首先要向支付寶申請, 與支付寶簽約,獲得appID(partner)和私鑰(privateKey)烟央,這個一般都是公司做夺荒,直接找公司要瞒渠。
然后,下載支付寶SDK技扼,下載地址
下載好后伍玖,找到里面的AlipaySDK.bundle和AlipaySDK.framework拷貝到你的工程里面,
最好是創(chuàng)建一個文件夾單獨放支付寶拷貝的文件剿吻。
再找到AliSDKDemo文件夾里面的libcrypto.a和libssl.a兩個拷貝到工程
再找到AliSDKDemo文件夾里面的AliSDKDemo文件夾里面的Order.h和Order.m文件窍箍,Util和openssl文件也拷貝到工程里面你創(chuàng)建的文件夾。
打開你的viewController,先導(dǎo)入#import "Order.h"和#import<AlipaySDK/AlipaySDK.h>兩個頭文件仔燕,
在viewDidLoad方法里面,添加下面代碼
//重要說明
//這里只是為了方便直接向商戶展示支付寶的整個支付流程魔招;所以Demo中加簽過程直接放在客戶端完成晰搀;
//真實App里,privateKey等數(shù)據(jù)嚴禁放在客戶端办斑,加簽過程務(wù)必要放在服務(wù)端完成外恕;
//防止商戶私密數(shù)據(jù)泄露,造成不必要的資金損失乡翅,及面臨各種安全風險鳞疲;
/*============================================================================*/
/*=======================需要填寫商戶app申請的===================================*/
/*============================================================================*/
NSString *appID = @"";
// 如下私鑰,rsa2PrivateKey 或者 rsaPrivateKey 只需要填入一個
// 如果商戶兩個都設(shè)置了蠕蚜,優(yōu)先使用 rsa2PrivateKey
// rsa2PrivateKey 可以保證商戶交易在更加安全的環(huán)境下進行尚洽,建議使用 rsa2PrivateKey
// 獲取 rsa2PrivateKey,建議使用支付寶提供的公私鑰生成工具生成靶累,
// 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
NSString *rsa2PrivateKey = @"";
NSString *rsaPrivateKey = @"";
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
/*
*生成訂單信息及簽名
*/
//將商品信息賦予AlixPayOrder的成員變量
Order* order = [Order new];
// NOTE: app_id設(shè)置
order.app_id = appID;
// NOTE: 支付接口名稱
order.method = @"alipay.trade.app.pay";
// NOTE: 參數(shù)編碼格式
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 根據(jù)商戶設(shè)置的私鑰來決定
order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA";
// NOTE: 商品數(shù)據(jù)
order.biz_content = [BizContent new];
order.biz_content.body = @"";//商品標題
order.biz_content.subject = @"";//商品描述
order.biz_content.out_trade_no = @""; //訂單ID(由商家自行制定)
order.biz_content.timeout_express = @"30m"; //超時時間設(shè)置
order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品價格
//將商品信息拼接成字符串
NSString *orderInfo = [order orderInfoEncoded:NO];
NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
NSLog(@"orderSpec = %@",orderInfo);
編譯一下腺毫,你會發(fā)現(xiàn)報了很多的錯
不要怕,點開這個錯誤挣柬,進入到報錯的地方,就是Base64.h里面加上一個#import <Foundation/Foundation.h>潮酒,
再次編譯會發(fā)現(xiàn)還有錯誤,
再次點開這個錯誤邪蛔,進入到openssl_wrapper.h里面急黎,加入一個#import <Foundation/Foundation.h>
如果你的項目里面有PCH文件,直接在PCH文件里面導(dǎo)入#import <Foundation/Foundation.h>就行了侧到。
再吃編譯勃教,就只剩下一個錯誤了
這個錯誤的解決方法就是找到Targets -> Build Settings 下的 Header Search Paths
找到 Header Search Paths后雙擊后面的空白框彈出一個方框
點擊+號就會出來一個輸入框,在輸入框里面輸入$(SRCROOT)/你項目的名字/文件的絕對地址(就是放拷貝的支付寶文件的文件夾名)
編譯一下會報很多錯誤床牧,這是沒有添加依賴庫荣回,要添加下列依賴庫
其中,需要注意的是:
如果是Xcode 7.0之后的版本戈咳,需要添加libc++.tbd心软、libz.tbd;
如果是Xcode 7.0之前的版本著蛙,需要添加libc++.dylib删铃、libz.dylib
libz.tbd
libc++.tbd
QuartzCore.framework
CoreText.framework
CoreGraphics.framework
UIKit.framework
Foundation.framework
CoreMotion.Framework
CFNetwork.framework
CoreTelephony.framework
SystemConfiguration.framework
回到ViewController里面添加頭文件#import "RSADataSigner.h",再在viewDidLoad里面添加下面代碼
// NOTE: 獲取私鑰并將商戶信息簽名踏堡,外部商戶的加簽過程請務(wù)必放在服務(wù)端猎唁,防止公私鑰數(shù)據(jù)泄露;
// 需要遵循RSA簽名規(guī)范顷蟆,并將簽名字符串base64編碼和UrlEncode
NSString *signedString = nil;
RSADataSigner* signer = [[RSADataSigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)];
if ((rsa2PrivateKey.length > 1)) {
signedString = [signer signString:orderInfo withRSA2:YES];
} else {
signedString = [signer signString:orderInfo withRSA2:NO];
}
// NOTE: 如果加簽成功诫隅,則繼續(xù)執(zhí)行支付
if (signedString != nil) {
//應(yīng)用注冊scheme,在AliSDKDemo-Info.plist定義URL types
NSString *appScheme = @"Alipay2";
// NOTE: 將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
orderInfoEncoded, signedString];
// NOTE: 調(diào)用支付結(jié)果開始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
其中 NSString *appScheme = @"Alipay2";這個是你項目自己的名字腐魂,并且為了能夠從支付寶跳轉(zhuǎn)回自己的應(yīng)用還要在Info.plist定義URL types
點擊?號,將你的項目名字填進去進行了
最后,進入AppDelegate.m里面導(dǎo)入#import <AlipaySDK/AlipaySDK.h>再添加下面代碼
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
// 支付跳轉(zhuǎn)支付寶錢包進行支付逐纬,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
// 授權(quán)跳轉(zhuǎn)支付寶錢包進行支付蛔屹,處理支付結(jié)果
[[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(@"授權(quán)結(jié)果 authCode = %@", authCode?:@"");
}];
}
return YES;
}