集成支付宝的坑
前段时间公司要接入支付宝和微信,自然这个任务落到了我头上。一边做一边研究,微信的很顺利的就集成成功了,所以这里不多说,按着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一同返回给客户端。
哎,不容易啊!