微信刷卡支付

开始介绍之前,首先补充说明一下微信支付的几种方式:

1、刷卡支付

刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。

2、扫码支付

扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

3、公众号支付

公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:

◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付

◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付

◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

4、APP支付

APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。

本次开发为一款基于Android系统的自助收银项目,为线下支付场景,故使用 刷卡支付 的方式。

首先要说的是,刷卡支付不同于APP支付,是要在 微信公众平台 申请并审核信息的。

微信公众平台 (https://mp.weixin.qq.com/) 微信刷卡支付开发文档 (https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=2_1)

好了,以上为篇外信息,以下才是开发中的重点:

微信刷卡支付开发文档中提供的SDK和Demo是java版的,也就是说,是服务器版本项目代码,并非Android项目。所以说,如果想方便开发,应在后台实现支付功能的前提下,Android端只需要使用接口提供参数就可以了。但是,如果没有后台,想让Android项目实现整个流程怎么办 。。。移植修改sdk的代码!这就是本文的中心。

用studio打开demo后(编译不了),重点在两个类,WXPay 和 ScanPayBusiness。前者是初始化参数,包括 在公众平台上申请的key、appID、mchID等信息,还有就是证书(.p12格式),微信支付采用的https。后者为整个被扫支付业务逻辑,逻辑无需调整,直接copy过来即可。需要移植的代码如下:

对了,还有重要一点,demo中的网络请求是httpclient,但Android现在已经不推荐使用了,故需要使用自己的网络框架。本项目采用的Retrofit。说到这儿,就需要排一下坑了,有关于.p12格式证书解析的。网上有关这个问题的回答不多,而且每个都不太相同,除了一点:都YD没用!!!本人尝试了很多种方法,都没在Android代码中解析成功。最后 ,,,怎么调试成功的我也忘了,反正有一点结论:在java服务器解析证书的代码跟Android上的有微小区别。直接上代码: 证书解析代码

网络代码调试完毕后,只需要在 ScanPayBusiness 的 run 方法中找到相关网络操作,替换掉就可以了。

整个被扫支付涉及三个接口:提交刷卡支付、查询订单、撤销订单。

最后,补充一些小东西:

  1. 当调试 提交刷卡支付接口 过程中,若返回订单信息有误先关错误码。可借用支付接口调试工具 。对比生成的签名和自己log信息中生成的签名是否一致,若不一致则代码有问题。排坑:检查一下数据bean生成签名的时候,打印bean.toMap会发现莫名其妙的多了一个字段:serialVersionUID 序列化ID。

  2. 微信付款码规则: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1

    用户刷卡条形码规则:18位纯数字,以10、11、12、13、14、15开头

    支付宝付款码规则:https://support.open.alipay.com/support/announcementDetail.htm?spm=a219a.7386793.0.0.5MK6mY&id=25251

    支付宝将会在2017年9月底对支付宝的用户付款码做升级处理。付款码将由原来的28开头扩充到25-30开头,长度由原来的 16-18位扩充到16-24位。

    第一次写文章,肯定有众多不足,请见谅 ~