天天看點

iOS 內建支付寶支付

   随着移動網際網路的快速發展,移動支付也變得越來越火熱,在北京的許多超市和飯店裡面都寫着支付寶支付立減10元,微信支付随機優惠幾元;移動支付正在成為這個時代不可阻擋的趨勢漸漸充斥在了我們的生活當中,同樣在我們的iOS開發中,也有大量的APP需要內建移動支付功能,目前移動支付的主要商家有支付寶、微信支付、銀聯支付等。當然我們優選的還是支付寶,因為支付寶有着中國最多的使用者量,市場占有量高,使用者黏性強,而且使用也極其簡單,隻需要幾分鐘我們就可以快速的內建到我們的項目當中。

       首先呢 我們先于支付寶簽約,獲得商戶ID (partner) 和賬号ID (seller)  、還有私匙這些使我們iOS內建支付所需要的, 再去支付寶開放平台(支付寶)下載下傳支付寶的iOS SDK,然後我們把一些相關的類庫檔案導入到我們的項目當中如下圖;我們先導入4個靜态庫檔案到項目中。

iOS 內建支付寶支付

  導入上面這個4個庫檔案之後  我們再導入一些類檔案,如下圖,我标示的2是必須要導入的,因為2是模型資料的名稱,1的話可以不導入,因為1這個檔案夾裡面的檔案,是支付寶模拟支付所用到的假資料資訊,包括加密的簽名(sign)資料等等,這個其實我們的伺服器給我們傳回的。但是為了做測試我們用這2個檔案夾裡的檔案模拟訂單資訊和簽名資訊。

iOS 內建支付寶支付

   當然,當我們導入上圖1檔案的時候,會有一些小錯誤,我隻需要在配置的->build setting->Header search paths裡面點選加号,添加  $(SRCROOT)/我們的工程名。例如我建立的工程的名字是payDemo,你們寫的時候要和你們的工程名字一樣,千萬别和我的一樣,否則會報錯的。如下圖:

iOS 內建支付寶支付

 我們再導入以下的系統庫檔案如下圖 ; 除了紅框裡面的其他的都需要我們導入。

iOS 內建支付寶支付

 我們再配置下url scheme來回調  我的url schme是thinklion  你們随便自己定義 如下圖:

iOS 內建支付寶支付

 好,需要配置的我們都配置好了,接下來就需要我們寫代碼了。我們再AppDelegate.m檔案中寫如下代碼:

[objc]  view plain copy

  1. #import "AppDelegate.h"  
  2. #import <AlipaySDK/AlipaySDK.h>  
  3. @interface AppDelegate ()  
  4. @end  
  5. @implementation AppDelegate  
  6. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
  7.     // Override point for customization after application launch.  
  8.     return YES;  
  9. }  
  10. //回調方法  
  11. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {  
  12.     //如果極簡 SDK 不可用,會跳轉支付寶錢包進行支付,需要将支付寶錢包的支付結果回傳給 SDK if ([url.host isEqualToString:@"safepay"]) {  
  13.     [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {  
  14.         NSLog(@"result = %@",resultDic);  
  15.     }];  
  16.     if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權傳回 authCode  
  17.         [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {  
  18.             NSLog(@"result = %@",resultDic);  
  19.         }];  
  20.     }  
  21.     return YES;  
  22. }  
  23. @end  

 在按鈕點選響應的方法來完成支付;

