支付宝app支付,订单参数错误/PHP生成支付宝预支付订单/php 支付宝app支付
以PHP为服务端语言,java为app端开发语言的支付宝app支付流程及常见的问题说明
前期的准备工作在这里不细讲,包括开通对公支付宝,开通app支付产品,配置app支付的私钥公钥,以及上线app,这些都是基础操作,不涉及程序编码,这里不做详细讲解,讲解从服务端编码开始,到app拉起支付。
1.为什么app前端支付,要通过服务端这一步
首先要理解这一点,便于后续的流程讲解。因为直接在app端拉起支付,就意味着把一些重要信息要放在app端进行保存,比如支付的公钥和私钥,那么一旦app被反编译,信息就会被暴露,造成数据安全问题。所以我们一般选择在服务端生成订单信息,然后将订单信息返回给app前端,前端再拉起支付,完成支付。
2.支付流程总述
说白了,支付的时候就是要干三件事,第一件事是,通知支付宝,你要准备进行支付(包括要支付的商品名称,价格等信息);第二步就是支付宝答应你可以发起支付请求,但是必须要按照你刚才申请的信息来请求,不能更改信息。为了防止你对信息进行变更,支付宝说,那干脆你通知我准备支付后,我把你支付的信息做一个封装,然后锁上一把锁,原路给你,到时候你就拿着我给你的这玩意再来支付就行了。于是,支付宝给你了一个数据包,上面有一把锁,这个锁就是支付宝的“加签”,意思我加密了,你不要想修改数据。第三件事,你拿着这个加锁数据包申请支付宝支付,支付宝在收到你这个包以后,用钥匙进行解锁,如果能解开,说明你信息没有变更,可以支付;如果解不开,说明你信息变更了,那就会拒绝支付。这里的解锁,就是支付宝的“验签”,就是校验通过,允许支付,校验失败,拒绝支付,报相关错误。
3.其中,服务端干两件事,通知支付和拿到允许支付的请求
因为涉及到数据安全问题,所以一般通知支付宝要支付和拿到支付许可,都在服务端完成,服务端拿到支付许可,返回给APP前端,app再拉起支付就行。
3.1PHP服务端SDK下载与配置
- PHP服务端sdk下载 :
打开https://github.com/alipay/alipay-sdk-php-all,下载SDK,下载以后,放到服务器的根目录下,或者根据你的代码结构,放到相关的文件结构下。
2.编辑请求文件
找到以下(aop->test->AopClientTest.php)文件目录,并打开
此PHP文件结构分为两部分,第一部分,头部引用,即把sdk里面的文件引入进来,
引入路径根据你sdk存放的位置进行调整,比如有时候用到绝对路径
类似这样,总之引入进来就行。
另一部分是是三个调用示例
服务端进行app支付调用,用的是第2个调用示例, 2、sdkExecute 调用示例
我们把1和3的调用示例注销掉或者删除掉,只留实例2
下面我们来进行参数说明和构造
所有参数里面,最重要的是一个叫setBizContent的参数,这是关键,里面包含了各种商品信息,包括总金额total_amount,订单号out_trade_no等,官方sdk给的样式是这样的
但这样的问题在于,一,有很多参数用不到,二,不好进行编辑。所以我们来分析一下参数的形式,setBizContent的参数形式是一对{},里面多个键值对,也就是说,setBizContent的参数其实是一套键值对对象,那么我们就可以通过构造键值对对象来替换sdk原始参数,那么我们setBizContent的参数改成下面的写法
即我们创建了一个object对象,然后对对象内的键值对进行赋值,然后把对象用json编码,编码后传递给setBizContent。这样的写法便于我们需要什么参数,就对什么参数进行赋值。
接下来我们对setBizContent里面的参数做一个讲解,哪些是必须的,哪些是非必须的,又代表什么意思
这样一来,所有的参数就整理完了,接下来将一个重要参数,setNotifyUrl,就是回调地址。
首先,我们要明白什么是回调,为什么要回调,什么时候用回调。我们开始讲,支付宝支付三步走,第一,服务端通知支付宝要支付;第二;支付宝同意支付,并返回数据包给服务端,服务端把数据包返回给app前端。第三;app用数据包发起支付请求,完成支付。
那么问题来了,app端支付完成后,我后台怎么才能知道他支付完了,并做出相应的处理呢?
那就是靠回调。也就是说,服务端在第一步通知支付宝进行支付的时候,还留了一个电话号,说,如果app端支付完成了,你给我打电话说他支付完了,我好做下一步处理。那这个电话号就是回调地址。就是app端在拉起支付宝支付完成后,支付宝通过回调地址告诉你支付完了。所以这个回调地址,就是你服务端自己设置的一个能响应的地址。
当然,这里还有一个问题,有小伙伴问了,既然app端支付完了,那他直接告诉我不就行了么,为什么还要回调。小伙子,那就是信任问题了,意思就是,app端可能特么压根没支付,就告诉你支付完了,因为他会说假话,而回调不会,因为人家是收钱的,钱不给,还想让人家配合你说假话,门都没有。所以回调又称为双重验证,验证支付成功。
不过一般为了方便,同时考虑app端是个好孩子的情况下,这里回调地址完全不用写,也就是说,让app端支付完以后告诉你一声就行了,我信你。
设置好参数后,就开始调用实例接口,调用实例接口,很简单,就一句话
调用完实例后,返回值$result,就是支付宝给的加锁数据包,服务端把这个丢给app端就行了。
这里要说明的是,官方sdk里面,调用完有这么一段处理,
听哥的,把这逼玩意删掉,毛用没有。就留着result返回给前端就行。
这里又有人问了,那我们怎么知道我服务端调用实例是成功了还是失败了,哥教你,两步走,
第一:看
r
e
s
u
l
t
值
,
运
行
完
实
例
后
,
打
印
result值,运行完实例后,打印
result值,运行完实例后,打印result的值,你会打印如下内容
如果凡是出现非这个玩意的,那就是错了,出现了类似的,那就是对了
第二:对不对,测试就知道了,借助工具
打开//alipaybbs.oss-cn-hangzhou.aliyuncs.com/1807/thread/60_191_eb31b639a0caf31.zip?spm=a2c6h.12873639.0.0.4d8b6a6ftz7lwG&file=60_191_eb31b639a0caf31.zip这个网站,下载阿里云官方测试apk,安装,安装完就是这么个玩意
然后打开它,
在ok的情况下,把值直接返回给app前端,让他去支付,那就没问题。如果不OK,主要检查下公钥和私钥是否正确,其他没必要检查,都是sdk‘自带的,没啥容易错的。
4.遇到的大坑
本来到这,就结束,支付算是完成了,但是那是因为我用阿里云官方apk测试了,所以最终成功了。那么问题在哪,我们来看一下,
官方文档app前端拉起支付的时候,需要两个参数,
其中一个就是咱们
r
e
s
u
l
t
,
也
是
最
主
要
的
一
个
,
但
是
人
家
的
参
数
结
构
要
啥
,
要
a
p
p
i
d
和
b
i
z
C
o
n
t
e
n
两
个
,
看
明
白
没
有
,
啥
问
题
,
跟
咱
们
的
result,也是最主要的一个,但是人家的参数结构要啥,要appid和bizConten两个,看明白没有,啥问题,跟咱们的
result,也是最主要的一个,但是人家的参数结构要啥,要appid和bizConten两个,看明白没有,啥问题,跟咱们的result啥区别,是不是咱们的result最前面的多了一个
标红的这玩意,第一开始以为人家不要呢,就给强制截掉了,但app前端总拉不起支付,报参数异常的错误,后来我用官方apk测试的时候,无意间复制了一个完整的result,结果好使,再返回完整的给前端,也好使,这才发现,原来特么不用截取。但为啥咱们的result会多了个这玩意呢,原来是sdk说明文档跟sdk版本不匹配的问题。以前的sdk版本返回来的result确实没有这玩意,但后来有了,但是文档说明没有更新过来。这,我能不能给支付宝打个电话,让提高一下我的花呗额度…
5.重要的事情说一遍
如果支付宝支付有困难,私信我,V1732474332,PHP和java都可以,谁让咱全栈呢。唉。人美心善