热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

支付结果回调_【微信支付】微信支付成功之后没有请求回调接口

谢尔顿的左耳朵​www.zhangxiaoshuai.fun最近做的一个项目中涉及到了微信支付的模块,因为之前从来没有接触过支付这方面的内容,所以花了一
425fd8cc22d200724c6c0a903aa3152a.png
谢尔顿的左耳朵​www.zhangxiaoshuai.fun

最近做的一个项目中涉及到了微信支付的模块,因为之前从来没有接触过支付这方面的内容,所以花了一些时间去专门研究,最后总算是搞定了支付;但是能支付可不行,我需要将用户支付过的订单的支付状态进行修改,并在下一次用户进行浏览的时候进行判断:用户是否已经对该资源进行了支付,如果已经进行了支付,那么直接放行;如果没有进行支付,就需要拉起收银台进行支付。

虽然这篇文章的标题主要是回调接口的内容,但是我还是想要把支付这一些问题进行一个小小的回顾总结。

最开始遇到的问题是:用户点击资源的时候系统进行预下单,然后在调用支付接口获取一系列参数,但是可能存在用户刚点进资源中,系统已经完成了预下单,但是用户又不想看了,又退了出去,过了一会,用户又回来了,这时,系统会再次下单,但是最开始的时候我没有考虑这种情况,所以在用户第二次进行下单的时候,就会出现下单失败的情况,最终的解决方案是:在用户请求下单之前,先查询是否存在之前下好的订单,如果存在,则只需修改预下单的时间即可,然后返回给前端订单信息;

完成重复下订单的问题之后,又出现了新的问题:当收银台被拉起的时候,用户又不想支付了,所以用户选择了关掉收银台,但是用户并没有退出资源界面,过了一会,用户重新点击支付,后台报错:订单已支付,请不要重复操作。what?我还没有支付呢……到底是哪里出现了问题呢?通过DEBUG,我将问题定位到自定义的“订单编号”上面,因为我这里使用的编号是该视频的序列编号,这个编号是固定的,当这个视频没有被购买过,第一次购买的人是可以成功支付的,这个时候自定义序列编号就会成为该订单的订单号,并且存在与微信后台中,这样在第二个人购买的时候,当我们将一系列的参数封装起来传到微信服务器上的时候,就会出现“该订单已存在”的现象。微信服务器返回给我的数据标识中:return_code:SUCCESS,而result_code:FAIL,在一个成功一个失败的情况下肯定是无法拉取起银台进行支付的,最终解决方案:使用当前年月日和一些标识生成每一个独一无二的订单编号,这样就解决了这个问题;

解决了无法支付的问题之后,随之而来的就是支付成功之后,微信似乎并没有调取回调接口进行逻辑业务。这样就造成了用户在支付成功之后,系统并没有将用户支付成功的结果进行存储,然后用户下次进行观看的时候就会造成继续收费的情况;

通过百度中各路大神的建议,我前后分别作出了如下尝试:

1.关闭和打开Linux防火墙;
2.分别尝试http和https;
3.尝试使用公网访问该回调接口,访问没有问题;

最后,我将目光集中在了tomcat日志上

查看catalina.out

9be3ea1f83986087a4b50c8db61fe753.png

显然,在请求支付的时候,后台是将notify_url传递过去了

5619e6533474bc4cd3e5973c2fa2ed67.png

这是支付成功之后的调用,显然是调用了回调接口,这说明回调地址应该是没有问题的。

但是为什么明明业务中写了对数据库的操作,既然调用了回调接口,却对数据库没有进行更新呢?

我又去到了error.log中查看

093d81cc64e588b2b3ab7b7cdae2c6bf.png

这就是我回调接口中的日志打印啊,这下我确信应该是业务逻辑中出现了问题,导致没有执行(日志打印在业务逻辑之前)

果然,在通过一个订单编号查询订单的方法参数上竟然还写的是之前的自定义订单号,这样每次根本没有订单被查询到,也就谈不上对支付状态更新和对支付成功订单进行存储的功能了……

我赶紧修改了查询参数、service层和持久层,总算是完成了基本的闭环支付。

eda9d87ee7292acb07c92cb395472e9e.gif



推荐阅读
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • Windows 系统下 MySQL 8.0.11 的安装与配置
    本文详细介绍了在 Windows 操作系统中安装和配置 MySQL 8.0.11 的步骤,包括环境准备、安装过程以及后续配置,帮助用户顺利完成数据库的部署。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 通过与阿里云的合作,牛客网成功解决了跨国视频面试中的网络卡顿问题,为求职者和面试官提供了更加流畅的沟通体验。 ... [详细]
author-avatar
白日做梦家_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有