一.移動支付
什么叫移動支付:移動支付也稱為手機支付结胀,就是允許用戶使用其移動終端(通常是手機)對所消費的商品或服務(wù)進(jìn)行賬務(wù)支付的一種服務(wù)方式。單位或個人通過移動設(shè)備责循、互聯(lián)網(wǎng)或者近距離傳感直接或間接向銀行金融機構(gòu)發(fā)送支付指令產(chǎn)生貨幣支付與資金轉(zhuǎn)移行為糟港,從而實現(xiàn)移動支付功能。移動支付將終端設(shè)備院仿、互聯(lián)網(wǎng)秸抚、應(yīng)用提供商以及金融機構(gòu)相融合,為用戶提供貨幣支付歹垫、繳費等金融業(yè)務(wù)剥汤。
微信和支付寶支付:在移動互聯(lián)網(wǎng)興起下比較大眾的兩款三方支付平臺,下面將詳細(xì)介紹在iOS開發(fā)中排惨,如何集成支付寶和微信支付
二.支付寶支付
前期準(zhǔn)備工作
創(chuàng)建應(yīng)用并獲取APPID:
首先開發(fā)的時候必須叫公司申請一個商家賬號吭敢,之后會審核,審核成功后創(chuàng)建你的應(yīng)用暮芭,創(chuàng)建成功后會有一個appid(應(yīng)用唯一標(biāo)識),當(dāng)我們集成支付的時候需要用這個來注冊使用(下面會講到)配置應(yīng)用環(huán)境:
請到官方查看:生成與配置密鑰鹿驼,這里mac和windows不一樣注意區(qū)分,這里你會下載一個工具會自動生成公私鑰(公私鑰是配對使用的,一定要配對辕宏,也就是你用工具一起生成的,并且后臺調(diào)用接口的時候需要這個來簽名等)畜晰,這里需要將公鑰和私鑰配置到你的賬號中,這里面的RSA就是一種加密的方式而已瑞筐。獲取支付寶公鑰:
應(yīng)用上線后在賬號總查看支付寶公鑰凄鼻,即可獲取支付寶公鑰,主要用于支付寶返回數(shù)據(jù)的驗簽聚假。其他的比如完善應(yīng)用信息块蚌,添加應(yīng)用功能請自行添加,很簡單膘格,這里不說
集成使用
- 導(dǎo)入支付寶SDK:這里下載 支付寶支付demo,解壓后峭范,將
1.AlipaySDK.bundle
2.AlipaySDK.framework
導(dǎo)入到項目中,這里建議你也將order.h這個類也導(dǎo)入,當(dāng)你支付的時候需要用
-
導(dǎo)入依賴庫:
注意:
如果是Xcode 7.0之后的版本闯袒,需要添加libc++.tbd虎敦、libz.tbd游岳;
如果是Xcode 7.0之前的版本政敢,需要添加libc++.dylib、libz.dylib
4.本地集成使用:意思就是簽名胚迫,商品的信息在本地寫好喷户,這里可以測試的時候使用,正式開發(fā)app不要這樣使用访锻,主要是不安全褪尝,這樣為了簽名你的私鑰和公鑰必須放在本地闹获,這里本地集成使用不在重復(fù)贅述,請查看 官方文檔
5:通過后臺服務(wù)器獲取簽名,支付商品信息支付:主要是在app中將需要購買的商品信息,通過后臺接口下單,下單后會將商品的訂單號返回(這里的訂單號是后臺人員自行分配的,為了家下來的支付做準(zhǔn)備)河哑,之后通過這個訂單號調(diào)用后臺接口獲取支付數(shù)據(jù)(主要是獲取商品信息避诽,簽名等,你支付需要的都在這里面),之后拿著這些數(shù)據(jù)去支付就行了,后面注意回調(diào)的判斷和支付成功后者失敗的提醒就行了,下面是實現(xiàn)代碼:
1.導(dǎo)入頭文件并注冊:
#import <AlipaySDK/AlipaySDK.h>//導(dǎo)入頭文件
[WXApi registerApp:WX_PAY_PPID withDescription:@"xxx"];//注冊支付寶,這里寫到appdelegate里
2.下單:下單的時候后臺提供一個接口璃谨,將提交的數(shù)據(jù)保存在后臺服務(wù)器并生成一個唯一的訂單號沙庐,這個訂單號和數(shù)據(jù)是關(guān)聯(lián)的
3.獲取支付數(shù)據(jù),簽名等,并調(diào)用支付寶支付:
+ (void)jumpToBizAliPay:(XSTAlipayModel *) modle andViewController:(UIViewController *)weSelf{
//這里的model是我用上面的訂單號請求的支付的數(shù)據(jù)模型(里面包含了支付的所有信息,)
/*
*商戶的唯一的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; //商品標(biāo)題
order.body = modle.body; //商品描述
order.totalFee = modle.total_fee; //商品價格
order.notifyURL = modle.notify_url; //回調(diào)URL
order.service = modle.service;
order.paymentType = modle.payment_type;
order.inputCharset = modle._input_charset;
order.itBPay = @"30m";
order.showUrl = @"m.alipay.com";
//應(yīng)用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString *appScheme = @"xstAlipay";
//將商品信息拼接成字符串
NSString *orderSpec = [order description];
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = (RSADataSigner *)modle.sign;
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴(yán)格按照該格式
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) {
//發(fā)送通知,這里是個block,當(dāng)成功后會發(fā)送一個通知,跳轉(zhuǎn)到支付成功的界面,這里是當(dāng)返回app的時候才調(diào)用
NSNotification * note = [[NSNotification alloc] initWithName:@"APS" object:@"succes" userInfo:nil];
[[NSNotificationCenter defaultCenter] postNotification:note];
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"支付結(jié)果" message:@"放棄支付" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
}];
}
}
4回調(diào):
- (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模型是我用訂單號通過后臺接口(后臺接口會調(diào)用支付寶提供的API返回一些數(shù)據(jù)铸抑,當(dāng)然這些事后臺操作的,你只要要獲取這個model就行)
- NSString *orderSpec = [order description];//這句代碼拼接的字符串要和后臺調(diào)用支付寶支付API的拼接的字符串一直,否者會一直報錯
- 支付成功后的回到,這個時候其實雖然支付成功了衷模,但是實際上還需要調(diào)用后臺接口,后臺的回調(diào)成功后才算是支付成功.
- 注意要設(shè)置支付寶的白名單鹊汛,否者在你想返回app的時候會返回不了
- 注意要在appdelegate里面實現(xiàn)了- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options這個方法才能回調(diào)成功
以上步驟支付寶支付就完成了
三.微信支付
前期準(zhǔn)備工作:
和支付寶一樣這里不再贅述
集成使用:
其實和支付寶差不多,下面簡單說說步驟和注意事項
1.導(dǎo)入微信支付SDK:在這里下載微信支付demo,解壓后將SDK導(dǎo)入到項目中
2.導(dǎo)入依賴庫:支付寶導(dǎo)入了依賴庫后,微信就不用導(dǎo)入什么了
3.注冊appid
3.集成使用:和支付寶一樣見參考微信支付文檔參考代碼如下:
+ (void)jumpToBizWeipay:(XSTWeiPayModel *) modle andViewController:(UIViewController )weSelf{
if ([WXApi isWXAppInstalled]) {//這里判斷有無微信客戶端阱冶,沒有就跳轉(zhuǎn)到app store進(jìn)行安裝
//調(diào)起微信支付
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:@"你還未安裝微信柒昏,點擊確定進(jìn)入app store安裝" andWithView:nil andWith:weSelf andWithType:WEIXIN andActionStyle:UIAlertControllerStyleAlert];
});
}
}
4.回調(diào):
- (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;//這里是支付寶支付
}
}
注意:
- 注意白名單設(shè)置
- 注意判斷手機中有無微信app,如果沒有是需要判斷提示手機沒有安裝微信app,這里可以給個彈框跳轉(zhuǎn)到app store的微信url進(jìn)行安裝熙揍,這里和支付寶不同职祷,支付寶不用判斷,沒有支付寶app會進(jìn)入web網(wǎng)頁支付.
- 微信支付這個方法沒有看到blcok回調(diào),那么他是怎么判斷支付成功的呢届囚?其實這里微信寫的是代理的方式,當(dāng)你導(dǎo)入微信sdk的時候把WXApiManager.h這個類一并導(dǎo)入,這個類里面寫了相應(yīng)的方法.
- 照微信SDK Sample有梆,在類實現(xiàn)onResp函數(shù),支付完成后意系,微信APP會返回到商戶APP并回調(diào)onResp函數(shù)泥耀,開發(fā)者需要在該函數(shù)中接收通知,判斷返回錯誤碼蛔添,如果支付成功則去后臺查詢支付結(jié)果再展示用戶實際支付結(jié)果痰催。注意 一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)迎瞧。(這里支付寶其實也一樣)
自此微信支付就完了夸溶,微信支付說的簡單,但是如果你看懂了支付寶支付凶硅,那么微信支付就不在話下