一.移動支付
什么叫移動支付:移動支付也稱為手機支付,就是允許用戶使用其移動終端(通常是手機)對所消費的商品或服務進行賬務支付的一種服務方式。單位或個人通過移動設備、互聯網或者近距離傳感直接或間接向銀行金融機構發送支付指令產生貨幣支付與資金轉移行為,從而實現移動支付功能。移動支付將終端設備、互聯網、應用提供商以及金融機構相融合,為用戶提供貨幣支付、繳費等金融業務。
微信和支付寶支付:在移動互聯網興起下比較大眾的兩款三方支付平臺,下面將詳細介紹在iOS開發中,如何集成支付寶和微信支付
二.支付寶支付
前期準備工作
創建應用并獲取APPID:
首先開發的時候必須叫公司申請一個商家賬號,之后會審核,審核成功后創建你的應用,創建成功后會有一個appid(應用唯一標識),當我們集成支付的時候需要用這個來注冊使用(下面會講到)配置應用環境:
請到官方查看:生成與配置密鑰,這里mac和windows不一樣注意區分,這里你會下載一個工具會自動生成公私鑰(公私鑰是配對使用的,一定要配對,也就是你用工具一起生成的,并且后臺調用接口的時候需要這個來簽名等),這里需要將公鑰和私鑰配置到你的賬號中,這里面的RSA就是一種加密的方式而已。獲取支付寶公鑰:
應用上線后在賬號總查看支付寶公鑰,即可獲取支付寶公鑰,主要用于支付寶返回數據的驗簽。其他的比如完善應用信息,添加應用功能請自行添加,很簡單,這里不說
集成使用
- 導入支付寶SDK:這里下載 支付寶支付demo,解壓后,將
1.AlipaySDK.bundle
2.AlipaySDK.framework
導入到項目中,這里建議你也將order.h這個類也導入,當你支付的時候需要用
-
導入依賴庫:
LB1PlBHKpXXXXXoXXXXXXXXXXXX.png
注意:
如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib
4.本地集成使用:意思就是簽名,商品的信息在本地寫好,這里可以測試的時候使用,正式開發app不要這樣使用,主要是不安全,這樣為了簽名你的私鑰和公鑰必須放在本地,這里本地集成使用不在重復贅述,請查看 官方文檔
5:通過后臺服務器獲取簽名,支付商品信息支付:主要是在app中將需要購買的商品信息,通過后臺接口下單,下單后會將商品的訂單號返回(這里的訂單號是后臺人員自行分配的,為了家下來的支付做準備),之后通過這個訂單號調用后臺接口獲取支付數據(主要是獲取商品信息,簽名等,你支付需要的都在這里面),之后拿著這些數據去支付就行了,后面注意回調的判斷和支付成功后者失敗的提醒就行了,下面是實現代碼:
1.導入頭文件并注冊:
#import <AlipaySDK/AlipaySDK.h>//導入頭文件
[WXApi registerApp:WX_PAY_PPID withDescription:@"xxx"];//注冊支付寶,這里寫到appdelegate里
2.下單:下單的時候后臺提供一個接口,將提交的數據保存在后臺服務器并生成一個唯一的訂單號,這個訂單號和數據是關聯的
3.獲取支付數據,簽名等,并調用支付寶支付:
+ (void)jumpToBizAliPay:(XSTAlipayModel *) modle andViewController:(UIViewController *)weSelf{
//這里的model是我用上面的訂單號請求的支付的數據模型(里面包含了支付的所有信息,)
/*
*商戶的唯一的parnter和seller。
*簽約后,支付寶會為每個商戶分配一個唯一的 parnter 和 seller。
*/
NSString *partner = modle.partner;
NSString *seller = modle.seller_id;
//partner和seller獲取失敗,提示
if ([partner length] == 0 || [seller length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少partner或者seller或者私鑰。"
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
return;
}
/*
*生成訂單信息及簽名
*/
//將商品信息賦予AlixPayOrder的成員變量
Order *order = [[Order alloc] init];
order.partner = partner;
order.sellerID = seller;
order.outTradeNO = modle.out_trade_no; //訂單ID(由商家自行制定)
order.subject = modle.subject; //商品標題
order.body = modle.body; //商品描述
order.totalFee = modle.total_fee; //商品價格
order.notifyURL = modle.notify_url; //回調URL
order.service = modle.service;
order.paymentType = modle.payment_type;
order.inputCharset = modle._input_charset;
order.itBPay = @"30m";
order.showUrl = @"m.alipay.com";
//應用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString *appScheme = @"xstAlipay";
//將商品信息拼接成字符串
NSString *orderSpec = [order description];
//獲取私鑰并將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = (RSADataSigner *)modle.sign;
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
NSString *orderString = nil;
if (modle.sign) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, modle.sign, modle.sign_type];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"%@", resultDic);
NSInteger resultStatus = [resultDic[@"resultStatus"] integerValue];
if (resultStatus == 9000) {
//發送通知,這里是個block,當成功后會發送一個通知,跳轉到支付成功的界面,這里是當返回app的時候才調用
NSNotification * note = [[NSNotification alloc] initWithName:@"APS" object:@"succes" userInfo:nil];
[[NSNotificationCenter defaultCenter] postNotification:note];
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"支付結果" message:@"放棄支付" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
}];
}
}
4回調:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
if ([WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]) {
return YES;//這里是微信支付
}else{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
}];
return YES;//這里是支付寶支付
}
}
注意:
- 上面的代碼的model模型是我用訂單號通過后臺接口(后臺接口會調用支付寶提供的API返回一些數據,當然這些事后臺操作的,你只要要獲取這個model就行)
- NSString *orderSpec = [order description];//這句代碼拼接的字符串要和后臺調用支付寶支付API的拼接的字符串一直,否者會一直報錯
- 支付成功后的回到,這個時候其實雖然支付成功了,但是實際上還需要調用后臺接口,后臺的回調成功后才算是支付成功.
- 注意要設置支付寶的白名單,否者在你想返回app的時候會返回不了
- 注意要在appdelegate里面實現了- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options這個方法才能回調成功
以上步驟支付寶支付就完成了
三.微信支付
前期準備工作:
和支付寶一樣這里不再贅述
集成使用:
其實和支付寶差不多,下面簡單說說步驟和注意事項
1.導入微信支付SDK:在這里下載微信支付demo,解壓后將SDK導入到項目中
2.導入依賴庫:支付寶導入了依賴庫后,微信就不用導入什么了
3.注冊appid
3.集成使用:和支付寶一樣見參考微信支付文檔參考代碼如下:
+ (void)jumpToBizWeipay:(XSTWeiPayModel *) modle andViewController:(UIViewController )weSelf{
if ([WXApi isWXAppInstalled]) {//這里判斷有無微信客戶端,沒有就跳轉到app store進行安裝
//調起微信支付
PayReq req = [[PayReq alloc] init];
req.partnerId = modle.partnerid;
req.prepayId = modle.prepayid;
req.nonceStr = modle.noncestr;
req.timeStamp = modle.timestamp.intValue;
req.package = modle.package;
req.sign = modle.sign;
[WXApi sendReq:req];
}else{
dispatch_async(dispatch_get_main_queue(), ^{
[XSTTools showAlertWith:@"取消" andWIthSure:@"確定" andWithTitle:@"提醒" andWithString:@"你還未安裝微信,點擊確定進入app store安裝" andWithView:nil andWith:weSelf andWithType:WEIXIN andActionStyle:UIAlertControllerStyleAlert];
});
}
}
4.回調:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
if ([WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]) {
return YES;//這里是微信支付
}else{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
}];
return YES;//這里是支付寶支付
}
}
注意:
- 注意白名單設置
- 注意判斷手機中有無微信app,如果沒有是需要判斷提示手機沒有安裝微信app,這里可以給個彈框跳轉到app store的微信url進行安裝,這里和支付寶不同,支付寶不用判斷,沒有支付寶app會進入web網頁支付.
- 微信支付這個方法沒有看到blcok回調,那么他是怎么判斷支付成功的呢?其實這里微信寫的是代理的方式,當你導入微信sdk的時候把WXApiManager.h這個類一并導入,這個類里面寫了相應的方法.
- 照微信SDK Sample,在類實現onResp函數,支付完成后,微信APP會返回到商戶APP并回調onResp函數,開發者需要在該函數中接收通知,判斷返回錯誤碼,如果支付成功則去后臺查詢支付結果再展示用戶實際支付結果。注意 一定不能以客戶端返回作為用戶支付的結果,應以服務器端的接收的支付通知或查詢API返回的結果為準。(這里支付寶其實也一樣)
自此微信支付就完了,微信支付說的簡單,但是如果你看懂了支付寶支付,那么微信支付就不在話下