一.微信支付流程
- APP用户点击进行支付,会向我们自己的订单服务发送请求,携带订单的相关信息
- 订单服务接收到请求之后需要保存订单,调用微信统一下单接口生成预支付订单,微信会返回预支付订单标识,订单服务会根据微信返回的标识生成带签名的支付信息
- App端发起支付,向服务端查询带签名的支付信息,服务端返回带签名的支付信息
- APP端使用带签名的支付信息,调用微信客户端唤醒微信APP
- 微信APP会向微信支付系统发起支付请求,微信支付系统会校验支付授权,返回授权结果
- 跳转微信支付界面,用户输入支付密码,提交授权,发送支付请求到微信支付系统,微信支付系统会验证授权,授权通过支付成功
- 支付成功微信支付系统会向微信APP返回支付成功标识,微信APP收到支付成功标识,会通知我们的APP,支付成功,APP收到支付成功信息之后,跳转到支付成功界面。
参数:
简单的传参 :公众id、商户号、订单号、金额、货币种类,回调url,随机字符串、签名
二.可能遇到的问题
问题:服务如何能够知道用户的支付结果
答:用户支付成功之后微信支付系统会向我们自己的支付服务发送支付结果回调(http)
我们需要在自己的支付服务定义接口,接收微信支付结果回调,接收到回调之后确认订单信息,修改订单状态,保存支付日志,向微信支付系统返回接收成功的消息。
问:支付结果通知丢失:
用户下单成功之后使用MQ发送延迟消息(订单id)(延迟10min),十分钟支付服务收到延迟消息调用微信查询订单接口,查询订单的支付情况,比对订单数据,修改订单状态
使用定时任务,每隔2min查询我们自己数据中的未支付订单,根据订单号调用微信查询订单接口,查询支付状态,比对订单数据,修改订单状态
问:重复回调
处理微信支付回调的时候,保存支付信息到支付日志表payLog(微信交易流水号,支付金额,商户订单号,支付时间…)
接收到回调之后,根据回调信息中的交易流水号去支付日志表中查询支付日志信息,如果查询到交易流水号就直接向微信返回SUCCESS
问:假回调
接收到回调之后,获取回调中的订单信息,调用微信查询订单接口查询支付信息,跟回调中的支付信息进行比对,看是否一致(交易流水号,支付金额,商户订单号,支付币种)
而且需要比对我们自己的订单系统相关信息,三方数据都匹配是真回调,如果有任何一方不同就是假回调(直接返回失败)
问:订单超时
用户下单成功之后,向MQ发送延迟消息(订单id)(延迟30min),30分钟之后支付服务接收到消息,检测对应的订单状态是否已支付,如果未支付,取消订单,回滚库存
取消订单:不仅需要修改自己的数据库中的订单状态,还需要在微信取消预支付订单