最新項目中要用到支付寶支付、微信支付、銀聯支付。首先下手的就是支付寶支付,遇到不少問題,查看網上都是之前老版本SDK的講解,部分並不適用,因此總結一下,但願能幫同胞們解決一些問題。express
剛下載SDK&Demo感受不難 ,心想照着文檔一步一步來吧,過程並無那麼簡單!!!那我就從最重要的事情提及了。安全
1、支付功能的必要條件:簽約微信
1.建立應用以後,添加功能。而後必定要上線--》簽約。地址:https://openhome.alipay.com/platform/appManage.htmapp
若是不簽約,我遇到的問題是ALI40247. 簽約成功以後才能正常支付框架
2.應用說明文檔,須要本身寫。下載《應用說明文檔示例》,按照格式寫測試
我這裏有一份寫好的,可是我好像不知道怎麼加進來!!!逗比了,有須要的我後邊建一個qq羣好了!微信支付
3.簽約。簽約成功的樣子是這樣的:顯示已簽約,纔算成功ui
好了,到這裏簽約完成。 備註:這些工做應該是後臺作的,就交給他們吧!編碼
2、下載支付寶SDK&demourl
下載地址不太好找!我直接粘在這裏了! https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.x3h32g&treeId=54&articleId=104509&docType=1
目前我用的最新的(推薦使用)
3、集成SDK
其實這些步驟支付寶官方文檔都有了,我按照個人思路寫一遍,以備不時之需。
1.把SDK中的這些文件集成到咱們的項目
還有一些框架加在 targets--> Build Phases 裏面
2.集成好了以後就要複製代碼了,直接把demo裏面ViewController的代碼所有複製過去.
#pragma mark ==============點擊訂單模擬支付行爲============== // //選中商品調用支付寶極簡支付 // - (void)doAlipayPay { //重要說明 //這裏只是爲了方便直接向商戶展現支付寶的整個支付流程;因此Demo中加簽過程直接放在客戶端完成; //真實App裏,privateKey等數據嚴禁放在客戶端,加簽過程務必要放在服務端完成; //防止商戶私密數據泄露,形成沒必要要的資金損失,及面臨各類安全風險; /*============================================================================*/ /*=======================須要填寫商戶app申請的===================================*/ /*============================================================================*/ // NSString *partner = @"208870120989419"; // 這是支付寶文檔裏的測試帳號 NSString *appID = @"20161018022204";//20161018022204 NSString *privateKey = @""; /*============================================================================*/ /*============================================================================*/ /*============================================================================*/ //partner和seller獲取失敗,提示 if ([appID length] == 0 || [privateKey length] == 0) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"缺乏appId或者私鑰。" delegate:self cancelButtonTitle:@"肯定" otherButtonTitles:nil]; [alert show]; return; } /* *生成訂單信息及簽名 */ //將商品信息賦予AlixPayOrder的成員變量 Order* order = [Order new]; // NOTE: app_id設置 order.app_id = appID; // NOTE: 支付接口名稱 order.method = @"alipay.trade.app.pay"; // NOTE: 參數編碼格式 order.charset = @"utf-8"; // NOTE: 當前時間點 NSDateFormatter* formatter = [NSDateFormatter new]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; order.timestamp = [formatter stringFromDate:[NSDate date]]; // NOTE: 支付版本 order.version = @"1.0"; // NOTE: sign_type設置 order.sign_type = @"RSA"; // NOTE: 商品數據 order.biz_content = [BizContent new]; order.biz_content.body = @"我是測試數據"; order.biz_content.subject = @"1"; order.biz_content.out_trade_no = [self generateTradeNO]; //訂單ID(由商家自行制定) order.biz_content.timeout_express = @"30m"; //超時時間設置 order.biz_content.total_amount = @"0.02"; //商品價格 //將商品信息拼接成字符串 NSString *orderInfo = [order orderInfoEncoded:NO]; NSString *orderInfoEncoded = [order orderInfoEncoded:YES]; // NSLog(@"%@",orderInfo); // NOTE: 獲取私鑰並將商戶信息簽名,‘外部商戶的加簽過程請務必放在服務端,防止公私鑰數據泄露; // 須要遵循RSA簽名規範,並將簽名字符串base64編碼和UrlEncode id<DataSigner> signer = CreateRSADataSigner(privateKey); NSString *signedString = [signer signString:orderInfo]; // NOTE: 若是加簽成功,則繼續執行支付 if (signedString != nil) { //應用註冊scheme,在AliSDKDemo-Info.plist定義URL types NSString *appScheme = @"baiwanpay2016"; // NOTE: 將簽名成功字符串格式化爲訂單字符串,請嚴格按照該格式 NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderInfoEncoded, signedString]; NSLog(@"%@",orderString); // NOTE: 調用支付結果開始支付 [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }]; } }
這裏的 privateKey appID須要本身的
須要注意的是:本身生成一對公鑰、私鑰。把公鑰給後臺配置到支付寶平臺上面,私鑰本身填進去。這步最容易出錯,空格、多餘字符都不要有!!!
在appdelegate裏面添加以下代碼:當沒有安裝手機支付寶客戶端的時候,會調用網頁端支付
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { if ([url.host isEqualToString:@"safepay"]) { // 支付跳轉支付寶錢包進行支付,處理支付結果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; // 受權跳轉支付寶錢包進行支付,處理支付結果 [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); // 解析 auth code NSString *result = resultDic[@"result"]; NSString *authCode = nil; if (result.length>0) { NSArray *resultArr = [result componentsSeparatedByString:@"&"]; for (NSString *subResult in resultArr) { if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) { authCode = [subResult substringFromIndex:10]; break; } } } NSLog(@"受權結果 authCode = %@", authCode?:@""); }]; } return YES; } // NOTE: 9.0之後使用新API接口 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options { if ([url.host isEqualToString:@"safepay"]) { // 支付跳轉支付寶錢包進行支付,處理支付結果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; // 受權跳轉支付寶錢包進行支付,處理支付結果 [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); // 解析 auth code NSString *result = resultDic[@"result"]; NSString *authCode = nil; if (result.length>0) { NSArray *resultArr = [result componentsSeparatedByString:@"&"]; for (NSString *subResult in resultArr) { if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) { authCode = [subResult substringFromIndex:10]; break; } } } NSLog(@"受權結果 authCode = %@", authCode?:@""); }]; } return YES; }
到這裏,集成部分就完成了。可是編譯會出現幾個錯誤。
4、解決一些問題及bug
1) Cannot find interface declaration for ‘NSObject’
解決:在報錯的文件中導入頭文件#import <Foundation/Foundation.h>
2)找不到 openssl/asn1.h 文件
解決:Build Settings –> Search Paths –> Header Search paths:$(PROJECT_DIR)/
這裏必定要注意:$(PROJECT_DIR)/ 後邊加的名字並非咱們工程的名字!!!而是咱們的SDK所在的文件夾的名字。。好比說:個人工程名是Pay,可是我把支付寶SDK放到了AlipaySDK 這個文件夾下,因此我就寫的是 $(PROJECT_DIR)/AlipaySDK 。這裏我試了無數路徑,必定要注意注意注意!!!
3)報錯:rsa_private read error : private key is NULL
解決:在支付寶SDK Util文件夾RSADataSigner.m中-->formatPrivateKey方法裏面
begin end後邊加上RSA
按照步驟到這裏支付寶集成 就基本完成了。可能有些bug漏寫了,歡迎你們指正修改。