iOS 支付寶集成中的那些坑

本文Demo地址

1.下載支付寶SDK以及Demohttps://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

2.解壓下載的.zip包,選擇iOS客戶端,看到的目錄結(jié)構(gòu)如下

Paste_Image.png

3.導(dǎo)入AliSDKDemo中的AliAlipaySDK.bundle AlipaySDK.framework libcrypto.a libssl.a四個文件到工程中

Paste_Image.png

4.導(dǎo)入demo中相關(guān)文件到項目中


Paste_Image.png

5.導(dǎo)入后項目結(jié)構(gòu)應(yīng)該是這樣的 其中AliPaySDK是筆者新建的文件夾用于存放支付寶項目文件的,你們可以自己創(chuàng)建文件夾

Paste_Image.png

6.導(dǎo)入系統(tǒng)依賴庫

Paste_Image.png

7.此時如果編譯的話,會報錯

Paste_Image.png

解決方法 在Header Search Paths中添加AliPaySDK路徑

注意 AliPaySDK為筆者自己創(chuàng)建的文件目錄 ,你們可以自行創(chuàng)建,然后換成自己的路徑就可以了
Paste_Image.png

8.客戶端調(diào)用支付寶SDK



#import "ViewController.h"
#import "Order.h"
#import "APAuthV2Info.h"
#import "DataSigner.h"
#import <AliPaySDK/AlipaySDK.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIButton *payButton = [UIButton buttonWithType:UIButtonTypeCustom];
    payButton.frame = CGRectMake(10, 100, self.view.frame.size.width-20, 40);
    [payButton setTitle:@"pay 0.01元" forState:UIControlStateNormal];
    [payButton setTitle:@"pay 0.01元" forState:UIControlStateSelected];
    [payButton setBackgroundColor:[UIColor orangeColor]];
    [payButton addTarget:self action:@selector(payAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:payButton];
}

/**
 *  支付按鈕
 */
- (void)payAction
{
    /*============================================================================*/
    /*=======================需要填寫商戶app申請的===================================*/
    /*============================================================================*/
    NSString *partner = @"2088*********"; /** 合作商戶ID  PID */
    NSString *seller = @"填寫支付寶賬號"; /** 支付寶賬號ID  */
    NSString *privateKey = @"很長的一串字符  文章下面有說明如何獲取"; /** 商戶私鑰 自助生成 */
    /*============================================================================*/
    /*============================================================================*/
    /*============================================================================*/
    
    //partner和seller獲取失敗,提示
    if ([partner length] == 0 ||
        [seller length] == 0 ||
        [privateKey length] == 0)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                        message:@"缺少partner或者seller或者私鑰。"
                                                       delegate:self
                                              cancelButtonTitle:@"確定"
                                              otherButtonTitles:nil];
        [alert show];
        return;
    }
    
    
    /*
     *生成訂單信息及簽名
     */
    //將商品信息賦予AlixPayOrder的成員變量
    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = [self generateTradeNO]; //訂單ID(由商家自行制定)
    order.productName = @"runbey測試商品"; //商品標題
    order.productDescription = @"runbey商品描述"; //商品描述
    order.amount = @"0.01"; //商品價格
    order.notifyURL =  @"http://*****"; //回調(diào)URL 異步通知服務(wù)器支付結(jié)果,便于服務(wù)器更新訂單狀態(tài)
    
//實際項目開發(fā)中 訂單信息應(yīng)該由服務(wù)器返回


    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showUrl = @"m.alipay.com";
    
    //應(yīng)用注冊scheme 便于支付結(jié)束后重新打開客戶端
    NSString *appScheme = @"ybpaydemo";
    
    //將商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    //將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        NSLog(@"簽名字符串:%@",orderString);
        
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"支付結(jié)果reslut = %@",resultDic);
        }];
    }
}

#pragma mark -
#pragma mark   ==============產(chǎn)生隨機訂單號==============

- (NSString *)generateTradeNO
{
    static int kNumber = 15;
    
    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand((unsigned)time(0));
    for (int i = 0; i < kNumber; i++)
    {
        unsigned index = rand() % [sourceStr length];
        NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
        [resultStr appendString:oneStr];
    }
    return resultStr;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

9.針對以上代碼做幾點說明

1.Mac終端中輸入 openssl 進入Openssl程序

  1. 生成私鑰 命令 genrsa -out rsa_private_key.pem 1024
    3.iOS客戶端需要將生成的私鑰轉(zhuǎn)換成PKCS8格式 命令 pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
獲取到pkcs8格式的字符串就是項目中需要的privatekey,取-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----

中間的部分 切記!?。。?/em>
4.生成公鑰 命令 rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem


  • 支付寶集成出現(xiàn)“系統(tǒng)繁忙,請稍后重試(ALI64)”錯誤的解決辦法

1.用記事本打開上面第四步生成的公鑰 rsa_public_key.pem,并將里面的密鑰拷貝出來,粘貼到合作伙伴密鑰管理中得RSA加密里,特別需要注意的是,需要將密鑰中的空格、回車等刪除,使該密鑰為一行字符串。
2.用記事本打開上面第四步生成的公鑰 rsa_public_key.pem,并將里面的密鑰拷貝出來,粘貼到開放平臺密鑰管理中得RSA加密里,特別需要注意的是,需要將密鑰中的空格、回車等刪除,使該密鑰為一行字符串。


至此,完成了支付寶iOS客戶端的集成。

記錄點滴,與君共勉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 填坑支付寶填坑是每個接入支付寶必經(jīng)之路,下面是我接入支付寶遇到的問題匯總,希望大家在接入的路上少一點彎路 問題1....
    lumic000閱讀 26,464評論 44 486
  • 因為近期項目中需要接入支付寶支付功能,自己也爬了很多的坑,所以做了一下這邊文章供大家學(xué)習(xí)參考,遠離爬坑,文章主要講...
    啓蘊閱讀 2,362評論 0 4
  • 嘟噥嘟噥:最近接到一個任務(wù):在客戶端動態(tài)生成RSA密鑰對,然后向服務(wù)器發(fā)送這個密鑰對中的公鑰字符串,由服務(wù)器進行公...
    TimmyR閱讀 8,353評論 19 21
  • 對號入座是種什么體驗,就是當你愉悅地happy了周末,第一天上班就遇到那個死人臉,然后死人臉一本正經(jīng)傻逼地痛批了你...
    雁點閱讀 286評論 1 0
  • 草戒指 2015年7月8日 究竟今天小草繞過指環(huán),我沒有去編那個草戒指,而是拿起狗尾巴草編了個不像兔子的兔子。 大...
    劉會專閱讀 725評論 2 7

友情鏈接更多精彩內(nèi)容