支付寶SDK集成

  最新項目中要用到支付寶支付、微信支付、銀聯支付。首先下手的就是支付寶支付,遇到不少問題,查看網上都是之前老版本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漏寫了,歡迎你們指正修改。

相關文章
相關標籤/搜索