文章主要講到以下五部分:
一、支付寶開放平臺(tái)創(chuàng)建應(yīng)用
二、簽約移動(dòng)支付功能
三、接入支付前的準(zhǔn)備工作附準(zhǔn)備工作中遇到難題的解決方法
四、配置官方Demo附BUG解決方法
五、集成項(xiàng)目,具體代碼編寫、
本文為本人學(xué)習(xí)記錄筆記,如需轉(zhuǎn)載,請(qǐng)注明出處@iOSlyon
支付寶開放平臺(tái)創(chuàng)建應(yīng)用登錄支付寶開放平臺(tái)

管理中心創(chuàng)建應(yīng)用
1. 應(yīng)用創(chuàng)建完成后點(diǎn)擊查看我的應(yīng)用詳情進(jìn)行移動(dòng)支付功能的簽約
或者
2.進(jìn)入支付寶商家服務(wù)頁(yè)面"https://b.alipay.com/newIndex.htm"選擇移動(dòng)支付功能進(jìn)行簽約
簽約過(guò)程以下以簽約移動(dòng)支付功能為例子
商戶簽約審核簽約審核具體步驟請(qǐng)參見支付寶官方文檔簽約與審核
或者
???????? 下列圖示
填寫簽約信息

填寫簽約信息
上圖的附件文檔因?yàn)橛写挝臋n錯(cuò)誤導(dǎo)致審核不通過(guò),所以以下貼出審核成功的文檔供大家參考

Paste_Image.png
上述簽約步驟審核通過(guò)之后就可以開始集成工作了
接入前準(zhǔn)備工作
第一步、商戶密鑰管理密鑰作用
2.1.生成步驟
2.2.上傳步驟
這個(gè)步驟完全可以看官方文檔中的操作,官方文檔寫得很詳細(xì),但是其中有幾點(diǎn)需要說(shuō)明:
一、說(shuō)明問(wèn)題
上傳密鑰步驟不知道怎么上傳?因?yàn)槊荑€是pem文件,但是上傳的是字符串文本。
一、解決方法
將生成的pem文件復(fù)制一份到桌面,改成Txt文件打開即可獲取我們需要的字符串,記住當(dāng)我們引用這兩個(gè)長(zhǎng)的字符串時(shí),字符串不能包括,換行,空格,以及其他誤加的字符,所以復(fù)制的時(shí)候一定要小心。
二、說(shuō)明問(wèn)題
Mac 自帶openssl環(huán)境,不用安裝,直接終端輸入openssl就可以。
配置官方Demo代碼部分下載Demo
支付寶官方Demo中需要配置商戶的資料(如下)
//開放平臺(tái)登錄https://openhome.alipay.com/platform/appManage.htm//管理中心獲取APPID#defineMXAlipayAPPID? ? ? @"請(qǐng)配置你的AppID"http://支付寶私鑰(用戶自主生成,使用pkcs8格式的私鑰)#defineMXAlipayPrivateKey? @"請(qǐng)配置你的支付寶pkcs8私鑰"
配置以上數(shù)據(jù)后,真機(jī)編譯,遇到以下問(wèn)題
輸出錯(cuò)誤信息如配置信息中的私鑰(即上述PartnerPrivKey)使用的不適pkcs8的私鑰的話,則會(huì)報(bào)以下錯(cuò)誤
rsa_private read error :privatekeyisNULL
解決方法:
方法一將私鑰轉(zhuǎn)成PKCS8替換一下原私鑰即可轉(zhuǎn)換方法如下
( PHP服務(wù)端語(yǔ)言讀取私鑰不需要PKCS8轉(zhuǎn)換)
OpenSSL> genrsa -outrsa_private_key.pem1024#生成私鑰OpenSSL> pkcs8 -topk8 -inform PEM -inrsa_private_key.pem-outform PEM -nocrypt -outrsa_private_key_pkcs8.pem#Java開發(fā)者需要將私鑰轉(zhuǎn)換成PKCS8格式OpenSSL> rsa -inrsa_private_key.pem-pubout -outrsa_public_key.pem#生成公鑰OpenSSL> exit#退出OpenSSL程序
方法二檢查PID是否寫正確
接下來(lái)重新運(yùn)行,上述錯(cuò)誤已經(jīng)解決,但遇到新問(wèn)題如下圖
彈框顯示

