评论

付款码支付个人见解

付款码支付个人见解

场景介绍

1:用户选择刷卡支付付款并打开微信,进入“我”->“钱包”->“刷卡”条码界面

2:商户系统操作生成支付订单,用户确认支付金额

3:用扫码设备扫描用户的条码/二维码,商户收银系统提交支付

4:微信支付后台系统收到支付请求,根据验证密码规则判断是否验证用户的支付密码,不需要验证密码的交易直接发起扣款,需要验证密码的交易会弹出密码输入框。支付成功后微信端会弹出成功页面,支付失败会弹出错误提示

商户平台流程

详细文档介绍只需要简单了解流程 https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_4

刷卡支付接入模式可分为:商户后台接入(提供给别人使用类似第三方)和门店接入(自己使用);区别就是支付结果多分发一次。

根据用户是否需要输入支付密码可分为:免密模式和验密模式。

支付验证密码规则
支付金额>500元的交易需要验证用户支付密码
用户账号每天最多有5笔交易可以免密,超过后需要验证密码
微信支付后台判断用户支付行为有异常情况,符合免密规则的交易也会要求验证密码


下面来讲讲具体实现

刷卡支付当中使用的支付接口为: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10 使用的是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 params = new HashMap();
  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 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分钟刷新一次),需要你快速输入授权码。扫码枪只是读取授权码并没有多做其他的事情。

http://域名/pay/micropay?auth_code=111 在浏览器中访问

返回结果如下:

  

这就是有密码与无密码的区别,有密码必须通过查询订单来获取支付结果,如果结果任然为USERPAYING,则每隔5秒循环调用查询订单API判断实际支付结果,如果用户取消支付或累计30秒用户都未支付,商户收银台退出查询流程后继续调用撤销订单API撤销支付交易。

正确的auth_code 返回的结果如下:
  

接入模式

1.商户后台接入 支付成功了微信支付系统就会将上面的xml数据返回给商户,商户再将支付结果回调给门店收银台,收银台继续处理业务逻辑。

2.门店接入 支付成功了微信支付系统就会将上面的xml数据返回给收银台,收银台继续处理业务逻辑。

以上就是个人对刷卡支付的一些介绍。


最后一次编辑于  2021-04-28  
点赞 1
收藏
评论

1 个评论

  • Memory
    Memory
    2021-04-29
    支付验证密码规则是>1000元哦
    
    2021-04-29
    赞同
    回复
登录 后发表内容