iOS中使用支付宝SDK支付的流程。
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;
支付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
#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,跳转到网页进行支付。模拟器上还有一个问题上,取消付款,程序会蹦掉,但是在真机上不会出现这样的问题。经过验证的。
效果图: