跳到主要内容

退款 API 指南

提示

僅當交易返回碼為 0000(交易成功)時,才能進行退款操作。

備註

若為信用卡交易,由於系統會自動進行捕獲(Capture),同日退款申請將視為 void 並自動處理,無需商戶另外判斷。

備註

不同錢包的退款規則(如可退款時間上限、是否支持部分退款)可能有所不同,請聯繫 QFPay 支援確認。

API Endpoint

Endpoint: /trade/v1/refund
Method: POST

HTTP 請求說明

  • Content-Type: application/x-www-form-urlencoded
  • Headers:
    • X-QF-APPCODE: 你的 App Code
    • X-QF-SIGN: 使用簽名函式生成的簽名值

請求參數

參數必填類型說明
syssnString(128)欲退款的原始交易 ID
out_trade_noString(128)外部退款訂單號(不可與原訂單號重複)
txamtInt(11)退款金額(單位為分)。部分錢包不支持部分退款,建議金額大於 200
txdtmString(20)請求時間,格式為:YYYY-MM-DD hh:mm:ss
mchidString(16)商戶號,如系統已分配給商戶,則為必填
udidString(40)裝置 ID,用於識別交易設備

回應參數

參數類型說明
syssnString(40)此次退款交易所對應的交易號
orig_syssnString(128)原始交易號
txamtInt(11)退款金額(單位為分)
sysdtmString(20)系統退款時間,格式:YYYY-MM-DD hh:mm:ss,用作結算分界時間
respcdString(4)返回碼:0000 成功,1143/1145 處理中,其它為失敗。請參考狀態碼說明文件
resperrString(128)返回訊息
cash_feeString實際支付金額(交易金額 - 折扣)
cash_fee_typeString實際支付幣種,如 CNY
cash_refund_feeString實際退款金額
cash_refund_fee_typeString實際退款幣種,如 CNY

範例程式碼

import urllib.request, urllib.parse, urllib.error, urllib.request, urllib.error, urllib.parse, hashlib
import requests
from hashids import Hashids
import datetime
import string
import random

# Enter Client Credentials
environment = 'https://test-openapi-hk.qfapi.com'
app_code = 'D5589D2A1F2E42A9A60C37**********'
client_key = '0E32A59A8B454940A2FF39**********'


# Create parameter values for data payload
current_time = datetime.datetime.now().replace(microsecond=0)
random_string = ''.join(random.choices(string.ascii_uppercase + string.digits, k=32))


# Create signature
def make_req_sign(data, key):
keys = list(data.keys())
keys.sort()
p = []
for k in keys:
v = data[k]
p.append('%s=%s'%(k,v))
unsign_str = ('&'.join(p) + key).encode("utf-8")
s = hashlib.md5(unsign_str).hexdigest()
return s.upper()


# Body payload
txamt = '10' #Partial or full refund amount
syssn = '20191227000200020061752831' #Original transaction number
out_trade_no = random_string
txdtm = current_time
key = client_key
mchid = 'ZaMVg*****'


#data ={'txamt': txamt, 'syssn': syssn, 'out_trade_no': out_trade_no, 'txdtm': txdtm, 'udid': udid, 'mchid': mchid}
data ={'mchid': mchid, 'txamt': txamt, 'syssn': syssn, 'out_trade_no': out_trade_no, 'txdtm': txdtm}

r = requests.post(environment+"/trade/v1/refund",data=data,headers={'X-QF-APPCODE':app_code,'X-QF-SIGN':make_req_sign(data, key)})

print(r.json())

回應示例

{
"orig_syssn": "20191227000200020061752831",
"sysdtm": "2019-12-27 11:11:23",
"paydtm": "2019-12-27 11:11:26",
"txdtm": "2019-12-27 11:10:38",
"udid": "qiantai2",
"txcurrcd": "EUR",
"txamt": "10",
"resperr": "success",
"respmsg": "",
"out_trade_no": "RGNOEIVU9JZLNP9GGYXWXCW7OEMI720F",
"syssn": "20191227000300020061652643",
"respcd": "0000",
"chnlsn": "2019122722001411461404119764",
"cardcd": ""
}

注意事項

備註
  • 請確保退款金額不超過原始交易金額。
  • 部分錢包不支援部分退款,請先確認。
  • 各支付通道的退款有效期限不同,請聯絡 QFPay 支援團隊以取得更多資訊。
  • 若退款結果為失敗(respcd0000),建議實作重試邏輯,或透過 交易查詢 API 驗證退款狀態。