Apple pay小記

Apple pay作為一種全新的支付方式,一經登陸國內,便收到各大銀行的激勵追捧,相信原因大家都了解,所以作為iOS開發人員,個人感覺有必要了解下。
apple pay的使用基本需要下面幾步:

獲得Apple pay開發資格

在開發者中心注冊一個Merchant ID
下載并安裝Merchant ID對應的cer證書,如果安裝證書出現問題可以參考http://www.lxweimin.com/p/a5f0795cf781

在需要使用Apple pay的項目中添加Apple pay功能

1、打開項目當中的Apple pay的開關,選擇對應的Merchant ID
2、導入PassKit框架#import <PassKit/PassKit.h>
3、直接上代碼,簡單實現

#import "ViewController.h"
#import <PassKit/PassKit.h>

@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>

/**支付按鈕*/
@property (weak, nonatomic) PKPaymentButton *payButton;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //是否可以使用apple pay
    if ([self isApplePayEnable])
    {
        //創建支付按鈕
        [self addPayButton];
    }
}



#pragma mark - 是否添加了銀行卡
- (BOOL)isApplePayEnable
{
    //1、判斷設備是否支持Apple pay
    if (![PKPaymentAuthorizationViewController canMakePayments])
    {
        return NO;
    }
    
    //2、判斷是否綁定了銀行卡
    if(![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex,PKPaymentNetworkDiscover,PKPaymentNetworkMasterCard,PKPaymentNetworkPrivateLabel,PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay]])
    {
        //如果沒有綁定銀行卡可以提示用戶綁定銀行卡菜可以交易
        return NO;
    }
    
    return YES;
}

#pragma mark - 添加支付按鈕
- (void)addPayButton
{
    //創建按鈕
    PKPaymentButton *payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleBlack];
    self.payButton = payButton;
    CGFloat btnW = payButton.bounds.size.width;
    CGFloat btnH = payButton.bounds.size.height;
    CGFloat btnX = ([UIScreen mainScreen].bounds.size.width - btnW) * 0.5;
    CGFloat btnY = 100;
    
    payButton.frame = CGRectMake(btnX, btnY, btnW, btnH);
    
    [self.view addSubview:payButton];
    
    //添加點擊事件,彈出支付授權控制器
    [payButton addTarget:self action:@selector(presentPayViewControler) forControlEvents:UIControlEventTouchUpInside];
}

#pragma mark - 創建支付請求
- (PKPaymentRequest *)createPayRequest
{
    PKPaymentRequest *pkRequest = [[PKPaymentRequest alloc] init];
    
    //1、設置貨幣代碼,中國就是CNY,度娘查
    pkRequest.currencyCode = @"CNY";
    //2、設置國家代碼,同樣找度娘
    pkRequest.countryCode = @"CN";
    //3、設置支持的綁定卡類型
    pkRequest.supportedNetworks = @[PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];
    //4、設置商家id(Merchant ID)
    pkRequest.merchantIdentifier = @"merchant.bjwlade";
    //5、設置支付的處理標準,具體的,我也不是很清楚,都寫上吧
    pkRequest.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityDebit | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit;
    //6、可選收貨人送貨信息,這一項可以不設置,如果設置了,就必須在支付控制器,手動添加相關信息
//    pkRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress | PKAddressFieldPhone | PKAddressFieldEmail | PKAddressFieldName;
    
    //7、設置賬單,或者說發票的投遞地址,當然也可以不設置,因為用戶可能不需要這個賬單,如果設置了,同樣就必須在支付控制器,手動添加相關信息
    //這里設置只有PKAddressFieldPostalAddress有用
//    pkRequest.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
    
    //8、設置默認的收貨人信息,默認的訂單或者發票投遞地址也這樣設置,這里不做設置
    //默認設置,如果設置了,在支付控制器頁面是看不到這些信息顯示的
    PKContact *contact = [[PKContact alloc] init];
    //8.1設置收貨人姓名
    NSPersonNameComponents *userName = [[NSPersonNameComponents alloc] init];
    userName.givenName = @"曉飛";
    userName.familyName = @"王";
    contact.name = userName;
    
    //8.2設置收貨人的地址
    CNMutablePostalAddress *userAddress = [[CNMutablePostalAddress alloc] init];
    userAddress.street = @"回龍觀東大街";
    userAddress.city = @"北京";
    userAddress.state = @"GA";
    userAddress.postalCode = @"100000";  //郵編
    contact.postalAddress = userAddress;
    //8.3設置收件人信息
    pkRequest.shippingContact = contact;
    
    //9、設置貨物的配送方式
    pkRequest.shippingMethods = [self setUpPayWay];
    
    //10、設置商品列表
    pkRequest.paymentSummaryItems = [self goodList];
    
    return pkRequest;
}

#pragma mark - 商品列表信息
//商品列表的最后一個前面參數必須是收款人,后面參數是收款總價
- (NSArray *)goodList
{
    PKPaymentSummaryItem *good1 = [PKPaymentSummaryItem summaryItemWithLabel:@"外星人筆記本電腦" amount:[NSDecimalNumber decimalNumberWithString:@"15000"]];
    
    PKPaymentSummaryItem *good2 = [PKPaymentSummaryItem summaryItemWithLabel:@"羅技鼠標墊" amount:[NSDecimalNumber decimalNumberWithString:@"40"]];
    PKPaymentSummaryItem *good3 = [PKPaymentSummaryItem summaryItemWithLabel:@"西部數據移動硬盤SSD 1G" amount:[NSDecimalNumber decimalNumberWithString:@"2500"]];
    
    PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"陳偉" amount:[NSDecimalNumber decimalNumberWithString:@"17540"]];
    
    return @[good1, good2,good3, total];
}


#pragma mark - 配送方式
//PKShippingMethod的label就是標簽描述,amount就是使用費用,如果使用費用直接寫成0,就表示免費
- (NSArray *)setUpPayWay
{
    PKShippingMethod * method1 = [PKShippingMethod summaryItemWithLabel:@"順風快遞" amount:[NSDecimalNumber decimalNumberWithString:@"0"]];
    
    method1.identifier = @"順豐";
    
    method1.detail = @"24小時到貨";
    
    PKShippingMethod * method2 = [PKShippingMethod summaryItemWithLabel:@"圓通快遞" amount:[NSDecimalNumber decimalNumberWithString:@"18.00"]];
    
    method2.identifier = @"圓通";
    
    method2.detail = @"貨到付款";
    
    
    return @[method1, method2];
}

#pragma mark - 支付授權控制器
- (void)presentPayViewControler
{
    PKPaymentAuthorizationViewController *payViewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:[self createPayRequest]];
    
    //因為這個控制器有可能創建失敗
    if (payViewController)
    {
        payViewController.delegate = self;
        [self presentViewController:payViewController animated:YES completion:nil];
    }
}


#pragma mark - PKPaymentAuthorizationViewControllerDelegate


- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
    NSLog(@"支付成功");
}

//用戶點擊了右上角的取消就會調用此方法
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
    NSLog(@"取消支付");
    [controller dismissViewControllerAnimated:YES completion:nil];
}

@end
幾個需要注意的地方

1、PKPaymentRequest在設置屬性的時候以下屬性是必須的,否則會導致PKPaymentAuthorizationViewController創建失敗,除了這些必須的,其他屬性設置根據實際情況選擇
currencyCode//貨幣編碼縮寫
countryCode//國家編碼縮寫
supportedNetworks//支持的磁卡類型
merchantIdentifier//在開發者中心創建的商家ID
merchantCapabilities//支付標準
paymentSummaryItems//商品列表
2、貨幣代碼縮寫和國家代碼縮寫
貨幣代碼參考:http://www.webmasterhome.cn/huilv/huobidaima.asp
國家代碼參考:http://country-code.cl/
3、商品列表的最后一個前面參數必須是收款人,后面參數是收款總價,其中總價應該包括郵費
4、由于PKPaymentAuthorizationViewController可能創建失敗,操作改控制器的時候應該先判空
5、由于PKPaymentAuthorizationViewController是一個控制器,所以不一定需要PKPaymentButton來操作,可以直接創建PKPaymentAuthorizationViewController,當普通控制器操作
6、Apple pay使用模擬器同樣可以,本文所有實現都是在模擬器下
7、模擬器下在打開Apple pay的開關的時候,timeout,可以暫時忽略,真機暫時沒有嘗試

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.About Apple Pay Apple Pay是一種移動支付技術,讓使用者把它們對真實的物品和服務的支付信...
    NEWWORLD閱讀 5,258評論 14 51
  • Apple Pay 一個方便 & 安全的移動支付技術,讓用戶完成他們的支付環節并把支付相關的信息告訴你 只可以購買...
    skingtree閱讀 2,136評論 0 4
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,283評論 25 708
  • 轉載自:Apple Pay的使用 Apple Pay的使用 關于Apple Pay 具體繼承步驟也可參考: 網址配...
    John_LS閱讀 1,032評論 5 0
  • 說真的,在早些年,大概還是高中和大學的時候,那個時候,QQ 剛剛開始盛行,所有人都只能去網吧里對著電腦搖頭傻笑的時...
    撒撒灑薩閱讀 207評論 0 0