APP支付之使用ApplePay支付開發步驟

最近蘋果推出了一種新的支付方式–ApplePay支付,雖然譭譽參半,可是不得不認可國內不少的公司還有商家已經開通了ApplePay,可能最早鋒的莫過於肯德基和招商銀行了。拋開優劣與否不說,做爲一個開發者天然要第一時間把ApplePay搞懂搞通,用不用再另說。html

ApplePay的支付流程
在具體去進行每一步操做的時候必定要先了解一下ApplePay的具體的操做流程。這裏是官方給出的開發者文檔。全部的流程步驟還有邏輯流程均可以在這裏找到答案。
開發者傳送門
使用ApplePay開發一樣的須要一個商戶ID,開通權限,而後根據需求拼接支付請求。Apple Pay會對支付信息進行加密處理,以防止未獲受權的第三方獲取用戶的支付信息。剩下的就是在本身的服務器上進行支付流程和處理了。ios

ApplePay的開發流程
1 獲取證書
詳細的官方指導能夠參考這裏蘋果證書幫助習慣了蘋果開發的人必定會料到,新的蘋果支付必定是須要一個新的證書的,沒錯,須要建立一個新的商業證書。json

選擇右側的[Merchant IDs],點擊右上角的添加。服務器

點擊continueapp

點擊registeride

如今新添加的Merchant ID已經顯示出來了,能夠添加到列表裏了。post

將剛剛添加的MerchantID選中,選擇編輯。ui

將選項改成Yes,點Continue。再繼續Continue。而後會須要上傳一個證書。這個時候來到本地打開鑰匙串,生成本地證書,我這裏直接貼每一步的截圖了。編碼

將生成的證書放到桌面上。加密

選擇剛纔建立的證書進行上傳,而且點擊生成。

選擇描述文件選項,建立一個描述文件,而後點開他的詳細信息,點擊編輯。

確認ApplePay的兩個選項都是enable。若是不是,點擊edit將其勾選上。

生成對應的描述文件,在本地運行添加到鑰匙串中。
2 工程配置
建立一個新工程,須要注意兩點:1 在BuildIdentifier中設置的必須和描述文件同樣。


2 在Capability標籤中把ApplePay選項打開,而且將MerchantIDs選中,以下圖

3 代碼編寫
1導入頭文件並遵循代理

#import <PassKit/PassKit.h>
#import <AddressBook/AddressBook.h>
@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>

2 處理支付頁面
支付界面都是採用的PKPaymentAuthorizationViewController,每一條支付信息能夠採用PKPaymentSummaryItem來進行編輯,最後調用蘋果支付的時候就是調用的這個頁面。

//點擊支付的相應事件
- (IBAction)payAction:(UIButton *)sender {

    // 訂單請求對象
    PKPaymentRequest *request = [[PKPaymentRequest alloc]init];
    //商品訂單信息對象
    PKPaymentSummaryItem *item1 = [PKPaymentSummaryItem summaryItemWithLabel:@"寶馬車一輛" amount:[NSDecimalNumber decimalNumberWithString:@"100"]];
    PKPaymentSummaryItem *item2 = [PKPaymentSummaryItem summaryItemWithLabel:@"真皮座椅一個" amount:[NSDecimalNumber decimalNumberWithString:@"200"]];
    PKPaymentSummaryItem *item3 = [PKPaymentSummaryItem summaryItemWithLabel:@"自動雨刷兩隻" amount:[NSDecimalNumber decimalNumberWithString:@"50"]];
    request.paymentSummaryItems = @[item1,item2,item3];
    //指定國家地區編碼
    request.countryCode = @"CN";
    //指定國家貨幣種類--人民幣
    request.currencyCode = @"CNY";
    //指定支持的網上銀行支付方式
    request.supportedNetworks = @[PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay,PKPaymentNetworkMasterCard];
    //指定APP須要的商業ID
    request.merchantIdentifier = @"merchant.com.coderqi.pay.test";
    //指定支付的範圍限制
    request.merchantCapabilities = PKMerchantCapabilityEMV;
    //指定訂單接受的地址是哪裏
    request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;

    //支付界面顯示對象
    PKPaymentAuthorizationViewController *pvc = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:request];
    pvc.delegate = self;

    if (!pvc) {
        NSLog(@"出問題了,請注意檢查");
        @throw  [NSException exceptionWithName:@"CQ_Error" reason:@"建立支付顯示界面不成功" userInfo:nil];
    }else{
        [self presentViewController:pvc animated:YES completion:nil];
    }
}

3 編寫代理回調
接下來就是代理回調的處理,服務器接收到了咱們的請求以後收到返回信息會調用對應的方法。

//在支付的過程當中進行調用,這個方法直接影響支付結果在界面上的顯示
//payment 是表明的支付對象,支付相關的全部信息都存在於這個對象,1 token 2 address
//comletion 是一個回調Block塊,block塊傳遞的參數直接影響界面結果的顯示。
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion{
    /*
    NSError *error;
    ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress ,kABPersonAddressProperty);
    NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);
    //這裏模擬取出地址裏的每個信息。
    NSLog(@"%@",addressDictionary[@"State"]);
    NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];
    // 這裏須要將Token和地址信息發送到本身的服務器上,進行訂單處理,處理以後,根據本身的服務器返回的結果調用completion()代碼塊,根據傳進去的參數界面的顯示結果會不一樣
    PKPaymentAuthorizationStatus status; // From your server
    completion(status);
    */
    //拿到token,
    PKPaymentToken *token = payment.token;
    //拿到訂單地址
    NSString *city = payment.billingContact.postalAddress.city;
    NSLog(@"city:%@",city);
    ///在這裏將token和地址發送到本身的服務器,有本身的服務器與銀行和商家進行接口調用和支付將結果返回到這裏
    //咱們根據結果生成對應的狀態對象,根據狀態對象顯示不一樣的支付結構
    //狀態對象
    PKPaymentAuthorizationStatus status = PKPaymentAuthorizationStatusFailure;
    completion(status);
}

//當支付過程完成的時候進行調用
-(void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
    [controller dismissViewControllerAnimated:YES completion:nil];
}

到此就結束了,這只是一個初步的研究,並無深刻,好比指紋付啊,還有不少功能能夠添加.


 

文/Ashoka_APP(簡書做者) 原文連接:http://www.jianshu.com/p/cc38d1a6bd1d 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。

相關文章
相關標籤/搜索