# 一、刷臉支付文檔
# 刷臉支付場(chǎng)景說(shuō)明
該流程通過(guò)識(shí)別用戶人臉、手機(jī)號(hào),獲取人臉憑證(face_code),該人臉憑證具有較高的安全等級(jí),可用于支付。
# 接入過(guò)程
# 刷臉支付時(shí)序圖
# SDK調(diào)用
# 使用方式
- SDK需要集成到商戶應(yīng)用,提供的SDK為C動(dòng)態(tài)鏈接庫(kù)dll,請(qǐng)注意采用cdecl調(diào)用約定
- 業(yè)務(wù)?C/C++技術(shù)棧可通過(guò)
編譯鏈接
或者LoadLibrary
的?式加載dll,并執(zhí)行相關(guān)函數(shù),C#等.NET平臺(tái)的技術(shù)棧請(qǐng)參照下面C#導(dǎo)入DLL聲明部分實(shí)現(xiàn)調(diào)用 - 運(yùn)行時(shí),需要先啟動(dòng)WxpayFaceService刷臉服務(wù),然后商戶應(yīng)用使用SDK中的接口調(diào)起刷臉功能
注意點(diǎn):
- 關(guān)于函數(shù)中?參、出參的數(shù)據(jù)格式, 均采?JSON字符串,編碼為UTF-8。
- 調(diào)用
wxpayCallFaceService
成功后,務(wù)必調(diào)用wxpayReleaseResponse
來(lái)釋放響應(yīng)結(jié)果
# 入口函數(shù)原型
/**
* 調(diào)用人臉服務(wù)
* @param reqBuf 請(qǐng)求參數(shù)(JSON字符串)
* @param reqSize 請(qǐng)求參數(shù)長(zhǎng)度
* @param pRespBuf 用來(lái)接收響應(yīng)結(jié)果(JSON字符串)的char**指針
* @param pRespSize 用來(lái)接收響應(yīng)結(jié)果長(zhǎng)度的unsigned int*指針
* @return 如果成功返回0,失敗則返回非0
*/
extern "C" int wxpayCallFaceService(const char *reqBuf, unsigned int reqSize, char **pRespBuf, unsigned int *pRespSize);
/**
* 釋放人臉服務(wù)的響應(yīng)字符串,調(diào)用wxpayCallFaceService成功后務(wù)必調(diào)用此函數(shù)釋放內(nèi)存
* @param pRespBuf 指向響應(yīng)結(jié)果(JSON字符串)的指針
*/
extern "C" void wxpayReleaseResponse(char **pRespBuf);
# C# 導(dǎo)入DLL聲明
// 聲明
[DllImport("WxpayFaceSDK.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public extern static int wxpayCallFaceService(IntPtr reqBuf, UInt32 reqSize, out IntPtr pRespBuf, out UInt32 pRespSize);
[DllImport("WxpayFaceSDK.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public extern static int wxpayReleaseResponse(out IntPtr pRespBuf);
// 封裝
public static int CallWxpayFaceService(string req, ref string resp)
{
byte[] reqBuf = Encoding.UTF8.GetBytes(req);
IntPtr reqPtr = Marshal.AllocHGlobal(reqBuf.Length);
Marshal.Copy(reqBuf, 0, reqPtr, reqBuf.Length);
IntPtr respPtr;
UInt32 respSize;
int ret = wxpayCallFaceService(reqPtr, (UInt32)reqBuf.Length, out respPtr, out respSize);
if (ret == 0)
{
byte[] respBuf = new byte[respSize];
Marshal.Copy(respPtr, respBuf, 0, (int)respSize);
resp = Encoding.UTF8.GetString(respBuf);
wxpayReleaseResponse(out respPtr);
}
Marshal.FreeHGlobal(reqPtr);
return ret;
}
# 請(qǐng)求參數(shù)Req和響應(yīng)結(jié)果Resp構(gòu)成
req
和resp
均為JSON結(jié)構(gòu)的字符串
req
包含:公共請(qǐng)求字段 + 命令專有請(qǐng)求字段
resp
包含:公共響應(yīng)字段 + 命令專有響應(yīng)字段
# 請(qǐng)求公共字段
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
cmd | 是 | string | 命令字,即各接口名: initWxpayface getWxpayfaceRawdata getWxpayfaceCode releaseWxpayface |
version | 是 | string | 版本號(hào), 固定填寫1 |
now | 是 | int | 取當(dāng)前時(shí)間的10位unix時(shí)間戮。 例如:1540901425 |
# 請(qǐng)求公共字段
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | 是 | string | 錯(cuò)誤碼。公共定義見 公共錯(cuò)誤碼 |
return_msg | 是 | string(128) | 對(duì)錯(cuò)誤碼的描述 |
# 公共錯(cuò)誤碼
參數(shù) | 錯(cuò)誤碼 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | SUCCESS | string | 接口成功 |
return_code | ERROR | string | 接口失敗 |
return_code | PARAM_ERROR | string | 參數(shù)錯(cuò)誤 |
return_code | SYSTEMERROR | string | 接口返回錯(cuò)誤 |
# 接口調(diào)用流程
# 1、程序啟動(dòng)時(shí)初始化
# 程序啟動(dòng)時(shí)初始化initWxpayface
接口作用:對(duì)人臉SDK進(jìn)行初始化
支持版本: 1.12及以上
# 請(qǐng)求參數(shù)
除公共參數(shù)外,下方參數(shù)中的代理設(shè)置可用于配置刷臉走商戶內(nèi)部代理。若不需要,則不用填寫代理參數(shù)。
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
ip | 否 | string | HTTP代理IP |
port | 否 | string | HTTP代理端口, 須為數(shù)字 |
user | 否 | string | HTTP代理的用戶名 |
passwd | 否 | string | HTTP代理的密碼 |
proxy_type | 否 | int | 0:none; 1:HttpTunnel; 2:Socks5; 3:Http v1.18及以上支持 |
camera_rotation | 否 | int | 對(duì)攝像頭畫面進(jìn)行旋轉(zhuǎn),1為+90度,2為180度,3為-90度,如需使用該參數(shù)請(qǐng)聯(lián)系微信支付確認(rèn)設(shè)備實(shí)際效果符合規(guī)范。1.18版本以上支持 |
# 返回參數(shù)
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | 是 | string | 錯(cuò)誤碼。公共定義見 公共錯(cuò)誤碼 |
return_msg | 是 | string(128) | 對(duì)錯(cuò)誤碼的描述 |
# 請(qǐng)求示例
// initWxpayface
// 初始化,默認(rèn)無(wú)代理
const char* req = "{\"cmd\":\"initWxpayface\",\"version\":\"1\",\"now\":1540901425}";
// 初始化并配置代理
const char* req = "{\"cmd\":\"initWxpayface\",\"version\":\"1\",\"now\":1540901425,\"ip\":\"10.123.10.11\",\"port\":\"8356\",\"user\":\"username\",\"passwd\":\"password\"}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
printf("resp: %s len: %u\n", resp, len);
wxpayReleaseResponse(&resp);
}
/*
* resp: {"return_code":"SUCCESS","return_msg":"SUCCESS"} len: 48
*/
# 2、獲取數(shù)據(jù)
# 獲取數(shù)據(jù)getWxpayfaceRawdata
接口作用:獲取rawdata數(shù)據(jù)
支持版本: 1.12及以上
# 請(qǐng)求參數(shù)
僅公共參數(shù)
# 返回參數(shù)
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | 是 | string | 錯(cuò)誤碼。公共定義見 公共錯(cuò)誤碼 |
return_msg | 是 | string(128) | 對(duì)錯(cuò)誤碼的描述 |
rawdata | S | string(2048) | 初始化數(shù)據(jù)。用于接口調(diào)用獲取authinfo, 參見: 3、獲取調(diào)用憑證 |
# 調(diào)用示例
// getWxpayfaceRawdata
const char* req = "{\"cmd\":\"getWxpayfaceRawdata\",\"version\":\"1\",\"now\":1540901425}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
printf("resp: %s len: %u\n", resp, len);
wxpayReleaseResponse(&resp);
}
/*
* resp: {"rawdata":"0CSmor/Pp4vC7WE5CsJxet4Sg+D24C8eJxAMjjkBEl58hDLmofPunD+OX8v7JQyxUFmimUb9ai9cuPmGXC87MfStCOGaK/Fjb77DzF7nJgpwQhl8bdprPWKx6h04ZzPRQBlE6DAgcylr3CFSisWpMSUUmA9MtHAKD8fhzFeTEAgj0NK49DjIFZXczfZRgj8qUTRrajdJtO6gZMqlRgSwM83MP8xPG2lCO33nA5HsSMy/vh5ET5O3ubj+wpfMuD1fUj3HBy3YXxxGqFKjJV6dRwuMmAXnaTk0P0u3LSOWO7wiA6En/JgwVZvf9zkcCzq9OyJFrc+8QY6bQeuPWCe4E73n397jaD5fu8GqyokUlO/XytuYP2qcNWAol9vBpf3u2xWt/MobKjJcsDwsCxGFxtjWATRyU0fB9atI8GKGt9zxwWbMd0m6gleWWVGVOHxodNKJbWFP4rRKvPjG0nntZzX4SJ0q/7zevKzYQhU+F+q+ePvvgjKAcxnI5Jhaz/khkffQLw4YAaR7GuLZhHYeFPYEvzOXVk89+dJ/M7s1jZK4dtFa75U1Et9vn2bYtfourPpL3PA9oPPVVu2gPuq/S+WmBG6hCp0lq+/3P4png82cgLq6MNPhSwAq5YRqxlrHbfE3qk0qr/vXXSMbIOhfLWnKFdOyRv+3ohdQOC/8sdHbbSDcyQSprYZ+JREhz0W3qPKlHxlsbvSrpGNj9D4VxL4UXTnloq5KdwZoGSeBgvpNS5NPhXuU6u0cVMufUriKsxptftFu68cDzVv3hdu+1bYy/P9vffwSl01U2uJiTGErHqVMuILTNL==","return_code":"SUCCESS","return_msg":"SUCCESS"} len: 885
*/
# 3、獲取調(diào)用憑證
# 獲取調(diào)用憑證get_wxpayface_authinfo(rawdata)(獲取調(diào)用憑證)
接口作用:獲取調(diào)用憑證
接口地址:https://payapp.weixin.qq.com/face/get_wxpayface_authinfo
# 請(qǐng)求參數(shù)
除公共參數(shù)外,下方參數(shù)的代理設(shè)置可用于配置刷臉走商戶內(nèi)部代理。若不需要,則不用填寫。
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
store_id | 是 | string(32) | 門店編號(hào), 由商戶定義, 各門店唯一。 |
store_name | 是 | string(128) | 門店名稱,由商戶定義。(可用于展示) |
device_id | 是 | string(32) | 終端設(shè)備編號(hào),由商戶定義。 |
attach | 否 | string | 附加字段。字段格式使用Json |
rawdata | 是 | string(2048) | 初始化數(shù)據(jù)。由微信人臉SDK的接口返回。 獲取方式參見: [獲取數(shù)據(jù) getWxpayfaceRawdata](#獲取數(shù)據(jù) getWxpayfaceRawdata) [獲取數(shù)據(jù) getWxpayfaceRawdata](#獲取數(shù)據(jù) getWxpayfaceRawdata) |
appid | 是 | string(32) | 商戶號(hào)綁定的公眾號(hào)/小程序 appid |
mch_id | 是 | string(32) | 商戶號(hào) |
sub_appid | 否 | string(32) | 子商戶綁定的公眾號(hào)/小程序 appid(服務(wù)商模式) |
sub_mch_id | 否 | string(32) | 子商戶號(hào)(服務(wù)商模式) |
now | 是 | int | 取當(dāng)前時(shí)間,10位unix時(shí)間戳。 例如:1239878956 |
version | 是 | string | 版本號(hào)。固定為1 |
sign_type | 是 | string | 簽名類型,目前支持HMAC-SHA256和MD5,默認(rèn)為MD5 |
nonce_str | 是 | string(32) | 隨機(jī)字符串,不長(zhǎng)于32位 |
sign | 是 | string | 參數(shù)簽名。詳見微信支付簽名算法 |
# 返回參數(shù)
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | 是 | string(16) | 錯(cuò)誤碼。公共定義見 公共錯(cuò)誤碼 |
return_msg | 是 | string(128) | 對(duì)錯(cuò)誤碼的描述 |
authinfo | 是 | string(4096) | SDK調(diào)用憑證。用于調(diào)用SDK的人臉識(shí)別接口。 參見[人臉識(shí)別 getWxpayfaceCode](#人臉識(shí)別 getWxpayfaceCode) |
expires_in | 否 | int | authinfo的有效時(shí)間, 單位秒。 例如: 3600 在有效時(shí)間內(nèi), 對(duì)于同一臺(tái)終端設(shè)備,相同的參數(shù)的前提下(如:相同的公眾號(hào)、商戶號(hào)、 門店編號(hào)等),可以用同一個(gè)authinfo,多次調(diào)用SDK的 getWxpayfaceCode 接口。 |
nonce_str | 是 | string(32) | 隨機(jī)字符串 |
sign | 是 | string(32) | 響應(yīng)結(jié)果簽名 |
appid | 是 | string(32) | 公眾號(hào) |
mch_id | 否 | string(32) | 商戶號(hào) |
sub_appid | 否 | string(32) | 子商戶公眾賬號(hào)ID(服務(wù)商模式) |
sub_mch_id | 是 | string(32) | 子商戶號(hào)(服務(wù)商模式) |
# 請(qǐng)求示例
<return_code>SUCCESS</return_code>
<return_msg>請(qǐng)求成功</return_msg>
<nonce_str>Tivppi4UXAbgLxk8e1Sij76YdowOFFii</nonce_str>
<sign>PL0EUID6A7ICWNKHCSMQC0UIXOYNSE5B</sign>
<appid>wx31fdaErqR31</appid>
<mch_id>12345689</mch_id>
<authinfo>q3OPhFtQBf6KZGqmZhejKCRy5K/ch0kwS11YSsEj9XmUGqcsT2QPHt0Oa7xaCMCoSZTWMmShCo4dOiO5tU+OJEsvSxXzn5m3Nkh747tinNlbpJmVq1zOPj+FJNndkzanxoiAddO8p1EfrmUhJs/aNf0pDfrPoVfkAapK+ZY6blwyaDQ9bB7+KkZq29kObsXOZ3thg+bxP4RAqC0oxNS4JiyP0uA1Euzxtkc9lCTebloFied8stILrMehUKukeMGkZ1SzTyc8/HFHApzHahNPX6yD8ttzYnhe+IRMFJgpuTlIvEOYZUxenPXE1A5clrPvOBeJDszX/OvZl4fpYWPpXAcVQlw+gfYhblt+rT6ALMsD73w/rT4NRriQEEraC4Pfb5yua4qAqv4TVo04</authinfo>
<expires_in>7200</expires_in>
建議:返回的接口憑證authinfo
,可以在expires_in
指定的有效期內(nèi),同一臺(tái)機(jī)具上重復(fù)使用
注意:這是一個(gè)后端調(diào)用接口,請(qǐng)?jiān)讷@取數(shù)據(jù)(getWxpayfaceRawdata)成功后獲取調(diào)用憑證get_wxpayface_authinfo(rawdata)
# 4、進(jìn)行人臉識(shí)別
# 進(jìn)行人臉識(shí)別getWxpayfaceCode(獲取支付憑證)
接口作用:開啟人臉識(shí)別,獲取支付憑證和用戶信息。
支持版本: 1.12及以上
# 請(qǐng)求參數(shù)
除公共參數(shù)外,
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
appid | 是 | string | 商戶號(hào)綁定的公眾號(hào)/小程序 appid |
mch_id | 是 | string | 商戶號(hào) |
sub_appid | 否 | string(32) | 子商戶綁定的公眾號(hào)/小程序 appid(可不填) |
sub_mch_id | 否 | string(32) | 子商戶號(hào)(非服務(wù)商模式不填) |
store_id | 是 | string | 門店編號(hào) |
openid | 否 | string | 通過(guò)getWxpayfaceUserInfo獲取的openid,傳入后可使用快捷支付模式。1.24版本以上支持該參數(shù) |
out_trade_no | 否 | string | 商戶訂單號(hào),須與調(diào)用支付接口時(shí)字段一致,該字段在在face_code_type 為"1"時(shí)可不填,為"0"時(shí)必填 |
total_fee | 否 | string | 訂單金額(數(shù)字), 單位分,該字段在在face_code_type 為"1"時(shí)可不填,為"0"時(shí)必填 |
face_authtype | 是 | string | 可選值:FACEPAY : 人臉憑證(face_code),用于刷臉支付 FACE_AUTH : 實(shí)名認(rèn)證(需聯(lián)系微信支付開通權(quán)限) |
authinfo | 是 | string | 調(diào)用憑證。獲取方式參見: get_wxpayface_authinfo |
face_code_type | 否 | string | 目標(biāo)face_code類型,可選值:"1",刷卡付款碼:18位數(shù)字,通過(guò)「付款碼支付/被掃支付」接口完成支付,如果不填寫則默認(rèn)為"0",人臉付款碼:數(shù)字字母混合,通過(guò)「刷臉支付」接口完成支付。1.16版本以上支持該參數(shù) |
screen_index | 否 | string | 指定刷臉界面顯示的屏幕編號(hào)。編號(hào)1為主屏幕,其余屏幕按系統(tǒng)設(shè)置中的順序從2開始編號(hào),常用場(chǎng)景舉例:雙屏機(jī)器上傳"2"即可顯示在副屏上。如果不填寫則默認(rèn)顯示在主屏幕。1.18版本以上支持該參數(shù) |
disable_keyboard | 否 | string | 設(shè)置不接受外接鍵盤輸入,可選值:"1",禁用。1.23版本以上支持該參數(shù) |
use_window_nofocus | 否 | string | 設(shè)置刷臉窗口以無(wú)焦點(diǎn)方式啟動(dòng),可選值:"1",無(wú)焦點(diǎn)啟動(dòng)窗口。1.26版本以上支持該參數(shù) |
# 返回參數(shù)
當(dāng)face_authtype
為FACEPAY
時(shí), 接口返回:
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | 是 | string | 錯(cuò)誤碼。公共定義見 公共錯(cuò)誤碼 |
return_msg | 是 | string(128) | 對(duì)錯(cuò)誤碼的描述 |
face_code | S | string | 人臉憑證, 用于刷臉支付。 |
openid | S | string | openid |
sub_openid | 否 | string | 子商戶號(hào)下的openid(服務(wù)商模式) |
face_sid | 否 | string | 用戶身份信息查詢憑證 |
# 接口錯(cuò)誤碼
錯(cuò)誤碼的公共部分, 參見公共錯(cuò)誤碼。以下為該接口獨(dú)有錯(cuò)誤碼:
錯(cuò)誤碼 | 描述 | 解決方案 |
---|---|---|
USER_CANCEL | 用戶退出了人臉識(shí)別 | 返回到結(jié)賬流程 |
SCAN_PAYMENT | 用戶選擇掃碼支付 | 進(jìn)入掃碼支付流程 |
# 請(qǐng)求示例
// getWxpayfaceCode
const char* req = "{\"cmd\":\"getWxpayfaceCode\",\"version\":\"1\",\"now\":1540907996,\"appid\":\"wx97debaxyzabcca2\",\"mch_id\":\"1281087510\",\"store_id\":\"IMG001\",\"face_authtype\":\"FACEPAY\",\"authinfo\":\"0CSmor/Pp4vC7WE5CsJxet4Sg+D24C8eJxAMjjkBEl58hDLmofPunD+OX8v7JQyxUFmimUb9ai9cuPmGXC87MfStCOGaK/Fjb77DzF7nJgpwQhl8bdprPWKx6h04ZzPRQBlE6DAgcylr3CFSisWpMSUUmA9MtHAKD8fhzFeTEAgj0NK49DjIFZXczfZRgj8qUTRrajdJtO6gZMqlRgSwM83MP8xPG2lCO33nA5HsSMy/vh5ET5O3ubj+wpfMuD1fUj3HBy3YXxxGqFKjJV6dRwuMmAXnaTk0P0u3LSOWO7wiA6En/JgwVZvf9zkcCzq9OyJFrc+8QY6bQeuPWCe4E73n397jaD5fu8GqyokUlO/XytuYP2qcNWAol9vBpf3u2xWt/MobKjJcsDwsCxGFxtjWATRyU0fB9atI8GKGt9zxwWbMd0m6gleWWVGVOHxodNKJbWFP4rRKvPjG0nntZzX4SJ0q/7zevKzYQhU+F+q+ePvvgjKAcxnI5Jhaz/khkffQLw4YAaR7GuLZhHYeFPYEvzOXVk89+dJ/M7s1jZK4dtFa75U1Et9vn2bYtfourPpL3PA9oPPVVu2gPuq/S+WmBG6hCp0lq+/3P4png82cgLq6MNPhSwAq5YRqxlrHbfE3qk0qr/vXXSMbIOhfLWnKFdOyRv+3ohdQOC/8sdHbbSDcyQSprYZ+JREhz0W3qPKlHxlsbvSrpGNj9D4VxL4UXTnloq5KdwZoGSeBgvpNS5NPhXuU6u0cVMufUriKsxptftFu68cDzVv3hdu+1bYy/P9vffwSl01U2uJiTGErHqVMuILTNL==\",\"out_trade_no\":\"10302159564hzhw2\",\"total_fee\":\"100\",\"face_code_type\":\"1\"}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
printf("resp: %s len: %u\n", resp, len);
wxpayReleaseResponse(&resp);
}
/*
* resp: {"face_code":"xxxxxxxxxxxxxxxxx","openid":"xxx-xxxxxxxxxxxxxxxxxxxxxxxx","return_code":"SUCCESS","return_msg":"SUCCESS"} len: 155
*/
注意:** face_code需要調(diào)用后端支付接口完成支付 **,微信刷臉應(yīng)用在返回face_code
后,仍會(huì)處于等待UI(等待支付loading狀態(tài)),商戶應(yīng)用獲取到face_code
后,需要調(diào)用后臺(tái)人臉支付API發(fā)起支付,支付完成后調(diào)用updateWxpayfacePayResult
將支付結(jié)果通知給刷臉應(yīng)用,刷臉應(yīng)用此時(shí)會(huì)關(guān)閉等待UI。
# 5、進(jìn)行發(fā)起訂單支付
# 進(jìn)行發(fā)起訂單支付micropay
接口作用:發(fā)起訂單支付
接口地址:https://api.mch.weixin.qq.com/pay/micropay
# 請(qǐng)求參數(shù)
注: 如果有分賬需求,請(qǐng)參考分賬文檔, 普通商戶分賬 服務(wù)商分賬
除公共參數(shù)外,下方參數(shù)的代理設(shè)置可用于配置刷臉走商戶內(nèi)部代理。若不需要,則不用填寫。
參數(shù) | 必填 | 類型 | 示例值 | 說(shuō)明 |
---|---|---|---|---|
appid | 是 | String(32) | wx8888888888888888 | 微信分配的公眾賬號(hào)ID(企業(yè)號(hào)corpid即為此appId) |
mch_id | 是 | String(32) | 1900000109 | 微信支付分配的商戶號(hào) |
device_info | 否 | String(32) | 013467007045764 | 終端設(shè)備號(hào)(商戶自定義,如門店編號(hào)) |
nonce_str | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 隨機(jī)字符串,不長(zhǎng)于32位。推薦隨機(jī)數(shù)生成算法 |
sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 簽名,詳見簽名生成算法 |
sign_type | 否 | String(32) | HMAC-SHA256 | 簽名類型,目前支持HMAC-SHA256和MD5,默認(rèn)為MD5 |
body | 是 | String(128) | image形象店-深圳騰大- QQ公仔 | 商品簡(jiǎn)單描述,該字段須嚴(yán)格按照規(guī)范傳遞,具體請(qǐng)見參數(shù)規(guī)定 |
detail | 否 | String(6000) | 單品優(yōu)惠功能字段,需要接入詳見單品優(yōu)惠詳細(xì)說(shuō)明 | |
attach | 否 | String(127) | 說(shuō)明 | 附加數(shù)據(jù),在查詢API和支付通知中原樣返回,該字段主要用于商戶攜帶訂單的自定義數(shù)據(jù) |
out_trade_no | 是 | String(32) | 1217752501201407033233368018 | 商戶系統(tǒng)內(nèi)部訂單號(hào),要求32個(gè)字符內(nèi),只能是數(shù)字、大小寫字母_-|*且在同一個(gè)商戶號(hào)下唯一。詳見商戶訂單號(hào) |
total_fee | 是 | Int | 888 | 訂單總金額,單位為分,只能為整數(shù),詳見支付金額 |
fee_type | 否 | String(16) | CNY | 符合ISO4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY,詳見貨幣類型 |
spbill_create_ip | 是 | String(64) | 8.8.8.8 | 支持IPV4和IPV6兩種格式的IP地址。調(diào)用微信支付API的機(jī)器IP |
goods_tag | 否 | String(32) | 1234 | 訂單優(yōu)惠標(biāo)記,代金券或立減優(yōu)惠功能的參數(shù),詳見代金券或立減優(yōu)惠 |
limit_pay | 否 | String(32) | no_credit | no_credit--指定不能使用信用卡支付 |
time_start | 否 | String(14) | 20091225091010 | 訂單生成時(shí)間,格式為yyyyMMddHHmmss,如2009年12月25日9點(diǎn)10分10秒表示為20091225091010。其他詳見時(shí)間規(guī)則 |
time_expire | 否 | String(14) | 20091227091010 | 訂單失效時(shí)間,格式為yyyyMMddHHmmss,如2009年12月27日9點(diǎn)10分10秒表示為20091227091010。注意:最短失效時(shí)間間隔需大于1分鐘 |
receipt | 否 | String(8) | Y | Y,傳入Y時(shí),支付成功消息和支付詳情頁(yè)將出現(xiàn)開票入口。需要在微信支付商戶平臺(tái)或微信公眾平臺(tái)開通電子發(fā)票功能,傳此字段才可生效 |
auth_code | 是 | String(128) | 120061098828009406 | 掃碼支付付款碼,設(shè)備讀取用戶微信中的條碼或者二維碼信息 (注:用戶付款碼條形碼規(guī)則:18位純數(shù)字,以10、11、12、13、14、15開頭) |
scene_info | 否 | String(256) | {"store_info" : { "id": "SZTX001", "name": "騰大餐廳", "area_code": "440305", "address": "科技園中一路騰訊大廈" }} | 該字段用于上報(bào)場(chǎng)景信息,目前支持上報(bào)實(shí)際門店信息。該字段為JSON對(duì)象數(shù)據(jù),對(duì)象格式為{"store_info":{"id": "門店ID","name": "名稱","area_code": "編碼","address": "地址" }} ,字段詳細(xì)說(shuō)明請(qǐng)點(diǎn)擊行前的+展開 |
# 請(qǐng)求示例
<xml>
<appid>wx2421b1c4370ec43b</appid>
<attach>訂單額外描述</attach>
<auth_code>120269300684844649</auth_code>
<body>付款碼支付測(cè)試</body>
<device_info>1000</device_info>
<goods_tag></goods_tag>
<mch_id>10000100</mch_id>
<nonce_str>8aaee146b1dee7cec9100add9b96cbe2</nonce_str>
<out_trade_no>1415757673</out_trade_no>
<spbill_create_ip>14.17.22.52</spbill_create_ip>
<time_expire></time_expire>
<total_fee>1</total_fee>
<sign>C29DB7DB1FD4136B84AE35604756362C</sign>
</xml>
注:參數(shù)值用XML轉(zhuǎn)義即可,CDATA標(biāo)簽用于說(shuō)明數(shù)據(jù)不被XML解析器解析。
# 返回參數(shù)
參數(shù) | 必填 | 類型 | 示例值 | 說(shuō)明 |
---|---|---|---|---|
return_code | 是 | String(16) | SUCCESS | SUCCESS/FAIL此字段是接口通信情況標(biāo)識(shí),非交易成功與否的標(biāo)識(shí) |
return_msg | 是 | String(128) | OK | 當(dāng)return_code為FAIL時(shí)返回信息為錯(cuò)誤原因 ,例如簽名失敗參數(shù)格式校驗(yàn)錯(cuò)誤 |
當(dāng)return_code為SUCCESS的時(shí)候,還會(huì)包括以下字段:
參數(shù) | 必填 | 類型 | 示例值 | 說(shuō)明 |
---|---|---|---|---|
appid | 是 | String(32) | wx8888888888888888 | 調(diào)用接口提交的公眾賬號(hào)ID |
mch_id | 是 | String(32) | 1900000109 | 調(diào)用接口提交的商戶號(hào) |
device_info | 否 | String(32) | 013467007045764 | 調(diào)用接口提交的終端設(shè)備號(hào), |
nonce_str | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 微信返回的隨機(jī)字符串 |
sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 微信返回的簽名,詳見簽名生成算法 |
result_code | 是 | String(16) | SUCCESS | SUCCESS/FAIL |
err_code | 否 | String(32) | SYSTEMERROR | 詳細(xì)參見錯(cuò)誤列表 |
err_code_des | 否 | String(128) | 系統(tǒng)錯(cuò)誤 | 錯(cuò)誤返回的信息描述 |
當(dāng)return_code 和result_code都為SUCCESS的時(shí),還會(huì)包括以下字段:
參數(shù) | 必填 | 類型 | 示例值 | 說(shuō)明 |
---|---|---|---|---|
openid | 是 | String(128) | Y | 用戶在商戶appid 下的唯一標(biāo)識(shí) |
is_subscribe | 是 | String(1) | Y | 用戶是否關(guān)注公眾賬號(hào),僅在公眾賬號(hào)類型支付有效,取值范圍:Y或N;Y-關(guān)注;N-未關(guān)注 |
trade_type | 是 | String(16) | MICROPAY | MICROPAY 付款碼支付 |
bank_type | 是 | String(32) | CMC | 銀行類型,采用字符串類型的銀行標(biāo)識(shí),詳見銀行類型 |
fee_type | 否 | String(16) | CNY | 符合ISO 4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY,詳見貨幣類型 |
total_fee | 是 | Int | 888 | 訂單總金額,單位為分,只能為整數(shù),詳見支付金額 |
settlement_total_fee | 否 | Int | 100 | 當(dāng)訂單使用了免充值型優(yōu)惠券后返回該參數(shù),應(yīng)結(jié)訂單金額=訂單金額-免充值優(yōu)惠券金額。 |
coupon_fee | 否 | Int | 100 | “代金券”金額<=訂單金額,訂單金額-“代金券”金額=現(xiàn)金支付金額,詳見支付金額 |
cash_fee_type | 否 | String(16) | CNY | 符合ISO 4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY,其他值列表詳見貨幣類型 |
cash_fee | 是 | Int | 100 | 訂單現(xiàn)金支付金額,詳見支付金額 |
transaction_id | 是 | String(32) | 1217752501201407033233368018 | 微信支付訂單號(hào) |
out_trade_no | 是 | String(32) | 1217752501201407033233368018 | 商戶系統(tǒng)內(nèi)部訂單號(hào),要求32個(gè)字符內(nèi),只能是數(shù)字、大小寫字母_-|*且在同一個(gè)商戶號(hào)下唯一。 |
attach | 否 | String(128) | 123456 | 商家數(shù)據(jù)包,原樣返回 |
time_end | 是 | String(14) | 20141030133525 | 訂單生成時(shí)間,格式為yyyyMMddHHmmss,如2009年12月25日9點(diǎn)10分10秒表示為20091225091010。詳見時(shí)間規(guī)則 |
promotion_detail | 否 | String(6000) | 示例見下文 | 新增返回,單品優(yōu)惠功能字段,需要接入請(qǐng)見詳細(xì)說(shuō)明 |
# 請(qǐng)求示例
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<device_info><![CDATA[1000]]></device_info>
<nonce_str><![CDATA[GOp3TRyMXzbMlkun]]></nonce_str>
<sign><![CDATA[D6C76CB785F07992CDE05494BB7DF7FD]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<openid><![CDATA[oUpF8uN95-Ptaags6E_roPHg7AG0]]></openid>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<trade_type><![CDATA[MICROPAY]]></trade_type>
<bank_type><![CDATA[CCB_DEBIT]]></bank_type>
<total_fee>1</total_fee>
<coupon_fee>0</coupon_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<transaction_id><![CDATA[1008450740201411110005820873]]></transaction_id>
<out_trade_no><![CDATA[1415757673]]></out_trade_no>
<attach><![CDATA[訂單額外描述]]></attach>
<time_end><![CDATA[20141111170043]]></time_end>
</xml>
# 錯(cuò)誤碼
名稱 | 描述 | 支付狀態(tài) | 原因 | 解決方案 |
---|---|---|---|---|
SYSTEMERROR | 接口返回錯(cuò)誤 | 支付結(jié)果未知 | 系統(tǒng)超時(shí) | 請(qǐng)立即調(diào)用被掃訂單結(jié)果查詢API,查詢當(dāng)前訂單狀態(tài),并根據(jù)訂單的狀態(tài)決定下一步的操作。 |
PARAM_ERROR | 參數(shù)錯(cuò)誤 | 支付確認(rèn)失敗 | 請(qǐng)求參數(shù)未按指引進(jìn)行填寫 | 請(qǐng)根據(jù)接口返回的詳細(xì)信息檢查您的程序 |
ORDERPAID | 訂單已支付 | 支付確認(rèn)失敗 | 訂單號(hào)重復(fù) | 請(qǐng)確認(rèn)該訂單號(hào)是否重復(fù)支付,如果是新單,請(qǐng)使用新訂單號(hào)提交 |
NOAUTH | 商戶無(wú)權(quán)限 | 支付確認(rèn)失敗 | 商戶沒有開通被掃支付權(quán)限 | 請(qǐng)開通商戶號(hào)權(quán)限。請(qǐng)聯(lián)系產(chǎn)品或商務(wù)申請(qǐng) |
AUTHCODEEXPIRE | 二維碼已過(guò)期,請(qǐng)用戶在微信上刷新后再試 | 支付確認(rèn)失敗 | 用戶的條碼已經(jīng)過(guò)期 | 請(qǐng)收銀員提示用戶,請(qǐng)用戶在微信上刷新條碼,然后請(qǐng)收銀員重新掃碼。 直接將錯(cuò)誤展示給收銀員 |
NOTENOUGH | 余額不足 | 支付確認(rèn)失敗 | 用戶的零錢余額不足 | 請(qǐng)收銀員提示用戶更換當(dāng)前支付的卡,然后請(qǐng)收銀員重新掃碼。建議:商戶系統(tǒng)返回給收銀臺(tái)的提示為“用戶余額不足.提示用戶換卡支付” |
NOTSUPORTCARD | 不支持卡類型 | 支付確認(rèn)失敗 | 用戶使用卡種不支持當(dāng)前支付形式 | 請(qǐng)用戶重新選擇卡種 建議:商戶系統(tǒng)返回給收銀臺(tái)的提示為“該卡不支持當(dāng)前支付,提示用戶換卡支付或綁新卡支付” |
ORDERCLOSED | 訂單已關(guān)閉 | 支付確認(rèn)失敗 | 該訂單已關(guān) | 商戶訂單號(hào)異常,請(qǐng)重新下單支付 |
ORDERREVERSED | 訂單已撤銷 | 支付確認(rèn)失敗 | 當(dāng)前訂單已經(jīng)被撤銷 | 當(dāng)前訂單狀態(tài)為“訂單已撤銷”,請(qǐng)?zhí)崾居脩糁匦轮Ц?/td> |
BANKERROR | 銀行系統(tǒng)異常 | 支付結(jié)果未知 | 銀行端超時(shí) | 請(qǐng)立即調(diào)用被掃訂單結(jié)果查詢API,查詢當(dāng)前訂單的不同狀態(tài),決定下一步的操作。 |
USERPAYING | 用戶支付中,需要輸入密碼 | 支付結(jié)果未知 | 該筆交易因?yàn)闃I(yè)務(wù)規(guī)則要求,需要用戶輸入支付密碼。 | 等待5秒,然后調(diào)用被掃訂單結(jié)果查詢API,查詢當(dāng)前訂單的不同狀態(tài),決定下一步的操作。 |
AUTH_CODE_ERROR | 付款碼參數(shù)錯(cuò)誤 | 支付確認(rèn)失敗 | 請(qǐng)求參數(shù)未按指引進(jìn)行填寫 | 每個(gè)二維碼僅限使用一次,請(qǐng)刷新再試 |
AUTH_CODE_INVALID | 付款碼檢驗(yàn)錯(cuò)誤 | 支付確認(rèn)失敗 | 收銀員掃描的不是微信支付的條碼 | 請(qǐng)掃描微信支付被掃條碼/二維碼 |
XML_FORMAT_ERROR | XML格式錯(cuò)誤 | 支付確認(rèn)失敗 | XML格式錯(cuò)誤 | 請(qǐng)檢查XML參數(shù)格式是否正確 |
REQUIRE_POST_METHOD | 請(qǐng)使用post方法 | 支付確認(rèn)失敗 | 未使用post傳遞參數(shù) | 請(qǐng)檢查請(qǐng)求參數(shù)是否通過(guò)post方法提交 |
SIGNERROR | 簽名錯(cuò)誤 | 支付確認(rèn)失敗 | 參數(shù)簽名結(jié)果不正確 | 請(qǐng)檢查簽名參數(shù)和方法是否都符合簽名算法要求 |
LACK_PARAMS | 缺少參數(shù) | 支付確認(rèn)失敗 | 缺少必要的請(qǐng)求參數(shù) | 請(qǐng)檢查參數(shù)是否齊全 |
NOT_UTF8 | 編碼格式錯(cuò)誤 | 支付確認(rèn)失敗 | 未使用指定編碼格式 | 請(qǐng)使用UTF-8編碼格式 |
BUYER_MISMATCH | 支付帳號(hào)錯(cuò)誤 | 支付確認(rèn)失敗 | 暫不支持同一筆訂單更換支付方 | 請(qǐng)確認(rèn)支付方是否相同 |
APPID_NOT_EXIST | APPID不存在 | 支付確認(rèn)失敗 | 參數(shù)中缺少APPID | 請(qǐng)檢查APPID是否正確 |
MCHID_NOT_EXIST | MCHID不存在 | 支付確認(rèn)失敗 | 參數(shù)中缺少M(fèi)CHID | 請(qǐng)檢查MCHID是否正確 |
OUT_TRADE_NO_USED | 商戶訂單號(hào)重復(fù) | 支付確認(rèn)失敗 | 同一筆交易不能多次提交 | 請(qǐng)核實(shí)商戶訂單號(hào)是否重復(fù)提交 |
APPID_MCHID_NOT_MATCH | appid和mch_id不匹配 | 支付確認(rèn)失敗 | appid和mch_id不匹配 | 請(qǐng)確認(rèn)appid和mch_id是否匹配 |
INVALID_REQUEST | 無(wú)效請(qǐng)求 | 支付確認(rèn)失敗 | 商戶系統(tǒng)異常導(dǎo)致,商戶權(quán)限異常、重復(fù)請(qǐng)求支付、證書錯(cuò)誤、頻率限制等 | 請(qǐng)確認(rèn)商戶系統(tǒng)是否正常,是否具有相應(yīng)支付權(quán)限,確認(rèn)證書是否正確,控制頻率 |
TRADE_ERROR | 交易錯(cuò)誤 | 支付確認(rèn)失敗 | 業(yè)務(wù)錯(cuò)誤導(dǎo)致交易失敗、用戶賬號(hào)異常、風(fēng)控、規(guī)則限制等 | 請(qǐng)確認(rèn)帳號(hào)是否存在異常 |
注意:
- ◆ 這是一個(gè)后端接口,請(qǐng)?jiān)谌四樧R(shí)別成功后發(fā)起支付
- ◆ 如果當(dāng)前交易返回的支付狀態(tài)是明確的錯(cuò)誤原因造成的支付失敗(支付確認(rèn)失敗),請(qǐng)重新下單支付;如果當(dāng)前交易返回的支付狀態(tài)是不明錯(cuò)誤(支付結(jié)果未知),請(qǐng)調(diào)用查詢訂單接口確認(rèn)狀態(tài),如果長(zhǎng)時(shí)間(建議30秒)都得不到明確狀態(tài)請(qǐng)調(diào)用撤銷訂單接口。
# 6、查詢訂單狀態(tài)
# 查詢訂單狀態(tài)orderquery
接口作用:該接口提供所有微信支付訂單的查詢,商戶可以通過(guò)查詢訂單接口主動(dòng)查詢訂單狀態(tài),完成下一步的業(yè)務(wù)邏輯。
需要調(diào)用查詢接口的情況:
- ◆ 當(dāng)商戶后臺(tái)、網(wǎng)絡(luò)、服務(wù)器等出現(xiàn)異常,商戶系統(tǒng)最終未接收到支付通知;
- ◆ 調(diào)用支付接口后,返回系統(tǒng)錯(cuò)誤或未知交易狀態(tài)情況;
- ◆ 調(diào)用付款碼支付API,返回USERPAYING的狀態(tài);
- ◆ 調(diào)用關(guān)單或撤銷接口API之前,需確認(rèn)支付狀態(tài);
接口地址:https://api.mch.weixin.qq.com/pay/orderquery
# 請(qǐng)求參數(shù)
除公共參數(shù)外,下方參數(shù)的代理設(shè)置可用于配置刷臉走商戶內(nèi)部代理。若不需要,則不用填寫。
參數(shù) | 必填 | 類型 | 說(shuō)明 | 示例值 |
---|---|---|---|---|
appid | 是 | String(32) | 微信支付分配的公眾賬號(hào)ID(企業(yè)號(hào)corpid即為此appId) | wxd678efh567hg6787 |
mch_id | 是 | String(32) | 微信支付分配的商戶號(hào) | 1230000109 |
transaction_id | 否 | String(32) | 微信的訂單號(hào),建議優(yōu)先使用 | 1009660380201506130728806387 |
out_trade_no | 否 | String(32) | 商戶系統(tǒng)內(nèi)部訂單號(hào),要求32個(gè)字符內(nèi),只能是數(shù)字、大小寫字母_-|*@ ,且在同一個(gè)商戶號(hào)下唯一。 詳見商戶訂單號(hào) | 20150806125346 |
nonce_str | 是 | String(32) | 隨機(jī)字符串,不長(zhǎng)于32位。推薦隨機(jī)數(shù)生成算法 | C380BEC2BFD727A4B6845133519F3AD6 |
sign | 是 | String(32) | 通過(guò)簽名算法計(jì)算得出的簽名值,詳見簽名生成算法 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
sign_type | 否 | String(32) | 簽名類型,目前支持HMAC-SHA256和MD5,默認(rèn)為MD5 | HMAC-SHA256 |
# 返回參數(shù)
參數(shù) | 必填 | 類型 | 說(shuō)明 | 示例值 |
---|---|---|---|---|
return_code | 是 | String(16) | SUCCESS/FAIL,此字段是通信標(biāo)識(shí),非交易標(biāo)識(shí),交易是否成功需要查看trade_state來(lái)判斷 | SUCCESS |
return_msg | 是 | String(128) | 當(dāng)return_code為FAIL時(shí)返回信息為錯(cuò)誤原因 ,例如簽名失敗參、數(shù)格式校驗(yàn)錯(cuò)誤 | OK |
以下字段在return_code為SUCCESS的時(shí)候有返回
參數(shù) | 必填 | 類型 | 說(shuō)明 | 示例值 |
---|---|---|---|---|
appid | 是 | String(32) | 微信分配的公眾賬號(hào)ID | wxd678efh567hg6787 |
mch_id | 是 | String(32) | 微信支付分配的商戶號(hào) | 1230000109 |
nonce_str | 是 | String(32) | 隨機(jī)字符串,不長(zhǎng)于32位。推薦隨機(jī)數(shù)生成算法 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
sign | 是 | String(32) | 簽名,詳見簽名生成算法 | C380BEC2BFD727A4B6845133519F3AD6 |
result_code | 是 | String(16) | SUCCESS/FAIL | SUCCESS |
err_code | 否 | String(32) | 當(dāng)result_code為FAIL時(shí)返回錯(cuò)誤代碼,詳細(xì)參見下文錯(cuò)誤列表 | |
err_code_des | 否 | String(128) | 當(dāng)result_code為FAIL時(shí)返回錯(cuò)誤描述,詳細(xì)參見下文錯(cuò)誤列表 |
以下字段在return_code 、result_code、trade_state都為SUCCESS時(shí)有返回 ,如trade_state不為 SUCCESS,則只返回out_trade_no(必傳)和attach(選傳)。
參數(shù) | 必填 | 類型 | 說(shuō)明 | 示例值 |
---|---|---|---|---|
device_info | 否 | String(32) | 微信支付分配的終端設(shè)備號(hào) | 013467007045764 |
openid | 是 | String(128) | 用戶在商戶appid下的唯一標(biāo)識(shí) | oUpF8uMuAJO_M2pxb1Q9zNjWeS6o |
is_subscribe | 是 | String(1) | 用戶是否關(guān)注公眾賬號(hào),Y-關(guān)注,N-未關(guān)注 | Y |
trade_type | 是 | String(16) | 調(diào)用接口提交的交易類型,取值如下:JSAPI,NATIVE,APP,MICROPAY,詳細(xì)說(shuō)明見參數(shù)規(guī)定 | JSAPI |
trade_state | 是 | String(32) | SUCCESS—支付成功,REFUND—轉(zhuǎn)入退款當(dāng)result_code為FAIL時(shí)返回錯(cuò)誤代碼,詳細(xì)參見下文錯(cuò)誤列表,NOTPAY—未支付當(dāng)result_code為FAIL時(shí)返回錯(cuò)誤描述,詳細(xì)參見下文錯(cuò)誤列表,CLOSED—已關(guān)閉,REVOKED—已撤銷(付款碼支付),USERPAYING--用戶支付中(付款碼支付),PAYERROR--支付失敗(其他原因,如銀行返回失敗),支付狀態(tài)機(jī)請(qǐng)見下單API頁(yè)面 | SUCCESS |
bank_type | 是 | String(16) | 銀行類型,采用字符串類型的銀行標(biāo)識(shí) | CMC |
total_fee | 是 | int | 訂單總金額,單位為分 | 100 |
settlement_total_fee | 否 | int | 當(dāng)訂單使用了免充值型優(yōu)惠券后返回該參數(shù),應(yīng)結(jié)訂單金額=訂單金額-免充值優(yōu)惠券金額。 | 100 |
fee_type | 否 | String(8) | 貨幣類型,符合ISO 4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY,其他值列表詳見貨幣類型 | CNY |
cash_fee | 是 | int | 現(xiàn)金支付金額訂單現(xiàn)金支付金額,詳見支付金額 | 100 |
cash_fee_type | 否 | String(16) | 貨幣類型,符合ISO 4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY,其他值列表詳見貨幣類型 | CNY |
coupon_fee | 否 | int | “代金券”金額<=訂單金額,訂單金額-“代金券”金額=現(xiàn)金支付金額,詳見支付金額 | CNY |
coupon_count | 否 | int | 代金券使用數(shù)量 | 1 |
coupon_type_$n | 否 | String | CASH--充值代金券,NO_CASH---非充值優(yōu)惠券,開通免充值券功能,并且訂單使用了優(yōu)惠券后有返回(取值:CASH、NO_CASH)。$n為下標(biāo),從0開始編號(hào),舉例:coupon_type_$0 | CASH |
coupon_id_$n | 否 | String(20) | 代金券ID, $n為下標(biāo),從0開始編號(hào) | 10000 |
coupon_fee_$n | 否 | int | 單個(gè)代金券支付金額, $n為下標(biāo),從0開始編號(hào) | 100 |
transaction_id | 是 | String(32) | 微信支付訂單號(hào) | 1009660380201506130728806387 |
out_trade_no | 是 | String(32) | 商戶系統(tǒng)內(nèi)部訂單號(hào),要求32個(gè)字符內(nèi),只能是數(shù)字、大小寫字母_-|*@ ,且在同一個(gè)商戶號(hào)下唯一。 | 20150806125346 |
attach | 否 | String(128) | 附加數(shù)據(jù),原樣返回 | 深圳分店 |
time_end | 是 | String(14) | 訂單支付時(shí)間,格式為yyyyMMddHHmmss,如2009年12月25日9點(diǎn)10分10秒表示為20091225091010。其他詳見時(shí)間規(guī)則 | 20141030133525 |
trade_state_desc | 是 | String(256) | 對(duì)當(dāng)前查詢訂單狀態(tài)的描述和下一步操作的指引 | 支付失敗,請(qǐng)重新下單支付 |
# 請(qǐng)求示例
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<device_info><![CDATA[1000]]></device_info>
<nonce_str><![CDATA[TN55wO9Pba5yENl8]]></nonce_str>
<sign><![CDATA[BDF0099C15FF7BC6B1585FBB110AB635]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<openid><![CDATA[oUpF8uN95-Ptaags6E_roPHg7AG0]]></openid>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<trade_type><![CDATA[MICROPAY]]></trade_type>
<bank_type><![CDATA[CCB_DEBIT]]></bank_type>
<total_fee>1</total_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<transaction_id><![CDATA[1008450740201411110005820873]]></transaction_id>
<out_trade_no><![CDATA[1415757673]]></out_trade_no>
<attach><![CDATA[訂單額外描述]]></attach>
<time_end><![CDATA[20141111170043]]></time_end>
<trade_state><![CDATA[SUCCESS]]></trade_state>
</xml>
# 錯(cuò)誤碼
名稱 | 描述 | 原因 | 解決方案 |
---|---|---|---|
ORDERNOTEXIST | 此交易訂單號(hào)不存在 | 查詢系統(tǒng)中不存在此交易訂單號(hào) | 該API只能查提交支付交易返回成功的訂單,請(qǐng)商戶檢查需要查詢的訂單號(hào)是否正確 |
SYSTEMERROR | 系統(tǒng)錯(cuò)誤 | 后臺(tái)系統(tǒng)返回錯(cuò)誤 | 系統(tǒng)異常,請(qǐng)?jiān)僬{(diào)用發(fā)起查詢 |
注意:這是一個(gè)后端接口
# 7、撤銷交易
# 撤銷交易reverse
接口作用:支付交易返回失敗或支付系統(tǒng)超時(shí),調(diào)用該接口撤銷交易。如果此訂單用戶支付失敗,微信支付系統(tǒng)會(huì)將此訂單關(guān)閉;如果用戶支付成功,微信支付系統(tǒng)會(huì)將此訂單資金退還給用戶。
注意:7天以內(nèi)的交易單可調(diào)用撤銷,其他正常支付的單如需實(shí)現(xiàn)相同功能請(qǐng)調(diào)用申請(qǐng)退款A(yù)PI。提交支付交易后調(diào)用【查詢訂單API】,沒有明確的支付結(jié)果再調(diào)用【撤銷訂單API】。
調(diào)用支付接口后請(qǐng)勿立即調(diào)用撤銷訂單API,建議支付后至少15s后再調(diào)用撤銷訂單接口
接口地址:https://api.mch.weixin.qq.com/secapi/pay/reverse
# 請(qǐng)求參數(shù)
除公共參數(shù)外,下方參數(shù)的代理設(shè)置可用于配置刷臉走商戶內(nèi)部代理。若不需要,則不用填寫。
字段名 | 變量名 | 必填 | 類型 | 示例值 | 描述 |
---|---|---|---|---|---|
公眾賬號(hào)ID | appid | 是 | String(32) | wx8888888888888888 | 微信分配的公眾賬號(hào)ID(企業(yè)號(hào)corpid即為此appId) |
商戶號(hào) | mch_id | 是 | String(32) | 1900000109 | 微信支付分配的商戶號(hào) |
微信訂單號(hào) | transaction_id | 否 | String(32) | 1217752501201407033233368018 | 微信的訂單號(hào),優(yōu)先使用 |
商戶訂單號(hào) | out_trade_no | 是 | String(32) | 1217752501201407033233368018 | 商戶系統(tǒng)內(nèi)部的訂單號(hào),transaction_id、out_trade_no二選一,如果同時(shí)存在優(yōu)先級(jí):transaction_id> out_trade_no |
隨機(jī)字符串 | nonce_str | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 隨機(jī)字符串,不長(zhǎng)于32位。推薦隨機(jī)數(shù)生成算法 |
簽名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 簽名,詳見簽名生成算法 |
簽名類型 | sign_type | 否 | String(32) | HMAC-SHA256 | 簽名類型,目前支持HMAC-SHA256和MD5,默認(rèn)為MD5 |
# 返回參數(shù)
字段名 | 變量名 | 必填 | 類型 | 示例值 | 描述 |
---|---|---|---|---|---|
返回狀態(tài)碼 | return_code | 是 | String(16) | SUCCESS | SUCCESS/FAIL此字段是通信標(biāo)識(shí),非交易標(biāo)識(shí),交易是否成功需要查看trade_state來(lái)判斷 |
返回信息 | return_msg | 是 | String(128) | OK | 當(dāng)return_code為FAIL時(shí)返回信息為錯(cuò)誤原因 ,例如簽名失敗參數(shù)格式校驗(yàn)錯(cuò)誤 |
當(dāng)return_code為SUCCESS的時(shí)候,還會(huì)包括以下字段:
字段名 | 變量名 | 必填 | 類型 | 示例值 | 描述 |
---|---|---|---|---|---|
公眾賬號(hào)ID | appid | 是 | String(32) | wx8888888888888888 | 返回提交的公眾賬號(hào)ID |
商戶號(hào) | mch_id | 是 | String(32) | 1900000109 | 返回提交的商戶號(hào) |
隨機(jī)字符串 | nonce_str | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 微信返回的隨機(jī)字符串 |
簽名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 返回?cái)?shù)據(jù)的簽名,詳見簽名算法 |
業(yè)務(wù)結(jié)果 | result_code | 是 | String(16) | SUCCESS | SUCCESS/FAIL |
錯(cuò)誤代碼 | err_code | 否 | String(32) | SYSTEMERROR | 詳細(xì)參見錯(cuò)誤列表 |
錯(cuò)誤描述 | err_code_des | 否 | String(128) | 系統(tǒng)錯(cuò)誤 | 結(jié)果信息描述 |
是否重調(diào) | recall | 是 | String(1) | Y | 是否需要繼續(xù)調(diào)用撤銷,Y-需要,N-不需要 |
# 請(qǐng)求示例
<xml>
<appid>wx2421b1c4370ec43b</appid>
<mch_id>10000100</mch_id>
<nonce_str>b7ffb16a7150cf08639db472c5f5bdae</nonce_str>
<out_trade_no>1415717424</out_trade_no>
<sign>9B2EA16C05A5CEF8E53B14D53932D012</sign>
</xml>
# 返回示例
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[o5bAKF3o2ypC8hwa]]></nonce_str>
<sign><![CDATA[6F5080EDDD196FFCDE53F786BBB93899]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<recall><![CDATA[N]]></recall>
</xml>
# 錯(cuò)誤碼
名稱 | 描述 | 原因 | 解決方案 |
---|---|---|---|
SYSTEMERROR | 接口返回錯(cuò)誤 | 系統(tǒng)超時(shí) | 請(qǐng)立即調(diào)用被掃訂單結(jié)果查詢API,查詢當(dāng)前訂單狀態(tài),并根據(jù)訂單的狀態(tài)決定下一步的操作。 |
INVALID_TRANSACTIONID | 無(wú)效transaction_id | 請(qǐng)求參數(shù)未按指引進(jìn)行填寫 | 參數(shù)錯(cuò)誤,請(qǐng)重新檢查 |
PARAM_ERROR | 參數(shù)錯(cuò)誤 | 請(qǐng)求參數(shù)未按指引進(jìn)行填寫 | 請(qǐng)根據(jù)接口返回的詳細(xì)信息檢查您的程序 |
REQUIRE_POST_METHOD | 請(qǐng)使用post方法 | 未使用post傳遞參數(shù) | 請(qǐng)檢查請(qǐng)求參數(shù)是否通過(guò)post方法提交 |
SIGNERROR | 簽名錯(cuò)誤 | 參數(shù)簽名結(jié)果不正確 | 請(qǐng)檢查簽名參數(shù)和方法是否都符合簽名算法要求 |
REVERSE_EXPIRE | 訂單無(wú)法撤銷 | 訂單有7天的撤銷有效期,過(guò)期將不能撤銷 | 請(qǐng)檢查需要撤銷的訂單是否超過(guò)可撤銷有效期 |
INVALID_REQUEST | 無(wú)效請(qǐng)求 | 商戶系統(tǒng)異常導(dǎo)致 | 請(qǐng)檢查商戶權(quán)限是否異常、重復(fù)請(qǐng)求支付、證書錯(cuò)誤、頻率限制等 |
TRADE_ERROR | 訂單錯(cuò)誤 | 業(yè)務(wù)錯(cuò)誤導(dǎo)致交易失敗 | 請(qǐng)檢查用戶賬號(hào)是否異常、被風(fēng)控、是否符合規(guī)則限制等 |
USERPAYING | 用戶支付中 | 用戶正在支付中的訂單不允許撤銷 | 用戶正在支付中的訂單不允許撤銷,請(qǐng)稍后再試 |
注意:這是一個(gè)后端接口
# 8、更新支付結(jié)果
# 更新支付結(jié)果updateWxpayfacePayResult
接口作用:商戶側(cè)確認(rèn)支付結(jié)果后通知人臉SDK更新支付結(jié)果,用戶確認(rèn)支付結(jié)果后返回,刷臉支付界面關(guān)閉
支持版本: 1.12及以上
# 請(qǐng)求參數(shù)
除公共參數(shù)外,
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
appid | 是 | string | 公眾號(hào) |
mch_id | 是 | string | 商戶號(hào) |
store_id | 是 | string | 門店編號(hào) |
authinfo | 是 | string | 調(diào)用憑證。獲取方式參見: get_wxpayface_authinfo |
payresult | 是 | string | 支付結(jié)果。可取值:SUCCESS : 支付成功ERROR : 支付失敗 |
# 返回參數(shù)
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | 是 | string | 錯(cuò)誤碼。公共定義見 公共錯(cuò)誤碼 |
return_msg | 是 | string(128) | 對(duì)錯(cuò)誤碼的描述 |
# 請(qǐng)求示例
// updateWxpayfacePayResult
const char* req = "{\"cmd\":\"updateWxpayfacePayResult\",\"version\":\"1\",\"now\":1540908003,\"appid\":\"wx97debaxyzabcca2\",\"mch_id\":\"1281087510\",\"store_id\":\"IMG001\",\"payresult\":\"SUCCESS\",\"authinfo\":\"0CSmor/Pp4vC7WE5CsJxet4Sg+D24C8eJxAMjjkBEl58hDLmofPunD+OX8v7JQyxUFmimUb9ai9cuPmGXC87MfStCOGaK/Fjb77DzF7nJgpwQhl8bdprPWKx6h04ZzPRQBlE6DAgcylr3CFSisWpMSUUmA9MtHAKD8fhzFeTEAgj0NK49DjIFZXczfZRgj8qUTRrajdJtO6gZMqlRgSwM83MP8xPG2lCO33nA5HsSMy/vh5ET5O3ubj+wpfMuD1fUj3HBy3YXxxGqFKjJV6dRwuMmAXnaTk0P0u3LSOWO7wiA6En/JgwVZvf9zkcCzq9OyJFrc+8QY6bQeuPWCe4E73n397jaD5fu8GqyokUlO/XytuYP2qcNWAol9vBpf3u2xWt/MobKjJcsDwsCxGFxtjWATRyU0fB9atI8GKGt9zxwWbMd0m6gleWWVGVOHxodNKJbWFP4rRKvPjG0nntZzX4SJ0q/7zevKzYQhU+F+q+ePvvgjKAcxnI5Jhaz/khkffQLw4YAaR7GuLZhHYeFPYEvzOXVk89+dJ/M7s1jZK4dtFa75U1Et9vn2bYtfourPpL3PA9oPPVVu2gPuq/S+WmBG6hCp0lq+/3P4png82cgLq6MNPhSwAq5YRqxlrHbfE3qk0qr/vXXSMbIOhfLWnKFdOyRv+3ohdQOC/8sdHbbSDcyQSprYZ+JREhz0W3qPKlHxlsbvSrpGNj9D4VxL4UXTnloq5KdwZoGSeBgvpNS5NPhXuU6u0cVMufUriKsxptftFu68cDzVv3hdu+1bYy/P9vffwSl01U2uJiTGErHqVMuILTNL==\"}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
printf("resp: %s len: %u\n", resp, len);
wxpayReleaseResponse(&resp);
}
/*
* resp: {"return_code":"SUCCESS","return_msg":"release success"} len: 56
*/
注意:
- ◆ 商戶側(cè)確認(rèn)支付結(jié)果后通知人臉SDK 更新支付結(jié)果,用戶確認(rèn)支付結(jié)果后返回,刷臉支付界面關(guān)閉
# 9、停止刷臉支付
# 停止刷臉支付stopWxpayface
接口作用:商戶側(cè)發(fā)起取消刷臉支付(按需調(diào)用),刷臉支付界面會(huì)關(guān)閉,僅在人臉憑證/付款碼face_code未返回前可用,face_code返回后不可停止
支持版本: 1.23及以上 注意: 需要更新 WxpayFaceSDK.dll,才能夠正常調(diào)用該接口
# 請(qǐng)求參數(shù)
除公共參數(shù)外,
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
appid | 是 | string | 公眾號(hào) |
mch_id | 是 | string | 商戶號(hào) |
authinfo | 是 | string | 調(diào)用憑證。獲取方式參見: get_wxpayface_authinfo |
# 返回參數(shù)
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | 是 | string | 錯(cuò)誤碼。公共定義見 公共錯(cuò)誤碼 |
return_msg | 是 | string(128) | 對(duì)錯(cuò)誤碼的描述 |
# 請(qǐng)求示例
// stopWxpayface
const char* req = "{\"cmd\":\"stopWxpayface\",\"version\":\"1\",\"now\":1540908003,\"appid\":\"wx97debaxyzabcca2\",\"mch_id\":\"1281087510\",\"authinfo\":\"0CSmor/Pp4vC7WE5CsJxet4Sg+D24C8eJxAMjjkBEl58hDLmofPunD+OX8v7JQyxUFmimUb9ai9cuPmGXC87MfStCOGaK/Fjb77DzF7nJgpwQhl8bdprPWKx6h04ZzPRQBlE6DAgcylr3CFSisWpMSUUmA9MtHAKD8fhzFeTEAgj0NK49DjIFZXczfZRgj8qUTRrajdJtO6gZMqlRgSwM83MP8xPG2lCO33nA5HsSMy/vh5ET5O3ubj+wpfMuD1fUj3HBy3YXxxGqFKjJV6dRwuMmAXnaTk0P0u3LSOWO7wiA6En/JgwVZvf9zkcCzq9OyJFrc+8QY6bQeuPWCe4E73n397jaD5fu8GqyokUlO/XytuYP2qcNWAol9vBpf3u2xWt/MobKjJcsDwsCxGFxtjWATRyU0fB9atI8GKGt9zxwWbMd0m6gleWWVGVOHxodNKJbWFP4rRKvPjG0nntZzX4SJ0q/7zevKzYQhU+F+q+ePvvgjKAcxnI5Jhaz/khkffQLw4YAaR7GuLZhHYeFPYEvzOXVk89+dJ/M7s1jZK4dtFa75U1Et9vn2bYtfourPpL3PA9oPPVVu2gPuq/S+WmBG6hCp0lq+/3P4png82cgLq6MNPhSwAq5YRqxlrHbfE3qk0qr/vXXSMbIOhfLWnKFdOyRv+3ohdQOC/8sdHbbSDcyQSprYZ+JREhz0W3qPKlHxlsbvSrpGNj9D4VxL4UXTnloq5KdwZoGSeBgvpNS5NPhXuU6u0cVMufUriKsxptftFu68cDzVv3hdu+1bYy/P9vffwSl01U2uJiTGErHqVMuILTNL==\"}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
printf("resp: %s len: %u\n", resp, len);
wxpayReleaseResponse(&resp);
}
/*
* resp: {"return_code":"SUCCESS","return_msg":"SUCCESS"} len: 48
*/
# 10、釋放資源
# 釋放資源releaseWxpayface
接口作用:釋放人臉服務(wù)。
接口使用規(guī)范:
- 聚合支付情況下:每次啟動(dòng)刷臉都需要initWxpayface,刷臉結(jié)束后需要調(diào)用releaseWxpayface(釋放攝像頭供其他刷臉支付平臺(tái)調(diào)用);
- 非聚合支付情況下:首次刷臉需要initWxpayface,刷臉結(jié)束后不需要調(diào)用releaseWxpayface,否則下次刷臉需要重新initWxpayface,影響啟動(dòng)耗時(shí);初始化之后第二次刷臉可以直接調(diào)用getWxpayfaceCode啟動(dòng)刷臉(在保證authinfo有效的情況下)。
支持版本: 1.12及以上
# 請(qǐng)求參數(shù)
僅公共參數(shù)
# 返回參數(shù)
參數(shù) | 必填 | 類型 | 說(shuō)明 |
---|---|---|---|
return_code | 是 | string | 錯(cuò)誤碼。公共定義見 公共錯(cuò)誤碼 |
return_msg | 是 | string(128) | 對(duì)錯(cuò)誤碼的描述 |
# 請(qǐng)求示例
// releaseWxpayface
const char* req = "{\"cmd\":\"releaseWxpayface\",\"version\":\"1\",\"now\":1540901425}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
printf("resp: %s len: %u\n", resp, len);
wxpayReleaseResponse(&resp);
}
/*
* resp: {"return_code":"SUCCESS","return_msg":"SUCCESS"} len: 48
*/