因?yàn)榻陧?xiàng)目中需要接入支付寶支付功能裹芝,自己也爬了很多的坑,所以做了一下這邊文章供大家學(xué)習(xí)參考娜汁,遠(yuǎn)離爬坑嫂易,文章主要講到以下五部分:
一、支付寶開放平臺(tái)創(chuàng)建應(yīng)用
三怜械、接入支付前的準(zhǔn)備工作附準(zhǔn)備工作中遇到難題的解決方法
本文為本人學(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)行簽約
商戶簽約審核簽約審核具體步驟請(qǐng)參見支付寶官方文檔簽約與審核
或者
??????? 下列圖示
填寫簽約信息
填寫簽約信息
上圖的附件文檔因?yàn)橛写挝臋n錯(cuò)誤導(dǎo)致審核不通過,所以以下貼出審核成功的文檔供大家參考
Paste_Image.png
2.1.生成步驟
2.2.上傳步驟
這個(gè)步驟完全可以看官方文檔中的操作彼绷,官方文檔寫得很詳細(xì)巍佑,但是其中有幾點(diǎn)需要說(shuō)明:
一、說(shuō)明問題
上傳密鑰步驟不知道怎么上傳寄悯?因?yàn)槊荑€是pem文件萤衰,但是上傳的是字符串文本。
一猜旬、解決方法
將生成的pem文件復(fù)制一份到桌面脆栋,改成Txt文件打開即可獲取我們需要的字符串,記住當(dāng)我們引用這兩個(gè)長(zhǎng)的字符串時(shí)洒擦,字符串不能包括椿争,換行,空格熟嫩,以及其他誤加的字符秦踪,所以復(fù)制的時(shí)候一定要小心。
二掸茅、說(shuō)明問題
Mac 自帶openssl環(huán)境椅邓,不用安裝,直接終端輸入openssl就可以昧狮。
支付寶官方Demo中需要配置商戶的資料(如下)
//開放平臺(tái)登錄https://openhome.alipay.com/platform/appManage.htm//管理中心獲取APPID#defineMXAlipayAPPID? ? ? @"請(qǐng)配置你的AppID"http://支付寶私鑰(用戶自主生成景馁,使用pkcs8格式的私鑰)#defineMXAlipayPrivateKey? @"請(qǐng)配置你的支付寶pkcs8私鑰"
配置以上數(shù)據(jù)后,真機(jī)編譯逗鸣,遇到以下問題
輸出錯(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)解決,但遇到新問題如下圖
彈框顯示
解決方法: 可參考百度中查到的結(jié)果上述問題解決方法
問題源頭是因?yàn)樗借€跟商戶上傳的公鑰不匹配
處理完上述問題之后慕购,就可以進(jìn)行支付操作了
1.創(chuàng)建一個(gè)AlipayDemoTest項(xiàng)目
2.新建一個(gè)AliSDK文件夾,提取SDK包中以下文件到此文件夾里茬底,
支付寶所需導(dǎo)入SDK文件
3.編譯項(xiàng)目沪悲,會(huì)出現(xiàn)以下問題:
1)"Unknown type name ‘NSString‘ "或"Unknown type name ‘NSData‘ "
報(bào)錯(cuò)信息
這是因?yàn)槿鄙貴oundation類庫(kù)和UIKit類庫(kù),支付寶Demo中之所以沒有出現(xiàn)此錯(cuò)誤阱表,是因?yàn)樵?pch文件中導(dǎo)入過這些類庫(kù)
解決辦法:只需要在出現(xiàn)錯(cuò)誤的文件中導(dǎo)入這些類庫(kù)即可
導(dǎo)入庫(kù)
2)‘openssl/asn1.h‘ file not found
報(bào)錯(cuò)信息
這是openssl文件夾頭文件鏈接問題殿如,如果openssl文件夾隨意拉進(jìn)項(xiàng)目中,即使添加頭文件鏈接最爬,也可能解決不了此問題涉馁,
這也是一開始就將所需要的文件放到一個(gè)新建文件夾中再添加到項(xiàng)目中的原因。
解決辦法:
Targets->Build Settings->Header Search Path中添加AliPaySDK文件夾的路徑
4.編譯項(xiàng)目爱致,會(huì)出現(xià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沒有配置下的提示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:獲取私鑰并將商戶信息簽名,外部商戶的加簽過程請(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
下載后替換掉MXAlipayConfig.h中的配置參數(shù)即可運(yùn)行,前提是你的參數(shù)不能錯(cuò)
服務(wù)端
負(fù)責(zé)生成訂單及簽名拳锚,及接受支付異步通知。
客戶端
負(fù)責(zé)使用服務(wù)端傳來(lái)的訂單信息調(diào)用支付寶支付接口肴茄,及根據(jù)SDK同步返回的支付結(jié)果展示結(jié)果頁(yè)晌畅。
服務(wù)端接入
私鑰必須放在服務(wù)端,簽名過程必須放在服務(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 沒有被設(shè)置成 disabled 断箫。
文/lyoniOS(簡(jiǎn)書作者)
原文鏈接:http://www.reibang.com/p/b3063678c462
著作權(quán)歸作者所有破婆,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)冠句,并標(biāo)注“簡(jiǎn)書作者”竟痰。
頂?:? 安卓的私鑰不需要轉(zhuǎn)pcks8潮孽,ios的才需要