解決方法: 可參考百度中查到的結(jié)果上述問(wèn)題解決方法
問(wèn)題源頭是因?yàn)樗借€跟商戶上傳的公鑰不匹配
處理完上述問(wèn)題之后,就可以進(jìn)行支付操作了
測(cè)試Demo具體操作
1.創(chuàng)建一個(gè)AlipayDemoTest項(xiàng)目
2.新建一個(gè)AliSDK文件夾,提取SDK包中以下文件到此文件夾里,

支付寶所需導(dǎo)入SDK文件
3.編譯項(xiàng)目,會(huì)出現(xiàn)以下問(wèn)題:
1)"Unknown type name ‘NSString‘ "或"Unknown type name ‘NSData‘ "

報(bào)錯(cuò)信息
這是因?yàn)槿鄙貴oundation類庫(kù)和UIKit類庫(kù),支付寶Demo中之所以沒(méi)有出現(xiàn)此錯(cuò)誤,是因?yàn)樵?pch文件中導(dǎo)入過(guò)這些類庫(kù)
解決辦法:只需要在出現(xiàn)錯(cuò)誤的文件中導(dǎo)入這些類庫(kù)即可

導(dǎo)入庫(kù)
2)‘openssl/asn1.h‘ file not found

報(bào)錯(cuò)信息
這是openssl文件夾頭文件鏈接問(wèn)題,如果openssl文件夾隨意拉進(jìn)項(xiàng)目中,即使添加頭文件鏈接,也可能解決不了此問(wèn)題,
這也是一開始就將所需要的文件放到一個(gè)新建文件夾中再添加到項(xiàng)目中的原因。
解決辦法:
Targets->Build Settings->Header Search Path中添加AliPaySDK文件夾的路徑

4.編譯項(xiàng)目,會(huì)出現(xiàn)以下問(wèn)題:

Paste_Image.png
解決方法:在xcode中,點(diǎn)擊項(xiàng)目名,選擇"target"->"Link Binary With Libraries"添加依賴庫(kù)。

