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