前段時間公司要接入支付寶和微信致盟,自然這個任務(wù)落到了我頭上酸员。一邊做一邊研究,微信的很順利的就集成成功了挪略,所以這里不多說露筒,按著demo走就好呐伞。這里稍微總結(jié)下集成支付寶遇到的坑。
支付寶官方demo地址慎式。
1.支付寶SDK集成時找不到#include<openssl/rsa.h>
解決方法: 添加一下路徑伶氢,記住要在路徑兩邊加上 “”
添加完路徑之后,就可以順利編譯成功了瘪吏。
2.交易訂單處理失敗癣防,請稍后再試。(ALI64)
這種一般都是私鑰或者公鑰配置不正確的原因掌眠,一般來說簽名都是在服務(wù)器端配置蕾盯,然后直接返給客戶端,直接拼接成orderString即可:
NSString*orderString=[NSString stringWithFormat:@"%@&sign=\\\\"%@\\\\"&sign_type=\\\\"%@\\\\"",orderSpec,signString,@"RSA"];
但是就算服務(wù)器端出現(xiàn)了問題蓝丙,那還是我們大家一起解決吧级遭,所以問服務(wù)器端拿到了私鑰望拖,自己按照支付寶demo上的方法進行生成簽名。
運行之后發(fā)現(xiàn)控制臺打印出:rsa_private read error : private key is NULL
并且得到的sign是空的挫鸽。
google了一下發(fā)現(xiàn)是私鑰格式的問題说敏。PHP服務(wù)端語言讀取私鑰不需要PKCS8轉(zhuǎn)換。
解決辦法:
1.如果原來已經(jīng)生成了私鑰丢郊,并且已經(jīng)把公鑰傳給了阿里開發(fā)者平臺的盔沫,類似得到了下面這種
直接打開終端,cd到私鑰(.pem文件)所在目錄,
執(zhí)行:openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
即可枫匾,終端就會生成新的私鑰給你架诞。替換一下就ok了。
2.如果還未生成公鑰和私鑰干茉,執(zhí)行一下三步谴忧,并且把公鑰上傳到阿里開發(fā)者平臺即可。
(1)生成私鑰pem, ?執(zhí)行命令openssl genrsa -out rsa_private_key.pem 1024
(2)生成公鑰,執(zhí)行命令openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
(3)將RSA私鑰轉(zhuǎn)換成PKCS8格式,命令執(zhí)行openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
接下來運行角虫,發(fā)現(xiàn)終于成功了俏蛮。和服務(wù)器溝通后,決定簽名還是由服務(wù)器返回上遥,更安全。
最新發(fā)現(xiàn)一個很惡心的問題争涌,就是當我們拼接orderString的時候
NSString*orderString=[NSString stringWithFormat:@"%@&sign=\\\\"%@\\\\"&sign_type=\\\\"%@\\\\"",orderSpec,signString,@"RSA"];
orderSpec是支付寶demo里面重寫了description方法生成的粉楚,里面拼接partner和sellerID等參數(shù)是有順序的,而signString是由服務(wù)器那邊根據(jù)生成的亮垫,服務(wù)器拼接partner和sellerID等參數(shù)我們預(yù)期參數(shù)的順序不一致模软。也就是說signString需要根據(jù)orderSpec生成,但是orderSpec由客戶端生成饮潦,signString由服務(wù)器生成燃异。這就產(chǎn)生了順序不一致導(dǎo)致ALI64的問題。
真是蛋疼的很继蜡。解決辦法是要么服務(wù)器按照客戶端的順序來拼接參數(shù)回俐,要么就連同orderSpec和signString一同返回給客戶端。
哎稀并,不容易敖銎摹!