1. 程式人生 > >APP支付之使用ApplePay支付開發步驟

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



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

ApplePay的支付流程


在具體去進行每一步操作的時候一定要先了解一下ApplePay的具體的操作流程。
這裡是官方給出的開發者文件。所有的流程步驟還有邏輯流程都可以在這裡找到答案。
開發者傳送門
使用ApplePay開發同樣的需要一個商戶ID,開通許可權,然後根據需求拼接支付請求。Apple Pay會對支付資訊進行加密處理,以防止未獲授權的第三方獲取使用者的支付資訊。剩下的就是在自己的伺服器上進行支付流程和處理了。

ApplePay的開發流程

1 獲取證書

詳細的官方指導可以參考這裡
蘋果證書幫助
習慣了蘋果開發的人一定會料到,新的蘋果支付一定是需要一個新的證書的,沒錯,需要建立一個新的商業證書。

選擇右側的[Merchant IDs],點選右上角的新增。


點選continue


點選register


現在新新增的Merchant ID已經顯示出來了,可以新增到列表裡了。


將剛剛新增的MerchantID選中,選擇編輯。


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



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


選擇剛才建立的證書進行上傳,並且點選生成。


選擇描述檔案選項,建立一個描述檔案,然後點開他的詳細資訊,點選編輯。


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


生成對應的描述檔案,在本地執行新增到鑰匙串中。

2 工程配置

建立一個新工程,需要注意兩點:
1 在BuildIdentifier中設定的必須和描述檔案一樣。

2 在Capability標籤中把ApplePay選項開啟,並且將MerchantIDs選中,如下圖

3 程式碼編寫

1 匯入標頭檔案

匯入需要的框架對應的標頭檔案PassKit/PassKit.h 和AddressBook/AddressBook.h,並且遵循PKPaymentAuthorizationViewControllerDelegate

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

2 處理支付頁面

支付介面都是採用的PKPaymentAuthorizationViewController,每一條支付資訊可以採用PKPaymentSummaryItem來進行編輯,最後呼叫蘋果支付的時候就是呼叫的這個頁面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
- (IBAction)payAction:(UIButton *)sender {
    if([PKPaymentAuthorizationViewController canMakePayments]) {
        NSLog(@"支援支付");
        // 我們後面創建出來的支付頁面就是根據這個request
        PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
        // 商品目錄
        PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@"麻辣燙"
                                                                            amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];
        PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"肯德基"
                                                                            amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];
        PKPaymentSummaryItem *widget3 = [PKPaymentSummaryItem summaryItemWithLabel:@"海鮮大餐"
                                                                            amount:[NSDecimalNumber decimalNumberWithString:@"0.02"]];
        PKPaymentSummaryItem *widget4 = [PKPaymentSummaryItem summaryItemWithLabel:@"coderqi" amount:[NSDecimalNumber decimalNumberWithString:@"0.03"] type:PKPaymentSummaryItemTypeFinal];
        request.paymentSummaryItems = @[widget1, widget2, widget3, widget4];
//        request.countryCode = @"CN";
//        request.currencyCode = @"CNY";//人民幣
        request.countryCode = @"US";
        request.currencyCode = @"USD";
        request.supportedNetworks = @[PKPaymentNetworkChinaUnionPay, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];
        // 這裡填的是就是我們建立的merchat IDs
        request.merchantIdentifier = @"merchant.com.coderqi.applepay.pay";
        request.merchantCapabilities = PKMerchantCapabilityEMV;
        //增加郵箱及地址資訊
        request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
        // 根據request去建立支付頁面
        PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
        // 設定代理
        paymentPane.delegate = self;
        if (!paymentPane) {
            NSLog(@"出問題了");
        } else {
            // 模態推出頁面
            [self presentViewController:paymentPane animated:YES completion:nil];
        }
    } else {

        NSLog(@"該裝置不支援支付");
    }
}

3 編寫代理回撥

接下來就是代理回撥的處理,伺服器接收到了我們的請求之後收到返回資訊會呼叫對應的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma mark ----支付狀態
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))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);
}
#pragma mark ----支付完成
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {

    // 支付完成後讓支付頁面消失
    [controller dismissViewControllerAnimated:YES completion:nil];
}

好了,到這裡就完事兒了。
最後,將工程的程式碼貼在後邊,各位看官可以隨意下載。
程式碼Demo。