作者
黄昭
推荐理由
对实际项目遇到问题的总结,以及解决方法,而且如何未来对接微信可能会有借鉴意义
某系统有个水电充值的功能,通过充值页面充值了一笔金额,系统后台根据订单等一些关键信息校验微信服务器的充值记录,如果存在充值成功的,系统则向第三方的能耗系统添加一笔充值记录。
如上图所示,给能耗系统传递订单号和充值金额两个参数,返回result_history的结果,并记录到日志里。园区系统根据result_history的中的状态参数,如果成功则修改园区系统中此订单的支付状态为支付成功
但是比较早的时候发现。水电充值时,微信收款账号已经收到充值的金额,但是园区系统改订单收款状态是未支付。
查看日志,发现是能耗系统的充值记录insert失败了,导致园区系统更改状态不成功。还有种比较诡异的情况,调用能耗系统时,只有异常,上图的logger.info没有记录任何日志信息,能耗系统中也没有任何相关充值记录,猜测是网络阻塞延迟等问题,导致能耗系统记录失败,导致没有任何返回值。
于是在园区系统中增加了一个定时任务,每10分钟检验一次,取出订单状态未支付的订单,去微信的相关接口查询是否存在已支付的相关订单,如果该订单已在微信上充值成功,则再次调用能耗系统,如返回状态为成功则修改园区系统该订单的状态。
如此运行了大半年几乎未曾出现微信上已支付但系统订单显示未支付的情况。
可是最近出现一个奇怪的问题,能耗系统已经有相关订单的充值记录,微信上也收到充值的金额了,但是园区系统的订单状态是未修改,查看日志,发现从充值那个时候开始,每隔10分钟日志提示水电充值调用能耗接口结果失败的提示,得出结论,只要能耗系统中已经有同一订单的记录,上面10分钟一次的定时任务,无法给能耗系统成功插入订单数据,返回结果是失败的,则园区系统根据这个失败结果,无法更新订单状态为已支付。 猜测可能是网络原因导致能耗系统在第一次调用的时候,已经成功插入数据,但是园区系统没有接收到返回数据。导致第一次修改支付状态失败。后面的定时任务也就没有任何意义了。暂定解决方案,需要能耗系统的厂家提供查询订单是否存在的接口。如果存在则可以修改订单状态为已支付