這些天公司讓做支付寶功能,不的不說小的也是第一次搞這個(gè)東西。所以遇到了不少坑,求助了多方大神,還有前輩們在網(wǎng)上留下的技術(shù)博客給解決了。為了防止世界被破壞,我決定給iOS新手的寶寶們做一個(gè)詳細(xì)的參考。由于我也是第一次寫簡書,技術(shù)還不成熟,有什么不對的地方請各位看官老爺們留下寶貴的意見。小的在這里謝過了。
接入支付寶的大致流程如下:
1.向支付寶申請, 與支付寶簽約,獲得商戶ID(partner)和賬號ID(seller)和私鑰(privateKey)
(1)生成公鑰和秘鑰的方法? 打開終端
生成私鑰pem,執(zhí)行命令?? openssl genrsa -outrsa_private_key.pem 1024

生成公鑰,執(zhí)行命令??? openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

//如果服務(wù)器端已經(jīng)生成公私密鑰,那么獲取他們的公私密鑰文件,然后編碼,然后將私鑰發(fā)給服務(wù)器,然后開始調(diào)試。
將RSA私鑰轉(zhuǎn)換成PKCS8格式,命令執(zhí)行openssl pkcs8 -topk8 -inform PEM -in
rsa_private_key.pem -outform PEM -nocrypt? PHP服務(wù)端語言讀取私鑰不需要PKCS8轉(zhuǎn)換。
2. 下載支付寶的demo
3. 生成訂單,簽名加密
4.調(diào)用支付寶客戶端,由支付寶客戶端跟支付寶安全服務(wù)器打交道
5.支付完畢后,支付寶客戶端會(huì)自動(dòng)跳回到原來的應(yīng)用程序
6.在原來的應(yīng)用程序中顯示支付結(jié)果給用戶看
下面開始正式的接入支付寶,假設(shè)你已經(jīng)獲得了 獲得商戶ID(partner- 一般以2088開頭)和賬號ID(seller)和私鑰(privateKey)
1.先將支付寶demo 中把下圖的文件拷貝到工程中

這個(gè)步驟值得注意的是,不要直接拖拽文件拷貝的工程,這樣你的路徑會(huì)出錯(cuò)。
解決方法先拷貝到一個(gè)文件夾中,然后在拷貝到工程中。
2. 添加依賴庫,在Build Phases選項(xiàng)卡的Link Binary With Libraries中

值得注意的是
如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib
可能遇到的困難
1.

不要慌張看到這么多錯(cuò)誤,這是阿里比較坑的地方,原因是缺少
#import<UIKit/UIKit.h>? 和 #import<Foundation/Foundation.h> 這兩個(gè)頭文件在
支付寶中AliSDKDemo-Prefix.pch 這個(gè)文件里添加了頭文件,我們只需要添加上即可。
問題2? 找不不這個(gè)文件

解決:Build Settings --> Search Paths --> Header Search paths : $(SRCROOT)/支付寶的文件路徑
例如:


問題3

遇到這樣的問題是因?yàn)樽约捍中亩鴮?dǎo)致,沒有添加下圖的這兩個(gè)文件

接下來我們開始生成訂單 (必須按照要求嚴(yán)格配置訂單,必須嚴(yán)格,必須嚴(yán)格,重要的事情說三遍)
//1.添加寫partner/seller/privateKey,簽約后獲得
NSString *partner =@"partner";
NSString*seller =@"seller";
NSString*privateKey =@"privateKey";
2.1.創(chuàng)建訂單Order *order =[[Order alloc] init];
order.partner = partner;
order.sellerID = seller;
order.outTradeNO = [self generateTradeNO]; //訂單ID(由商家自行制定)
order.subject = @“”; //商品標(biāo)題
order.body = @“”; //商品描述
order.totalFee = [NSString stringWithFormat:@"0.01"]; //商品價(jià)格
order.notifyURL =? @""; //回調(diào)URL
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showURL = @"m.alipay.com";
//應(yīng)用注冊scheme,在AlixPayDemo-Info.plist定義URL types? ?
NSString *appScheme = @"alisdkdemo";? ? ? ?
//將商品信息拼接成字符串? ? NSString *orderSpec = [order description];? ? NSLog(@"orderSpec = %@",orderSpec);? ? ??
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
idsigner = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴(yán)格按照該格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
上面為 生成訂單和 簽名的代碼。
值得注意的是官方推薦,一般生成訂單和簽名,獲得商戶ID(partner- 一般以2088開頭)和賬號ID(seller)和私鑰(privateKey) 都應(yīng)該放在后臺進(jìn)行,這樣極大方面的保護(hù)了金錢安全。我們只需要負(fù)責(zé)調(diào)用支付寶的回調(diào)方法,來處理結(jié)果。
配置完成后,我們快點(diǎn)興奮的來檢測一下,誒,好像遇到什么問題了。
我擦嘞,好不容易配置好了,可以測試了,他竟然又出現(xiàn)了錯(cuò)誤
???????????? 顯示系統(tǒng)繁忙,請稍后再試(ALI10)
這個(gè)問題很好解釋,字面意思就是錯(cuò)了唄。 解決方法
1. 你配置的秘鑰有問題,由于調(diào)用支付寶接口的那個(gè)平臺,他的秘鑰可能過期導(dǎo)致,或者是一些其他的協(xié)議出現(xiàn)了問題。
2.請聯(lián)系客服(不過我沒有試過)
解決了上面的問題我們在來測試下,oh 買噶的。 又遇到了問題,我也是醉了。
交易訂單處理失敗,請稍后再試。(ALI59)
小伙子們不要慌張,這個(gè)問題也是我們粗心而導(dǎo)致的,是因?yàn)槲覀兩傻挠唵斡袉栴}。解決方案:
1. 認(rèn)真核對配置訂單的信息,認(rèn)真核對,認(rèn)真核對,認(rèn)真核對。一定要認(rèn)真,也許是我們訂單商品名稱錯(cuò)了,訂單描述錯(cuò)了,拼接的價(jià)錢錯(cuò)了,要記住他們都是 NSString 類型。
以上就是本次的內(nèi)容,不的不說的是支付寶太任性了,我也是爬過了都少個(gè)坑才總結(jié)的經(jīng)驗(yàn)。以上的內(nèi)容也并非我自己解決的,查看了很多技術(shù)博客然后自己歸納整編到一起的,我是這方面的菜鳥,我的格言就是——站在巨人的肩膀上編程。謝謝前輩們開創(chuàng)的經(jīng)驗(yàn)道路,讓我們后輩繼承。
?