写在前面:
具体对接请参考接口文档,对接文档写的会更详细,本文只探讨支付实现思路
支付流程:
基本上支付功能的对接都差不多,我把它简化为3步:
- 调用统一下单接口获取支付URL
- 诱导用户触发URL
- 支付成功回调函数
支付实现流程:
- 商户系统生成一个二维码,二维码与收费实体绑定,比如二维码上携带停车场出口车道ID,用户扫码后获取账单信息
这一步可以按需求设计,我这边是设计一个二维码,也可以使用其他方式诱导用户进入获取账单信息
在获取账单信息的同时调用支付微信/支付宝提供的统一下单接口,获取支付URL
在调用统一下单接口时除了商品的基本信息外还需要生成一个支付订单号,每个支付订单都必须有一个唯一的订单号,支付成功会原样返回,用于确保订单的唯一性;并且需要上传商户收费账单号,支付成功回调时也会原样返回,用于确认账单支付状态。
- 进入账单确认页面,账单确认界面的支付按钮访问的就是第一步获取支付URL
- 等待用户点击支付按钮并确认支付
- 支付成功同步回调:用户支付成功会跳转至 returnUrl
- 支付成功异步回调:用户支付成功会跳转至 notifyUrl
在支付成功异步回调的接口中拿到回调数据后:
第一步,先验签,先判断回调数据是否合法;
第二步,拿到支付订单号(每一笔支付订单都有唯一的订单号),用于判断是否重复回调,因为有可能因为网络等原因,会重复收到支付成功通知;
第三步,保存支付成功回调信息,每一个支付完的信息都要保存好,方便后续查看,并且要用于判断是否重复回调;
第四步,拿到回调信息中商户订单号,也就是调用统一下单接口时上传的收费账单号,拿到收费账单号后调出未支付收费账单并修改支付状态,以及处理一下需要支付完成后才能执行的操作,比如说开闸。
最后,业务处理结束后记得再回复“SUCCESS",因为如果你没有回复接收成的话他们会误以为你没有收到,然后再给你发一次。
- 正常支付成功都是会回调,但是不排除数据丢失的情况,当系统生成订单后长时间没有支付可定时调用查询订单接口
总结 :
一、对支付第三方的理解
- 对接支付第三方实际上就是两个平台之间的交互,支付平台需要知道商品的基本信息及商品的价格,商户平台需要知道订单的支付状态、支付金额及支付时间
二、对支付的理解
- 连接起两个平台的其实就两个接口:一个是支付平台提供的统一下单接口,一个是商户平台提供的支付成功回调接口;两个接口都完成才算是一次完整的支付