作為iOS開發(fā)者猫妙,雖然泡沫的式的發(fā)展并不是我們想看到的串绩,但是,就目前來(lái)看看枉圃,我們的能力和經(jīng)驗(yàn)依舊很重要9睢!(突然發(fā)現(xiàn)這是完全不搭邊的兩句話....)在很多時(shí)候我們所被問(wèn)到的就是:做過(guò)支付嗎孽亲?做過(guò)地圖嗎坎穿?做過(guò)視頻嗎?做過(guò)流媒體嗎返劲?做過(guò)通訊嗎玲昧?使用過(guò)融云嗎?使用過(guò)環(huán)信嗎篮绿?使用過(guò)網(wǎng)易云信嗎孵延?會(huì)做游戲嗎?懂得socket嗎亲配?懂得HTTP尘应、TCP/IP、UDP嗎吼虎?知道多線程嗎犬钢?會(huì)使用NSOperation、GCD思灰、NSThread嗎娜饵?知道各種dispath_XXX嗎?......木有9俦病!遍坟!不會(huì)H凇!OK愿伴,你可以回去了......即使是在任何情況下肺魁,我們都應(yīng)該積極的去學(xué)習(xí),去面對(duì)問(wèn)題隔节,哪怕是我們的付出沒(méi)有回報(bào)鹅经,那你就趕緊跳槽<徘骸!或者瘾晃,繼續(xù)提高自己贷痪,你的優(yōu)秀會(huì)潛意識(shí)的散發(fā)出來(lái),別人也會(huì)看在眼里蹦误,嫉在心里劫拢。
言歸正傳,下面是支付寶的集成:
一强胰、首先介紹產(chǎn)品流程:(開發(fā)者可以看文檔舱沧,十分詳細(xì),比微信強(qiáng)太多了)
《支付寶開放品臺(tái)文檔中心》
總的來(lái)說(shuō)分為兩種情況:
(1)用戶已安裝支付寶支付流程偶洋。已經(jīng)安裝app后熟吏,可以直接調(diào)起app進(jìn)行支付。輸入密碼玄窝,完成支付牵寺。
(2)用戶未安裝支付寶支付流程。未安裝app哆料,則需要調(diào)起h5界面進(jìn)行支付缸剪。需要:輸入校驗(yàn)碼->選擇支付方式->輸入支付密碼->完成支付。
二东亦、第一步:務(wù)必在開放平臺(tái)創(chuàng)建一個(gè)應(yīng)用
《App支付接入指引》
(1)創(chuàng)建應(yīng)用杏节。
(2)配置應(yīng)用。
(3)設(shè)計(jì)典阵。
(4)開發(fā)奋渔。
(5)調(diào)試應(yīng)用。
(6)上線應(yīng)用壮啊。
三嫉鲸、App支付快速接入。
此處問(wèn)題是有兩個(gè)版本:9.0之前歹啼、9.0之后玄渗。
老版本的樣式:
第一步:創(chuàng)建應(yīng)用并獲取APPID
第二步:配置密鑰
第三步:搭建和配置開發(fā)環(huán)境
需要集成客戶端SDK。
第四步:調(diào)用接口
注意事項(xiàng):
其他的具體看開發(fā)文檔狸眼,一步一步的進(jìn)行設(shè)置即可藤树。
在下載的SDK(demo)中有兩個(gè)文件夾、AlipaySDK.bundle拓萌、AlipaySDK.framework岁钓,這些東西需要導(dǎo)入到工程中。至于Order,則是模擬后臺(tái)支付“生成訂單信息及簽名”而使用的屡限。
上代碼:
//app_id設(shè)置(is:partner)
NSString *appID = @"2017010304820705";
//這是第二種生成私鑰的方法
NSString *rsa2PrivateKey = @"";
//這是第一種生成方法
NSString *rsaPrivateKey = @"";
官方文檔建議使 rsa2品嚣,因?yàn)楸容^安全。私鑰生成有兩個(gè):1024钧大、2048翰撑。同學(xué)們可以使用文檔提供的生成器進(jìn)行操作。如果 rsa2 沒(méi)有或者輸出為 null 時(shí)候拓型,就說(shuō)明生成錯(cuò)誤额嘿,這時(shí)候可以使用 rsaPrivateKey 進(jìn)行簽名。
/**
* 生成訂單信息及簽名
*/
Order *order = [Order new];
//
order.app_id = appID;
//支付接口名稱
order.method = @"alipay.trade.app.pay";
//參數(shù)編碼格
order.charset = @"utf-8";
//設(shè)置時(shí)間
NSDateFormatter *formatter= [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//請(qǐng)求發(fā)送的時(shí)間
order.timestamp = [formatter stringFromDate:[NSDate date]];
//請(qǐng)求調(diào)用的接口版本劣挫,固定為:1.0
order.version = @"1.0";
//簽名類型
order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA";
//商品數(shù)據(jù)
order.biz_content = [BizContent new];
//(非必填項(xiàng))商品描述
order.biz_content.body = @"此物只應(yīng)天上有册养,人間哪得幾回聞";
//商品的標(biāo)題/交易標(biāo)題/訂單標(biāo)題/訂單關(guān)鍵字等。
order.biz_content.subject = @"一只草泥馬";
#warning 訂單號(hào)方法如下:generateTradeNO
//商戶網(wǎng)站唯一訂單號(hào)
order.biz_content.out_trade_no = [self generateTradeNO];
/**
* 該筆訂單允許的最晚付款時(shí)間压固,逾期將關(guān)閉交易球拦。
*
* 取值范圍:1m~15d m-分鐘,h-小時(shí)帐我,d-天坎炼,1c-當(dāng)天(1c-當(dāng)天的情況下,無(wú)論交易何時(shí)創(chuàng)建拦键,都在0點(diǎn)關(guān)閉)
* 該參數(shù)數(shù)值不接受小數(shù)點(diǎn)谣光, 如1.5h,可轉(zhuǎn)換為90m芬为。
*/
order.biz_content.timeout_express = @"30m";
//訂單總金額萄金,單位為元,精確到小數(shù)點(diǎn)后兩位媚朦,取值范圍[0.01,100000000]
order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01];
/**
* 獲取訂單信息串(將商品信息拼接成字符串)
*
* bEncoded 訂單信息串中的各個(gè)value是否encode
* 非encode訂單信息串氧敢,用于生成簽名
* encode訂單信息串 + 簽名,用于最終的支付請(qǐng)求訂單信息串
*/
NSString *orderInfo = [order orderInfoEncoded:NO];
//
NSString *orderinfoEncoded = [order orderInfoEncoded:YES];
//
NSLog(@"商品信息:%@", orderInfo);
// NOTE: 獲取私鑰并將商戶信息簽名询张,外部商戶的加簽過(guò)程請(qǐng)務(wù)必放在服務(wù)端孙乖,防止公私鑰數(shù)據(jù)泄露;
// 需要遵循RSA簽名規(guī)范份氧,并將簽名字符串base64編碼和UrlEncode
NSString *singedString = nil;
簽名代碼如下:
#warning 這是新版本的簽名
RSADataSigner *singer = [[RSADataSigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1) ? rsa2PrivateKey : rsaPrivateKey)];
//
if (rsa2PrivateKey.length > 1) {
singedString = [singer signString:orderInfo withRSA2:YES];
}else {
singedString = [singer signString:orderInfo withRSA2:NO];
}
// NOTE: 如果加簽成功唯袄,則繼續(xù)執(zhí)行支付
if (singedString != nil) {
//應(yīng)用注冊(cè)scheme,在AliSDKDemo-Info.plist定義URL types
NSString *appScheme = @"Payone";
//將簽名成功字符串格式化為訂單字符串,務(wù)必嚴(yán)格按照格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderinfoEncoded, singedString];
// NOTE: 調(diào)用支付結(jié)果開始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"開始支付:%@", resultDic);
}];
}
#warning 這是老版本的簽名
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
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"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
訂單號(hào)生成方法:
- (NSString *)generateTradeN {
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;
}
支付:AppDelegate
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
//跳轉(zhuǎn)支付寶錢包進(jìn)行支付蜗帜,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
if ([url.host isEqualToString:@"safepay"]) {
//跳轉(zhuǎn)支付寶錢包進(jìn)行支付越妈,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
四、為了可以跳回app钮糖,需要設(shè)置appScheme
應(yīng)用注冊(cè)scheme,在AliSDKDemo-Info.plist定義URL types
appScheme = @"Payone";
scheme與代碼中的一定要一致才可以。(第一個(gè)是支付寶的,第二個(gè)是微信的)
總結(jié):大多數(shù)東西是不需要客戶端進(jìn)行設(shè)置和存儲(chǔ)的店归。所以阎抒,同學(xué)們集成之后即可根據(jù)需要進(jìn)行開發(fā)啦。
大多數(shù)都是demo和文檔的東西消痛。另外且叁,遇到的錯(cuò)誤信息,忘記截圖保存了.....
只提供簡(jiǎn)單的集成方法秩伞,錯(cuò)誤請(qǐng)指正逞带。