關鍵字:微信支付、動態native支付、掃碼支付、掃碼支付模式2、統一支付php
用戶掃描商戶展現在各類場景的二維碼進行支付。算法
步驟1:商戶根據微信支付的規則,爲不一樣商品生成不一樣的二維碼(如圖1.1),展現在各類場景,用於用戶掃描購買。api
步驟2:用戶使用微信「掃一掃」(如圖1.2)掃描二維碼後,獲取商品支付信息,引導用戶完成支付(如圖1.3)。安全
圖1.1支付二維碼 圖1.2打開微信掃一掃 圖1.3 支付確認頁面服務器
步驟(3):用戶確認支付,輸入支付密碼(如圖1.4)。微信
步驟(4):支付完成後會提示用戶支付成功(如圖1.5),商戶後臺獲得支付成功的通知,而後進行發貨處理。網絡
圖1.4用戶確認支付,輸入密碼 圖1.5 支付成功提示app
發送和接收參數格式均爲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小時,過時後沒法支付。
https://api.mch.weixin.qq.com/pay/unifiedorder
否
注:如下只列出了關鍵參數
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
公衆帳號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,商戶自行定義。 |
.... |
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
返回狀態碼 |
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時有返回,用於生成二維碼,展現給用戶進行掃碼支付 |
支付完成後,微信會把相關支付結果和用戶信息發送給商戶,商戶須要接收處理,並返回應答。
對後臺通知交互時,若是微信收到商戶的應答不是成功或超時,微信認爲通知失敗,微信會經過必定的策略按期從新發起通知,儘量提升通知的成功率,但微信不保證通知最終能成功。(通知頻率爲15/15/30/180/1800/1800/1800/1800/3600,單位:秒)
注意:
一樣的通知可能會屢次發送給商戶系統。商戶系統必須可以正確處理重複的通知。
特別提醒:商戶系統對於支付結果通知的內容必定要作簽名驗證,並校驗返回的訂單金額是否與商戶側的訂單金額一致,防止數據泄漏致使出現「假通知」,形成資金損失。
【統一下單API】中提交的參數notify_url,若是連接沒法訪問,商戶將沒法接收到微信通知。
注意:
通知url必須爲直接可訪問的url,不能攜帶參數。示例:notify_url:「https://pay.weixin.qq.com/wxpay/pay.action」。
否
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
返回狀態碼 |
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 |
商戶系統的訂單號,與請求一致。 |
... |
商戶處理後同步返回給微信參數:
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
返回狀態碼 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL SUCCESS表示商戶接收通知成功並校驗成功 |
返回信息 |
return_msg |
否 |
String(128) |
OK |
返回信息,如非空,爲錯誤緣由: 簽名失敗 參數格式校驗錯誤 |
該接口提供全部微信支付訂單的查詢,商戶能夠經過查詢訂單接口主動查詢訂單狀態,完成下一步的業務邏輯。
須要調用查詢接口的狀況:
◆ 當商戶後臺、網絡、服務器等出現異常,商戶系統最終未接收到支付通知;
◆ 調用支付接口後,返回系統錯誤或未知交易狀態狀況;
◆ 調用被掃支付API,返回USERPAYING的狀態;
◆ 調用關單或撤銷接口API以前,需確認支付狀態;
https://api.mch.weixin.qq.com/pay/orderquery
否
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
公衆帳號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。 |
字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
返回狀態碼 |
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) |
支付失敗,請從新下單支付 |
對當前查詢訂單狀態的描述和下一步操做的指引 |
... |