微信公眾號(hào)開(kāi)發(fā)之刷卡支付

歡迎留言、轉(zhuǎn)發(fā)

微信極速開(kāi)發(fā)系列文章:點(diǎn)擊這里

上兩篇文章介紹了微信公眾號(hào)支付以及微信掃碼支付

此篇文章具體來(lái)聊聊微信刷卡支付


刷卡支付-官方文檔


場(chǎng)景介紹

  • 步驟1:用戶(hù)選擇刷卡支付付款并打開(kāi)微信,進(jìn)入“我”->“錢(qián)包”->“刷卡”條碼界面
  • 步驟2:收銀員在商戶(hù)系統(tǒng)操作生成支付訂單,用戶(hù)確認(rèn)支付金額
  • 步驟3:商戶(hù)收銀員用掃碼設(shè)備掃描用戶(hù)的條碼/二維碼,商戶(hù)收銀系統(tǒng)提交支付
  • 步驟4:微信支付后臺(tái)系統(tǒng)收到支付請(qǐng)求,根據(jù)驗(yàn)證密碼規(guī)則判斷是否驗(yàn)證用戶(hù)的支付密碼,不需要驗(yàn)證密碼的交易直接發(fā)起扣款,需要驗(yàn)證密碼的交易會(huì)彈出密碼輸入框。支付成功后微信端會(huì)彈出成功頁(yè)面,支付失敗會(huì)彈出錯(cuò)誤提示

商戶(hù)側(cè)流程


詳細(xì)文檔介紹只需要簡(jiǎn)單了解流程 點(diǎn)擊這里


刷卡支付接入模式可分為:商戶(hù)后臺(tái)接入(提供給別人使用類(lèi)似第三方)和門(mén)店接入(自己使用);區(qū)別就是支付結(jié)果多分發(fā)一次

根據(jù)用戶(hù)是否需要輸入支付密碼可分為:免密模式和驗(yàn)密模式。

支付驗(yàn)證密碼規(guī)則

  • 支付金額>500元的交易需要驗(yàn)證用戶(hù)支付密碼
  • 用戶(hù)賬號(hào)每天最多有5筆交易可以免密,超過(guò)后需要驗(yàn)證密碼
  • 微信支付后臺(tái)判斷用戶(hù)支付行為有異常情況,符合免密規(guī)則的交易也會(huì)要求驗(yàn)證密碼

免密模式和驗(yàn)密模式兩者的區(qū)別會(huì)在后面講到

下面來(lái)講講具體實(shí)現(xiàn)

刷卡支付當(dāng)中使用的支付接口為: 提交刷卡支付API 使用的是https請(qǐng)求;不需要微信支付證書(shū)。

以下是具體實(shí)現(xiàn)代碼:
com.javen.weixin.controller.WeixinPayController中的micropay()

public void micropay(){
  String url="https://api.mch.weixin.qq.com/pay/micropay";
  
  String total_fee="1";
  //授權(quán)碼
  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");//終端設(shè)備號(hào)
  params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
  params.put("body", "刷卡支付測(cè)試");
//  params.put("detail", "json字符串");//非必須
  params.put("attach", "javen205");//附加參數(shù)非必須
  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));
  //同步返回結(jié)果
  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");
   //用戶(hù)支付中,需要輸入密碼
   if (err_code.equals("USERPAYING")) {
    //等待5秒后調(diào)用【查詢(xún)訂單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);
 }

開(kāi)源項(xiàng)目weixin-guide中 測(cè)試訪(fǎng)問(wèn)地址為http://域名[/項(xiàng)目名稱(chēng)]/pay/micropay?auth_code=xxxxx , 授權(quán)碼auth_code 為微信客戶(hù)端刷卡界面條形碼上顯示的數(shù)字。

(注:用戶(hù)刷卡條形碼規(guī)則:18位純數(shù)字,以10、11、12、13、14、15開(kāi)頭)

測(cè)試

不用掃碼槍也可以測(cè)試,只是測(cè)試手動(dòng)輸入授權(quán)碼麻煩一點(diǎn)(1分鐘刷新一次),需要你快速輸入授權(quán)碼。掃碼槍只是讀取授權(quán)碼并沒(méi)有多做其他的事情。

我本地做端口映射測(cè)試的地址如下:

其中auth_code 值是誰(shuí)便寫(xiě)的
http://域名/pay/micropay?auth_code=111 在瀏覽器中訪(fǎng)問(wèn)

返回結(jié)果如下:

<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[您公眾號(hào)的appid]]></appid>
<mch_id><![CDATA[您微信商戶(hù)號(hào)]]></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[請(qǐng)掃描微信支付被掃條碼/二維碼]]></err_code_des>
</xml>

刷卡支付超過(guò)5次就會(huì)提示輸入密碼

返回的err_codeUSERPAYING

此時(shí)支付結(jié)果就需要通過(guò) 查詢(xún)訂單接口來(lái)獲取

這就是有密碼與無(wú)密碼的區(qū)別,有密碼必須通過(guò)查詢(xún)訂單來(lái)獲取支付結(jié)果,如果結(jié)果任然為USERPAYING,則每隔5秒循環(huán)調(diào)用查詢(xún)訂單API判斷實(shí)際支付結(jié)果,如果用戶(hù)取消支付或累計(jì)30秒用戶(hù)都未支付,商戶(hù)收銀臺(tái)退出查詢(xún)流程后繼續(xù)調(diào)用撤銷(xiāo)訂單API撤銷(xiāo)支付交易。

輸入正確的auth_code 返回的結(jié)果如下:

<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[您公眾號(hào)的appid]]></appid>
<mch_id><![CDATA[您微信商戶(hù)號(hào)]]></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>

使用場(chǎng)景描述

如果接入模式為商戶(hù)后臺(tái)接入 支付成功了微信支付系統(tǒng)就會(huì)將上面的xml數(shù)據(jù)返回給商戶(hù),商戶(hù)再將支付結(jié)果回調(diào)給門(mén)店收銀臺(tái),收銀臺(tái)繼續(xù)處理業(yè)務(wù)邏輯

如果接入模式-門(mén)店接入 支付成功了微信支付系統(tǒng)就會(huì)將上面的xml數(shù)據(jù)返回給收銀臺(tái),收銀臺(tái)繼續(xù)處理業(yè)務(wù)邏輯

刷卡支付.png

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

歡迎留言、轉(zhuǎn)發(fā)
微信極速開(kāi)發(fā)系列文章:http://www.itdecent.cn/p/a172a1b69fdd

此文章項(xiàng)目開(kāi)源地址:極速開(kāi)發(fā)微信公眾號(hào)-Start支持項(xiàng)目發(fā)展

后續(xù)更新預(yù)告
1、微信紅包
2、企業(yè)轉(zhuǎn)賬

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容