支付

iOS支付

iOS支付分為兩類火鼻,第三方支付應用內(nèi)支付(內(nèi)購)竹握。

第三方支付包括:支付寶支付熔掺、微信支付铆帽、銀聯(lián)支付致扯、百度錢包蛇更、京東支付等等错妖。

應用內(nèi)支付(In-App Purchase):在應用程序內(nèi)購買虛擬商品揭保。如果你在App Store上銷售的應用程序知押,將收到支付金額的70%叹螟。

第三方支付

彈出方式

網(wǎng)頁

有些第三方支付沒有安裝客戶端鹃骂,可以直接彈出網(wǎng)頁進行支付。(比如支付寶)

調用APP

手機中安裝了客戶端可以跳轉到APP中進行支付罢绽。微信支付只能調用App進行支付畏线。

支付寶支付

相關資料

支付流程

  1. 在商戶服務平臺先與支付寶簽約,獲得商戶ID(partner)和賬號ID(seller)良价,需要提供公司資質或者營業(yè)執(zhí)照寝殴,個人無法申請。

    文檔地址:https://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103542&docType=1

  2. 生成并下載相應的公鑰私鑰文件(加密簽名用)

    文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.POMYKl&treeId=58&articleId=103543&docType=1

  3. 下載支付寶SDK:https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

  4. 生成訂單信息

  5. 調用支付寶客戶端明垢,由支付寶客戶端跟支付寶安全服務器打交道

  6. 支付完畢后返回支付結果給商戶客戶端和服務器

SDK里有集成支付寶功能的一個Demo蚣常,集成支付功能的具體操作方式,可以參考Demo痊银。

代碼集成流程

參考文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.efmKDS&treeId=59&articleId=103676&docType=1

  1. 下載官方SDK

    下載地址:https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

    本Demo使用的SDK是從官方Demo整理出來的抵蚊,整理的SDK版本:201501022。

    下載地址:http://7xooko.com1.z0.glb.clouddn.com/AlipaySDK.zip

    目錄結構如下:

    ├── AlipaySDK.bundle
    ├── AlipaySDK.framework
    ├── Order.h
    ├── Order.m
    ├── Util
    ├── libcrypto.a
    ├── libssl.a
    └── openssl
    

    其中:

    • AlipaySDK.bundleAlipaySDK.framework是支付寶SDK
    • Order類:定義訂單信息
    • Util溯革、libcrypto.a贞绳、libssl.a、openssl:數(shù)據(jù)簽名致稀,對訂單信息進行加密
  2. 添加依賴庫

    其中冈闭,需要注意的是:

    如果是Xcode 7.0之后的版本,需要添加libc++.tbd抖单、libz.tbd萎攒;

    如果是Xcode 7.0之前的版本,需要添加libc++.dylib矛绘、libz.dylib躺酒。

  3. 創(chuàng)建prefix header filePCH文件,添加#import <Foundation/Foundation.h>

    Build Settings中的prefix header設置pch文件路徑

  4. Build SettingsHeader Search Paths添加頭文件引用路徑蔑歌,[文件路徑]/AlipaySDK/

  5. 在需要調用AlipaySDK的文件中羹应,增加頭文件引用。

    #import  <AlipaySDK/AlipaySDK.h>
    #import "Order.h"
    #import "DataSigner.h"
    
  6. 生成訂單信息及簽名

    //將商品信息賦予AlixPayOrder的成員變量
    Order *order = [[Order alloc] init];
    order.partner = PartnerID; // 商戶ID
    order.seller = SellerID; // 賬號ID
    order.tradeNO = @"20150923"; //訂單ID(由商家自行制定)
    order.productName = @"iPhone6s"; //商品標題
    order.productDescription = @"新年打折"; //商品描述
    order.amount = @"0.01"; //商品價格(單位:元)
    order.notifyURL =  @"http://www.chaosky.me"; //回調URL次屠,支付成功或者失敗回調通知自己的服務器進行訂單狀態(tài)變更
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showUrl = @"m.alipay.com";
    
    // 應用注冊scheme,在AlixPayDemo-Info.plist定義URL types
    NSString *appScheme = @"AliPayDemo";
    
    //將商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(PartnerPrivKey);
    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) {
            NSLog(@"reslut = %@",resultDic);
        }];
    }
    
  7. Xcode設置URL scheme

    iPhone SDK可以把你的App和一個自定義的URL Scheme綁定园匹。該URL Scheme可用來從瀏覽器或別的App啟動你的App。

    配置方法:打開info.plist文件劫灶,找到或者添加如圖所示的鍵值對:

    URL Scheme值為代碼中對應的值裸违,必須一致

  8. 配置支付寶客戶端返回url處理方法

    AppDelegate.m文件中本昏,增加引用代碼:

    #import <AlipaySDK/AlipaySDK.h>
    

    在@implementation AppDelegate中增加如下代碼:

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
        //如果極簡開發(fā)包不可用供汛,會跳轉支付寶錢包進行支付,需要將支付寶錢包的支付結果回傳給開發(fā)包
        if ([url.host isEqualToString:@"safepay"]) {
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
        //【由于在跳轉支付寶客戶端支付的過程中,商戶app在后臺很可能被系統(tǒng)kill了怔昨,所以pay接口的callback就會失效雀久,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法里面處理跟callback一樣的邏輯】
                NSLog(@"result = %@",resultDic);
            }];
        }
        if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權返回authCode
    
            [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
                //【由于在跳轉支付寶客戶端支付的過程中,商戶app在后臺很可能被系統(tǒng)kill了趁舀,所以pay接口的callback就會失效赖捌,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法里面處理跟callback一樣的邏輯】
                NSLog(@"result = %@",resultDic);
            }];
        }
        return YES;
    }
    

