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

文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

最近因为有了新的需求,需要开发支付宝支付功能以及微信支付功能,两三天开发下来碰到了几个Bug,在这里记录下来以供以后可以温故知新。因为支付宝功能是在H5端进行使用,所以使用了支付宝扫码付功能,生成一张支付二维码,然后用户保存二维码去支付宝进行扫码支付操作。一路磕磕碰碰把功能完善出来了,但是碰到了几个坑。支付宝支付开发碰到的问题:

1.无效的APP_ID

这个问题其实是最容易犯的一个错误,因为支付宝支付功能有沙箱测试环境。

经过查阅文档发现支付宝app_id与网关地址不匹配所以导致出现无效的app_id这个问题,定位到问题原因,我在内网中将环境设置成沙箱环境网关地址以及沙箱环境app_id,然后发布外网之后再将环境改成正式环境,然后果然解决了这个问题,然后对信息进行验签操作之后,支付宝会返回一个支付二维码链接,点击则会打开二维码界面

然后进行支付宝扫码付款就完成支付功能。

2.支付宝回调函数多次执行

可能因为沙箱环境不完善的原因,支付宝支付功能在沙箱环境下成功运行,而且回调函数只会执行一次,但是将支付功能发布外网后,出现了支付宝执行多次回调函数的问题,因为需求比较赶,所以我将受支付宝多次执行回调影响执行的更新数据库操作给注释了,然后把这部分代码逻辑写到了轮询访问用户支付状态的接口里面,但是这样造成了一个问题,如果用户截图二维码再去支付宝扫码支付,支付成功返回二维码界面那就可以调用轮询接口成功进行更新数据库操作,但是有部分机型长按二维码可以直接跳转支付宝支付,但是这样操作支付完返回界面的时候二维码界面会消失,也就无法执行轮询访问用户支付状态的接口,这样就会导致用户支付成功但是积分没有充值到账的结果,所以最后终究要回到解决第一个问题:支付宝为什么会执行多次回调函数?

经过查阅文档我发现这么一句话:程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。开发文档的解释完美给出了造成了支付宝多次回调的原因:因为用户支付成功执行回调函数中的数据库更新操作后并没有返回success字符串给支付宝,所以支付宝认为我还没有成功回调,所以会不断执行回调函数,这样也导致了我数据库更新操作被多次的执行。我把代码逻辑按照文档处理一下,再次去测试,果然就不会出现回调函数多次执行的原因了。

微信支付开发碰到的问题

1.Native无法点击支付链接进行支付

微信付款我才用的Native扫码支付,因为有支付宝的教训,所以前期基本配置都没出问题,成功生成了微信支付链接,但是这时候出现一个坑,这个链接在微信中可以直接打开支付界面

但是密码付款之后就会提示当前交易不支持点击消息链接发起,也就是说说虽然我们成功生成了支付链接,但是我们没办法进行支付

后来我去翻阅了微信开发文档,对Native支付是这样介绍的:Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。也就是说Native支付是要生成支付二维码,然后使用扫一扫再进行支付,但是微信只会返回一个支付二维码链接,并不会和支付宝一样直接给一个二维码地址,所以就需要我们用微信成功返回的支付二维码地址去生成支付二维码,经过和前端同事协商,这部分逻辑在前端进行实现,为了测试支付功能,我使用了微微在线二维码生成器,将微信成功返回的支付链接去生成了对应的支付二维码。

然后使用微信进行扫码支付最后成功支付,所以Native支付是不能直接使用微信支付链接进行支付的,而是需要先生成支付二维码,然后使用扫一扫进行扫码支付。

2.实际支付价格和需要支付的价格不匹配

微信付款虽然可以成功跑起来了,但是出现一个问题:我们需要支付1块钱,但是最后生成的支付链接却只能支付一分钱,查了微信支付开发文档没找到这个问题的具体原因,但是在百度文库中找到了原因,微信支付与支付宝不一样,微信支付以分为单位,所以如果想要以元为单位,参数total_fee接受前端传过来的价格后需要乘以100,这个问题就可以解决了。

3.微信回调函数多次执行

微信开发接近尾声了,我在同一个坑里又摔倒了一次,微信支付又多次执行回调函数了,因为有了支付宝支付的教训,我马上想到一定是回调成功执行之后返回给微信的参数出问题,我去查了下微信支付开发文档:在微信的异步通知后,也需要给微信服务器,返回一个信息,只不过,微信的所有数据格式都是xml的。所以我们在返回一个数据给微信即可。而不是和支付宝一样返回success就可以。

我按照文档要求在回调函数中把return_code及return_msg封装成xml格式进行返回,微信多次执行回调函数的问题就成功解决了。到这里微信支付功能就成功跑起来了。其实支付功能有很多坑,但是我站在前人的肩膀上,所以前期配置以及签名那些最容易出问题的地方我都顺风顺水就成功了,在这里记录下自己开发碰到的问题,也希望可以给需要的朋友一点点帮助。

