ApplePay支付以及使用ApplePay支付開發(fā)步驟

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

ApplePay的支付流程

開發(fā)者傳送門

在具體去進(jìn)行每一步操作的時候一定要先了解一下ApplePay的具體的操作流程。
這里是官方給出的開發(fā)者文檔。所有的流程步驟還有邏輯流程都可以在這里找到答案。
使用ApplePay開發(fā)同樣的需要一個商戶ID,開通權(quán)限,然后根據(jù)需求拼接支付請求。
Apple Pay會對支付信息進(jìn)行加密處理,以防止未獲授權(quán)的第三方獲取用戶的支付信息。
剩下的就是在自己的服務(wù)器上進(jìn)行支付流程和處理了。

ApplePay的開發(fā)流程
1 : 獲取證書
蘋果證書幫助

習(xí)慣了蘋果開發(fā)的人一定會料到,新的蘋果支付一定是需要一個新的證書的,沒錯,
需要創(chuàng)建一個新的商業(yè)證書。
步驟1.png

選擇右側(cè)的[Merchant IDs],點擊右上角的添加。

步驟2.png

點擊continue

步驟3.png

點擊register

步驟4.png

現(xiàn)在新添加的Merchant ID已經(jīng)顯示出來了,可以添加到列表里了。

步驟5.png

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

步驟6.png

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

步驟7.png
步驟8.png

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

步驟8.png

選擇剛才創(chuàng)建的證書進(jìn)行上傳,并且點擊生成。

步驟9.png

選擇描述文件選項,創(chuàng)建一個描述文件,然后點開他的詳細(xì)信息,點擊編輯。

步驟10.png

確認(rèn)ApplePay的兩個選項都是enable。如果不是,點擊edit將其勾選上。

步驟11.png

生成對應(yīng)的描述文件,在本地運行添加到鑰匙串中。

2 : 工程配置

創(chuàng)建一個新工程,需要注意兩點:

1 在BuildIdentifier中設(shè)置的必須和描述文件一樣。

步驟11.png

2 在Capability標(biāo)簽中把ApplePay選項打開,并且將MerchantIDs選中,如下圖

步驟12.png

3 代碼編寫
1 導(dǎo)入頭文件
導(dǎo)入需要的框架對應(yīng)的頭文件PassKit/PassKit.h 和AddressBook/AddressBook.h,
并且遵循 PKPaymentAuthorizationViewControllerDelegate


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

2: 處理支付頁面

支付界面都是采用的PKPaymentAuthorizationViewController,每一條支付信息可以采用PKPaymentSummaryItem來進(jìn)行編輯,最后調(diào)用蘋果支付的時候就是調(diào)用的這個頁面。

- (IBAction)payAction:(UIButton *)sender {
  if([PKPaymentAuthorizationViewController canMakePayments]) { 
       NSLog(@”支持支付”);
 // 我們后面創(chuàng)建出來的支付頁面就是根據(jù)這個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]; 
   // 這里填的是就是我們創(chuàng)建的merchat IDs 
    request.merchantIdentifier = @”merchant.com.coderqi.applepay.pay”;   
    request.merchantCapabilities = PKMerchantCapabilityEMV; 
    //增加郵箱及地址信息
    request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress; 
   // 根據(jù)request去創(chuàng)建支付頁面 
    PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request]; 
   // 設(shè)置代理 paymentPane.delegate = self;
   if (!paymentPane) { 
      NSLog(@”出問題了”); 
     } else { 
// 模態(tài)推出頁面 
     [self presentViewController:paymentPane animated:YES completion:nil];
     } } else { 
     NSLog(@”該設(shè)備不支持支付”); 
    }}

3 : 編寫代理回調(diào)

接下來就是代理回調(diào)的處理,服務(wù)器接收到了我們的請求之后收到返回信息會調(diào)用對應(yīng)的方法。

#pragma mark —-支付狀態(tài)
- (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和地址信息發(fā)送到自己的服務(wù)器上,
   進(jìn)行訂單處理,處理之后,根據(jù)自己的服務(wù)器返回的結(jié)果調(diào)用completion()代碼塊,
   根據(jù)傳進(jìn)去的參數(shù)界面的顯示結(jié)果會不同 
    PKPaymentAuthorizationStatus status; 
   // From your server completion(status); 
  / //這是新版 //拿到token, PKPaymentToken *token = payment.token;* 
  //拿到訂單地址
   NSString city = payment.billingContact.postalAddress.city; 
   NSLog(@”city:%@”,city);  
   ///在這里將token和地址發(fā)送到自己的服務(wù)器,
   有自己的服務(wù)器與銀行和商家進(jìn)行接口調(diào)用和支付將結(jié)果返回到這里 
   //我們根據(jù)結(jié)果生成對應(yīng)的狀態(tài)對象,根據(jù)狀態(tài)對象顯示不同的支付結(jié)構(gòu) 
   //狀態(tài)對象 
   PKPaymentAuthorizationStatus status = PKPaymentAuthorizationStatusFailure; completion(status);
    }
  #pragma mark —-支付完成
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
 {  
   // 支付完成后讓支付頁面消失 
   [controller dismissViewControllerAnimated:YES completion:nil];
  }

好了,到這里就完事兒了。

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

附贈大神錄得視頻地址:優(yōu)酷:http://v.youku.com/v_show/id_XMTQ4Njk0NTE2MA==.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容