首頁  >  文章  >  微信小程式  >  分享微信公眾號開發刷卡支付的實例教程

分享微信公眾號開發刷卡支付的實例教程

零下一度
零下一度原創
2017-05-19 16:02:462791瀏覽

歡迎留言、轉發

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

#場景介紹

  • 步驟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_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

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

【相關推薦】

1.

微信公眾號平台源碼下載

#2. 

小豬cms(PigCms)微電商系統營運版(獨立微店商城+三級分銷系統)

3.

微信投票源碼#

以上是分享微信公眾號開發刷卡支付的實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn