谈谈开发支付功能碰到的坑
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134425230-900351512.jpg)
最近因为有了新的需求,需要开发支付宝支付功能以及微信支付功能,两三天开发下来碰到了几个Bug,在这里记录下来以供以后可以温故知新。因为支付宝功能是在H5端进行使用,所以使用了支付宝扫码付功能,生成一张支付二维码,然后用户保存二维码去支付宝进行扫码支付操作。一路磕磕碰碰把功能完善出来了,但是碰到了几个坑。支付宝支付开发碰到的问题:
**1.无效的APP_ID**
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134425486-2070913531.jpg)
这个问题其实是最容易犯的一个错误,因为支付宝支付功能有沙箱测试环境。
* 沙箱测试网关为: https://openapi.alipaydev.com/gateway.do
* 正式网关为:https://openapi.alipay.com/gateway.do
经过查阅文档发现支付宝app_id与网关地址不匹配所以导致出现无效的app_id这个问题,定位到问题原因,我在内网中将环境设置成沙箱环境网关地址以及沙箱环境app_id,然后发布外网之后再将环境改成正式环境,然后果然解决了这个问题,然后对信息进行验签操作之后,支付宝会返回一个支付二维码链接,点击则会打开二维码界面
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134425700-904968331.jpg)
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134425930-1867049105.jpg)
然后进行支付宝扫码付款就完成支付功能。
**2.支付宝回调函数多次执行**
可能因为沙箱环境不完善的原因,支付宝支付功能在沙箱环境下成功运行,而且回调函数只会执行一次,但是将支付功能发布外网后,出现了支付宝执行多次回调函数的问题,因为需求比较赶,所以我将受支付宝多次执行回调影响执行的更新数据库操作给注释了,然后把这部分代码逻辑写到了轮询访问用户支付状态的接口里面,但是这样造成了一个问题,如果用户截图二维码再去支付宝扫码支付,支付成功返回二维码界面那就可以调用轮询接口成功进行更新数据库操作,但是有部分机型长按二维码可以直接跳转支付宝支付,但是这样操作支付完返回界面的时候二维码界面会消失,也就无法执行轮询访问用户支付状态的接口,这样就会导致用户支付成功但是积分没有充值到账的结果,所以最后终究要回到解决第一个问题:支付宝为什么会执行多次回调函数?
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134426280-1680735150.jpg)
经过查阅文档我发现这么一句话:程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。开发文档的解释完美给出了造成了支付宝多次回调的原因:因为用户支付成功执行回调函数中的数据库更新操作后并没有返回success字符串给支付宝,所以支付宝认为我还没有成功回调,所以会不断执行回调函数,这样也导致了我数据库更新操作被多次的执行。我把代码逻辑按照文档处理一下,再次去测试,果然就不会出现回调函数多次执行的原因了。
**微信支付开发碰到的问题**
**1.Native无法点击支付链接进行支付**
微信付款我才用的Native扫码支付,因为有支付宝的教训,所以前期基本配置都没出问题,成功生成了微信支付链接,但是这时候出现一个坑,这个链接在微信中可以直接打开支付界面
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134426569-1008092531.jpg)
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134426790-713059206.jpg)
但是密码付款之后就会提示当前交易不支持点击消息链接发起,也就是说说虽然我们成功生成了支付链接,但是我们没办法进行支付
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134427222-775962333.jpg)
后来我去翻阅了微信开发文档,对Native支付是这样介绍的:Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。也就是说Native支付是要生成支付二维码,然后使用扫一扫再进行支付,但是微信只会返回一个支付二维码链接,并不会和支付宝一样直接给一个二维码地址,所以就需要我们用微信成功返回的支付二维码地址去生成支付二维码,经过和前端同事协商,这部分逻辑在前端进行实现,为了测试支付功能,我使用了微微在线二维码生成器,将微信成功返回的支付链接去生成了对应的支付二维码。
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134427499-468522938.jpg)
然后使用微信进行扫码支付最后成功支付,所以Native支付是不能直接使用微信支付链接进行支付的,而是需要先生成支付二维码,然后使用扫一扫进行扫码支付。
**2.实际支付价格和需要支付的价格不匹配**
微信付款虽然可以成功跑起来了,但是出现一个问题:我们需要支付1块钱,但是最后生成的支付链接却只能支付一分钱,查了微信支付开发文档没找到这个问题的具体原因,但是在百度文库中找到了原因,微信支付与支付宝不一样,微信支付以分为单位,所以如果想要以元为单位,参数total_fee接受前端传过来的价格后需要乘以100,这个问题就可以解决了。
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134427781-740139596.jpg)
**3.微信回调函数多次执行**
微信开发接近尾声了,我在同一个坑里又摔倒了一次,微信支付又多次执行回调函数了,因为有了支付宝支付的教训,我马上想到一定是回调成功执行之后返回给微信的参数出问题,我去查了下微信支付开发文档:在微信的异步通知后,也需要给微信服务器,返回一个信息,只不过,微信的所有数据格式都是xml的。所以我们在返回一个数据给微信即可。而不是和支付宝一样返回success就可以。
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134428042-86340204.jpg)
我按照文档要求在回调函数中把return_code及return_msg封装成xml格式进行返回,微信多次执行回调函数的问题就成功解决了。到这里微信支付功能就成功跑起来了。其实支付功能有很多坑,但是我站在前人的肩膀上,所以前期配置以及签名那些最容易出问题的地方我都顺风顺水就成功了,在这里记录下自己开发碰到的问题,也希望可以给需要的朋友一点点帮助。
**欢迎关注我个人公众号:程序猿周先森**
![file](https://img2018.cnblogs.com/blog/830272/201909/830272-20190921134429013-2137214517.jpg)