您好,登錄后才能下訂單哦!
這篇文章主要介紹微信公眾號開發刷卡支付的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
場景介紹
步驟1:用戶選擇刷卡支付付款并打開微信,進入“我”->“錢包”->“刷卡”條碼界面
步驟2:收銀員在商戶系統操作生成支付訂單,用戶確認支付金額
步驟3:商戶收銀員用掃碼設備掃描用戶的條碼/二維碼,商戶收銀系統提交支付
步驟4:微信支付后臺系統收到支付請求,根據驗證密碼規則判斷是否驗證用戶的支付密碼,不需要驗證密碼的交易直接發起扣款,需要驗證密碼的交易會彈出密碼輸入框。支付成功后微信端會彈出成功頁面,支付失敗會彈出錯誤提示
詳細文檔介紹只需要簡單了解流程 點擊這里
刷卡支付接入模式可分為:商戶后臺接入(提供給別人使用類似第三方)和門店接入(自己使用);區別就是支付結果多分發一次
。
根據用戶是否需要輸入支付密碼可分為:免密模式和驗密模式。
支付金額>500元的交易需要驗證用戶支付密碼
用戶賬號每天最多有5筆交易可以免密,超過后需要驗證密碼
微信支付后臺判斷用戶支付行為有異常情況,符合免密規則的交易也會要求驗證密碼
免密模式和驗密模式兩者的區別會在后面講到
下面來講講具體實現
刷卡支付當中使用的支付接口為: 提交刷卡支付API 使用的是https
請求;不需要微信支付證書。
以下是具體實現代碼:com.javen.weixin.controller.WeixinPayController
中的micropay()
public void micropay(){ String url="https://api.mch.weixin.qq.com/pay/micropay"; String total_fee="1"; //授權碼 String auth_code = getPara("auth_code"); Map<String, String> params = new HashMap<String, String>(); params.put("appid", appid); params.put("mch_id", partner); params.put("device_info", "javen205");//終端設備號 params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); params.put("body", "刷卡支付測試"); // params.put("detail", "json字符串");//非必須 params.put("attach", "javen205");//附加參數非必須 String out_trade_no=System.currentTimeMillis()+""; params.put("out_trade_no", out_trade_no); params.put("total_fee", total_fee); String ip = IpKit.getRealIp(getRequest()); if (StrKit.isBlank(ip)) { ip = "127.0.0.1"; } params.put("spbill_create_ip", ip); params.put("auth_code", auth_code); String sign = PaymentKit.createSign(params, paternerKey); params.put("sign", sign); String xmlResult = HttpUtils.post(url, PaymentKit.toXml(params)); //同步返回結果 System.out.println("xmlResult:"+xmlResult); Map<String, String> result = PaymentKit.xmlToMap(xmlResult); String return_code = result.get("return_code"); if (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) { //通訊失敗 String err_code = result.get("err_code"); //用戶支付中,需要輸入密碼 if (err_code.equals("USERPAYING")) { //等待5秒后調用【查詢訂單API】https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_2 } renderText("通訊失敗>>"+xmlResult); return; } String result_code = result.get("result_code"); if (StrKit.isBlank(result_code) || !"SUCCESS".equals(result_code)) { //支付失敗 renderText("支付失敗>>"+xmlResult); return; } //支付成功 renderText(xmlResult); }
在開源項目weixin-guide中 測試訪問地址為http://域名[/項目名稱]/pay/micropay?auth_code=xxxxx
, 授權碼auth_code
為微信客戶端刷卡界面條形碼上顯示的數字。
(注:用戶刷卡條形碼規則:18位純數字,以10、11、12、13、14、15開頭)
不用掃碼槍也可以測試,只是測試手動輸入授權碼麻煩一點(1分鐘刷新一次),需要你快速輸入授權碼。掃碼槍只是讀取授權碼并沒有多做其他的事情。
我本地做端口映射測試的地址如下:
其中auth_code
值是誰便寫的http://域名/pay/micropay?auth_code=111
在瀏覽器中訪問
返回結果如下:
<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[您公眾號的appid]]></appid> <mch_id><![CDATA[您微信商戶號]]></mch_id> <device_info><![CDATA[javen205]]></device_info> <nonce_str><![CDATA[eXgczazQq54pqcyH]]></nonce_str> <sign><![CDATA[FF03DA0E58845CCE1FCC2166EC03FBE5]]></sign> <result_code><![CDATA[FAIL]]></result_code> <err_code><![CDATA[AUTH_CODE_INVALID]]></err_code> <err_code_des><![CDATA[請掃描微信支付被掃條碼/二維碼]]></err_code_des> </xml>
刷卡支付超過5次就會提示輸入密碼
返回的err_code
為USERPAYING
此時支付結果就需要通過 查詢訂單接口來獲取
這就是有密碼與無密碼的區別,有密碼必須通過
查詢訂單
來獲取支付結果,如果結果任然為USERPAYING
,則每隔5秒循環調用查詢訂單API
判斷實際支付結果,如果用戶取消支付或累計30秒用戶都未支付,商戶收銀臺退出查詢流程后繼續調用撤銷訂單API
撤銷支付交易。
輸入正確的auth_code
返回的結果如下:
<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[您公眾號的appid]]></appid> <mch_id><![CDATA[您微信商戶號]]></mch_id> <device_info><![CDATA[javen205]]></device_info> <nonce_str><![CDATA[Z9p14VPJ822ZTPXP]]></nonce_str> <sign><![CDATA[03BD421A33A5079A1BE6030E2EBA8291]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <openid><![CDATA[o_pncsidC-pRRfCP4zj98h7slREw]]></openid> <is_subscribe><![CDATA[Y]]></is_subscribe> <trade_type><![CDATA[MICROPAY]]></trade_type> <bank_type><![CDATA[CFT]]></bank_type> <total_fee>1</total_fee> <fee_type><![CDATA[CNY]]></fee_type> <transaction_id><![CDATA[4009682001201610156761057959]]></transaction_id> <out_trade_no><![CDATA[1476523316727]]></out_trade_no> <attach><![CDATA[javen205]]></attach> <time_end><![CDATA[20161015172058]]></time_end> <cash_fee>1</cash_fee> </xml>
使用場景描述
如果接入模式為商戶后臺接入 支付成功了微信支付系統就會將上面的
xml
數據返回給商戶,商戶再將支付結果回調給門店收銀臺,收銀臺繼續處理業務邏輯如果接入模式-門店接入 支付成功了微信支付系統就會將上面的
xml
數據返回給收銀臺,收銀臺繼續處理業務邏輯
以上是“微信公眾號開發刷卡支付的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。