Paste_Image.png
編輯程序,已經(jīng)可以成功編譯了,接下來(lái)就是集成代碼了
#import"AppDelegate.h"#import@interfaceAppDelegate()@end@implementationAppDelegate- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {// Override point for customization after application launch.returnYES;}- (BOOL)application:(UIApplication*)application? ? ? ? ? ? openURL:(NSURL*)url? sourceApplication:(NSString*)sourceApplication? ? ? ? annotation:(id)annotation{if([url.hostisEqualToString:@"safepay"]) {//跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary*resultDic) {NSLog(@"result = %@",resultDic);? ? ? ? }];? ? }returnYES;}//NOTE:9.0以后使用新API接口- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options{if([url.hostisEqualToString:@"safepay"]) {//跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary*resultDic) {NSLog(@"result = %@",resultDic);? ? ? ? }];? ? }returnYES;}@end
#import"ViewController.h"#import"Order.h"#import"DataSigner.h"#import@interfaceViewController()@end@implementationViewController- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{/*=========================================================*//*====客戶端調(diào)用支付寶支付(實(shí)際操作請(qǐng)放到服務(wù)端)=================*//*=========================================================*///AppId和PrivateKey沒(méi)有配置下的提示if(? [MXAlipayAPPID length] ==0||[MXAlipayPrivateKey length] ==0||[MXAlipayAPPID isEqualToString:@"請(qǐng)配置你的AppID"]? ? ? ? ||[MXAlipayPrivateKey isEqualToString:@"請(qǐng)配置你的支付寶pkcs8私鑰"])? ? {UIAlertView*alert = [[UIAlertViewalloc] initWithTitle:@"提示"message:@"缺少appId或者私鑰。"delegate:selfcancelButtonTitle:@"確定"otherButtonTitles:nil];? ? ? ? [alert show];return;? ? }//商品價(jià)格NSString*price = [NSStringstringWithFormat:@"%.2f",0.01];//將商品信息賦予AlixPayOrder的成員變量Order* order? ? = [Order new];? ? order.app_id= MXAlipayAPPID;//NOTE:app_id設(shè)置order.method= MXUrlAlipay;//NOTE:支付接口名稱order.charset=@"utf-8";//NOTE:參數(shù)編碼格式NSDateFormatter* formatter = [NSDateFormatternew];? ? [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];? ? order.timestamp= [formatter stringFromDate:[NSDatedate]];//NOTE:當(dāng)前時(shí)間點(diǎn)order.version=@"1.0";//NOTE:支付版本order.sign_type=@"RSA";//NOTE:sign_type設(shè)置//NOTE:商品數(shù)據(jù)order.biz_content= [BizContent new];? ? order.biz_content.body=@"我是測(cè)試數(shù)據(jù)";? ? order.biz_content.subject=@"1";? ? order.biz_content.out_trade_no= [selfgenerateTradeNO];//訂單ID(由商家自行制定)order.biz_content.timeout_express=@"30m";//超時(shí)時(shí)間設(shè)置order.biz_content.total_amount= price;//商品價(jià)格//將商品信息拼接成字符串NSString*orderInfo? ? ? ? = [order orderInfoEncoded:NO];NSString*orderInfoEncoded? = [order orderInfoEncoded:YES];NSLog(@"orderSpec = %@",orderInfo);//NOTE:獲取私鑰并將商戶信息簽名,外部商戶的加簽過(guò)程請(qǐng)務(wù)必放在服務(wù)端,防止公私鑰數(shù)據(jù)泄露;//? ? ? 需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncodeid signer = CreateRSADataSigner(MXAlipayPrivateKey);NSString*signedString = [signer signString:orderInfo];//NOTE:如果加簽成功,則繼續(xù)執(zhí)行支付if(signedString !=nil) {//應(yīng)用注冊(cè)scheme,在AliSDKDemo-Info.plist定義URL typesNSString*appScheme = MXURLScheme;//NOTE:將簽名成功字符串格式化為訂單字符串,請(qǐng)嚴(yán)格按照該格式NSString*orderString = [NSStringstringWithFormat:@"%@&sign=%@",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? orderInfoEncoded, signedString];//NOTE:調(diào)用支付結(jié)果開始支付[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary*resultDic) {NSLog(@"reslut = %@",resultDic);? ? ? ? }];? ? }}#pragma mark - Private Method//==============產(chǎn)生隨機(jī)訂單號(hào)==============+ (NSString*)generateTradeNO{staticintkNumber =15;NSString*sourceStr =@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";NSMutableString*resultStr = [[NSMutableStringalloc] init];? ? srand((unsigned)time(0));for(inti =0; i < kNumber; i++)? ? {unsignedindex = rand() % [sourceStr length];NSString*oneStr = [sourceStr substringWithRange:NSMakeRange(index,1)];? ? ? ? [resultStr appendString:oneStr];? ? }returnresultStr;}@end
已解決所有錯(cuò)誤
下載后替換掉MXAlipayConfig.h中的配置參數(shù)即可運(yùn)行,前提是你的參數(shù)不能錯(cuò)
使用方法可以參考Demo中的ReadMe文件
正式接入階段
服務(wù)端
負(fù)責(zé)生成訂單及簽名,及接受支付異步通知。
客戶端
負(fù)責(zé)使用服務(wù)端傳來(lái)的訂單信息調(diào)用支付寶支付接口,及根據(jù)SDK同步返回的支付結(jié)果展示結(jié)果頁(yè)。
服務(wù)端接入
私鑰必須放在服務(wù)端,簽名過(guò)程必須放在服務(wù)端。
集成支付寶后打包ipa,報(bào)如下一系列警告:

Paste_Image.png
解決方法:
1)? Go to Build Settings -> Build Options -> Debug Information Format
2)? Change the Debug setting from "DWARF with dSYM File" to "DWARF"
3)? Leave the Release setting at "DWARF with dSYM File"
AlipaySDK.framework 是先 build 的靜態(tài) lib ,然后轉(zhuǎn)成的 framework ,但是在 build 靜態(tài) lib 時(shí) CLANG_ENABLE_MODULES 沒(méi)有被設(shè)置成 disabled 。
文/iOSlyon(簡(jiǎn)書作者)
原文鏈接:http://www.itdecent.cn/p/b3063678c462
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書作者”。