本文共 3754 字,大约阅读时间需要 12 分钟。
此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步
文章首发地址:
微信极速开发系列文章:上两篇文章介绍了微信以及
此篇文章具体来聊聊微信刷卡支付
刷卡支付-
详细文档介绍只需要简单了解流程
刷卡支付接入模式可分为:商户后台接入(提供给别人使用类似第三方)和门店接入(自己使用);区别就是支付结果多分发一次
。
根据用户是否需要输入支付密码可分为:免密模式和验密模式。
免密模式和验密模式两者的区别会在后面讲到
下面来讲讲具体实现
刷卡支付当中使用的支付接口为: 使用的是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"); Mapparams = 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); }
在中 测试访问地址为http://域名[/项目名称]/pay/micropay?auth_code=xxxxx
, 授权码auth_code
为微信客户端刷卡界面条形码上显示的数字。
(注:用户刷卡条形码规则:18位纯数字,以10、11、12、13、14、15开头)
不用扫码枪也可以测试,只是测试手动输入授权码麻烦一点(1分钟刷新一次),需要你快速输入授权码。扫码枪只是读取授权码并没有多做其他的事情。
我本地做端口映射测试的地址如下:
其中auth_code
值是谁便写的
http://域名/pay/micropay?auth_code=111
在浏览器中访问 返回结果如下:
刷卡支付超过5次就会提示输入密码
返回的err_code
为USERPAYING
此时支付结果就需要通过 接口来获取
这就是有密码与无密码的区别,有密码必须通过
查询订单
来获取支付结果,如果结果任然为USERPAYING
,则每隔5秒循环调用查询订单API
判断实际支付结果,如果用户取消支付或累计30秒用户都未支付,商户收银台退出查询流程后继续调用撤销订单API
撤销支付交易。
输入正确的auth_code
返回的结果如下:
1 1
使用场景描述
如果接入模式为商户后台接入 支付成功了微信支付系统就会将上面的
xml
数据返回给商户,商户再将支付结果回调给门店收银台,收银台继续处理业务逻辑如果接入模式-门店接入 支付成功了微信支付系统就会将上面的
xml
数据返回给收银台,收银台继续处理业务逻辑
码字完毕,以上就是微信刷卡支付的详细介绍。
欢迎留言、转发
微信极速开发系列文章:
此文章项目开源地址:
后续更新预告
1、微信红包 2、企业转账
转载地址:http://yjkzl.baihongyu.com/