当前位置: 首页 > 后端技术 > Node.js

谈谈开发支付功能碰到的坑

时间:2023-04-03 10:41:51 Node.js

说说支付功能开发遇到的坑本平台不定期更新,喜欢我的文章,请关注我的微信公众号。最近由于新需求,需要开发支付宝支付功能和微信支付功能。经过两三天的开发,遇到了好几个bug。我将它们记录在这里以备将来参考。因为H5端使用支付宝功能,所以使用支付宝扫码支付功能生成支付二维码,然后用户将二维码保存到支付宝进行扫码支付操作。一路磕磕绊绊,功能完善了,但是遇到了几个坑。支付宝支付开发遇到的问题:1、APP_ID无效的问题其实是最容易犯的错误,因为支付宝支付功能有沙盒测试环境。沙箱测试网关为:https://openapi.alipaydev.com...官方网关为:https://openapi.alipay.com/ga...查阅文档后发现支付宝app_id确实不匹配网关地址,所以出现app_id无效的问题,定位问题原因后,我把环境设置为内网的沙箱环境网关地址和沙箱环境app_id,然后把环境改成官方的发布外网后的环境,然后问题就解决了,然后支付宝验证信息后,会返回一个支付二维码链接。点击后会打开二维码界面,然后支付宝扫码支付即可完成支付功能。2、支付宝回调函数多次执行可能是沙箱环境不完善造成的。支付宝支付函数在沙箱环境下运行成功,回调函数只会执行一次。但是在外网发布支付功能后,出现了支付宝执行。多次回调函数的问题,因为需求比较急,所以把支付宝多次执行回调影响的updatedatabase操作注释掉,然后把这部分代码逻辑写到轮询访问用户支付状态的接口中,但这引起了一个问题。如果用户截取二维码后去支付宝扫码支付,支付成功返回二维码界面,则可以调用轮询接口成功更新数据库。但部分机型可以长按二维码。直接跳转到支付宝支付,但是操作完成返回支付界面后二维码界面会消失,无法执行轮询访问用户支付状态的接口,会导致结果用户支付成功但积分未充值,所以最后还是要回到解决第一个问题:为什么支付宝会多次执行回调函数?查阅文档后,发现了这样一句话:程序执行后,必须打印出“success”(不带引号)。如果商户反馈给支付宝的字符不是成功的7个字符,支付宝服务器会继续重发通知,直到超过24小时22分钟。开发文档的解释完美的给出了支付宝多次回调的原因:因为用户在回调函数中成功执行了数据库更新操作,并没有返回成功字符串给支付宝,所以支付宝认为我没有回调成功,所以会不断的执行回调函数,这也导致我的数据库更新操作被执行了多次。我按照文档处理了代码逻辑,又测试了一遍。果然没有理由多次执行回调函数。微信支付开发遇到的问题1.原生无法点击支付链接进行微信支付。我只用Native扫码支付。因为有支付宝的教训,前期基本配置没有问题。微信支付链接生成成功了,但是这时候有个坑。此链接可直接打开微信支付界面,但密码支付后会提示当前交易不支持点击消息链接发起。也就是说,我们虽然成功生成了支付链接,但是我们没有办法进行支付。后来看了微信开发文档,介绍了原生支付:原生支付是商户系统根据微信支付协议生成支付二维码,用户使用微信“扫一扫”完成支付支付。也就是说,Native支付需要生成支付二维码,然后使用扫一扫进行支付,但是微信只会返回一个支付二维码链接,不会像支付宝那样直接给出二维码地址,所以就我们需要使用微信成功返回的支付二维码地址生成支付二维码。和前端同事协商后,这部分逻辑在前端实现。为了测试支付功能,我使用了薇薇在线二维码生成器。微信成功返回的支付链接生成对应的支付二维码。然后使用微信扫码支付,最终支付成功,所以Native支付不能直接使用微信支付链接进行支付,需要先生成支付二维码,然后使用扫码器扫码支付。2、实际支付的价格与需要支付的价格不符。微信支付虽然可以成功运行,但是有个问题:我们需要支付1元,但是最后的支付环节只能支付一分钱。查看微信支付开发文档中没有找到这个问题的具体原因,但是在百度文库中找到了原因。微信支付不同于支付宝。微信支付是以分为单位的,所以如果要以元为单位,前端接受参数total_fee。价格需要乘以100后,这个问题就可以解决了。3、微信回调函数被执行了多次。微信开发告一段落。我又掉进了同一个坑。微信支付多次执行回调函数。因为吸取了支付宝支付的教训,立马想到一定是回调执行成功后返回给微信的参数有问题。查了下微信支付开发文档:微信异步通知后,还需要给微信服务器返回一个消息,但是微信的数据格式都是xml。.所以我们只需要返回一条数据给微信即可。而不是像支付宝那样返回成功。我按照文档要求在回调函数中封装了return_code和return_msg为xml格式返回,成功解决了微信多次执行回调函数的问题。至此,微信支付功能运行成功。支付功能其实有很多坑,但是我站在前辈的肩膀上,所以在前期最容易出问题的配置和签名上成功了。我将自己在开发中遇到的问题记录在这里,希望能给有需要的朋友一点帮助。欢迎关注我公众号:程序员周先森