您的位置:首页 > 移动开发 > IOS开发

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

2015-01-12 14:27 218 查看
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  @"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,跳转到网页进行支付。模拟器上还有一个问题上,取消付款,程序会蹦掉,但是在真机上不会出现这样的问题。经过验证的。

效果图:









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: