前期準(zhǔn)備
- 接入前期準(zhǔn)備工作包括商戶(hù)簽約和密鑰配置,已完成商戶(hù)可略過(guò)。
- 下載支付寶SDK支付寶SDK下載地址
SDK集成流程
-
將支付寶SDK中以下文件拷貝到項(xiàng)目文件夾下,并導(dǎo)入開(kāi)發(fā)環(huán)境中。
AlipaySDK.bundle
AlipaySDK.framework
libcrypto.a
libssl.a
AliSDKDemo\\Util 及下面所有文件
AliSDKDemo\\openssl 及下面所有文件
Order.h
和Order.m
-
導(dǎo)入系統(tǒng)依賴(lài)庫(kù)
在link Binary With Libraries 里面添加
CoreMotion.framework
CFNetwork.framework
SystemConfiguration.framework
QuartzCore.framework
CoreText.framework
CoreTelephony.framework
CoreGraphics.framework
libc++.tbd
libz.tbd
加上之前導(dǎo)入的3個(gè)
AlipaySDK.framework
libcrypto.a
libssl.a
共計(jì)12個(gè)
在需要使用SDK的文件中,增加頭文件引用。
#import <AlipaySDK/AlipaySDK.h>
#import "Order.h"
#import "DataSigner.h"
#import <AliPaySDK/AlipaySDK.h>
但是會(huì)出現(xiàn)錯(cuò)誤:
這是為什么呢,原因是項(xiàng)目沒(méi)有找到之前導(dǎo)入的AliSDKDemo\\Util 及下面所有文件
,AliSDKDemo\\openssl 及下面所有文件
頭文件,解決方法 在項(xiàng)目文件夾中找到Util
和openssl
文件夾 ,在Header Search Paths中添加路徑
到這一步,SDK集成已經(jīng)完畢
配置代碼
- 配置alipay支付
#pragma mark ==============配置alipay支付==============
- (void)payAction
{
/*
*生成訂單信息及簽名
*/
//將商品信息賦予AlixPayOrder的成員變量
Order *order = [[Order alloc] init];
order.partner = @"";//商戶(hù)在支付寶簽約時(shí),支付寶為商戶(hù)分配的唯一標(biāo)識(shí)號(hào)(以2088開(kāi)頭的16位純數(shù)字)。
order.sellerID = @"";////賣(mài)家支付寶賬號(hào)對(duì)應(yīng)的支付寶唯一用戶(hù)號(hào)(以2088開(kāi)頭的16位純數(shù)字),訂單支付金額將打入該賬戶(hù),一個(gè)partner可以對(duì)應(yīng)多個(gè)seller_id。
order.outTradeNO = [self generateTradeNO]; //訂單ID(由商家自行制定)
order.subject = @"測(cè)試商品"; //商品的標(biāo)題/交易標(biāo)題/訂單標(biāo)題/訂單關(guān)鍵字等。
order.body = @"runbey商品描述"; //對(duì)一筆交易的具體描述信息。如果是多種商品,請(qǐng)將商品描述字符串累加傳給body。
order.totalFee = @"0.01"; //該筆訂單的資金總額,單位為RMB(Yuan)。取值范圍為[0.01,100000000.00],精確到小數(shù)點(diǎn)后兩位。
order.notifyURL = @"http://*****"; //支付寶服務(wù)器主動(dòng)通知商戶(hù)網(wǎng)站里指定的頁(yè)面http路徑。
//實(shí)際項(xiàng)目開(kāi)發(fā)中 訂單信息應(yīng)該由服務(wù)器返回
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showURL = @"m.alipay.com";
//應(yīng)用注冊(cè)scheme 便于支付結(jié)束后重新打開(kāi)客戶(hù)端
NSString *appScheme = @"";
//將商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//獲取私鑰并將商戶(hù)信息簽名,外部商戶(hù)可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
NSString * privateKey = @"";//商戶(hù)私鑰
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請(qǐng)嚴(yán)格按照該格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\\"%@\\"&sign_type=\\"%@\\"",
orderSpec, signedString, @"RSA"];
NSLog(@"簽名字符串:%@",orderString);
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"支付結(jié)果reslut = %@",resultDic);
}];
}
}
#pragma mark ==============產(chǎn)生隨機(jī)訂單號(hào)==============
- (NSString *)generateTradeNO
{
static int kNumber = 15;
NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand((unsigned)time(0));
for (int i = 0; i < kNumber; i++)
{
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
return resultStr;
}
此時(shí)運(yùn)行,這2個(gè)文件:
base64.h
openssl_wrapper.h
會(huì)出現(xiàn):
Cannot find interface declaration for 'NSObject', superclass of 'Base64'
那么需要打開(kāi)的文件base64.h
openssl_wrapper.h
,頂部添加頭:
#import <Foundation/Foundation.h>
- 配置返回處理代碼
在 AppDelegate.m 文件中,增加引用代碼:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//如果極簡(jiǎn) SDK 不可用,會(huì)跳轉(zhuǎn)支付寶錢(qián)包進(jìn)行支付,需要將支付寶錢(qián)包的支付結(jié)果回傳給 SDK
if ([url.host isEqualToString:@"safepay"])
{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
- 添加URL Schemes
點(diǎn)擊項(xiàng)目名稱(chēng),點(diǎn)擊“Info”選項(xiàng)卡,在“URL Types”選項(xiàng)中,點(diǎn)擊“+”, 在“URL Schemes”中輸入項(xiàng)目的bundleid。“bundleid”來(lái)自于 NSString *appScheme = @"****"(一般為項(xiàng)目的bundleid)
至此,完成了支付寶iOS客戶(hù)端的配置
微信支付撰寫(xiě)中。。。。
后記:
有朋友反饋,運(yùn)行時(shí)在 rsa.h
中,會(huì)出現(xiàn):
解決方法:
在在項(xiàng)目文件夾中找到找到和項(xiàng)目同名的文件夾 ,在Header Search Paths中添加路徑
一樣把文件夾拖進(jìn)去!