iOS -- 支付寶SDK 的使用(支付功能)

          iOS中使用支付寶SDK支付的流程。

     

          1:首先先導入支付寶官方的SDK-- “alipay”

          2:導入官方類庫:CFNetworkSystemConfigurationSecurity

          3:   在相應的頁面包含 頭文件

                                                #import "AlixLibService.h"

                                                #import "AlixPayOrder.h"

                                                #import "AlixPayResult.h"

                                                #import "AlixLibService.h"

                                                #import "DataSigner.h"

                                                #import "DataVerifier.h"

                                              

        --------------------------------------------------------

   以下才是開始使用支付寶支付

  --------------------------------------------------------


          4:生成訂單信息。(  需要使用官方提供的數據模型,   這個訂單用於用戶在支付寶進行支付的時候,多給出的提示,讓用戶知道自己爲什麼東西付款了)

        

          5:驗證密匙。(注意:這需要支付寶商戶提供自己的支付寶私匙,和支付寶公匙)

     

          6:   生成訂單

          7:調用 官方接口,發送請求。  + (void)payOrder:(NSString*)order AndScheme:(NSString*)scheme  seletor:(SEL)seletor target:(id)target;



支付Demo:

               


PAYConfig.h:

#ifndef AZ___demo_PAYConfig_h
#define AZ___demo_PAYConfig_h

//合作身份者id,以2088開頭的16位純數字
#define PartnerID @"2088511933544308"
//收款支付寶賬號
#define SellerID  @"[email protected]"

//安全校驗碼(MD5)密鑰,以數字和字母組成的32位字符
#define MD5_KEY @"1g81z5tgu3o2yst4mqm6n838dxe5cw1a"

//商戶私鑰,自助生成
#define PartnerPrivKey @"MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAL0M8jaJCm9bMb7PjgI0wR9+mpzWTcNTwTyYBEXmrJg3MjRVluUezDjQhQBSrgaMTeM40cz+1Nt/f1OlS/vB9PzGSF+MDty6zS0NQEEvVjUUge7PsOtbPDIEmuPppKIj4wETfavaZt7j4/kVuABDC2P1DpPRP686dJsNTkSO5qrNAgMBAAECgYApxEVy9P3gMkagQFzAcgVEvwTLp7EQeV2U1IUFKHxzOKaX11z6C77UwoTP2HRoL/E5RSFc5+QBBn8L7NYHrgdAu4L5Kl048saM53QyXJviQs7lgxDSBbo+EHDY9OJJsVRalpqKSirgBZmce/M4/tNhDxUfV5yXvxOC43JEr92UIQJBAPXbahDDMN+D0MqG1y0zPyU5bJwopXsSLIxpqp4vRmHokMxlber5HGMgSSnVQ9x9j974G1RSamqV34xwnqPzIlUCQQDE2ZPgtKd9Te19kGpmmCs64iqlkUVabAuKI8wMyx4hGZx6/EpeufFiTpF3F3YDN37JOenBefLL9UIkrOrjXI6ZAkBmpX75FKV5DG3FwNph0r2QaxM/d3DvmzziOtOzS4WVJyYdUFO+ANerQzWIs7OrgPjqXKf8YpRvf7dfyT1SshYpAkAhj0qDw6jOVwvHHWjWZtjv6AEHSxX8zXDGM0YlZDeVww0Hdp2jOqYpcWWhXRGUiNCHs+TjREwdc4m8QPKmom/5AkAYGRw6TLB/XWfEvlGLMHMmbZWMXDBdBmlIN+JK2oRjIoTryG35KlXzAHWcAq2xVhvCd6gJjz9arUmqewOLBMWn"


//支付寶公鑰
#define AlipayPubKey   @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB"


#endif






AZProduct.h:

#import <Foundation/Foundation.h>

/**商品數據模型*/
@interface AZProduct : NSObject

/**商品標題*/
@property (nonatomic,copy)NSString *title;
/**商品介紹,詳細信息*/
@property (nonatomic,copy)NSString *intro;
/**商品價格*/
@property (nonatomic,assign)float price;

