热门标签 | 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的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • Navicat Premium 15 安装指南及数据库连接配置
    本文详细介绍 Navicat Premium 15 的安装步骤及其对多种数据库(如 MySQL 和 Oracle)的支持,帮助用户顺利完成软件的安装与激活。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
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社区 版权所有