1勾习、下載支付寶SDK
2苫幢、進入支付平臺注冊應用
3盹憎、獲取支付相關的 '私鑰' 和 '密鑰'
下載macOSX版本 根據圖示走
Paste_Image.png
Paste_Image.png
將生成的公鑰添加到你支付寶平臺注冊
Paste_Image.png
而你APP中需要的私鑰就這個
Paste_Image.png
但是需要文本編輯器打開才可以看到你的私鑰
Paste_Image.png
中間這一段就是你要寫入你APP的私鑰
Paste_Image.png
4拒贱、集成支付寶SDK
新建一個項目 導入這8個文件
然后根據支付寶官方文檔導入相關依賴的庫
Paste_Image.png
新建PCH文件 將這個頭文件放進去
設置APP的ATS
Paste_Image.png
如果出現這種錯誤,就在錯誤的文件中添加 #import <Foundation/Foundation.h>
Paste_Image.png
這是openssl文件夾頭文件鏈接問題,如果openssl文件夾隨意拉進項目中崔梗,即使添加頭文件鏈接夜只,也可能解決不了此問題,
這也是問什么一開始就將所需要的文件放到一個新建文件夾中再添加到項目中的原因蒜魄。
解決辦法:Targets->Build Settings->Header Search Path中添加1中建立的aliPaySDK文件夾的路徑(拖拽此文件夾至輸入框即可)
Paste_Image.png
現在你進行編譯,應該是可以通過的.
5扔亥、支付代碼
ViewController.m
#pragma mark -
#pragma mark ==============點擊訂單模擬支付行為==============
//
//選中商品調用支付寶極簡支付
//
- (void)doAlipayPay
{
//重要說明
//這里只是為了方便直接向商戶展示支付寶的整個支付流程;所以Demo中加簽過程直接放在客戶端完成谈为;
//真實App里砸王,privateKey等數據嚴禁放在客戶端,加簽過程務必要放在服務端完成峦阁;
//防止商戶私密數據泄露,造成不必要的資金損失耘成,及面臨各種安全風險榔昔;
/*============================================================================*/
/*=======================需要填寫商戶app申請的===================================*/
/*============================================================================*/
NSString *appID = @"這里填寫你在支付寶平臺注冊的應用APPID";
NSString *privateKey = @"這里填寫你的私鑰(就是用文本編輯器打開的那一大串)";
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
//partner和seller獲取失敗,提示 (這里判斷你有沒有填寫appID和私鑰)
if ([appID length] == 0 ||
[privateKey length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少appId或者私鑰。"
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
return;
}
(下面就是一些訂單信息的設置)
/*
*生成訂單信息及簽名
*/
//將商品信息賦予AlixPayOrder的成員變量
Order* order = [Order new];
// NOTE: app_id設置
order.app_id = appID;
// NOTE: 支付接口名稱
order.method = @"alipay.trade.app.pay";
// NOTE: 參數編碼格式
order.charset = @"utf-8";
// NOTE: 當前時間點
NSDateFormatter* formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
order.timestamp = [formatter stringFromDate:[NSDate date]];
// NOTE: 支付版本
order.version = @"1.0";
// NOTE: sign_type設置
order.sign_type = @"RSA";
// NOTE: 商品數據
order.biz_content = [BizContent new];
order.biz_content.body = @"我是測試數據";
order.biz_content.subject = @"1";
order.biz_content.out_trade_no = [self generateTradeNO]; //訂單ID(由商家自行制定)
order.biz_content.timeout_express = @"30m"; //超時時間設置
order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品價格
//將商品信息拼接成字符串
NSString *orderInfo = [order orderInfoEncoded:NO];
NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
NSLog(@"orderSpec = %@",orderInfo);
**********************這里需要特別注意,仔細看注釋*************************
// NOTE: 獲取私鑰并將商戶信息簽名瘪菌,外部商戶的加簽過程請務必放在服務端撒会,防止公私鑰數據泄露;
// 需要遵循RSA簽名規(guī)范师妙,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];
// NOTE: 如果加簽成功诵肛,則繼續(xù)執(zhí)行支付
if (signedString != nil) {
//應用注冊scheme,在AliSDKDemo-Info.plist定義URL types
NSString *appScheme = @"alisdkdemo";
// NOTE: 將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
orderInfoEncoded, signedString];
(這里就是開始正常的支付了)
// NOTE: 調用支付結果開始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
}
由于暫時還沒有PID 所以這一部分還沒有去做.以后會完成的
#pragma mark -
#pragma mark ==============點擊模擬授權行為==============
- (void)doAlipayAuth
{
//重要說明
//這里只是為了方便直接向商戶展示支付寶的整個支付流程;所以Demo中加簽過程直接放在客戶端完成默穴;
//真實App里怔檩,privateKey等數據嚴禁放在客戶端褪秀,加簽過程務必要放在服務端完成;
//防止商戶私密數據泄露薛训,造成不必要的資金損失媒吗,及面臨各種安全風險;
/*============================================================================*/
/*=======================需要填寫商戶app申請的===================================*/
/*============================================================================*/
NSString *pid = @"";
NSString *appID = @"";
NSString *privateKey = @"";
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
//pid和appID獲取失敗,提示
if ([pid length] == 0 ||
[appID length] == 0 ||
[privateKey length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少pid或者appID或者私鑰乙埃。"
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:@"呵呵",nil];
[alert show];
return;
}
//生成 auth info 對象
APAuthV2Info *authInfo = [APAuthV2Info new];
authInfo.pid = pid;
authInfo.appID = appID;
//auth type
NSString *authType = [[NSUserDefaults standardUserDefaults] objectForKey:@"authType"];
if (authType) {
authInfo.authType = authType;
}
//應用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString *appScheme = @"alisdkdemo";
// 將授權信息拼接成字符串
NSString *authInfoStr = [authInfo description];
NSLog(@"authInfoStr = %@",authInfoStr);
// 獲取私鑰并將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:authInfoStr];
// 將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
if (signedString.length > 0) {
authInfoStr = [NSString stringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, signedString, @"RSA"];
[[AlipaySDK defaultService] auth_V2WithInfo:authInfoStr
fromScheme:appScheme
callback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = nil;
if (result.length>0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授權結果 authCode = %@", authCode?:@"");
}];
}
}
AppDelegate.m
支付寶app支付完成以后回到APP會調用的方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
if ([url.host isEqualToString:@"safepay"]) {
// 支付跳轉支付寶錢包進行支付闸英,處理支付結果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
// 授權跳轉支付寶錢包進行支付,處理支付結果
[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = nil;
if (result.length>0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授權結果 authCode = %@", authCode?:@"");
}];
}
return YES;
}
個人還在學習中...要是有什么不對的地方歡迎指出.
沒有寫完,還會繼續(xù)寫下去的....