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

一.移動支付

  1. 什么叫移動支付:移動支付也稱為手機支付,就是允許用戶使用其移動終端(通常是手機)對所消費的商品或服務進行賬務支付的一種服務方式。單位或個人通過移動設備、互聯網或者近距離傳感直接或間接向銀行金融機構發送支付指令產生貨幣支付與資金轉移行為,從而實現移動支付功能。移動支付將終端設備、互聯網、應用提供商以及金融機構相融合,為用戶提供貨幣支付、繳費等金融業務。

  2. 微信和支付寶支付:在移動互聯網興起下比較大眾的兩款三方支付平臺,下面將詳細介紹在iOS開發中,如何集成支付寶和微信支付


二.支付寶支付

前期準備工作

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

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

  3. 獲取支付寶公鑰:
    應用上線后在賬號總查看支付寶公鑰,即可獲取支付寶公鑰,主要用于支付寶返回數據的驗簽。

  4. 其他的比如完善應用信息,添加應用功能請自行添加,很簡單,這里不說

集成使用

  1. 導入支付寶SDK:這里下載 支付寶支付demo,解壓后,將

1.AlipaySDK.bundle
2.AlipaySDK.framework

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

  1. 導入依賴庫:


    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返回的結果為準。(這里支付寶其實也一樣)

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


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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容