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
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,跳轉到網頁進行支付。模擬器上還有一個問題上,取消付款,程序會蹦掉,但是在真機上不會出現這樣的問題。經過驗證的。
效果圖: