一.支付寶集成的介紹
1.1 什么是支付方式?
- 內(nèi)購是用戶將錢付款給蘋果,之后蘋果分成給商戶
- 支付寶是用戶將錢付款給支付寶,之后支付寶將錢轉(zhuǎn)入我們的賬戶
1.2 集成支付寶的步驟
- 向支付寶申請, 與支付寶簽約鸵隧,獲得商戶
ID(partner)
和賬號ID(seller)
和私鑰(privateKey)
- 下載支付寶SDK
- 生成訂單信息,簽名加密
- 調(diào)用支付寶客戶端婿屹,由支付寶客戶端跟支付寶安全服務(wù)器打交道
- 支付完畢后,支付寶客戶端會自動跳回到原來的應(yīng)用程序
- 在原來的應(yīng)用程序中顯示支付結(jié)果給用戶看
1.3 支付流程
流程1:
流程圖二:官方版
二.下載SDK
2.1 進入支付寶官網(wǎng)官網(wǎng)地址:https://www.alipay.com
2.2 點擊商家中心
如何簽約
進入下一個頁面,可以點擊右上角的如何簽約
在公司簽約工作通常由產(chǎn)品完成
我們只需和產(chǎn)品要商戶ID(partner)和賬號ID(seller)和私鑰(privateKey)
點擊如何集成
-
來到頁面下方,點擊移動支付
移動支付 -
下一個頁面中,點擊Demo下載
下載demo -
來到移動支付功能,點擊下載即可
下載demo
三.集成流程
- 1.項目中展示對應(yīng)的商品內(nèi)容
- 2.當用戶點擊購買時,通過支付購買商品
- 3.購買流程
- 根據(jù)對應(yīng)的商品,生成訂單
- 對訂單進行簽名加密
- 調(diào)用支付寶客戶端進行支付
- 4.支付成功或者失敗時回調(diào)
- 如果手機內(nèi)沒安裝支付寶的app,會直接展現(xiàn)支付寶web支付界面婚脱,通過callback返回支付結(jié)果;
- 如果手機內(nèi)安裝了支付寶的app椅贱,會跳轉(zhuǎn)到支付寶的app支付怀跛,然后通過openURL的回調(diào)返回支付結(jié)果萍丐。
// 1.獲取簽約之后的三個數(shù)據(jù)
NSString *partner = @"";
NSString *seller = @"";
NSString *privateKey = @"";
// 2.生成訂單和簽名
Order *order = [[Order alloc] init];
order.partner = partner;
order.seller = seller;
order.tradeNO = nil; //訂單ID(由商家自行制定)
order.productName = product.name; //商品標題
order.productDescription = product.detail; //商品描述
order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品價格
// 服務(wù)器的回調(diào)地址
order.notifyURL = @"http://www.xxx.com"; // 用戶支付成功后,支付寶服務(wù)器會同步通知我們的服務(wù)器.我們服務(wù)器需要有一個可以回調(diào)的地址
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showUrl = @"m.alipay.com";
//應(yīng)用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString *appScheme = @"alipay";
//將商品信息拼接成字符串
NSString *orderSpec = [order description];
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
// 跳轉(zhuǎn)到支付寶進行支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
四 調(diào)用支付接口
在調(diào)用支付寶支付接口前,我們需要先生成一個訂單党涕,文檔中描述時烦感,是將這步也放在客戶端來做了,但這個最好是 放在服務(wù)器端來做膛堤,后臺生成訂單然后拼接手趣,簽名,然后服務(wù)器端直接給客戶端傳一個加密簽名過的參數(shù)就可以了骑祟,這樣比較安全,官方demo上放在客戶端生成訂單并且簽名是因為沒有服務(wù)給你用啊气笙,所以就客戶端上生成了~~~次企。
我做的時候,為了安全潜圃,生成訂單缸棵,拼接字符串,簽名谭期,都是在服務(wù)器上做的堵第,所有的訂單信息,商戶信息等都掌握在自己的手中隧出,這樣的話APP端就不怕被攔截數(shù)據(jù)踏志,并且調(diào)用起來也就特別簡單了,只需要調(diào)用支付的接口胀瞪,打開支付寶APP客戶端進行支付就行了针余,沒有用戶的手機上沒有安裝支付寶客戶端的話會調(diào)用網(wǎng)頁來支付,也是一樣的凄诞。
如果只需要發(fā)送訂單和處理支付返回結(jié)果圆雁,只需要添加AlipaySDK.bundle和AlipaySDK.framework這兩個就行了,下載的SDK中很容易發(fā)現(xiàn)帆谍。
快捷支付方法是這個:
-(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;
在支付的按鈕中伪朽,試用支付寶這個類,再調(diào)用這個方法就行啦汛蝙!如下如:
在調(diào)用支付寶接口的時候烈涮,我們需要兩個參數(shù),orderString和APPScheme窖剑, APPScheme是app在info.plist注冊的scheme跃脊。
orderstring 這個是一個訂單的字符串,由后臺拼接生成的苛吱,還需要簽名的酪术。例如:
在調(diào)用支付寶接口的時候,我們需要兩個參數(shù),orderString和APPScheme绘雁, APPScheme是app在info.plist注冊的scheme橡疼。
orderstring 這個是一個訂單的字符串,由后臺拼接生成的庐舟,還需要簽名的
例如:
partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="測試"&body="測試測試"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&input_charset="utf-8"&it_bpay="30m"&sign="lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA".
五 支付寶的坑
- 1, 如何獲取商戶私鑰 privateKey 鏈接地址
- Mac終端中輸入 openssl 進入Openssl程序
- 生成私鑰 命令
genrsa -out rsa_private_key.pem 1024
- iOS客戶端需要將生成的私鑰轉(zhuǎn)換成PKCS8格式 命令
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
獲取到pkcs8格式的字符串就是項目中需要的privatekey,取-----BEGIN PRIVATE KEY-----和 -----END PRIVATE KEY----- 中間的部分 切記P莱!E猜浴历帚! - 生成公鑰 命令
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
- 2, 支付寶集成出現(xiàn)“系統(tǒng)繁忙,請稍后重試(ALI64)”錯誤的解決辦法
1.用記事本打開上面第四步生成的公鑰 rsa_public_key.pem杠娱,并將里面的密鑰拷貝出來挽牢,粘貼到合作伙伴密鑰管理中得RSA加密里,特別需要注意的是摊求,需要將密鑰中的空格禽拔、回車等刪除,使該密鑰為一行字符串室叉。
2.用記事本打開上面第四步生成的公鑰 rsa_public_key.pem睹栖,并將里面的密鑰拷貝出來,粘貼到開放平臺密鑰管理中得RSA加密里茧痕,特別需要注意的是野来,需要將密鑰中的空格、回車等刪除踪旷,使該密鑰為一行字符串梁只。
- 3, 設(shè)置一下search paths
build setting ->搜索search path,然后你懂的
完成后埃脏,編譯一下搪锣,看有沒有錯,有錯沒錯彩掐,還是下一步吧构舟。
- 4, 你可能會發(fā)現(xiàn)回調(diào)不行->設(shè)置回調(diào)shema
//上面支付時已經(jīng)傳給了支付寶客戶端回調(diào)shema名稱
NSString *appScheme = URLScheme;
//具體設(shè)置shema方法此處就不再累贅,這兒需要處理來自支付寶shema回調(diào)堵幽,才能完成上面方法的block回調(diào)
在APPDelegate -
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
//跳轉(zhuǎn)支付寶錢包進行支付狗超,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
return YES;
}