關鍵字:微信支付、動態native支付、掃碼支付、掃碼支付模式二、統一支付
一、支付場景
用戶掃描商戶展示在各種場景的二維碼進行支付。
步驟1:商戶根據微信支付的規則,為不同商品生成不同的二維碼(如圖1.1),展示在各種場景,用於用戶掃描購買。
步驟2:用戶使用微信“掃一掃”(如圖1.2)掃描二維碼后,獲取商品支付信息,引導用戶完成支付(如圖1.3)。
圖1.1支付二維碼 圖1.2打開微信掃一掃 圖1.3 支付確認頁面
步驟(3):用戶確認支付,輸入支付密碼(如圖1.4)。
步驟(4):支付完成后會提示用戶支付成功(如圖1.5),商戶后台得到支付成功的通知,然后進行發貨處理。
圖1.4用戶確認支付,輸入密碼 圖1.5 支付成功提示
二、參數格式
發送和接收參數格式均為XML格式。
三、簽名算法
第一步,設所有發送或者接收到的數據為集合M,將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規則:
◆ 參數名ASCII碼從小到大排序(字典序);
◆ 如果參數的值為空不參與簽名;
◆ 參數名區分大小寫;
◆ 驗證調用返回或微信主動通知簽名時,傳送的sign參數不參與簽名,將生成的簽名與該sign值作校驗。
◆ 微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,並對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換為大寫,得到sign值signValue。
key設置路徑:微信商戶平台(pay.weixin.qq.com)-->賬戶設置-->API安全-->密鑰設置
四、調用流程
商戶后台系統調用微信支付【統一下單API】生成預付交易,將接口返回的鏈接生成二維碼,用戶掃碼后輸入密碼完成支付交易。
用戶支付后,微信將支付結果通知到【統一下單API】中配置的notify_url鏈接地址,商戶后台系統拿到支付結果后做相應的訂單狀態變更。
商戶后台可根據訂單號或者微信訂單號,調用【訂單查詢API】查詢訂單支付狀態。
注意:該模式的預付單有效期為2小時,過期后無法支付。
五、統一下單
1.接口鏈接
https://api.mch.weixin.qq.com/pay/unifiedorder
2.是否需要證書
否
3.請求參數
注:以下只列出了關鍵參數
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
公眾賬號ID |
appid |
是 |
String(32) |
wxd678efh567hg6787 |
微信支付分配的公眾賬號ID(企業號corpid即為此appId) |
商戶號 |
mch_id |
是 |
String(32) |
1230000109 |
微信支付分配的商戶號 |
隨機字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
隨機字符串,長度要求在32位以內。推薦隨機數生成算法 |
簽名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
通過簽名算法計算得出的簽名值,詳見簽名生成算法 |
簽名類型 |
sign_type |
否 |
String(32) |
HMAC-SHA256 |
簽名類型,默認為MD5,支持HMAC-SHA256和MD5。 |
商品描述 |
body |
是 |
String(128) |
騰訊充值中心-QQ會員充值 |
商品簡單描述,該字段請按照規范傳遞,具體請見參數規定 |
商戶訂單號 |
out_trade_no |
是 |
String(32) |
20150806125346 |
商戶系統內部訂單號,要求32個字符內、且在同一個商戶號下唯一 |
標價金額 |
total_fee |
是 |
Int |
88 |
訂單總金額,單位為分 |
終端IP |
spbill_create_ip |
是 |
String(16) |
123.12.12.123 |
APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。 |
通知地址 |
notify_url |
是 |
String(256) |
http://www.weixin.qq.com/wxpay/pay.php |
異步接收微信支付結果通知的回調地址,通知url必須為外網可訪問的url,不能攜帶參數。 |
交易類型 |
trade_type |
是 |
String(16) |
NATIVE |
取值如下:JSAPI,NATIVE,APP等 |
商品ID |
product_id |
否 |
String(32) |
12235413214070356458058 |
trade_type=NATIVE時(即掃碼支付),此參數必傳。此參數為二維碼中包含的商品ID,商戶自行定義。 |
.... |
4.返回參數
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
返回狀態碼 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL此字段是通信標識,非交易標識,交易是否成功需要查看result_code來判斷 |
返回信息 |
return_msg |
否 |
String(128) |
簽名失敗 |
返回信息,如非空,為錯誤原因 簽名失敗 參數格式校驗錯誤 |
以下字段在return_code為SUCCESS的時候有返回
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
公眾賬號ID |
appid |
是 |
String(32) |
wx8888888888888888 |
調用接口提交的公眾賬號ID |
商戶號 |
mch_id |
是 |
String(32) |
1900000109 |
調用接口提交的商戶號 |
設備號 |
device_info |
否 |
String(32) |
013467007045764 |
自定義參數,可以為請求支付的終端設備號等 |
隨機字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
微信返回的隨機字符串 |
簽名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
微信返回的簽名值,詳見簽名算法 |
業務結果 |
result_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL |
錯誤代碼 |
err_code |
否 |
String(32) |
SYSTEMERROR |
|
錯誤代碼描述 |
err_code_des |
否 |
String(128) |
系統錯誤 |
錯誤信息描述 |
以下字段在return_code 和result_code都為SUCCESS的時候有返回
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
交易類型 |
trade_type |
是 |
String(16) |
JSAPI |
交易類型,取值為:JSAPI,NATIVE,APP等 |
預支付交易會話標識 |
prepay_id |
是 |
String(64) |
wx201410272009395522657a690389285100 |
|
二維碼鏈接 |
code_url |
否 |
String(64) |
weixin://wxpay/s/An4baqw |
trade_type為NATIVE時有返回,用於生成二維碼,展示給用戶進行掃碼支付 |
5.示例代碼
六、支付結果通知
1.說明
支付完成后,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。
對后台通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,微信會通過一定的策略定期重新發起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。(通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)
注意:
同樣的通知可能會多次發送給商戶系統。商戶系統必須能夠正確處理重復的通知。
特別提醒:商戶系統對於支付結果通知的內容一定要做簽名驗證,並校驗返回的訂單金額是否與商戶側的訂單金額一致,防止數據泄漏導致出現“假通知”,造成資金損失。
2.接口鏈接
【統一下單API】中提交的參數notify_url,如果鏈接無法訪問,商戶將無法接收到微信通知。
注意:
通知url必須為直接可訪問的url,不能攜帶參數。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”。
3.是否需要證書
否
4.通知參數
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
返回狀態碼 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL此字段是通信標識,非交易標識,交易是否成功需要查看result_code來判斷 |
返回信息 |
return_msg |
否 |
String(128) |
簽名失敗 |
返回信息,如非空,為錯誤原因 簽名失敗 參數格式校驗錯誤 |
以下字段在return_code為SUCCESS的時候有返回
注:以下只列出了關鍵參數
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
公眾賬號ID |
appid |
是 |
String(32) |
wxd678efh567hg6787 |
微信支付分配的公眾賬號ID(企業號corpid即為此appId) |
商戶號 |
mch_id |
是 |
String(32) |
1230000109 |
微信支付分配的商戶號 |
隨機字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
隨機字符串,長度要求在32位以內。推薦隨機數生成算法 |
簽名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
通過簽名算法計算得出的簽名值,詳見簽名生成算法 |
簽名類型 |
sign_type |
否 |
String(32) |
HMAC-SHA256 |
簽名類型,默認為MD5,支持HMAC-SHA256和MD5。 |
業務結果 |
result_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL |
錯誤代碼 |
err_code |
否 |
String(32) |
SYSTEMERROR |
|
錯誤代碼描述 |
err_code_des |
否 |
String(128) |
系統錯誤 |
錯誤信息描述 |
用戶標識 |
openid |
是 |
String(128) |
wxd930ea5d5a258f4f |
用戶在商戶appid下的唯一標識 |
交易類型 |
trade_type |
是 |
String(16) |
JSAPI |
JSAPI、NATIVE、APP |
付款銀行 |
bank_type |
是 |
String(16) |
CMC |
銀行類型,采用字符串類型的銀行標識 |
訂單金額 |
total_fee |
是 |
Int |
100 |
訂單總金額,單位為分 |
現金支付金額 |
cash_fee |
是 |
Int |
100 |
現金支付金額訂單現金支付金額 |
微信支付訂單號 |
transaction_id |
是 |
String(32) |
1217752501201407033233368018 |
微信支付訂單號 |
商戶訂單號 |
out_trade_no |
是 |
String(32) |
20150806125346 |
商戶系統的訂單號,與請求一致。 |
... |
5.返回參數
商戶處理后同步返回給微信參數:
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
返回狀態碼 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL SUCCESS表示商戶接收通知成功並校驗成功 |
返回信息 |
return_msg |
否 |
String(128) |
OK |
返回信息,如非空,為錯誤原因: 簽名失敗 參數格式校驗錯誤 |
七、訂單查詢
1.使用場景
該接口提供所有微信支付訂單的查詢,商戶可以通過查詢訂單接口主動查詢訂單狀態,完成下一步的業務邏輯。
需要調用查詢接口的情況:
◆ 當商戶后台、網絡、服務器等出現異常,商戶系統最終未接收到支付通知;
◆ 調用支付接口后,返回系統錯誤或未知交易狀態情況;
◆ 調用被掃支付API,返回USERPAYING的狀態;
◆ 調用關單或撤銷接口API之前,需確認支付狀態;
2.接口鏈接
https://api.mch.weixin.qq.com/pay/orderquery
3.是否需要證書
否
4.請求參數
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
公眾賬號ID |
appid |
是 |
String(32) |
wxd678efh567hg6787 |
微信支付分配的公眾賬號ID(企業號corpid即為此appId) |
商戶號 |
mch_id |
是 |
String(32) |
1230000109 |
微信支付分配的商戶號 |
微信支付訂單號 |
transaction_id |
二選一 |
String(32) |
1217752501201407033233368018 |
微信的訂單號,建議優先使用 |
商戶訂單號 |
out_trade_no |
String(32) |
20150806125346 |
商戶系統內部的訂單號,請確保在同一商戶號下唯一。 |
|
隨機字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
隨機字符串,長度要求在32位以內。推薦隨機數生成算法 |
簽名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
通過簽名算法計算得出的簽名值,詳見簽名生成算法 |
簽名類型 |
sign_type |
否 |
String(32) |
HMAC-SHA256 |
簽名類型,默認為MD5,支持HMAC-SHA256和MD5。 |
5.返回參數
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
返回狀態碼 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL SUCCESS表示商戶接收通知成功並校驗成功 |
返回信息 |
return_msg |
否 |
String(128) |
簽名失敗 |
返回信息,如非空,為錯誤原因: 簽名失敗 參數格式校驗錯誤 |
以下字段在return_code為SUCCESS的時候有返回
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
公眾賬號ID |
appid |
是 |
String(32) |
wx8888888888888888 |
調用接口提交的公眾賬號ID |
商戶號 |
mch_id |
是 |
String(32) |
1900000109 |
調用接口提交的商戶號 |
隨機字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
|
簽名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
微信返回的簽名值,詳見簽名算法 |
業務結果 |
result_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL |
錯誤代碼 |
err_code |
否 |
String(32) |
SYSTEMERROR |
錯誤碼 |
錯誤代碼描述 |
err_code_des |
否 |
String(128) |
系統錯誤 |
錯誤信息描述 |
以下字段在return_code 、result_code、trade_state都為SUCCESS時有返回 ,如trade_state不為 SUCCESS,則只返回out_trade_no(必傳)和attach(選傳)。
注:以下只列出了關鍵參數
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
設備號 |
device_info |
否 |
String(32) |
013467007045764 |
微信支付分配的終端設備號 |
用戶標識 |
openid |
是 |
String(128) |
oUpF8uMuAJO_M2pxb1Q9zNjWeS6o |
用戶在商戶appid下的唯一標識 |
交易類型 |
trade_type |
是 |
String(16) |
JSAPI |
調用接口提交的交易類型,取值如下:JSAPI,NATIVE,APP,MICROPAY |
交易狀態 |
trade_state |
是 |
String(32) |
SUCCESS |
SUCCESS—支付成功 REFUND—轉入退款 NOTPAY—未支付 CLOSED—已關閉 REVOKED—已撤銷(刷卡支付) USERPAYING--用戶支付中 PAYERROR--支付失敗(其他原因,如銀行返回失敗) |
標價金額 |
total_fee |
是 |
Int |
100 |
訂單總金額,單位為分 |
現金支付金額 |
cash_fee |
是 |
Int |
100 |
現金支付金額訂單現金支付金額 |
微信支付訂單號 |
transaction_id |
是 |
String(32) |
1217752501201407033233368018 |
微信的訂單號,建議優先使用 |
商戶訂單號 |
out_trade_no |
是 |
String(32) |
20150806125346 |
商戶系統的訂單號,與請求一致 |
交易狀態描述 |
trade_state_desc |
是 |
String(256) |
支付失敗,請重新下單支付 |
對當前查詢訂單狀態的描述和下一步操作的指引 |
... |
6.示例代碼