/**訂單ID*/
@property (nonatomic,copy)NSString *orderID;

@end


AZViewController.h:

#import <UIKit/UIKit.h>
#import "AlixLibService.h"
#import "AlixPayOrder.h"
#import "AlixPayResult.h"
#import "AlixLibService.h"
#import "DataSigner.h"
#import "DataVerifier.h"


@interface AZViewController : UIViewController

@end


AZViewController.m: ( 關鍵支付流程在這裏,點擊tableviewCell的處理事件裏 )

#import "AZViewController.h"
#import "AZProduct.h"
#import "AZShowProductTableViewCell.h"

//支付配置文件(保存的是 商戶合作身份ID 、收款商戶的支付寶賬號 、安全校驗碼(MD5)密鑰、 商戶的私匙 、和 支付寶公匙 )
#import "PAYConfig.h"


@interface AZViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    UITableView *_tableView;
}
@property(nonatomic,strong)NSMutableArray *dataArray;

@end

@implementation AZViewController

#pragma mark -- 懶加載
-(NSMutableArray *)dataArray
{
    if (!_dataArray) {
        _dataArray=[NSMutableArray array];
        
        /**
                        模擬數據,實際應該是網絡請求然後填充模型
                 */
        
        NSArray *titles=@[@"話費充值",@"珍珠項鍊",@"韓版雪紡"];
        
        NSArray *intros=@[@"[四鑽信譽]北京移動30元 電腦全自動充值 1到10分鐘內到賬",@"[2元包郵]韓版 韓國 流行飾品太陽花小巧雛菊 珍珠項鍊2M15",@"飾品批發價 韓版雪紡紗圓點布花朵 山茶玫瑰花 髮圈胸針兩用 6002"];
        for (int i=0; i<3; i++)
        {
            AZProduct *product=[[AZProduct alloc] init];
            product.price=0.01;
            product.title=titles[i];
            product.intro=intros[i];
            [_dataArray addObject:product];
        }
        
    }
    return _dataArray;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self createTableView];

}
#pragma mark -- 創建Tableview
-(void)createTableView
{
    CGRect frame=self.view.bounds;
    _tableView=[[UITableView alloc] initWithFrame:CGRectMake(0, 64, frame.size.width, frame.size.height-64)];
    _tableView.dataSource=self;
    _tableView.delegate=self;
    _tableView.rowHeight=79;
    [self.view addSubview:_tableView];
}

#pragma mark -- UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    static BOOL isRegister=NO;
    if (!isRegister) {
        UINib *nib=[UINib nibWithNibName:@"AZShowProductTableViewCell" bundle:nil];
        [tableView registerNib:nib forCellReuseIdentifier:@"AZShowProductTableViewCell"];
        isRegister=YES;
    }
    
    AZShowProductTableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"AZShowProductTableViewCell"];
    
    AZProduct *product=self.dataArray[indexPath.row];
    cell.titleLabel.text=product.title;
    cell.introLabel.text=product.intro;
    cell.priceLabel.text=[NSString stringWithFormat:@"¥%.2f",product.price];
    
    
    return cell;
}

#pragma mark -- UITableViewDelegate 支付寶開始

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    /**
            從這裏開始,纔是支付寶支付的流程。
     
          1:首先先導入支付寶官方的SDK--alipay。
          2:導入官方類庫:CFNetwork、SystemConfiguration、Security
          3:   在響應的頁面包含 頭文件 :
                                                #import "AlixLibService.h"
                                                #import "AlixPayOrder.h"
                                                #import "AlixPayResult.h"
                                                #import "AlixLibService.h"
                                                #import "DataSigner.h"
                                                #import "DataVerifier.h"
                                              
     
          4:生成訂單信息。(  需要使用官方提供的數據模型,   這個訂單用於用戶在支付寶進行支付的時候,多給出的提示,讓用戶知道自己爲什麼東西付款了)
        
          5:驗證密匙。(注意:這需要支付寶商戶提供自己的支付寶私匙,和支付寶公匙)
     
          6:   生成訂單
          7:調用 官方接口,發送請求。  + (void)payOrder:(NSString*)order AndScheme:(NSString*)scheme  seletor:(SEL)seletor target:(id)target;
        */
    
    //應用程序名稱
    NSString *appScheme=@"AZPay";
    
    //  生成訂單信息
    NSString *orderInfo=[self getOrderInfo:indexPath.row];
    
    //  驗證密匙
    NSString *checkInfo=[self doRsa:orderInfo];
    
    
    //  生成訂單,使用字符串拼接(  注意:格式一定要這樣寫  )
    
    NSString *order=[NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderInfo,checkInfo,@"RSA"];
    
    
    //發送訂單請求
    [AlixLibService payOrder:order AndScheme:appScheme seletor:@selector(paymentResult:) target:self];
    
    
}

