博客 > 软件开发 > 桌面&移动开发 > React Native
# 总结 React Native + Spring boot 微信APP支付 经历过两次微信支付系统的开发, 终于算是理清楚了微信支付的基本流程. 如图所示: <graph engine=1> digraph { graph[label="\n支付前流程"] APP[shape=box] 后端[shape=box] 微信后端[shape=box] APP->后端[label=" 1.支付金额等数据 "] 后端->微信后端[label=" 2.统一下单 "] 微信后端->后端[label=" 3.下单结果 "] 后端->APP[label=" 4.二次签名 "] } </graph> 支付前首先让后端使用微信后端的[**统一下单**](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)接口, 拿到单据, 然后在后端进行[**二次签名**](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2), 响应给APP, 这里的响应结果就是APP调起微信APP所用的**预付单**. <br> <graph engine=1> digraph { graph[label="\n支付中流程"] APP[shape=box] 后端[shape=box] 微信后端[shape=box] 微信APP[shape=box] APP->微信APP[label=" 1.使用二次签名数据唤醒 "] 微信APP->APP[label=" 2.用户支付结果 "] 微信APP->微信后端[label=" 2.用户支付结果 "] 微信后端->后端[label=" 3.发送支付结果通知 "] 后端->微信后端[label=" 4.查单 "] 微信后端->后端[label=" 5.查单结果 "] } </graph> APP**把[预付单数据](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2)通过微信支付API传递给微信APP**, 等用户在微信APP完成支付(或取消)后微信APP会再把消息传给APP. APP端最后会获取到我们自己约定的一个订单编号与一个成功或失败的信号, 但我们都知道前端是不可信的, 这个信号一般不作为实质性关键业务的检测标志. 同时微信后端也会有记录, 微信官方会定时**[回访你后端的一个接受通知的接口](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3)(用他们定好的格式)**. 后端接收到支付成功的通知之后应当再调用一下微信后端的[**查单**](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2&index=4)接口, 确定支付已经完成了, 然后处理此次支付, 比如给用户打金币或者开会员之类的, **注意规避重复处理问题**. <br> <graph engine=1> digraph { graph[label="\n支付后流程"] APP[shape=box] 后端[shape=box] 微信后端[shape=box] APP->后端[label=" 1.查询订单请求 "] 后端->微信后端[label=" 2.查单 "] 微信后端->后端[label=" 3.查单结果 "] 后端->APP[label=" 4.查单结果 "] } </graph> 如果APP想要明确用户是否支付成功了, 应该在后端开通一个查单通道, 实际的查单方法和支付中收到通知后的[**查单**](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2&index=4)用一个就可以了. 当然后端如果本来就有足够可信的记录的话也可以直接返回. 另外还有一个[**关单**](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_3&index=5)接口, 一般用于处理已作废的订单, 比如业务中超过24小时的订单无效(这个由你自己规定), 就可以开一个定时回收器, 把24小时前发起的支付状态还没成功的订单关闭掉. 至于其他比如查历史账单之类的东西, 这个就由后端自己维护了, 和微信没什么关系了. 微信只提供了一个[对账单](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_6&index=8), 这个我暂时不需要.