[objc]  view plain copy

  1. #import "ViewController.h"  
  2. #import "Order.h"  
  3. #import "DataSigner.h"  
  4. #import <AlipaySDK/AlipaySDK.h>  
  5. @interface ViewController ()  
  6. - (IBAction)pay;  
  7. @end  
  8. @implementation ViewController  
  9. - (void)viewDidLoad {  
  10.     [super viewDidLoad];  
  11. }  
  12. //支付按鈕點選的方法  
  13. - (IBAction)pay {  
  14.     //下面3個參數 我這裡不寫了 因為這是我們公司的商戶ID和私匙,你們可以用自己公司申請的填到上面。  
  15.     NSString *partner = @"";  
  16.     NSString *seller = @"";  
  17.     NSString *privateKey = @"";  
  18.     //如果partner和seller擷取失敗,提示使用者  
  19.     if ([partner length] == 0 ||  
  20.         [seller length] == 0 ||  
  21.         [privateKey length] == 0)  
  22.     {  
  23.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"  
  24.                                                         message:@"缺少partner或者seller或者私鑰。"  
  25.                                                        delegate:self  
  26.                                               cancelButtonTitle:@"确定"  
  27.                                               otherButtonTitles:nil];  
  28.         [alert show];  
  29.         return;  
  30.     }  
  31.     //2.建立訂單對象  
  32.     Order *order=[[Order alloc]init];  
  33.     order.partner=partner;  
  34.     order.seller=seller;  
  35.     order.tradeNO=@"201591734927845485340";  //訂單ID  
  36.     order.productName=@"iphone 6s" ;   //商品标題  
  37.     order.productDescription = @"超高配置 2個記憶體 配A9處理器  其性能是iphone6的1.8倍"; //商品描述  
  38.     order.amount = @"0.01" ;//商品價格  
  39.     order.notifyURL =  @"http://www.xxx.com"; //回調URL  
  40.     order.service = @"mobile.securitypay.pay";  
  41.     order.paymentType = @"1";  
  42.     order.inputCharset = @"utf-8";  
  43.     order.itBPay = @"30m";  
  44.     order.showUrl = @"m.alipay.com";  
  45.     NSString *appScheme = @"thinklion";  
  46.     //将商品資訊拼接成字元串  商品資訊也是伺服器傳回的  
  47.     NSString *orderSpec = [order description];  
  48.     //此資料是伺服器傳回的證書類型  
  49.     //擷取私鑰并将商戶資訊簽名,外部商戶可以根據情況存放私鑰和簽名,隻需要遵循RSA簽名規範,并将簽名字元串base64編碼和UrlEncode  
  50.     id<DataSigner> signer = CreateRSADataSigner(privateKey);  
  51.     //此簽名資訊是Util和openssl裡面的檔案生成的資料   其實應該是我們伺服器端給我們傳回的  
  52.     NSString *signedString = [signer signString:orderSpec];  
  53.     NSLog(@"orderSpec = %@",orderSpec);  
  54.    NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",  
  55.                    orderSpec, signedString, @"RSA"];  
  56.     //如果有簽名字元串 才打開支付  
  57.     if(signedString!=nil){  
  58.         [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {  
  59.             NSLog(@"reslut = %@",resultDic);  
  60.         }];  
  61.     }  
  62. }  
  63. @end  

  大家注意上述代碼的2個地方,代碼中訂單資訊 (orderSpec)  和簽名資訊(signedString)在實際項目中應該是伺服器給我們傳回的,而這裡是自定義的demo.

  //将商品資訊拼接成字元串 商品資訊也是伺服器傳回的

    NSString *orderSpec = [orderdescription];

    //此資料是伺服器傳回的證書類型

    //擷取私鑰并将商戶資訊簽名,外部商戶可以根據情況存放私鑰和簽名,隻需要遵循RSA簽名規範,并将簽名字元串base64編碼和UrlEncode

    id<DataSigner> signer =CreateRSADataSigner(privateKey);

    //此簽名資訊是Util和openssl裡面的檔案生成的資料  其實應該是我們伺服器端給我們傳回的

    NSString *signedString = [signersignString:orderSpec];

  當我們點選支付按鈕之後,支付寶的庫會自動判斷你的手機有沒有安裝支付寶,如果安裝了會打開支付寶APP,如果沒安裝會打開h5的網頁來支付。這個是我寫的支付寶demo代碼歡迎大家下載下傳觀看(點選下載下傳)

iOS 內建支付寶支付
iOS 內建支付寶支付