模式一
模式一開發(fā)前,商戶必須在公眾平臺后臺設(shè)置支付回調(diào)URL。URL實現(xiàn)的功能:接收用戶掃碼后微信支付系統(tǒng)回調(diào)的productid和openid;URL設(shè)置詳見回調(diào)地址設(shè)置。
業(yè)務(wù)流程時序圖
業(yè)務(wù)流程說明:
(1)商戶后臺系統(tǒng)根據(jù)微信支付規(guī)定格式生成二維碼(規(guī)則見下文),展示給用戶掃碼。
(2)用戶打開微信“掃一掃”掃描二維碼,微信客戶端將掃碼內(nèi)容發(fā)送到微信支付系統(tǒng)。
(3)微信支付系統(tǒng)收到客戶端請求,發(fā)起對商戶后臺系統(tǒng)支付回調(diào)URL的調(diào)用。調(diào)用請求將帶productid和用戶的openid等參數(shù),并要求商戶系統(tǒng)返回交易會話標識(prepay_id)
(4)商戶后臺系統(tǒng)收到微信支付系統(tǒng)的回調(diào)請求,根據(jù)productid生成商戶系統(tǒng)的訂單。
(5)商戶系統(tǒng)調(diào)用微信支付【統(tǒng)一下單API】請求下單,獲取交易會話標識(prepay_id)
(6)微信支付系統(tǒng)根據(jù)商戶系統(tǒng)的請求生成預(yù)支付交易,并返回交易會話標識(prepay_id)。
(7)商戶后臺系統(tǒng)得到交易會話標識prepay_id(2小時內(nèi)有效)。
(8)商戶后臺系統(tǒng)將prepay_id返回給微信支付系統(tǒng)。
(9)微信支付系統(tǒng)根據(jù)交易會話標識,發(fā)起用戶端授權(quán)支付流程。
(10)用戶在微信客戶端輸入密碼,確認支付后,微信客戶端提交支付授權(quán)。
(11)微信支付系統(tǒng)驗證后扣款,完成支付交易。
(12)微信支付系統(tǒng)完成支付交易后給微信客戶端返回交易結(jié)果,并將交易結(jié)果通過短信、微信消息提示用戶。微信客戶端展示支付交易結(jié)果頁面。
(13)微信支付系統(tǒng)通過發(fā)送異步消息通知商戶后臺系統(tǒng)支付結(jié)果。商戶后臺系統(tǒng)需回復(fù)接收情況,通知微信后臺系統(tǒng)不再發(fā)送該單的支付通知。
(14)未收到支付通知的情況,商戶后臺系統(tǒng)調(diào)用【查詢訂單API】。
(15)商戶確認訂單已支付后給用戶發(fā)貨。
生成二維碼規(guī)則
二維碼中的內(nèi)容為鏈接,形式為:
weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
其中XXXXX為商戶需要填寫的內(nèi)容,商戶將該鏈接生成二維碼,如需要打印發(fā)布二維碼,需要采用此格式。商戶可調(diào)用第三方庫生成二維碼圖片。參數(shù)說明如下:
表6.1 生成二維碼所需參數(shù)列表
名稱 | 變量名 | 類型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|---|
公眾賬號ID | appid | String(32) | 是 | wx8888888888888888 | 微信分配的公眾賬號ID |
商戶號 | mch_id | String(32) | 是 | 1900000109 | 微信支付分配的商戶號 |
時間戳 | time_stamp | String(10) | 是 | 1414488825 | 系統(tǒng)當前時間,定義規(guī)則詳見時間戳 |
隨機字符串 | nonce_str | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 隨機字符串,不長于32位。推薦隨機數(shù)生成算法 |
商品ID | product_id | String(32) | 是 | 88888 | 商戶定義的商品id 或者訂單號 |
簽名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 簽名,詳見簽名生成算法 |
舉例:
weixin://wxpay/bizpayurl?appid=wx2421b1c4370ec43b&mch_id=10000100&nonce_str=f6808210402125e30663234f94c87a8c&product_id=1&time_stamp=1415949957&sign=512F68131DD251DA4A45DA79CC7EFE9D
回調(diào)商戶支付URL
商戶提供的支付回調(diào)URL(回調(diào)地址設(shè)置)需要實現(xiàn)以下功能:接收用戶掃碼后微信支付系統(tǒng)發(fā)送的數(shù)據(jù),根據(jù)接收的數(shù)據(jù)生成支付訂單,調(diào)用【統(tǒng)一下單API】提交支付交易。
3.1 輸入?yún)?shù)(XML格式)
表6.2 輸入?yún)?shù)說明
名稱 | 變量名 | 類型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|---|
公眾賬號ID | appid | String(32) | 是 | wx8888888888888888 | 微信分配的公眾賬號ID |
用戶標識 | openid | String(128) | 是 | o8GeHuLAsgefS_80exEr1cTqekUs | 用戶在商戶appid下的唯一標識 |
商戶號 | mch_id | String(32) | 是 | 1900000109 | 微信支付分配的商戶號 |
是否關(guān)注公眾賬號 | is_subscribe | String(1) | 是 | Y | 用戶是否關(guān)注公眾賬號,僅在公眾賬號類型支付有效,取值范圍:Y或N;Y-關(guān)注;N-未關(guān)注 |
隨機字符串 | nonce_str | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 隨機字符串,不長于32位。推薦隨機數(shù)生成算法 |
商品ID | product_id | String(32) | 是 | 88888 | 商戶定義的商品id 或者訂單號 |
簽名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 返回數(shù)據(jù)簽名,簽名生成算法 |
3.2 輸出參數(shù)(XML格式)
表6.3 輸出參數(shù)說明
名稱 | 變量名 | 類型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|---|
返回狀態(tài)碼 | return_code | String(16) | 是 | SUCCESS | SUCCESS/FAIL,此字段是通信標識,非交易標識,交易是否成功需要查看result_code來判斷 |
返回信息 | return_msg | String(128) | 否 | 簽名失敗 | 返回信息,如非空,為錯誤原因;簽名失敗;具體某個參數(shù)格式校驗錯誤. |
公眾賬號ID | appid | String(32) | 是 | wx8888888888888888 | 微信分配的公眾賬號ID |
商戶號 | mch_id | String(32) | 是 | 1900000109 | 微信支付分配的商戶號 |
隨機字符串 | nonce_str | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 微信返回的隨機字符串 |
預(yù)支付ID | prepay_id | String(64) | 是 | wx201410272009395522657a690389285100 | 調(diào)用統(tǒng)一下單接口生成的預(yù)支付ID |
業(yè)務(wù)結(jié)果 | result_code | String(16) | 是 | SUCCESS | SUCCESS/FAIL |
錯誤描述 | err_code_des | String(128) | 否 | 當result_code為FAIL時,商戶展示給用戶的錯誤提 | |
簽名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 返回數(shù)據(jù)簽名,簽名生成算法 |