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

时间:2021-07-02 05:39:18

          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:

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


PAYConfig.h:

#ifndef AZ___demo_PAYConfig_h
#define AZ___demo_PAYConfig_h

//合作身份者id,以2088开头的16位纯数字
#define PartnerID @"2088511933544308"
//收款支付宝账号
#define SellerID  @"yingtehua8@sina.com"

//安全校验码(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,跳转到网页进行支付。模拟器上还有一个问题上,取消付款,程序会蹦掉,但是在真机上不会出现这样的问题。经过验证的。


效果图:

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


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



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