我的电商网站修bug日常②——支付宝踩坑实录
缘起
其实在提交之前我就发现了,但是当时来不及了,就没管,现在修修((
具体表现是收不到回调结果,无法执行完成支付的逻辑。(支付成功后,修改订单状态、修改库存)
排查
AliPayController
中调起支付宝支付页面的代码如下:
aliPay.setSubject("Test Pay"); |
其中aliPay.getRedirect()
由前端传入。
查看response
的body
:
<form name="punchout_form" method="post" action="https://openapi-sandbox.dl.alipaydev.com/gateway.do?alipay_sdk=alipay-easysdk-java-2.1.2&app_id=9021000131656346&charset=UTF-8&format=json&method=alipay.trade.page.pay¬ify_url=http%3A%2F%2F127.0.0.1%3A5173%2F%23%2Fpaycallback&return_url=http%3A%2F%2F127.0.0.1%3A5173%2F%23%2Fpaycallback&sign=dwYqWfor3YLR%2BsO35VWVrCnzVKSWjNoZOs68TMpP9SYtvmtkxKYINnQlQDWR0g7qzJsCkKEtjJgNwQSg%2Bh60c4ppr1JM0ndsH5KzgNBxKH9G7ScybN5FaXgP%2F3jQNRa8jVUx7m%2B2nkKqhLBlgim4CYTsaVo5SOu5bSwSkJNWt9JxSwWuoodILag6lHlMw%2BAY0wDM2YZMDlxYW6eTOOzVGztVyaRMcLHoelRlqFE6yMbcNi3gbkqm18UTbusvb%2BCyaM93Yg7gqS1pm3VLvlRKpBv%2FUavGJEoQhGl478xsCXAG%2BgXpY0aMKNVQML%2FAzO%2FKo1levhAxUuqw0CRoOj%2F0Hw%3D%3D&sign_type=RSA2×tamp=2024-01-13+20%3A34%3A36&version=1.0"> |
notify_url
为支付宝异步回调地址(回调给后端处理),return_url
为完成支付后前端跳转的地址(前端传入)。
很好,都错了(
尝试修改后端application.yml
:《尝试》
alipay: |
以及前端的url:
const backURL = 'http://localhost:5173/#/paycallback' |
改完之后,再测测。
然而还是不行,后端还是收不到回调。(此处没图)
用Apifox测一下接口。(没带参数)
能返回错误信息,说明后端接口应该没错的。
此时response
的body
:
<form name="punchout_form" method="post" action="https://openapi-sandbox.dl.alipaydev.com/gateway.do?alipay_sdk=alipay-easysdk-java-2.1.2&app_id=9021000131656346&charset=UTF-8&format=json&method=alipay.trade.page.pay¬ify_url=http%3A%2F%2F127.0.0.1%3A8080%2Fpaycallback&return_url=http%3A%2F%2Flocalhost%3A5173%2F%23%2Fpaycallback&sign=ACrRQgcE5De7Fkx%2FZKEjbS4iM9U%2F3huYlschr5HHd4TZzKSSBB6oY%2FhHkwaIrwRrd1mdsEozMH9hfSO5dtlCRguRw58PNcRpUmvyPPM%2Ftdh3JbM6iAlTeXN05e41Cq7tX0DiQp%2Fg%2BIltBneHLkzTZn2QPA1Ixt9vVJCDCEFuhq8xdSZvEInxva6Zhtp4%2Fwrx5xlRwQHZ5TGgCMMspi0269wZbxtGgtOhe3DuMJFitRZPGSWxj18QodRLuzDP24FsFAAHF1ZUW%2FRUItAhu0SeQj4BhZjjrfF5%2F2230pgvIpsPNr8G5l%2FAZbVlqnyYsn0gcf9A0wiyt2KpLUQTSpBKbg%3D%3D&sign_type=RSA2×tamp=2024-01-13+20%3A41%3A50&version=1.0"> |
那么问题到底在哪里呢?
搜了一堆(过程就略去了)之后,我看到这个评论,有点醍醐灌顶了。
解决
于是修改后端的application.yml
里面的notifyUrl
以及数据库用户密码:
alipay: |
然后部署到云上(过程略),并且修改前端的baseUrl
(在前几篇文章里面有!)
然后再测!
噔 噔 咚
这里过程就不展开了,总之原因是支付宝那边是不允许订单号重复(商户端)的,然后我这边本地数据库和云端数据库之间有差异,而且订单号是自增的,这样就会导致重复。
改好之后,这下总算ok了!
云端数据库中订单状态成功修改。
前端结果显示成功。
顺便这里还改了一下前端,因为原本的代码里面是利用redirectUrl
里面的payResult
参数判断,但是这里并没有这个参数,应该是原本的后端处理的,这里就改前端了,因为这个页面启动的时候会首先获取这个订单的数据,所以根据订单数据中的orderState
来判断就可以了。
const payResult=ref(0) |
<span class="iconfont icon-queren2 green" v-if="payResult===1"></span> |
参考链接
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自Rean's Blog