#pragma mark -- 生成訂單信息
-(NSString *)getOrderInfo:(NSInteger)index
{
    AZProduct *product=self.dataArray[index];
    
    //支付寶官方提供的數據模型
    AlixPayOrder *order=[[AlixPayOrder alloc] init];
    
    //01 商戶合作者身份ID( 使用宏 -- 在配置文件中申明 )
    order.partner=PartnerID;
    
    //02 商戶收款的支付寶賬號 ( 使用宏 -- 在配置文件中申明 )
    order.seller=SellerID;
    
    //03  訂單ID (這個是用戶下單之後,會生成一個訂單ID,這裏我們可以寫一個函數來隨機生成訂單ID)
    order.tradeNO=[self generateTradeNO];
    
    //04 商品標題
    order.productName=product.title;
    
    //05 商品描述
    order.productDescription=product.intro;
    
    //06 商品價格
    order.amount=[NSString stringWithFormat:@"%.2f",product.price];
    
    //07 通知URL(回調URL)
    
    //就這麼寫
    order.notifyURL =  @"http%3A%2F%2Fwwww.xxx.com"; //回調URL
    
    
    return order.description;
}

#pragma mark -- 生成訂單ID(隨機)
-(NSString *)generateTradeNO
{
    
    const int N =15;
    NSString * sourceString=@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *re=[[NSMutableString alloc]init];
    srand(time(0));
    for (int i=0; i<N; i++) {
        unsigned index=rand()%[sourceString length];
        NSString * s=[sourceString substringWithRange:NSMakeRange(index, 1)];
        [re appendString:s];
    }
    return re;
}

#pragma mark -- 驗證密匙
-(NSString *)doRsa:(NSString *)orderInfo
{
    id<DataSigner>signer;
    signer=CreateRSADataSigner(PartnerPrivKey);
    NSString * signedString=[signer signString:orderInfo];
    return signedString;
    
}

#pragma mark -- 支付回調函數
-(void)paymentResult:(NSString *)resultd
{
    //結果處理
    
    AlixPayResult* result = [[AlixPayResult alloc] initWithString:resultd];
    if (result)
    {
        
        if (result.statusCode == 9000)
        {
            /*
             *用公鑰驗證簽名 嚴格驗證請使用result.resultString與result.signString驗籤
             */
            
            //交易成功
            NSString* key = AlipayPubKey;//簽約帳戶後獲取到的支付寶公鑰
            id<DataVerifier> verifier;
            verifier = CreateRSADataVerifier(key);
            
            if ([verifier verifyString:result.resultString withSign:result.signString])
            {
                //驗證簽名成功,交易結果無篡改
                //交易成功
                
                NSLog(@"交易成功");
                
            }
        }
        else
        {
            //交易失敗
        }
    }
    else
    {
        //失敗
    }
}

@end


經過真機測試,支付流程完全沒有問題。如果手機上沒有支付寶客戶端,會直接跳到支付寶支付網頁端進行支付。如果有支付寶客戶端,則直接到支付寶客戶端進行支付。


在模擬器上,因爲沒有支付寶客戶端,所以直接是打開Safari,跳轉到網頁進行支付。模擬器上還有一個問題上,取消付款,程序會蹦掉,但是在真機上不會出現這樣的問題。經過驗證的。


效果圖:

         


         







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章