iOS開發(fā):移動支付(支付寶+微信)

一.移動支付

  1. 什么叫移動支付:移動支付也稱為手機支付结胀,就是允許用戶使用其移動終端(通常是手機)對所消費的商品或服務(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ù)剥汤。

  2. 微信和支付寶支付:在移動互聯(lián)網(wǎng)興起下比較大眾的兩款三方支付平臺,下面將詳細(xì)介紹在iOS開發(fā)中排惨,如何集成支付寶和微信支付


二.支付寶支付

前期準(zhǔn)備工作

  1. 創(chuàng)建應(yīng)用并獲取APPID:
    首先開發(fā)的時候必須叫公司申請一個商家賬號吭敢,之后會審核,審核成功后創(chuàng)建你的應(yīng)用暮芭,創(chuàng)建成功后會有一個appid(應(yīng)用唯一標(biāo)識),當(dāng)我們集成支付的時候需要用這個來注冊使用(下面會講到)

  2. 配置應(yīng)用環(huán)境:
    請到官方查看:生成與配置密鑰鹿驼,這里mac和windows不一樣注意區(qū)分,這里你會下載一個工具會自動生成公私鑰(公私鑰是配對使用的,一定要配對辕宏,也就是你用工具一起生成的,并且后臺調(diào)用接口的時候需要這個來簽名等)畜晰,這里需要將公鑰和私鑰配置到你的賬號中,這里面的RSA就是一種加密的方式而已瑞筐。

  3. 獲取支付寶公鑰:
    應(yīng)用上線后在賬號總查看支付寶公鑰凄鼻,即可獲取支付寶公鑰,主要用于支付寶返回數(shù)據(jù)的驗簽聚假。

  4. 其他的比如完善應(yīng)用信息块蚌,添加應(yīng)用功能請自行添加,很簡單膘格,這里不說

集成使用

  1. 導(dǎo)入支付寶SDK:這里下載 支付寶支付demo,解壓后峭范,將

1.AlipaySDK.bundle
2.AlipaySDK.framework

導(dǎo)入到項目中,這里建議你也將order.h這個類也導(dǎo)入,當(dāng)你支付的時候需要用

  1. 導(dǎo)入依賴庫:


    LB1PlBHKpXXXXXoXXXXXXXXXXXX.png

注意:
如果是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)迎瞧。(這里支付寶其實也一樣)

自此微信支付就完了夸溶,微信支付說的簡單,但是如果你看懂了支付寶支付凶硅,那么微信支付就不在話下


PS:其實如果公司有條件的話還是建議用集成好的支付,比如ping++ 等.里面集成了百度錢包,apple pay缝裁, 銀聯(lián)等,包含的支付方式比較多足绅,這樣也減輕開發(fā)者工作量.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捷绑,一起剝皮案震驚了整個濱河市韩脑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粹污,老刑警劉巖段多,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壮吩,居然都是意外死亡衩匣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門粥航,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琅捏,“玉大人,你說我怎么就攤上這事递雀”樱” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵缀程,是天一觀的道長搜吧。 經(jīng)常有香客問我,道長杨凑,這世上最難降的妖魔是什么滤奈? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮撩满,結(jié)果婚禮上蜒程,老公的妹妹穿的比我還像新娘。我一直安慰自己伺帘,他們只是感情好昭躺,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伪嫁,像睡著了一般领炫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上张咳,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天帝洪,我揣著相機與錄音,去河邊找鬼脚猾。 笑死葱峡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婚陪。 我是一名探鬼主播族沃,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼弃鸦,長吁一口氣:“原來是場噩夢啊……” “哼散址!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘫镇,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤沽一,失蹤者是張志新(化名)和其女友劉穎盖溺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铣缠,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡烘嘱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝗蛙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝇庭。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捡硅,靈堂內(nèi)的尸體忽然破棺而出哮内,到底是詐尸還是另有隱情,我是刑警寧澤壮韭,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布北发,位于F島的核電站,受9級特大地震影響喷屋,放射性物質(zhì)發(fā)生泄漏琳拨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一屯曹、第九天 我趴在偏房一處隱蔽的房頂上張望狱庇。 院中可真熱鬧,春花似錦恶耽、人聲如沸僵井。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽批什。三九已至,卻和暖如春社搅,著一層夾襖步出監(jiān)牢的瞬間驻债,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工形葬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留合呐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓笙以,卻偏偏與公主長得像淌实,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容