iOS开发技术讨论swift编程开发iOS

集成支付宝的坑

2016-07-27  本文已影响316人  陈阿票

前段时间公司要接入支付宝和微信,自然这个任务落到了我头上。一边做一边研究,微信的很顺利的就集成成功了,所以这里不多说,按着demo走就好。这里稍微总结下集成支付宝遇到的坑。

支付宝官方demo地址

1.支付宝SDK集成时找不到#include<openssl/rsa.h>

解决方法: 添加一下路径,记住要在路径两边加上 “”

search path

添加完路径之后,就可以顺利编译成功了。

2.交易订单处理失败,请稍后再试。(ALI64)

这种一般都是私钥或者公钥配置不正确的原因,一般来说签名都是在服务器端配置,然后直接返给客户端,直接拼接成orderString即可:

NSString*orderString=[NSString stringWithFormat:@"%@&sign=\\\\"%@\\\\"&sign_type=\\\\"%@\\\\"",orderSpec,signString,@"RSA"];

但是就算服务器端出现了问题,那还是我们大家一起解决吧,所以问服务器端拿到了私钥,自己按照支付宝demo上的方法进行生成签名。

运行之后发现控制台打印出:rsa_private read error : private key is NULL

并且得到的sign是空的。

google了一下发现是私钥格式的问题。PHP服务端语言读取私钥不需要PKCS8转换。

解决办法:

1.如果原来已经生成了私钥,并且已经把公钥传给了阿里开发者平台的,类似得到了下面这种

私钥

直接打开终端,cd到私钥(.pem文件)所在目录,

执行:openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

即可,终端就会生成新的私钥给你。替换一下就ok了。

2.如果还未生成公钥和私钥,执行一下三步,并且把公钥上传到阿里开发者平台即可。

(1)生成私钥pem,  执行命令openssl genrsa -out rsa_private_key.pem 1024

(2)生成公钥,执行命令openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

(3)将RSA私钥转换成PKCS8格式,命令执行openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

接下来运行,发现终于成功了。和服务器沟通后,决定签名还是由服务器返回,更安全。


最新发现一个很恶心的问题,就是当我们拼接orderString的时候

NSString*orderString=[NSString stringWithFormat:@"%@&sign=\\\\"%@\\\\"&sign_type=\\\\"%@\\\\"",orderSpec,signString,@"RSA"];

orderSpec是支付宝demo里面重写了description方法生成的,里面拼接partner和sellerID等参数是有顺序的,而signString是由服务器那边根据生成的,服务器拼接partner和sellerID等参数我们预期参数的顺序不一致。也就是说signString需要根据orderSpec生成,但是orderSpec由客户端生成,signString由服务器生成。这就产生了顺序不一致导致ALI64的问题。

真是蛋疼的很。解决办法是要么服务器按照客户端的顺序来拼接参数,要么就连同orderSpec和signString一同返回给客户端。

哎,不容易啊!

上一篇下一篇

猜你喜欢

热点阅读