支付宝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下载与配置

  1. 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值,运行完实例后,打印 resultresult的值,你会打印如下内容
在这里插入图片描述
如果凡是出现非这个玩意的,那就是错了,出现了类似的,那就是对了
第二:对不对,测试就知道了,借助工具
打开//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两个,看明白没有,啥问题,跟咱们的 resultappidbizContenresult啥区别,是不是咱们的result最前面的多了一个在这里插入图片描述
标红的这玩意,第一开始以为人家不要呢,就给强制截掉了,但app前端总拉不起支付,报参数异常的错误,后来我用官方apk测试的时候,无意间复制了一个完整的result,结果好使,再返回完整的给前端,也好使,这才发现,原来特么不用截取。但为啥咱们的result会多了个这玩意呢,原来是sdk说明文档跟sdk版本不匹配的问题。以前的sdk版本返回来的result确实没有这玩意,但后来有了,但是文档说明没有更新过来。这,我能不能给支付宝打个电话,让提高一下我的花呗额度…

5.重要的事情说一遍

如果支付宝支付有困难,私信我,V1732474332,PHP和java都可以,谁让咱全栈呢。唉。人美心善

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
/** *SDK调用说明 */ public function index() { //调用测试 import('AlipaySDK.Alipay'); $pay = new \Alipay(); /** * $trade_type 交易类型 app wap web */ $data = $pay->alipay('215360251411626', '0.01', '测试', '测试', 'web', 'http://www.test.com/callback'); //wap 结果string(880) "https://openapi.alipay.com/gateway.do?alipay_sdk=alipay-sdk-php-20180705&app_id=2018072660781410&biz;_content={"body":"测试","subject":"测试","out_trade_no":"215360251411626","timeout_express":"90m","total_amount":"0.01","product_code":"QUICK_WAP_PAY"}&charset=UTF-8&format=json&method=alipay.trade.wap.pay&notify_url=http://www.test.com/callback&sign=RKPyAKAPv28GKfhWIdsCCOualcg2DMCbhpny6yw/tTvJ3Och+yIfS1au7zbGBnm5sFoX2enfgfZekTqBCyzK0/Irw01zDSAOJM4mPYxs96OUkOglWS5Zuq64JwQBAzesFvzKBGgsH2ecL8EUCclDbBIIrAT/DWr6KenyvQvXOxVQNwn540NoS754oBU0w9vLdrGj0Jljvn8D6cbDgnHiE8qLOgpaXv1ROLwtol0yj2H7cM/G7A9RM5Y8jV1aVNYWND8M4XAK5Wr8zwoa9RocbqDpYfw66NXSvrsuFpHf7MpWtSybH5TnxOP5kwzr7pJRDi0XRAyD9u1geei9thUsqA==&sign_type=RSA2&timestamp=2018-09-04+11:50:49&version=1.0" //app 结果直接返回客户端无需处理 alipay_sdk=alipay-sdk-php-20180705&app_id=2018072660781410&biz;_content={"body":"测试","subject":"测试","out_trade_no":"215360251411626","timeout_express":"90m","total_amount":"0.01","product_code":"QUICK_MSECURITY_PAY"}&charset=UTF-8&format=json&method=alipay.trade.app.pay¬ify_url=http://www.test.com/callback&sign_type=RSA2×tamp=2018-09-04+11:54:53&version=1.0&sign=Ab6a0lDxaNcWLL7XcETM85DbBrJI8Sj6czPGKBNK17MZ85FBeStKL+nA/Z4tMORC7H39ooVCDz9ILpbRUfU0eaE7Oe2MOz+Jsj7oUEqwvbvt7eebyPgy2PmPlfAwcZypKla0nUJwHOF5F0cL+mvMGk/K7f2PYMtWL/dIfPOQGC1hBoKFiS+ZF7jIJ98R0AaITAjvQ1drAmJqXpMzUCa1XsTCuQXMXYKu8DNGb/hooJu0xUH/qUU+4fKD0TmBYANQHIrKIBNFl6J2Gw504Mlcfh929ce+YdzF8DXQjacsBSp7f08UJ/FfRvhVXqAfX8lAFETGjc7FXGgU6simNgv1UQ== //web 结果 https://openapi.alipay.com/gateway.do?alipay_sdk=alipay-sdk-php-20180705&app_id=2018072660781410&biz;_content={"body":"测试","subject":"测试","out_trade_no":"215360251411626","timeout_express":"90m","total_amount":"0.01","product_code":"FAST_INSTANT_TRADE_PAY"}&charset=UTF-8&format=json&method=alipay.trade.page.pay¬ify_url=http://www.test.com/callback&sign=l9+A5ZByhwLjQwzRes9+ymKkFVu7uMND4j6cIWmXIXHjrBnGaHkcr+hVkwocaU3d/hB2hdPnxDruhyYFgchnsIA/XWumosG9uEnKyD/T52+VZ8FxLh5wpwH0ucvKzbMjgIWk9dPVjUAU5Zz7QjqKsJ+AsItFpttd0tEVZD4je2PFp5mizeCWT0id0H+y44IGexN705rNe6TGpfJDG0RSDsbD/ZoCzd8FRzC9cv5uwf00J1E9Yc0bUH/l37WFDBTv/LZnqdfeWpaiu8ro7CJ3R+z/xGQTHToo2zLtEc4Cwop096X8WqwSdGbyI9FCemcFzigRB+6yzD9nS4PsWEG3Ug==&sign_type=RSA2×tamp=2018-09-04+11:56:06&version=1.0 echo $data; exit; } /** * 回调地址 */ public function callback() { import('AlipaySDK.Alipay'); $pay = new \Alipay(); $data = $_POST; $verify_result = $pay->check($data); if ($verify_result) { // 验证成功 $out_trade_no = $data['out_trade_no']; // 支付宝交易号 $trade_no = $data['trade_no']; // 交易状态 $trade_status = $data['trade_status']; if ($trade_status == 'TRADE_FINISHED') { //成功之后的操作 } else if ($trade_status == 'TRADE_SUCCESS') { //成功之后的操作 } echo "success"; // 请不要修改或删除 } else { // 验证失败 echo "fail"; } } 声明:是文档根据Alipay文档二次整合,完全开源。如果觉得还可以请点击收藏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

16年上任的CTO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值