iOS 移動支付之種類
iOS 端的移動支付,大概包括:支付寶支付、微信支付、銀聯卡支付、paypal支付,如今又多出一個Apple pay支付;
如何集成這些種類的支付方式
談及如何集成這些支付方式,面對各類支付方式的SDK以及Demo寫的詳細的天衣無縫,我還真不如還如何去寫,這裏我就接地氣的寫寫,寫的很差請勿噴哦☺!
支付寶支付
大體有如下步驟:
1.向支付寶申請, 與支付寶簽約,得到商戶PID(partner)和帳號ID(seller)和私鑰(privateKey)
注:*這一步,通常公司會搞定的,這裏只是讓你知道前因後果☺
沒有支付寶帳號的同窗,能夠點擊這裏註冊帳號;
已經有支付寶帳號的同窗點擊這裏申請移動支付
申請簽約有個門檻比較難,就是無論你是我的仍是企業,都須要營業執照,這點有點蛋疼,不過人家也是爲了有質量的管理申請者嘛,能夠理解,我這裏沒有營業執照,申請工做就死在了搖籃裏,不過大體流程,我基本弄清楚了,不過做爲開發者,這申請工做就不用多關心了,通常公司都會有申請過的,我這裏寫出來也就是讓咱們開發者也大概知道流程,而不是直接就是用,只知去向,不知來龍。
申請簽約成功後,就能夠查看 PID(partner)和帳號ID(seller)和私鑰(privateKey) ,查看地址點擊這裏 進行登陸,點擊下圖中的查詢PID和Key;
可是這裏查詢到的Key 是公鑰,不是私鑰,你到底該怎麼弄私鑰呢?同窗們,不用急,支付寶文檔寫的仍是比較清楚的,點擊這裏能夠查看RSA私鑰及公鑰生成
這裏文檔給出了兩種平臺下的生產方式,咱們既然是iOS 開發者,那就選擇Linux用戶生產的方式吧,能夠直接在Mac的終端敲這些命令;
敲過這些命令後,會在本地生產兩個文件,分別是私鑰和公鑰文件
在命令行敲入(以行爲單位)
$cd ~/
$open . //打開文件的存放位置
想要查看文件內容,還須要使用命令
$cat rsa_private_key.pem //會在終端顯示文件中的內容,這就是私鑰
到這裏,第一步基本上就能夠了,具體還須要本身動手試試,否則仍是會一頭霧水。
2.下載支付寶SDK以及Demo
這一步,沒啥好說的,給個地址就行SDK以及Demo下載地址
3.集成SDK到工程中(生成訂單信息,簽名加密)
支付寶官方集成文檔
集成支付寶SDK的步驟,這裏是官方給出的集成文檔, 按照步驟集成老是會出錯,這不是咱們腦子不行,而是官方畢竟是官方。
查看支付寶給出的Demo,會發現這些文件必需要加到項目中:
其中小方框中的爲必須加入,而除了小方框之外的,那就要看大家後臺人員是否將簽名成功字符串格式化的訂單字符串,給你傳到前端來,若是沒有,那就必須你本身在前端處理; 按理說,這些應該由後臺來處理,爲了訂單信息的安全,以及前端業務的輕運行,都該有後端來處理(注:這點不懂,沒關係,後面還會根據代碼在進行講解;
集成中可能遇到的錯誤
1)Cannot find interface declaration for ‘NSObject’
解決方案:a. 能夠在報錯的文件中加入#import <Foundation/Foundation.h>
b. 能夠建個pch文件加入
` #ifdef __OBJC__ #import UIKit/UIKit.h #import Foundation/Foundation.h #endif `
2)提示找不到 openssl/asn1.h 文件
解決方案:Build Settings –> Search Paths –> Header Search paths:$(PROJECT_DIR)/ASPayDemo/Alipay
3)_CNCopyCurrentNetworkInfo,referenced from:
解決方案:添加SystemConfiguration.framework
部署代碼
NSString *partner = @""; //PID NSString *seller = @""; //收款帳戶,手機號或者郵箱 NSString*privateKey= @"";// 私鑰 if ([partner length] == 0 || [seller length] == 0 || [privateKey length] == 0) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"缺乏partner或者seller或者私鑰。" delegate:self cancelButtonTitle:@"肯定" otherButtonTitles:nil]; [alert show]; return; } Order *order = [[Order alloc] init]; order.partner = partner; order.seller = seller; order.tradeNO = @"20160324012412412"; //訂單ID(由商家自行制定) order.productName = @"iOS 高級教程"; //商品標題 order.productDescription = @"這是一本關於iOS的一本高級教程書"; //商品描述 order.amount = @"0.1"; //商品價格 order.notifyURL = @"http://www.devashen.com/Notify/Alipay/"; //回調URL order.service = @"mobile.securitypay.pay"; order.paymentType = @"1"; order.inputCharset = @"utf-8"; order.itBPay = @"30m"; order.showUrl = @"m.alipay.com"; NSString *appScheme = @"alisdkdemo"; //將商品信息拼接成字符串 該方法支付寶已經封好 NSString *orderSpec = [order description]; //獲取私鑰並將商戶信息簽名,外部商戶能夠根據狀況存放私鑰和簽名,只須要遵循RSA簽名規範,並將簽名字符串base64編碼和UrlEncode id signer = CreateRSADataSigner(privateKey); //調用簽名 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:appScheme callback:^(NSDictionary *resultDic) { if ([[resultDic objectForKey:@"resultStatus"] isEqualToString:@"9000"]) { //9000爲支付成功 } }]; }
看代碼,若是後臺將簽名成功字符串格式化的訂單字符串,給你傳到前端來,那咱們就只須要作不多的工做就能夠了,只須要直接處理訂單字符串便可:
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { if ([[resultDic objectForKey:@"resultStatus"] isEqualToString:@"9000"]) { //9000爲支付成功 } }];
最後,千萬別忘了,在Appdelegate中,處理支付寶客戶端返回url處理方法, 少了這一步,支付寶SDK的回調方法是不會執行的:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //跳轉支付寶錢包進行支付,處理支付結果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; return YES; }
到這裏,支付寶支付基本上完成, 火燒眉毛的你,趕忙去試驗試驗吧, 別忘了給大家相關負責人要對應的PID、收款帳號、以及私鑰,固然若是後臺直接傳給你訂單字符串的話,你能夠直接給後臺要接口了,置於PID什麼的你就不用管了。