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


刷卡支付-官方文档


场景介绍

  • 步骤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_code 为USERPAYING

此时支付结果就需要通过 查询订单接口来获取

这就是有密码与无密码的区别,有密码必须通过查询订单来获取支付结果,如果结果任然为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数据返回给收银台,收银台继续处理业务逻辑

id="iframe_0.9135353676347038" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://upload-images.jianshu.io/upload_images/1342351-63bc02b8ed9b5361.png?imageMogr2/auto-orient/strip%257CimageView2/2/w/1240&_=5967440%22%20style=%22border:none;max-width:1576px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.9135353676347038',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; border-width: initial; border-style: none; width: 1576px;">

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

喜欢我的文章的,可以关注微信公众号“测试项目开发”,需要什么内容可以在里面提,我看到后会给大家解答。

微信公众号之刷卡支付相关推荐

  1. php早起打卡,微信公众号早起打卡挑战应用制作教程

    原标题:微信公众号早起打卡挑战应用制作教程 最近有很多公众号都推送了"早起打卡挑战"应用,粉丝可支付一定的金额参与早起打卡,若次日打卡则可获得支付金额+奖励金额,若忘记打卡则会被扣 ...

  2. vue 在微信公众号里使用支付宝支付(h5支付宝支付)

    vue 在微信公众号里使用支付宝支付(h5支付宝支付) 需求:在微信公众号里面支持支付宝支付. 思路:微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行支付宝网页或 ...

  3. 微信公众号中的支付宝支付与微信支付 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

  4. 微信公众号,关联网页支付功能(公众号支付)的实现

    公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付.应用场景有: 1. 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付 ...

  5. 支付宝支付功能实现原理,微信公众号中实现支付宝支付功能开发流程

    这篇文章使用一些简单的代码例子来解释微信接入支付宝支付功能的操作步骤,即使新手也可以轻松参透的. 第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口对 ...

  6. 微信公众号h5使用jsapi支付

    准备工作 准备好公众号及支付商户号相关的:appid,商户号id,appsecret,apikey(支付密钥v2),下载好api支付证书路径,公众号中配置好业务域名(前端与域名). 域名穿透内网 我使 ...

  7. 微信公众号 H5 通联支付

    参考:https://blog.csdn.net/caimingxian401/article/details/96993205 注意:必须使用 " setTimeout " 箭头 ...

  8. vue 调用共众url_vue单页面,在微信公众号支付中遇到的URL未注册BUG解决方法-Go语言中文社区...

    今天在做微信公众号支付的时候,遇到一个bug,在当前支付页面点击支付,就会报错,提示当前页面的URL未注册.如下图: 但是,这个URL我们是在后台微信公众号配置了的,所以说不会出错. 但是我们刷新一次 ...

  9. 微信公众号支付WeixinJSBridge

    微信公众号中直接发起支付 此前开发更具官方文档一直在使用,wx.chooseWXPay方法完成支付,WeixinJSBridge最开始开发微信的时候也有使用,但是经常出问题,支付不能发起,当时查找好的 ...

最新文章

  1. 第二个冲刺期的第七天
  2. 三藏一面:为什么要用 NoSQL
  3. 使用svnsync备份详解[转载+修改]
  4. Python 图像处理 - 用PIL库提取图片中的颜色并展示为色谱实例演示,RGB颜色排序方法
  5. Android无线调试出现错误的解决方法
  6. c语言 指针 a= amp b,c语言初学-引用和指针的异同点
  7. PHP yii 框架源码阅读(一)
  8. 选择交换机需要了解的一些性能参数
  9. Java 网络编程(二) 两类传输协议:TCP UDP
  10. final 数组 java_Java Final数组列表
  11. Mac上的Dock 栏如何设置更好用?
  12. ROS采坑日记(3)----在ROS下 编译ORB_SLAM2时遇到问题:[rosbuild] rospack found package ORB_SLAM2 at ........
  13. PHP 实现-多线程编程
  14. java银行叫号课程设计_课程设计-银行排队叫号机设计.doc
  15. 管中窥豹IIoT(一):工业物联网价值与解决方案通用模型
  16. 互联网消费金融---互联网金融原理与实务【郭勤贵......等人著】的学习
  17. Vue -Ts入门 (一)
  18. easyExcel实现单sheet多子表,并结合动态表头,复杂表头
  19. 海外直播、聊天交友APP的开发及上架GooglePlay体验【Compose版】
  20. uniapp实战项目 (仿知识星球App) - - 配置开发工具和全局css样式

热门文章

  1. H5+CSS3 背景图毛玻璃效果实现方案
  2. tabbar图片位置大小修改
  3. 微信小程序开发文档——开放能力
  4. c 语言中12u是多少,填空题总复习题及参考答案
  5. unity particle system 粒子系统 制作闪电放电效果
  6. Android模拟电子墨水屏,彩色电子墨水屏手机海信A5proCC使用体验
  7. 小飞鱼 通达OA二次开发网络课程 系列视频课程在CSDN发布
  8. 通过钉钉网页上的js学习xss打cookie
  9. ERROR! The server quit without updating PID file (/usr/local/mysql/data/
  10. 可用的公共RTSP地址