欢迎关注我个人公众号:程序猿周先森

原文地址:https://www.cnblogs.com/niyueling/p/11562994.html

时间: 2024-08-11 13:05:55

谈谈开发支付功能碰到的坑的相关文章

iOS之开发支付功能概述

前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微信支付的网址是: https://pay.weixin.qq.com/wiki/doc/api/index.html 进去之后,我们可以看到网页,但我接下来主要讲的是app支付 app支付的过程:商业app通过集成微信SDK,用户解析后跳转到微信内软件支付的过程. 点进去app支付: 我们可以看到A

关于小程序支付功能的爬坑

代码大部分用的http://www.wxapp-union.com/article-2516-1.html提供的. 但是,此代码在使用org.apache.httpcomponents(4.3.5)里的HttpPost实例化时出错. 解决:maven中引入的httpclient和httpcore版本一致,如 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcl

微信开发——申请微信支付功能及支付环境设置

很久没写博客文章了,最近一直负责微信开发实现微信支付功能,所以在这方面有一定的了解. 在开始实现微信支付功能的前提是公众号已认证的并已通过审核的服务号,具体微信支付申请人的流程没有比官 方公布的流程更详细的了,附上链接https://mp.weixin.qq.com/paymch/readtemplate?t=mp/business/faq_tmpl,开通 并与微信工作人员沟通微信支付相关授权路径之后,在微信后台可以看到微信支付的相关功能 在支付申请选择下可以查看商户的基本资料以及我们开发支付功

PHP开发支付时开启OPENSSL扩展

开发支付功能时,发现openssl类的方法都找不到,大概知道是没有扩展,在网上收集了PHP开启openssl扩展的方法. windows下开启方法: 1: 首先检查php.ini中:extension=php_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘:’, 如果不存在这行,那么添加extension=php_openssl.dll. 2: 讲php文件夹下的: php_openssl.dll, ssleay32.dll, libeay32.dll 3个文件拷贝到 WIND

网站添加微信支付功能(小白填坑)

本周的工作安排就是在网站添加支付功能,包括支付宝.微信.财付通等,今天这篇文章先说一下微信支付吧,支付宝的太容易了基本看一下都会了 1.首先准备工作,开通了支付功能的账号,具体怎么开通的我也不熟悉因为我做的时候都是使用开通好的账号(目前微信支付好像只支持商家不支持个人吧?) 2.按照我的性格当然是百度一下啦,但是微信支付的文档说明事例实在是太坑了,完全不是我这种小白可以一下看懂的,在这夸奖一下支付宝,支付宝的事例文档做的太好了基本做的时候没什么坑 准备工作结束开工: 我的开发环境是java,所以

微信小程序支付功能 C# .NET开发

微信小程序支付功能的开发的时候坑比较多,不过对于钱的事谨慎也是好事.网上关于小程序支付的实例很多,但是大多多少有些问题,C#开发的更少.此篇文档的目的是讲开发过程中遇到的问题做一个备注,也方便其他开发的同学作为参考! 1.首先建议把官方文档支付部分看上三遍,每个细节都不要放过,因为任何一个点和微信要求不符都会导致支付不成功.https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=3_1 2.经过验证的微信支付功能,会需要一些商

IOS开发之支付功能概述

前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微信支付的网址是: https://pay.weixin.qq.com/wiki/doc/api/index.html 进去之后,我们可以看到网页,但我接下来主要讲的是app支付 app支付的过程:商业app通过集成微信SDK,用户解析后跳转到微信内软件支付的过程. 点进去app支付: 我们可以看到A

如何玩转微信支付功能的原理和开发(转)

打开微信,各种营销信息霸占了我的眼球,以“微信支付+微信小店”的模式挑战阿里“支付宝+淘宝天猫”的模式开启了新纪元,腾讯此举是在革淘宝的命吗?有人说,微信对阿里最大的挑战,是把连接能力下发给了企业/用户,让企业/用户而不是平台自身发挥主动权和能动性来建立新的连接模式. 近年来,移动支付发展迅猛,移动支付已经成为了不可抵挡的发展趋势,其引领了新一轮的支付潮流.从某种角度来讲,反观移动互联网的迅速发展,对微信的快速发展起到了很大的推动力,其所蕴含的巨大潜力使其成为了市场争相抢夺的香饽饽.一时间各种支

[5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)

1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按钮时,执行一个Ajax到后台 后台通过前台的部分信息(如商品名额,金额等),将其组装成符合微信要求格式的xml,然后调用微信的"统一下单接口" 调用成功后微信会返回一个组装好的xml,我们提取之中的消息(预支付id也在其中)以JSON形式返回给前台 前台将该JSON传参给微信内置JS的方法