微信支付

需要提供公司資質或者營業(yè)執(zhí)照,個人無法申請矮烹。

相關文檔

支付流程

  1. 向微信注冊你的應用程序id

    開發(fā)者應用登記頁面進行登記越庇,登記并選擇移動應用進行設置后,將獲得AppID奉狈,可立即用于開發(fā)卤唉。但應用登記完成后還需要提交審核,只有審核通過的應用才能正式發(fā)布使用仁期。

  2. 微信APP支付接入商戶服務中心

    參考文檔鏈接:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=&lang=zh_CN

  3. 下載微信SDK文件搬味,如果在項目中應使用SDK的最新版。

    官方資源下載地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&token=&lang=zh_CN

    本Demo使用的SDK是從官方Demo整理出來的蟀拷,整理的SDK版本:1.6.1碰纬。

    下載地址:http://7xooko.com1.z0.glb.clouddn.com/AlipaySDK.zip

    目錄結構如下:

    ├── SDKExport
    │   ├── WXApi.h
    │   ├── WXApiObject.h
    │   ├── libWeChatSDK.a
    │   └── read_me.txt
    └── lib
        ├── ApiXml.h
        ├── ApiXml.mm
        ├── WXUtil.h
        ├── WXUtil.mm
        ├── payRequsestHandler.h
        └── payRequsestHandler.mm
    

    其中:

    SDKExport文件夾:SDK文件

    lib文件夾:工具類

  4. 添加依賴庫

    SystemConfiguration.framework
    libz.dylib
    libsqlite3.dylib
    libc++.dylib
    CoreTelephony.framework
    CoreGraphics.framework
    
  5. Xcode設置URL scheme

    在Xcode中,選擇你的工程設置項问芬,選中“TARGETS”一欄悦析,在“info”標簽欄的“URL type“添加“URL scheme”為你所注冊的應用程序id(如下圖所示)。

  6. 在你需要使用微信終端API的文件中import WXApi.h 頭文件此衅,并增加 WXApiDelegate 協(xié)議强戴。

    // 微信所有的API接口
    #import "WXApi.h"
    // APP端簽名相關頭文件
    #import "payRequsestHandler.h"
    @interface AppDelegate ()<WXApiDelegate>
    @end
    
  7. 要使你的程序啟動后微信終端能響應你的程序,必須在代碼中向微信終端注冊你的id挡鞍。(如下圖所示骑歹,在 AppDelegate 的 didFinishLaunchingWithOptions 函數(shù)中向微信注冊id)。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        //向微信注冊
        [WXApi registerApp:APP_ID withDescription:@"demo 2.0"];
        return YES;
    }
    

    重寫AppDelegate的handleOpenURL和openURL方法:

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
    {
        return [WXApi handleOpenURL:url delegate:self];
    }
    
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
        return [WXApi handleOpenURL:url delegate:self];
    }
    
  8. 現(xiàn)在墨微,你的程序要實現(xiàn)和微信終端交互的具體請求與回應道媚,因此需要實現(xiàn)WXApiDelegate協(xié)議的兩個方法:

    -(void) onReq:(BaseReq*)req
    {
        if([req isKindOfClass:[GetMessageFromWXReq class]])
        {
            // 微信請求App提供內(nèi)容, 需要app提供內(nèi)容后使用sendRsp返回
            NSString *strTitle = [NSString stringWithFormat:@"微信請求App提供內(nèi)容"];
            NSString *strMsg = @"微信請求App提供內(nèi)容翘县,App要調用sendResp:GetMessageFromWXResp返回給微信";
    
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            alert.tag = 1000;
            [alert show];
        }
        else if([req isKindOfClass:[ShowMessageFromWXReq class]])
        {
            ShowMessageFromWXReq* temp = (ShowMessageFromWXReq*)req;
            WXMediaMessage *msg = temp.message;
    
            //顯示微信傳過來的內(nèi)容
            WXAppExtendObject *obj = msg.mediaObject;
    
            NSString *strTitle = [NSString stringWithFormat:@"微信請求App顯示內(nèi)容"];
            NSString *strMsg = [NSString stringWithFormat:@"標題:%@ \n內(nèi)容:%@ \n附帶信息:%@ \n縮略圖:%lu bytes\n\n", msg.title, msg.description, obj.extInfo, msg.thumbData.length];
    
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
        }
        else if([req isKindOfClass:[LaunchFromWXReq class]])
        {
            //從微信啟動App
            NSString *strTitle = [NSString stringWithFormat:@"從微信啟動"];
            NSString *strMsg = @"這是從微信啟動的消息";
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
        }
    }
    

    onReq是微信終端向第三方程序發(fā)起請求最域,要求第三方程序響應。第三方程序響應完后必須調用sendRsp返回锈麸。在調用sendRsp返回時镀脂,會切回到微信終端程序界面。

    -(void) onResp:(BaseResp*)resp
     {
         NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
         NSString *strTitle;
    
         if([resp isKindOfClass:[SendMessageToWXResp class]])
         {
             strTitle = [NSString stringWithFormat:@"發(fā)送媒體消息結果"];
         }
         if([resp isKindOfClass:[PayResp class]]){
             //支付返回結果忘伞,實際支付結果需要去微信服務器端查詢
             strTitle = [NSString stringWithFormat:@"支付結果"];
    
             switch (resp.errCode) {
                 case WXSuccess:
                     strMsg = @"支付結果:成功薄翅!";
                     NSLog(@"支付成功-PaySuccess沙兰,retcode = %d", resp.errCode);
                     break;
    
                 default:
                     strMsg = [NSString stringWithFormat:@"支付結果:失敗翘魄!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                     NSLog(@"錯誤鼎天,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                     break;
             }
         }
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
         [alert show];
     }
    

    如果第三方程序向微信發(fā)送了sendReq的請求,那么onResp會被回調熟丸。sendReq請求調用后,會切到微信終端程序界面

應用內(nèi)支付(In-App Purchase)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伪节,一起剝皮案震驚了整個濱河市光羞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怀大,老刑警劉巖纱兑,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異化借,居然都是意外死亡潜慎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門蓖康,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铐炫,“玉大人,你說我怎么就攤上這事蒜焊〉剐牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵泳梆,是天一觀的道長鳖悠。 經(jīng)常有香客問我,道長优妙,這世上最難降的妖魔是什么乘综? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮套硼,結果婚禮上卡辰,老公的妹妹穿的比我還像新娘。我一直安慰自己邪意,他們只是感情好看政,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抄罕,像睡著了一般允蚣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呆贿,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天嚷兔,我揣著相機與錄音森渐,去河邊找鬼。 笑死冒晰,一個胖子當著我的面吹牛同衣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壶运,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼耐齐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒋情?” 一聲冷哼從身側響起埠况,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棵癣,沒想到半個月后辕翰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡狈谊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年喜命,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片河劝。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡壁榕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赎瞎,到底是詐尸還是另有隱情护桦,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布煎娇,位于F島的核電站二庵,受9級特大地震影響,放射性物質發(fā)生泄漏缓呛。R本人自食惡果不足惜催享,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哟绊。 院中可真熱鬧因妙,春花似錦、人聲如沸票髓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洽沟。三九已至以故,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裆操,已是汗流浹背怒详。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工炉媒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昆烁。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓吊骤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親静尼。 傳聞我的和親對象是個殘疾皇子白粉,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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

  • iOS支付 iOS支付分為兩類,第三方支付和應用內(nèi)支付(內(nèi)購)鼠渺。 第三方支付包括:支付寶支付鸭巴、微信支付、銀聯(lián)支付系冗、...
    請輸入賬號名閱讀 6,182評論 3 22
  • iOS支付 iOS支付分為兩類奕扣,第三方支付和應用內(nèi)支付(內(nèi)購)薪鹦。 第三方支付包括:支付寶支付掌敬、微信支付、銀聯(lián)支付池磁、...
    帥不過oneS閱讀 2,863評論 2 8
  • iOS支付 iOS支付分為兩類奔害,第三方支付和應用內(nèi)支付(內(nèi)購)。 第三方支付包括:支付寶支付地熄、微信支付华临、銀聯(lián)支付、...
    sillen閱讀 1,354評論 0 1
  • 在我們應用開發(fā)中我們經(jīng)常在自己的項目中使用到支付端考,下面我們來談談iOS這塊的支付雅潭;iOS支付主要分為兩類,第三方支...
    Hither閱讀 8,259評論 9 42
  • 測試
    kkkk12345閱讀 150評論 0 0