微信支付和支付宝支付,几乎垄断了移动支付业务的市场。项目上最近也上线了有关微信支付的模块,虽然开发很简单,可是由于和钱相关,作方案时要谨慎再谨慎。
项目背景是,咱们给客户食堂作了一款微信小程序,员工能够基于我的的一卡通登陆使用和消费。此次他们要增长给一卡通充值的功能。一卡通就相似于咱们大学时候的学生证,可用来吃饭消费,你们天天都要用,因此微信充值的频率还算比较高。
这个项目实际开发了两天,但前先后后的配合工做持续了快半年,我以为挺典型的,在此作一下记录。php
客户是典型国企的氛围,财务部通常都是手动作帐,要想让各级领导接受微信支付,前期要作不少工做。前端
微信支付须要先开通绑定银行的商户号,可是开通商户号通常须要企业的法人拿相关的营业执照去办理,因此这部分工做想一想都难。协调集团董事长,财务和业务部门,几个月就过去了。程序员
通过微信支付的全部费用,腾讯公司会从中抽取 0.6%的手续费。这个其实也不算很高,可是客户领导仍是很慎重,又考虑了一个月。咱们甚至于作了两个版本:一个版本是三菱公司承担这笔手续费,员工充值100元,实际到帐100元;另外一个版本是在界面上提示让员工本身承担手续费,员工充值100元,实际到帐99.4元。他们采用了后者。web
各级领导最关心,绝对就是微信支付的安全性了吧,因此前期保障安全的技术方案要作好,要是再弄个方便给领导汇报的ppt就更好了。数据库
微信支付官方开发文档十分详细,我这里就列几个我经常使用的吧。小程序
固然还有一些退款、发送帐单等api,只不过咱们此次没有这些需求,就没用上。后端
通常来讲,你没有考虑到的地方,每每最容易出问题。我记下我遇到的和我能想到的,可能会出现问题的点,后续若是还有再补充。微信小程序
在 3.2 中的流程操做,咱们要考虑若是执行了一半,咱们的服务器或者数据库故障,致使操做步骤中断了怎么办。例如执行到了步骤3,用户已经付过钱了,由于服务器宕机,步骤4中的充值操做就没了。
强烈建议在本地也建一个中间表,记录每一笔微信订单,并在每一步操做实时更新订单状态。而后再写一个轮询的脚本,当发现问题订单时,能够作出补救措施。还能够经过该中间表作一些前端报表页面,相关用户能够追溯到每笔订单的履历。api
微信官方提供的api也多是会有问题的,我就遇到过。例如“3. 小程序调起支付API”中,在支付成功的回调函数里面,会去调用后端入帐的接口。但是我就遇到过一个订单,用户在支付成功后,没有触发回调函数,致使扣了钱,却没有完成一卡通的实际入帐。有多是用户手机的问题,当时没办法调起微信客户端的支付API,有多是网络波动致使的问题,甚至于,也有多是微信官方API的bug。安全
咱们一切要作最坏的打算,在基于已经有了订单中间表后,轮询的脚本就能捕捉全部未支付的订单。经过“2. (后端)查订单”接口查询订单状态,若是订单支付成功的,就作一卡通的入帐,若是订单支付失败或者并未支付的,则关闭订单。
以咱们如今的方案,针对某次微信订单的入帐操做就有两个了。一个是成功支付后的回调函数,触发入帐操做;另外一个是轮询脚本用于补救的入帐。若是你的方案存在并发的风险,就要考虑事务锁,不然可能微信付款100元,一卡通到帐的倒是200元。
若是接口部署的服务器是集群,那还要考虑分布式的事务。千万别觉得成功回调触发的支付接口,就比轮询的接口执行的早,这两个接口被分配到集群的随机节点上,不一样服务器节点上的线程等待时间也不一致。我就遇到过一个成功回调触发的支付接口,在weblogic一个节点上卡了10分钟才执行,而轮询的接口被分配在另外一个节点上,早就执行完了。
也许有些人对这个“财务对帐”这个过程感到奇怪,但你绝对会印象深入,bug严重的话,程序员真的会被“祭天”。财务会对微信充值的每一笔钱作比对,不要小看平时测试的几块钱的脏数据,对帐那一天,每块钱的差别都要讲清前因后果。
因此,在项目方案设计的时候,必定要作好支付流水的记录。详细再详细,例如手续费要单独作字段记录,不然由于政策上的变动,有的手续费扣了,有的没扣,在财务面前没办法说的清。