
因為項目中需要用到支付,所以這一周就開始集成支付,因為微信支付貌似需要繳納200元才能使用微信第三方登陸,支付等功能,所以公司先要求集成支付寶,百度了一下,集成支付寶的過程,很多人都說集成支付寶太坑了,但我覺的前端還好,坑的是后台,后台天天吆喝着支付寶官方的文檔和demo太坑了,如果是后台的話,不要太相信支付寶官方文檔和demo,話不多說,集成開始!!!!!
支付大概流程圖

(下面的話是引用 )
(文/WK_IOSDevelpoer(簡書作者)
原文鏈接:http://www.jianshu.com/p/b88f87a552a1)
1.用戶選好了商品后,點擊提交訂單(一般是這樣),選擇使用支付寶付款。
2.手機客戶端(你做的APP)把用戶選擇的商品的信息傳給你們后台服務器。
3.后台的服務器將各種數據拼接簽名后生成一個簽名后的字符串,回傳到客戶端APP上。
4.用戶點擊確認支付按鈕,調用手機支付寶客戶端(在你手機上裝的那個),利用后台傳過來的那個參數調起支付寶,讓支付寶客戶端傳給他們服務器交互,進行付款。(這一步是支付寶自己完成的,安全性高)
5.支付寶的服務器將支付的結果(可能成功也可能不成功)返回給手機支付寶客戶端和你們公司的后台服務器。
6.你們公司后台服務器收到后一般是更新下數據信息(這個咱們不用管),手機支付寶客戶端會顯示一下支付成功,咱們的客戶端也可以顯示一個訂單支付成功之類的東西(就像在手機12306訂票,用支付寶支付后支付寶客戶端會說一次支付成功,12306也會說一次支付成功,咱們就像12306客戶端一樣,需要再說一次訂單支付成功)。
1.下載官方demo和sdk
https://github.com/chenyang-ios/alipay.git
里面有官方demo和sdk,下這個就行,在一起呢!!!
2、配置支付寶sdk

3、導入依賴庫

4、添加 URL schme

5、添加白名單
在info.plist里面添加

6、在pch文件里面導入
增加一個預編譯頭文件,導入
import <Foundation/Foundation.h>
import <UIKit/UIKit.h>
7、編譯,會報錯

解決辦法:Targets->Build Settings->Header Search Path中添加AliPaySDK文件夾的路徑
!!!!!添加路徑的時候直接將路徑拖進去就行了,不要看到里面有個加號,先點擊加號,再拖進去,那是沒用的~這個我弄了半天,煩人!!!!

8.如果編譯沒問題就成功一大半了,我們開始集成代碼,直接上代碼,用的話直接粘貼復制!!!在點擊支付的按鈕的觸發事件里面寫
"
//1. partnerID NSString *partnerID = @"2088421512225446"; //2. sellerID NSString *sellerId = @"miracle@mcqiji.com"; //3. 私鑰 NSString *privatekey = @"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALvqLWelnudXoSuEWXS+8RUMiTg0qrFWP2PrDFg9Keb9DyiCJbabZp7eoX1EJxETWuoXsNpmTS0IkYG5GSMdEcf1kFYR8XRr4dkFsXv+cOd0i+uXm26/IlYm48jX6VANtQBqESbv+7vYQoPeCD6fPh2bqD9BLaRtyGs10bGBm0GFAgMBAAECgYBT6K19qqbaBnchR2fqiZh9HavoPRw7M5f6teo9PJKJYlZycCsG7z1Tk3XoyZXoOgxOm2WNIEE16q2Oj2h6FXDqY7n17bw64lxERpFIMzuKEqVSGeDqHaVEFtN1EE1XRH04DY00UQEaIEpdX0FeRkxzpHWeRVQUpPreX0wT3ENBwQJBAPZSRBjrhPlO8xRhq4uGBp4bejNbYilgIhkkCC5/qYIBUxwoW4kSYvsJ/8tywYQ5I8I6Py1bRBBocyUFNe2yhvMCQQDDTGcBZv9Gs5etGWC3MFNYwQXDip3iL6R7Rv8xuD70N9YUneVPxP+Nikb2dihbuvyAMIfjyt70rwVp3c+gBiOnAkAHl5mJuxiqJojPhAMplcP2c5pcouBvrgrfA4FNDZpH64qIP6Yyn2J1omVD/BGC5c/4WJtB5qI+bzm9Vl/HJ82JAkEAgLzfdbQweKmwRUHiWD954ZqzsvewJcakFUNyu5KppREdhM+ktpW0o9fP+W1gIz+6bMIRAd7cY8zvs56s297QJwJAFSROxXaKUTQJ2DPrDL6YPE+7QjuS31KJMhJXWs7XPWWELigdHYrhCDPO5BQb7Vkz9p5prZRUDIINZbqJA7qSHQ=="; /* *生成訂單信息及簽名 */ //將商品信息賦予AlixPayOrder的成員變量 Order *order = [[Order alloc] init]; order.partner = partnerID; order.sellerID = sellerId; order.outTradeNO = _num; //訂單ID(由商家自行制定) order.subject = _titl; //商品標題 order.body = _cont; //商品描述 order.totalFee = [NSString stringWithFormat:@"%@",jiage]; //商品價格 order.notifyURL = huiURL; //回調URL order.service = @"mobile.securitypay.pay"; order.paymentType = @"1"; order.inputCharset = @"utf-8"; order.itBPay = min; order.showURL = @"m.alipay.com"; //應用注冊scheme,在AlixPayDemo-Info.plist定義URL types NSString *appScheme = @"alisdkdemo"; //將商品信息拼接成字符串 NSString *orderSpec = [order description]; NSLog(@"orderSpec = %@",orderSpec); // //獲取私鑰並將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規范,並將簽名字符串base64編碼和UrlEncode // id<DataSigner> signer = CreateRSADataSigner(privatekey); // // NSString *signedString = [signer signString:orderSpec]; //將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式 NSString *orderString = nil; if (qianming != nil) { orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec,qianming, @"RSA"]; NSLog(@"%@",orderString); [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }]; }
為了安全訂單信息都是后台給你的

這個官方簽名訂單信息,官方demo把訂單號和簽名都放在前端了,但是實際開發是簽名訂單號都是后台做的,讓后台給你就行,到時候這兩句話屏蔽,將

將官方的畫框的直接替換成從后台獲取的的簽名就行
在appdelegate.m文件的代碼,有兩個方法,一個是9.0之后的,一個是9.0之前的,為了安全我都寫了
導入頭文件
import <AlipaySDK/AlipaySDK.h>
//9.0之后的 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //如果極簡開發包不可用,會跳轉支付寶錢包進行支付,需要將支付寶錢包的支付結果回傳給開發包 if ([url.host isEqualToString:@"alisdkdemo"]) { [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { //【由於在跳轉支付寶客戶端支付的過程中,商戶app在后台很可能被系統kill了,所以pay接口的callback就會失效,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法里面處理跟callback一樣的邏輯】 NSLog(@"result = %@",resultDic); NSInteger orderState=[resultDic[@"resultStatus"] integerValue]; if (orderState==9000) { NSString *allString=resultDic[@"result"]; NSString * FirstSeparateString=@"\"&"; NSString * SecondSeparateString=@"=\""; NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithDictionary:[UserInfo VEComponentsStringToDic:allString withSeparateString:FirstSeparateString AndSeparateString:SecondSeparateString]] ; NSLog(@"ali=%@",dic); if ([dic[@"success"]isEqualToString:@"true"]) { [[NSNotificationCenter defaultCenter] postNotificationName:@"AliPaySucceed" object:nil userInfo:dic]; NSLog(@"支付成功"); [[NSNotificationCenter defaultCenter] postNotificationName:@"result" object:nil userInfo:resultDic]; } }else{ NSString *returnStr; switch (orderState) { case 8000: returnStr=@"訂單正在處理中"; break; case 4000: returnStr=@"訂單支付失敗"; break; case 6001: returnStr=@"訂單取消"; break; case 6002: returnStr=@"網絡連接出錯"; break; default: break; } } }]; } if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權返回authCode [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) { //【由於在跳轉支付寶客戶端支付的過程中,商戶app在后台很可能被系統kill了,所以pay接口的callback就會失效,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法里面處理跟callback一樣的邏輯】 NSLog(@"result = %@",resultDic); }]; } return YES; } //9.0之前的方法 -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{ [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); NSInteger orderState=[resultDic[@"resultStatus"] integerValue]; if (orderState==9000) { NSString *allString=resultDic[@"result"]; NSString * FirstSeparateString=@"\"&"; NSString * SecondSeparateString=@"=\""; NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithDictionary:[UserInfo VEComponentsStringToDic:allString withSeparateString:FirstSeparateString AndSeparateString:SecondSeparateString]] ; NSLog(@"ali=%@",dic); if ([dic[@"success"]isEqualToString:@"true"]) { [[NSNotificationCenter defaultCenter] postNotificationName:@"AliPaySucceed" object:nil userInfo:dic]; NSLog(@"支付成功"); [[NSNotificationCenter defaultCenter] postNotificationName:@"result" object:nil userInfo:resultDic]; } }else{ NSString *returnStr; switch (orderState) { case 8000: returnStr=@"訂單正在處理中"; break; case 4000: returnStr=@"訂單支付失敗"; break; case 6001: returnStr=@"訂單取消"; break; case 6002: returnStr=@"網絡連接出錯"; break; default: break; } } }]; return YES; }
appdelegate里面的方法block是走app客戶端的時候才會調用,如果手機沒有客戶端,就回自動跳到網頁端,沒事,支付寶直接寫好了,我們不用管,網頁端支付成功會走這個block

客戶端的話會走這個block

支付成功的頁面跳轉問題,我用的是通知,不能直接跳的!!!這個要注意,比如用客戶端
在appdelegate里面

在點擊支付的里面

注意如果遇到這個問題,一般是簽名錯了,問后台,讓他改!!!

支付成功以后支付寶給你返回的9000(代表支付成功),或者其他的,這個只是支付寶通知的,直返完成支付寶還會給后台異步通知,后台要判斷簽名被人篡改沒有,最終的支付狀態還是要聽后台的,在那兩個block里面在進行一次網絡請求,讓后台給你支付狀態,成不成功聽后台的!!!!!!我感覺我想到的我都寫了,還有什么問題可以給我留言~~~
出處這里:http://www.jianshu.com/p/13db9e3adad8