微信开发之刷卡支付

此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步
https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPay

文章首发地址:http://www.jianshu.com/p/ef6c9c5c5807
微信极速开发系列文章:点击这里

上两篇文章介绍了微信公众号支付以及微信扫码支付

此篇文章具体来聊聊微信刷卡支付



刷卡支付-官方文档


场景介绍

  • 步骤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数据返回给收银台,收银台继续处理业务逻辑

码字完毕,以上就是微信刷卡支付的详细介绍。

欢迎留言、转发

微信极速开发系列文章:http://www.jianshu.com/p/a172a1b69fdd

此文章项目开源地址:极速开发微信公众号-Start支持项目发展

后续更新预告
1、微信红包
2、企业转账

时间: 2024-09-22 02:08:47

微信开发之刷卡支付的相关文章

微信支付开发(8) 刷卡支付

关键字:微信支付 微信支付v3 刷卡支付 统一支付 prepay_id 作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/wxpayv3-micropay.html    本文介绍微信支付下的刷卡支付的开发过程.刷卡支付是指用户打开微信钱包的刷卡的界面,商户扫码后提交完成支付的支付过程.     一.刷卡支付API 接口地址 https://api.mch.weixin.qq.com/pay/micropay 是否需要证书 不需要. 输入参数 名称 变量名

微信刷卡支付开发问题

问题描述 微信刷卡支付开发问题 本人直接下载的SDK中.NET版本DEMO,本人对config.cs中必要的参数作了相应的修改, /* 微信公众号信息配置 * APPID:绑定支付的APPID(必须配置) * MCHID:商户号(必须配置) * KEY:商户支付密钥,参考开户邮件设置(必须配置) * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置) 这些均按照申请后的信息作了确认,应该是没有问题的. 在DEMO中作"刷卡支付"时返回的信息为支付成功,手机微信也

缺乏电商基因的微信逆袭:普及刷卡支付 使用场景需要扩大

一位网络安全人士指出,"刷卡支付只有安全程度之分,也就是风险的高低,没有绝对的安全不安全." 9月14日晚,微信支付低调地在"钱包"模块中增加"刷卡"功能,支付方式由被叫停的主动扫码变为商户"反扫"模式. 技术不难,但便捷性和安全性二者间的平衡,将直接决定使用者对新支付方式的认同. 安全性是用户最大的要求,便捷性则要求使用场景的扩大,增加"刷卡"频率,进而培养用户习惯. 技术实现难度不大 在业内人士看来,&

微信刷卡支付,服务器Linux环境支付和退款都报错,curl(35)

问题描述 微信刷卡支付,服务器Linux环境支付和退款都报错,curl(35) 微信刷卡支付,服务器Linux环境支付和退款都报错,支付时请求时间过长,退款时报错 curl(35),gnutls_handshake() failed: GnuTLS internal error. 服务器环境为:LNMP, PHP版本是5.4 程序没有错误,在Windows环境下可以支付成功,也可以退款成功,求大神指导 解决方案 这个已经说得很明显了,gnutls内部错误,和你的程序没有关系,看下Linux下的配

微信开发之扫码支付

此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 https://github.com/Javen205/IJPay http://git.oschina.net/javen205/IJPay 文章首发地址:http://www.jianshu.com/p/474af73eb176 微信极速开发系列文章:http://www.jianshu.com/p/a172a1b69fdd 上一篇文章介绍了微信提供的那些支付方式以及公众号支付http://www.jianshu.com

微信开发之公众号支付

微信开发交流群:148540125 此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 https://github.com/Javen205/IJPay http://git.oschina.net/javen205/IJPay 首发地址:http://www.jianshu.com/p/cb2456a2d7a7 微信极速开发系列文章:http://www.jianshu.com/p/a172a1b69fdd 首先来看看微信支付都提供哪些支付方式如下图 官方文档 刷卡支付

火球网获千万美元A轮融资 微信钱包增刷卡功能

1.火球网获千万美元A轮融资:源码资本明势资本投资 9月12日,网贷债权交易平台火球网也完成了来自源码资本.明势资本的近千万美元A轮,同时还推出了用户间债权交易市场火球+. 现在,火球正式开启了三段进化,上线火球+之后,有机会成为一个承接全行业债权转让的二级市场--也就是说,火球想做的是一个互联网金融的"债市",而不是P2P式的"银行". 小新评:真是无巧不成书,"雪球" "火球"同一天获得融资,真是球字辈的好日子.这二球,一

小米MI Pay怎么刷卡支付,小米MI Pay两种刷卡方式介绍

MI Pay刷卡流程 相较于传统的刷卡方式,MI Pay更加便捷安全,手机就是银行卡. MI Pay的两种刷卡方式 1.息屏或锁屏状态下,双击Home键呼出MI Pay,选择需要使用的银行卡,根据提示验证指纹之后即可靠近POS刷卡.(注:6.8.22开发版及以后版本支持双击Home键唤起MI Pay) 2.在收银员设置好POS之后,将手机靠近POS的感应区,手机上会自动弹出MI Pay页面.选择需要使用的银行卡,根据提示验证指纹之后即可靠近POS刷卡. 小米MI Pay怎么刷卡支付,小米MI P

发展NFC手机刷卡支付已势不可挡

中介交易 SEO诊断 淘宝客 云主机 技术大厅 [大明世纪网]4月份看了一组艾瑞的调查数据:"2012年移动支付领域近场支付额占比仅为2.6%,而远程支付占比高达97.4%",一时间被寄予厚望的NFC近场支付遭到"口诛笔伐"竞争者更是抓住机会,贬低NFC近场支付.其实只要认识到是什么原因造成的,就知道NFC近场支付占比为什么会这么低了,笔者的<NFC近场支付的发展趋势>有具体分析原因,在此不赘述. NFC近场支付NFC是一种短距离的高频无线通信技术,允许