支付寶
支付寶開發(fā)步驟:
- 創(chuàng)建應(yīng)用
- 配置應(yīng)用
- 設(shè)計
- 開發(fā)
- 調(diào)試
- 上線
創(chuàng)建應(yīng)用
接入App支付能力度帮,需要在開放平臺創(chuàng)建一個應(yīng)用糕档,通過該應(yīng)用來接入各種能力劈榨。
配置應(yīng)用
配置應(yīng)用一般分為三個部分
- 第一部分:給應(yīng)用添加相應(yīng)的功能
- 第二部分:簽約
- 第三部分:配置秘鑰
這些一般都是TeamLeader和運營總監(jiān)來做
設(shè)計
設(shè)計一般分為:
-
架構(gòu)設(shè)計
架構(gòu)設(shè)計一般采用支付寶推薦設(shè)計架構(gòu),附上一張圖片吧
- 安全設(shè)計
- 采用HTTPS協(xié)議傳輸交易數(shù)據(jù),防止數(shù)據(jù)被截獲汹买,解密浩习。
- 采用RSA非對稱秘鑰静暂,明確交易雙方的身份,保證交易主體的正確性和唯一性
開發(fā)
開發(fā)就先上圖了,讓大家了解一下支付的基本流程:
了解基本流程后就要開始進行服務(wù)端和客戶端的開發(fā)集成了.
后臺的開發(fā)任務(wù)相比客戶端相對來說繁瑣一些,因為后臺要做訂單的訂單信息的拼接和簽名,將簽好名的訂單串給客戶端,這樣做是因為原則上不允許將簽名放在客戶端進行,不安全.
客戶端的任務(wù)是調(diào)起支付寶并監(jiān)聽回調(diào)結(jié)果,并展示給用戶支付結(jié)果.
具體的支付狀態(tài)一定要以服務(wù)端的回調(diào)為準.
ios客戶端配置
- 導(dǎo)入支付寶SDK和bundle文件
AlipaySDK.bundle
AlipaySDK.framework
- 集成第三方的第一個步驟導(dǎo)入依賴庫
- 配置info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>CFBundleURLTypes</key>
<array>
<!-- 支付寶 用來應(yīng)用之間跳轉(zhuǎn)的 -->
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>alipay</string>
<key>CFBundleURLSchemes</key>
<array>
<string>DovAlipayDemo</string>
</array>
</dict>
</array>
Show me the code!
導(dǎo)入頭文件
#import <AlipaySDK/AlipaySDK.h>
/**
發(fā)起支付,調(diào)起支付寶應(yīng)用
orderString 從后天獲取的拼接好的簽過名的訂單串
schemes 用來進行應(yīng)用跳轉(zhuǎn)的schemes,支付成功或者失敗跳回應(yīng)用
callback 支付回調(diào)(但是我并沒有發(fā)現(xiàn)有什么軟用) 原因:【由于在跳轉(zhuǎn)支付寶客戶端支付的過程中瘦锹,商戶app在后臺很可能被系統(tǒng)kill了籍嘹,所以pay接口的callback就會失效】
*/
[[AlipaySDK defaultService] payOrder:orderString
fromScheme:@"DovAlipayDemo" //這個一定要和info.plist里面配置的一樣,并確保唯一性
callback:^(NSDictionary *resultDic) {
//這里的回調(diào)是供網(wǎng)頁支付使用的
if ([[resultDic objectCheckForKey:@"resultStatus"] isEqualToString:@"9000"]) {
//支付成功
}
else {
//支付失敗
}
}];
//支付接口的回調(diào)是不管用了,我們一下面的方式進行回調(diào)結(jié)果的監(jiān)聽
//ios 9.0 以下使用此方法進行回調(diào)監(jiān)聽
- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//支付寶
if ([url.host isEqualToString:@"safepay"]) {
[self alipayCallbackWithUrl:url];
}
return YES;
}
//ios 9.0 以上使用此方法進行回調(diào)監(jiān)聽
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
//支付寶
if ([url.host isEqualToString:@"safepay"]) {
[self alipayCallbackWithUrl:url];
}
return YES;
}
- (void)alipayCallbackWithUrl:(NSURL *)url {
//跳轉(zhuǎn)支付寶錢包進行支付,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
if ([[resultDic objectForKey:@"resultStatus"] integerValue] == 9000) {
//代表你支付成功了
}
else {
//失敗了
}
}];
}
調(diào)試
支付寶推出了一個沙盒測試,我們開發(fā)的時候基本沒有使用,因為測試的時候使用的小金額測試.
上線
商戶本身應(yīng)用上線時候弯院,也要把支付寶開放平臺的應(yīng)用上線.
擴展介紹
訂單信息簽名過程模擬(這個一定要放在服務(wù)端來做)
//================== 生成支付訂單信息 =================//
/*
*生成訂單信息及簽名
*/
//將商品信息賦予AlixPayOrder的成員變量
Order *order = [[Order alloc] init];
order.partner = alipayParterID; //合作商ID (支付寶開發(fā)平臺里面)
order.sellerID = alipaySellerID; //商家ID
order.outTradeNO = @"78797348634858734673899"; //訂單ID(由商家自行制定)
order.subject = @"籃球"; //商品標題
order.body = @"室內(nèi)室外兩用"; //商品描述
order.totalFee = [NSString stringWithFormat:@"%.2f",100.5]; //商品價格
order.notifyURL = @"http://www.baidu.com"; //回調(diào)URL
//這些值是固定值不用修改
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showURL = @"m.alipay.com";
//將商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//================== 簽名 =================//
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(@"私鑰");
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:self.scheme callback:^(NSDictionary *resultDic) {
}];
}
注意事項
- 支付寶的簽名過程一定要在服務(wù)端完成
- 支付寶的回調(diào)以服務(wù)端的為準,客戶端的只是做參考
- 支付寶的發(fā)起支付方法附帶的回調(diào)是當你沒有安裝支付寶app的時候,使用網(wǎng)頁支付時候用到泪掀,安裝支付寶APP后需要使用url的回調(diào)
- 如果是Xcode 7.0之后的版本听绳,需要添加libc++.tbd、libz.tbd异赫;如果是Xcode7.0之前的版本椅挣,需要添加libc++.dylib、libz.dylib