支付宝支付
- 其实是比较简单的,但因为发起订单总是失败,经过各种测试、排除,最终确定是服务端返回数据有误造成的。所以严格来说支付宝文档等没有什么问题,问题在于后端程序员不认真看文档和测试。
- 申请id需要的应该是微信支付一致,也是需要包名和md5签名,可能也是需要先上架应用商店。
- 文档地址:https://opendocs.alipay.com/open/204/105051,[APP支付接入流程]: https://opensupport.alipay.com/support/helpcenter/87/201602491089?ant_source=opendoc_recommend。
- 服务端文档:https://opendocs.alipay.com/open/54/103419。
集成sdk
-
sdk和demo:https://opendocs.alipay.com/open/04km1h。
-
使用的是gradle文件添加,未主动下载sdk。参考文档:[客户端 Android 集成流程]:https://opendocs.alipay.com/open/204/105296/
分析bug
-
输出日志,确定请求支付返回4000。查看文档中的常见问题,找到:
-
当时手机未安装支付宝app,测试安装后可以打开支付宝(未登录,所以没有返回4000,也没有测试是否可以支付成功)。后来测试登录支付宝后支付也是失败(但是没有返回4000,弹窗"交易订单处理失败,请稍后再试。“,应该是支付宝的弹窗。点击确定后返回6001,表示取消订单。)。而未安装支付宝app时返回4000,弹窗"订单创建失败,请重试”,这个弹窗是自己的代码弹窗的,正确的逻辑应该是打开h5的支付页面。
-
然后下面的问题列表也有:
-
核心就是配置"com.alipay.sdk.app.H5PayActivity"这个activity。但是查看引用的aar是15.8.11版本,aar的xml中配置了,而且反编译生成的apk也确实是存在activity。所以一开始怀疑是不是因为activity的配置不完全一致造成的?测试主动在xml中加入activity,因为android:configChanges产生冲突,无法编译,只能去除android:configChanges属性。测试还是无法打开h5支付页面。
-
搜索这个问题,大部分都是和文档里说的一样:主动添加activity。有一个说是需要在新线程里执行,我对照着文档和demo的代码,猜测不是这个问题,因为本身执行这段代码的已经是新线程了,而且测试再新创建一个线程执行还是同样的错误。搜索到的还有一个:https://blog.csdn.net/qijingwang/article/details/102739536,说是org.apache.http.legacy的问题,测试添加后依然不能解决。而且其实aar的xml中本来就已经存在org.apache.http.legacy了,不需要主动添加。
-
最终无奈编译官方的demo,但是运行需要id、密钥等信息,后端程序员根本没有给我这些信息。
-
翻看demo代码,发现是本地拼接的字符串orderStr,格式是:键值对以"=“号连接,相邻的键值对使用”&"连接。而查看服务端返回的数据,解密后是一个带双引号的字符串:
"alipay_sdk=alipay-sdk-PHP-4.11.14.ALL&app_id=2021003...2912&biz_conte..."
-
错误1:解密后是字符串,但不应该是带双引号的字符串,这样就需要手动取出双引号内的字符串,但是直接取出,不能确保是否存在需要去除转义的字符。
-
错误2:相邻的键值对应该使用"&“连接,而不是加上"amp;”。
-
文档中有orderStr的例子。
- 而且php的demo中应该指出了可能存在转义的情况:https://opendocs.alipay.com/open/54/106370
- 所以如果真的认真看文档了,或者测试了,或者参考已经有的项目,还没有发现这两个错误,那就真的是太不负责任了。对后端程序员完全失望了,此类的错误已经不是2、3次了。