(點(diǎn)擊上方公眾號(hào),,可快速關(guān)注我們)
來源: Vinc 鏈接:http://www.jianshu.com/p/ccfb86cd8f9f
一、去官網(wǎng)申請(qǐng)開通支付寶使用權(quán)限
二,、審核通過
1、seller ID:商家唯一標(biāo)識(shí)符
2,、partner ID:合作身份者 ID,,以2088開頭的16位純數(shù)字
3,、加密用到的文件(支付寶公鑰/自助生成的商家私鑰)
三、具體項(xiàng)目代碼(Demo)
準(zhǔn)備工作:解壓從支付寶網(wǎng)站上下載到的SDK壓縮包(藏的很深,具體網(wǎng)址是https://b.alipay.com/order/productDetail.htm?productId=2014110308141993&tabId=1#ps-tabinfo-hash,下載到的文件名是 WS_MOBILE_PAY_SDK_BASE.zip,,內(nèi)含Android 和 iOS 的 SDK),,找到WS_MOBILE_PAY_SDK_BASE –> 支付寶錢包支付接口開發(fā)包2.0標(biāo)準(zhǔn)版(20150724) –> DEMO –> 客戶端demo –> 支付寶錢包支付接口開發(fā)包2.0標(biāo)準(zhǔn)版(iOS 2.2.3).zip,解壓,。
位置藏的很好
1,、啟動(dòng)IDE(如Xcode),把iOS包中的以下文件拷貝到項(xiàng)目文件夾下,并導(dǎo)入到項(xiàng)目工程中,。
AlipaySDK.bundle AlipaySDK.framework AliSDKDemo文件夾下的Order.h AliSDKDemo文件夾下的Order.m AliSDKDemo文件夾下的Util文件夾 AliSDKDemo文件夾下的openssl文件夾 AliSDKDemo文件夾下的libcrypto.a AliSDKDemo文件夾下的libssl.a
2,、新建一個(gè)header file(.h)文件,,放入商家相關(guān)的宏
// PartnerConfig.h // YuenAlipayDemo // // Created by peikua on 15/8/17. // Copyright (c) 2015年 Ruan. All rights reserved. // #ifndef YuenAlipayDemo_PartnerConfig_h #define YuenAlipayDemo_PartnerConfig_h //合作身份者id,,以2088開頭的16位純數(shù)字 #define PartnerID @'2088511933544308' //收款支付寶賬號(hào) #define SellerID @'[email protected]' //商戶私鑰,,自助生成 #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' //安全校驗(yàn)碼(MD5)密鑰,以數(shù)字和字母組成的32位字符 #define MD5_KEY @'1g81z5tgu3o2yst4mqm6n838dxe5cw1a' #endif
3,、在 ViewController.m 中導(dǎo)入必要的頭文件,,新建一個(gè)按鈕,,為按鈕添加“購(gòu)買Action”
// ViewController.m // YuenAlipayDemo // // Created by peikua on 15/8/17. // Copyright (c) 2015年 Ruan. All rights reserved. // #import 'ViewController.h' #import 'MyUtility.h' #import <AlipaySDK/AlipaySDK.h> #import 'Order.h' #import 'PartnerConfig.h' @interface ViewController () <UITableViewDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIButton *payButton = [MyUtility createButtonWithFrame:CGRectMake(0, kHeightOfScreen/2, kWidthOfScreen, 100) title:@'支付' backgroundImageName: nil selectImageName:nil target:self action:@selector(payAction)]; payButton.backgroundColor = [UIColor colorWithRed:0.000 green:1.000 blue:0.870 alpha:1.000]; [self.view addSubview:payButton]; }
4,、購(gòu)買Action
- (void)payAction { /** * 1. 生成訂單信息 */ Order *order = [[Order alloc] init]; order.partner = PartnerID; //支付寶分配給商戶的ID order.seller = SellerID; //收款支付寶賬號(hào)(用于收款) order.tradeNO = [self generateTradeNO]; //訂單ID(由商家自行制定) NSLog(@'%@', order.tradeNO); order.productName = @'Mac'; //商品標(biāo)題 order.productDescription = @'MacBook Air'; //商品描述 order.amount = [NSString stringWithFormat:@'%.2f', 0.01]; //商品價(jià)格 //???: 回調(diào) URL 沒有進(jìn)行調(diào)試 order.notifyURL = @'http://www.'; //回調(diào)URL(通知服務(wù)器端交易結(jié)果)(重要) //???: 接口名稱要如何修改? order.service = @'mobile.securitypay.pay'; //接口名稱, 固定值, 不可空 order.paymentType = @'1'; //支付類型 默認(rèn)值為1(商品購(gòu)買), 不可空 order.inputCharset = @'utf-8'; //參數(shù)編碼字符集: 商戶網(wǎng)站使用的編碼格式, 固定為utf-8, 不可空 order.itBPay = @'30m'; //未付款交易的超時(shí)時(shí)間 取值范圍:1m-15d, 可空 // 應(yīng)用注冊(cè)scheme,在當(dāng)前項(xiàng)目的Info.plist定義URL types NSString *appScheme = @'alisdkdemo'; // 將訂單信息拼接成字符串 NSString *orderSpec = [order description]; NSLog(@'訂單信息orderSpec = %@', orderSpec); /** * 2. 簽名加密 * 獲取私鑰并將商戶信息簽名, 外部商戶可以根據(jù)情況存放私鑰和簽名, 只需要遵循 RSA 簽名規(guī)范, 并將簽名字符串 base64 編碼和 UrlEncode */ id <DataSigner> signer = CreateRSADataSigner(PartnerPrivKey); NSString *signedString = [signer signString:orderSpec]; /** * 3. 將簽名成功字符串格式化為訂單字符串,請(qǐng)嚴(yán)格按照該格式 */ NSString *orderString = nil; if (signedString != nil) { orderString = [NSString stringWithFormat:@'%@&sign=\'%@\'&sign_type=\'%@\'', orderSpec, signedString, @'RSA']; [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@'reslut = %@',resultDic); }]; } } /** * 產(chǎn)生隨機(jī)訂單號(hào) * * @return 訂單號(hào)字符串 */ - (NSString *)generateTradeNO { static int kNumber = 15; NSString *sourceStr = @'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; NSMutableString *resultStr = [[NSMutableString alloc] init]; /* 支付寶官方給出的 Demo 中加入了這句生成種子的代碼, 但是 arc4random 似乎并不需要生成隨機(jī)種子(引用網(wǎng)上: arc4random() 是一個(gè)真正的偽隨機(jī)算法,,不需要生成隨機(jī)種子,因?yàn)榈谝淮握{(diào)用的時(shí)候就會(huì)自動(dòng)生成) srand((unsigned)time(0)); */ for (int i = 0; i < kNumber; i ) { unsigned index = arc4random() % [sourceStr length]; NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)]; [resultStr appendString:oneStr]; } NSLog(@'隨機(jī)生成的訂單號(hào)->%@', resultStr); return resultStr; }
5,、配置支付寶客戶端返回url處理方法:
在AppDelegate.m中,,重寫- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //如果極簡(jiǎn)開發(fā)包不可用,會(huì)跳轉(zhuǎn)支付寶錢包進(jìn)行支付,需要將支付寶錢包的支付結(jié)果回傳給開 發(fā)包 if ([url.host isEqualToString:@'safepay']) { [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@'result = %@',resultDic); }]; } if ([url.host isEqualToString:@'platformapi']){ //支付寶錢包快登授權(quán)返回 authCode [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@'result = %@',resultDic); }]; } return YES; }
四,、博主自己遇到的項(xiàng)目運(yùn)行報(bào)錯(cuò)的2個(gè)地方,另需要注意添加URL Schemes
1,、lexical or preprocessor issue 'penssl/asn1.h' file not found 支付寶提供的PDF中有解決辦法(自己犯二了沒有好好看文檔)
點(diǎn)擊項(xiàng)目名稱,點(diǎn)擊“Build Settings”選項(xiàng)卡,在搜索框中,以關(guān)鍵字“search” 搜索,對(duì)“Header Search Paths”增加頭文件路徑:$(SRCROOT)/項(xiàng)目名稱,。
2、報(bào)的一堆 Apple Mach-O Linker Error:點(diǎn)擊項(xiàng)目名稱,點(diǎn)擊“Build Phases”選項(xiàng)卡,在“Link Binary with Librarles” 選項(xiàng)中,新增“SystemConfiguration.framework” 系統(tǒng)庫(kù)文件
3,、配置URL Schemes:點(diǎn)擊項(xiàng)目名稱,點(diǎn)擊“Info”選項(xiàng)卡,在“URL Types”選項(xiàng)中,點(diǎn)擊“ ”, 在“URL Schemes”中輸入“alisdkdemo”,。“alisdkdemo”來自于文件 “APViewController.m”的 NSString *appScheme = @”alisdkdemo”
|