微信开发之刷卡支付
2017-01-04 20:51
302 查看
此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步
https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPay
文章首发地址:http://www.jianshu.com/p/ef6c9c5c5807
微信极速开发系列文章:点击这里
上两篇文章介绍了微信公众号支付以及微信扫码支付
此篇文章具体来聊聊微信刷卡支付
刷卡支付-官方文档
步骤2:收银员在商户系统操作生成支付订单,用户确认支付金额
步骤3:商户收银员用扫码设备扫描用户的条码/二维码,商户收银系统提交支付
步骤4:微信支付后台系统收到支付请求,根据验证密码规则判断是否验证用户的支付密码,不需要验证密码的交易直接发起扣款,需要验证密码的交易会弹出密码输入框。支付成功后微信端会弹出成功页面,支付失败会弹出错误提示
刷卡支付接入模式可分为:商户后台接入(提供给别人使用类似第三方)和门店接入(自己使用);
根据用户是否需要输入支付密码可分为:免密模式和验密模式。
用户账号每天最多有5笔交易可以免密,超过后需要验证密码
微信支付后台判断用户支付行为有异常情况,符合免密规则的交易也会要求验证密码
免密模式和验密模式两者的区别会在后面讲到
下面来讲讲具体实现
刷卡支付当中使用的支付接口为: 提交刷卡支付API 使用的是
以下是具体实现代码:
在开源项目weixin-guide中 测试访问地址为
(注:用户刷卡条形码规则:18位纯数字,以10、11、12、13、14、15开头)
我本地做端口映射测试的地址如下:
其中
返回结果如下:
刷卡支付超过5次就会提示输入密码
返回的
此时支付结果就需要通过 查询订单接口来获取
这就是有密码与无密码的区别,有密码必须通过
输入正确的
使用场景描述
如果接入模式为商户后台接入 支付成功了微信支付系统就会将上面的
如果接入模式-门店接入 支付成功了微信支付系统就会将上面的
码字完毕,以上就是微信刷卡支付的详细介绍。
欢迎留言、转发
微信极速开发系列文章:http://www.jianshu.com/p/a172a1b69fdd
此文章项目开源地址:极速开发微信公众号-Start支持项目发展
后续更新预告
1、微信红包
2、企业转账
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()
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); }" data-snippet-id="ext.a1fb98589dbfcb256431b5dc9a73624b" data-snippet-saved="false" data-codota-status="done">[code]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在浏览器中访问
返回结果如下:
" data-snippet-id="ext.857e8907e689b7ab223f3c41c439d642" data-snippet-saved="false" data-codota-status="done">[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[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_code为
USERPAYING
此时支付结果就需要通过 查询订单接口来获取
这就是有密码与无密码的区别,有密码必须通过
查询订单来获取支付结果,如果结果任然为
USERPAYING,则每隔5秒循环调用
查询订单API判断实际支付结果,如果用户取消支付或累计30秒用户都未支付,商户收银台退出查询流程后继续调用
撤销订单API撤销支付交易。
输入正确的
auth_code返回的结果如下:
1 1 " data-snippet-id="ext.a820f3e7d880a80a5fcee62c7ede4470" data-snippet-saved="false" data-codota-status="done">[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、企业转账
相关文章推荐
- 微信刷卡支付开发-公众号支付开发-视频教程8
- Android微信刷卡支付开发
- C#微信开发之旅(十):APP预支付及支付参数生成(V2)
- 微信开发——申请微信支付功能及支付环境设置
- 微信开发-支付
- 微信H5支付开发指南
- 微信商户开发文档之扫码支付
- 微信新增刷卡功能 微信二维码支付回归?
- jsapi h5 内网页微信支付开发
- java开发微信支付(刷卡支付)
- 微信支付——调用微信客户端支付之【服务端】开发详解
- 微信支付开发 c# SDK JSAPI支付开发的流程和微信大坑
- 微信开发——熟悉支付流程
- 微信二维码支付native原生支付开发模式二
- 记微信公众平台开发之V3版微信native原生支付功能开发
- .Net C# 微信刷卡支付接口
- 微信支付——调用微信客户端支付之【服务端】开发详解
- 微信开发----支付
- 微信公众服务号申请、认证(开通支付)-微信开发图文教程
- 微信app支付php开发