微信公衆號開發之刷卡支付

此項目已開源歡迎Start、PR、發起Issues一塊兒討論交流共同進步
https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPayphp

微信極速開發系列文章:點擊這裏git

上兩篇文章介紹了微信公衆號支付以及微信掃碼支付github

此篇文章具體來聊聊微信刷卡支付json


刷卡支付-官方文檔api


場景介紹

  • 步驟1:用戶選擇刷卡支付付款並打開微信,進入「我」->「錢包」->「刷卡」條碼界面
  • 步驟2:收銀員在商戶系統操做生成支付訂單,用戶確認支付金額
  • 步驟3:商戶收銀員用掃碼設備掃描用戶的條碼/二維碼,商戶收銀系統提交支付
  • 步驟4:微信支付後臺系統收到支付請求,根據驗證密碼規則判斷是否驗證用戶的支付密碼,不須要驗證密碼的交易直接發起扣款,須要驗證密碼的交易會彈出密碼輸入框。支付成功後微信端會彈出成功頁面,支付失敗會彈出錯誤提示

商戶側流程


詳細文檔介紹只須要簡單瞭解流程 點擊這裏瀏覽器


刷卡支付接入模式可分爲:商戶後臺接入(提供給別人使用相似第三方)和門店接入(本身使用);區別就是支付結果多分發一次微信

根據用戶是否須要輸入支付密碼可分爲:免密模式和驗密模式。app

支付驗證密碼規則

  • 支付金額>500元的交易須要驗證用戶支付密碼
  • 用戶帳號天天最多有5筆交易能夠免密,超事後須要驗證密碼
  • 微信支付後臺判斷用戶支付行爲有異常狀況,符合免密規則的交易也會要求驗證密碼

免密模式和驗密模式二者的區別會在後面講到ide

下面來說講具體實現post

刷卡支付當中使用的支付接口爲: 提交刷卡支付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位純數字,以十、十一、十二、1三、1四、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_codeUSERPAYING

此時支付結果就須要經過 查詢訂單接口來獲取

這就是有密碼與無密碼的區別,有密碼必須經過查詢訂單來獲取支付結果,若是結果任然爲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-pRRfCP4zj98h6slREw]]></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數據返回給收銀臺,收銀臺繼續處理業務邏輯

刷卡支付.png

碼字完畢,以上就是微信刷卡支付的詳細介紹。

歡迎留言、轉發
微信極速開發系列文章:http://www.jianshu.com/p/a172a1b69fdd

此文章項目開源地址:極速開發微信公衆號-Start支持項目發展

後續更新預告 一、微信紅包 二、企業轉帳

相關文章
相關標籤/搜索