以下內(nèi)容是我在做項目時遇到的一些小問題,主要是參考了阿里的官方文檔,也有在網(wǎng)上找到的一些內(nèi)容.主要是為了繼承使用,對阿里的SDK中的東西沒有做深入的討論,希望各位有什么問題了一起交流學(xué)習(xí)下,以下內(nèi)容全部是手打出來的,截圖是我現(xiàn)做的一個demo.大神勿噴.感謝那些無償分享技術(shù)的大牛們.
三方支付平臺說明(一些廢話,可以不用看的)
三方支付和內(nèi)購很像,內(nèi)購是用戶將錢付款給蘋果,之后蘋果分給商戶,而支付寶支付,是用戶將錢付款給支付寶,,之后支付寶將錢轉(zhuǎn)入到我們賬戶.
注意:使用三方支付是有前提的,購買的物品必須和應(yīng)用程序無關(guān),比如:團(tuán)購券/衣服/電子商品等等.如果和應(yīng)用程序有關(guān),必須采用內(nèi)購,否則不允許上架,比如:會員/游戲道具等.
集成支付寶
使用支付寶進(jìn)行一個完整的支付,大致有以下步驟:
- 向支付寶申請,與支付寶簽約,獲得商戶ID(partner)和賬戶ID(seller)和私鑰(privateKey)
- 下載支付寶SDK
- 生成訂單信息,簽名加密
- 條用支付寶客戶端,由支付寶客戶端跟支付寶安全服務(wù)器打交道.
- 支付完畢后,支付寶客戶端會自動跳回到原來的應(yīng)用程序
- 在原來的應(yīng)用程序中顯示支付結(jié)果給用戶看
三方支付平臺說明(一些廢話,可以不用看的)
三方支付和內(nèi)夠很像,內(nèi)購是用戶將錢付款給蘋果,之后蘋果分給商戶,而支付寶支付,是用戶將錢付款給支付寶,,之后支付寶將錢轉(zhuǎn)入到我們賬戶.
注意:使用三方支付是有前提的,購買的物品必須和應(yīng)用程序無關(guān),比如:團(tuán)購券/衣服/電子商品等等.如果和應(yīng)用程序有關(guān),必須采用內(nèi)購,否則不允許上架,比如:會員/游戲道具等.
集成支付寶
使用支付寶進(jìn)行一個完整的支付,大致有以下步驟:
- 向支付寶申請,與支付寶簽約,獲得商戶ID(partner)和賬戶ID(seller)和私鑰(privateKey)
- 下載支付寶SDK
- 生成訂單信息,簽名加密
- 條用支付寶客戶端,由支付寶客戶端跟支付寶安全服務(wù)器打交道.
- 支付完畢后,支付寶客戶端會自動跳回到原來的應(yīng)用程序
- 在原來的應(yīng)用程序中顯示支付結(jié)果給用戶看
大概流程下圖所示:
下面開始集成支付寶
集成前先介紹下支付寶的相關(guān)專業(yè)術(shù)語,方便理解(這些在支付寶的官網(wǎng)上都可以看到的)
API版本:支付寶網(wǎng)關(guān)分為兩大類笛质。一類是在支付寶開放平臺建立之前就存在的商戶網(wǎng)關(guān),這類網(wǎng)關(guān)采用的訪問協(xié)議稱為1.0協(xié)議捞蚂,協(xié)議參數(shù)中可區(qū)分的特征是需要傳入partner妇押、service等參數(shù),以及請求網(wǎng)關(guān)為 https://mapi.alipay.com/gateway.do
姓迅,后簡稱mapi或API1.0敲霍;
另外一類是隨開放平臺建立的開放網(wǎng)關(guān),主要服務(wù)于接入開放平臺的開放應(yīng)用队贱。這類網(wǎng)關(guān)采用的訪問協(xié)議稱為2.0協(xié)議色冀,協(xié)議參數(shù)中可區(qū)分的特征是需要傳入app_id、method柱嫌、platform等參數(shù)锋恬,以及請求網(wǎng)關(guān)為 https://openapi.alipay.com/gateway.do
,后簡稱openapi或API2.0编丘。UID:user_id的簡稱与学,用戶身份標(biāo)示。用于表示支付寶用戶的唯一標(biāo)示嘉抓。
PID:partner_id的簡稱索守,合作伙伴身份∫制可登錄開放平臺卵佛,點(diǎn)擊用戶名稱,選擇合作伙伴密鑰查看
- APPID:app_id,應(yīng)用身份標(biāo)示截汪〖采可登錄開放平臺,在“開放平臺-管理中心-應(yīng)用詳情”查看衙解。
- RSA:RSA是一種公鑰加密算法阳柔。能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)蚓峦。主要用于公鑰加密私鑰解密舌剂、私鑰簽名公鑰驗(yàn)簽。
- 支付寶公鑰:開發(fā)者請求支付寶并獲得返回時暑椰,開發(fā)者用于驗(yàn)簽使用的公鑰霍转,查看位置如下圖所示。
下載支付寶SDK
- 支付寶的SDK挺難找的,不知道阿里是怎么想的.可以在百度里直接搜索支付寶,在官網(wǎng)上查找SDK的下載.別下載成了Alipass了.方便大家,我直接把鏈接貼出來
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.Nq6pyg&treeId=54&articleId=104509&docType=1 - SDK現(xiàn)在下來后解壓demo的效果如圖
- 雙擊打開demo
- 具體支付代碼
// 1.添加簽約后的 商戶ID/賬號ID/商戶方的私鑰
NSString *partner = @"";
NSString *seller = @"";
NSString *privateKey = @"";
// 2.生成訂單信息
Order *order = [[Order alloc] init];
order.partner = partner; // 商戶ID
order.seller = seller; // 賬號ID
order.tradeNO = nil; //訂單ID(由商家自行制定)
order.productName = product.title; //商品標(biāo)題
order.productDescription = product.detail; //商品描述
order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品價格
// 購買成功后的服務(wù)器的回調(diào)地址
order.notifyURL = @"http://www.xxx.com"; //回調(diào)URL
// 固定寫法
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"15m"; // 支付超時時間
order.showUrl = @"m.alipay.com";
//應(yīng)用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString *appScheme = @"appScheme"; // appScheme建議填寫成自己的bundle ID
下面是截圖
//將商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴(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);
}];
}
// 支付接口類方法,喚起支付界面
+ (void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr
callback:(CompletionBlock)completionBlock
在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) {
TFLog(@"result = %@",resultDic);
// 處理支付結(jié)果
}];
}
}
**返回值說明**
支付結(jié)束后SDK將回調(diào)completionBlock并將支付結(jié)果resultDic(NSDictionary *類型)作為參數(shù)傳入該Block谴忧。resultDic中主要包含兩個字段很泊,如下所示:
resultCode NSString * 返回碼角虫,標(biāo)識支付狀態(tài),含義如下:
9000——訂單支付成功
8000——正在處理中
4000——訂單支付失敗
5000——重復(fù)請求
6001——用戶中途取消
6002——網(wǎng)絡(luò)連接出錯
以上是支付寶支付所需要用到的,具體實(shí)現(xiàn)的時候,還有一些坑需要注意.
首先把支付寶的SDK集成到自己的項目中
把SDK拖拽到自己項目中一定要注意,如果你們公司是用svn管理的,里面的靜態(tài)庫libcrypto.a和libssl.a要用命令行添加到svn的管理下
- 首先添加上依賴庫,阿里給的官網(wǎng)文檔依賴庫截圖是這樣的:
按照官網(wǎng)文檔添加依賴庫,添加完成后還是報錯
拖拽SDK的時候一定要把截圖里面紅框框中的拖進(jìn)去
編譯后報錯
查看報錯原因,你會發(fā)現(xiàn)原來是文件Base64.h和openssl_wrapper.h中沒有導(dǎo)入#import <Foundation/Foundation.h> 框架,阿里的demo是在.pch里添加的,分別在這兩個文件中導(dǎo)入Foundation頭文件就可以了.再次編譯,還是報錯,最大的坑來了
openssl/asn1.h file not found
再次編譯,接著報錯,所有的操作都是按照阿里的文檔操作的.最后發(fā)現(xiàn)還是依賴庫的問題
缺少libc++.tbd這個庫
缺少CoreMotion.framework這個庫
缺少libz.tbd這個庫