1. 程式人生 > >iOS 整合apple Pay 接入詳細教程

iOS 整合apple Pay 接入詳細教程

Apple Pay執行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業證書新增。

環境搭建好後可以在模擬器上面執行,xcode7.2.1+iPhone6SP9.2系統下,系統會繫結幾種虛擬的銀行卡,和幾個聯絡人,方便除錯,支付也不會發生真實的付款,真的很方便。

準備工作

在接入Apple Pay之前,首先要申請MerchantID及對應證書。

工程設定

  • bundleID設定

1024259-16fff81828406887.png

Capability中啟用Apple Pay許可權,並選擇merchantID。

1024259-21c046559eb3d59a.png

之後專案會多一個Applepay的配置檔案ApplePayYasin.entitlements

1024259-35739a7c9011a540.png

  • 需要引用的庫

Xcode7.0以上不需要再手動新增需要引用的庫了,只需要匯入標頭檔案就可以了

1 2 3 #import <passkit passkit.h="">                                 //使用者繫結的銀行卡資訊 #import <passkit pkpaymentauthorizationviewcontroller.h="">    //Apple pay的展示控制元件 #import <addressbook addressbook.h="">                         //使用者聯絡資訊相關</addressbook></passkit></passkit>
  • 裝置Applepay許可權檢測

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 if (![PKPaymentAuthorizationViewController class]) { //PKPaymentAuthorizationViewController需iOS8.0以上支援 NSLog(@"作業系統不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援"); return; } //檢查當前裝置是否可以支付 if (![PKPaymentAuthorizationViewController canMakePayments]) {
//支付需iOS9.0以上支援 NSLog(@"裝置不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援"); return; } //檢查使用者是否可進行某種卡的支付,是否支援Amex、MasterCard、Visa與銀聯四種卡,根據自己專案的需要進行檢測 NSArray *supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay]; if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworks]) { NSLog(@"沒有繫結支付卡"); return; }

建立支付請求PKPaymentRequest

  • 初始化PKPaymentRequest

這裡需要注意RMB的幣種程式碼是CNY

1 2 3 4 5 6 7 //設定幣種、國家碼及merchant識別符號等基本資訊 PKPaymentRequest *payRequest = [[PKPaymentRequest alloc]init]; payRequest.countryCode = @"CN";     //國家程式碼 payRequest.currencyCode = @"CNY";       //RMB的幣種程式碼 payRequest.merchantIdentifier = @"merchant.ApplePayDemoYasin";  //申請的merchantID payRequest.supportedNetworks = supportedNetworks;   //使用者可進行支付的銀行卡 payRequest.merchantCapabilities = PKMerchantCapability3DS|PKMerchantCapabilityEMV;      //設定支援的交易處理協議,3DS必須支援,EMV為可選,目前國內的話還是使用兩者吧
  • 設定發票配送資訊和貨物配送地址資訊,使用者設定後可以通過代理回撥代理獲取資訊的更新

1 2 3 4 5 // payRequest.requiredBillingAddressFields = PKAddressFieldEmail;    //如果需要郵寄賬單可以選擇進行設定,預設PKAddressFieldNone(不郵寄賬單) //樓主感覺賬單郵寄地址可以事先讓使用者選擇是否需要,否則會增加客戶的輸入麻煩度,體驗不好, payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName; //送貨地址資訊,這裡設定需要地址和聯絡方式和姓名,如果需要進行設定,預設PKAddressFieldNone(沒有送貨地址)

1024259-43c63c7a57cc2a08.png

送貨資訊頁面展示

設定貨物的配送方式,不需要不配置

1 2 3 4 5 6 7 8 9 10 //設定兩種配送方式 PKShippingMethod *freeShipping = [PKShippingMethod summaryItemWithLabel:@"包郵" amount:[NSDecimalNumber zero]]; freeShipping.identifier = @"freeshipping"; freeShipping.detail = @"6-8 天 送達"; PKShippingMethod *expressShipping = [PKShippingMethod summaryItemWithLabel:@"極速送達" amount:[NSDecimalNumber decimalNumberWithString:@"10.00"]]; expressShipping.identifier = @"expressshipping"; expressShipping.detail = @"2-3 小時 送達"; payRequest.shippingMethods = @[freeShipping, expressShipping];

1024259-c8a390d491efc6ef.png

1024259-ff33c2d6e59a960b.png

  • 賬單資訊的設定

每條賬單的設定

賬單列表使用PKPaymentSummaryItem新增描述和價格,價格使用NSDecimalNumber。

PKPaymentSummaryItem初始化:

label為商品名字或者是描述,amount為商品價格,折扣為負數,type為該條賬單為最終價格還是估算價格(比如計程車價格預估)

1 2 + (instancetype)summaryItemWithLabel:(NSString *)label amount:(NSDecimalNumber *)amount; + (instancetype)summaryItemWithLabel:(NSString *)label amount:(NSDecimalNumber *)amount type:(PKPaymentSummaryItemType)type NS_AVAILABLE(NA, 9_0);

NSDecimalNumber初始化:

NSDecimalNumber可以使用數字初始化,也可以使用字串。

新增賬單列表:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:1275 exponent:-2 isNegative:NO];   //12.75 PKPaymentSummaryItem *subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"商品價格" amount:subtotalAmount]; NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithString:@"-12.74"];      //-12.74 PKPaymentSummaryItem *discount = [PKPaymentSummaryItem summaryItemWithLabel:@"優惠折扣" amount:discountAmount]; NSDecimalNumber *methodsAmount = [NSDecimalNumber zero]; PKPaymentSummaryItem *methods = [PKPaymentSummaryItem summaryItemWithLabel:@"包郵" amount:methodsAmount]; NSDecimalNumber *totalAmount = [NSDecimalNumber zero]; totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount]; totalAmount = [totalAmount decimalNumberByAdding:discountAmount]; totalAmount = [totalAmount decimalNumberByAdding:methodsAmount]; PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"Yasin" amount:totalAmount];  //最後這個是支付給誰。哈哈,快支付給我 summaryItems = [NSMutableArray arrayWithArray:@[subtotal, discount, methods, total]]; //summaryItems為賬單列表,型別是 NSMutableArray,這裡設定成成員變數,在後續的代理回撥中可以進行支付金額的調整。 payRequest.paymentSummaryItems = summaryItems;

顯示購物資訊並進行支付

1 2 3 4 //ApplePay控制元件 PKPaymentAuthorizationViewController *view = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:payRequest]; view.delegate = self; [self presentViewController:view animated:YES completion:nil];

PKPaymentAuthorizationViewControllerDelegate代理

  • 這裡還有兩個類要介紹

PKPayment 支付成功資訊

1 2 3 4 5 PKPaymentToken *payToken = payment.token; //支付憑據,發給服務端進行驗證支付是否真實有效 PKContact *billingContact = payment.billingContact;     //賬單資訊 PKContact *shippingContact = payment.shippingContact;   //送貨資訊 PKContact *shippingMethod = payment.shippingMethod;     //送貨方式

PKContact 聯絡人資訊

1 2 3 4 5 NSPersonNameComponents *name = contact.name;                //聯絡人姓名 CNPostalAddress *postalAddress = contact.postalAddress;     //聯絡人地址 NSString *emailAddress = contact.emailAddress;              //聯絡人郵箱 CNPhoneNumber *phoneNumber = contact.phoneNumber;           //聯絡人手機 NSString *supplementarySubLocality = contact.supplementarySubLocality;  //補充資訊,地址詳細描述,其他備註等等,iOS9.2及以上才有
  • 代理說明

送貨地址回撥

1 2 3 4 5 6 7 -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectShippingContact:(PKContact *)contact completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkshippingmethod *> * _Nonnull, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{ //contact送貨地址資訊,PKContact型別 //送貨資訊選擇回撥,如果需要根據送貨地址調整送貨方式,比如普通地區包郵+極速配送,偏遠地區只有付費普通配送,進行支付金額重新計算,可以實現該代理,返回給系統:shippingMethods配送方式,summaryItems賬單列表,如果不支援該送貨資訊返回想要的PKPaymentAuthorizationStatus completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, summaryItems); }</pkpaymentsummaryitem *></pkshippingmethod *>

送貨方式回撥

1 2 3 4 5 6 7 8 9 10 11 12 13 -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectShippingMethod:(PKShippingMethod *)shippingMethod completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{ //配送方式回撥,如果需要根據不同的送貨方式進行支付金額的調整,比如包郵和付費加速配送,可以實現該代理 PKShippingMethod *oldShippingMethod = [summaryItems objectAtIndex:2]; PKPaymentSummaryItem *total = [summaryItems lastObject]; total.amount = [total.amount decimalNumberBySubtracting:oldShippingMethod.amount]; total.amount = [total.amount decimalNumberByAdding:shippingMethod.amount]; [summaryItems replaceObjectAtIndex:2 withObject:shippingMethod]; [summaryItems replaceObjectAtIndex:3 withObject:total]; completion(PKPaymentAuthorizationStatusSuccess, summaryItems); }</pkpaymentsummaryitem *>

支付卡選擇回撥

1 2 3 4 -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(void (^)(NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{ //支付銀行卡回撥,如果需要根據不同的銀行調整付費金額,可以實現該代理 completion(summaryItems); }</pkpaymentsummaryitem *>

送貨地址回撥,已棄用

1 2 3 -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectShippingAddress:(ABRecordRef)address completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkshippingmethod *> * _Nonnull, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{ //送貨地址回撥,已棄用 }</pkpaymentsummaryitem *></pkshippingmethod *>

付款成功蘋果伺服器返回資訊回撥,做伺服器驗證

1 2 3 4 5 6 7 8 9 10 11 12 13 14 -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus status))completion { PKPaymentToken *payToken = payment.token; //支付憑據,發給服務端進行驗證支付是否真實有效 PKContact *billingContact = payment.billingContact;     //賬單資訊 PKContact *shippingContact = payment.shippingContact;   //送貨資訊 PKContact *shippingMethod = payment.shippingMethod;     //送貨方式 //等待伺服器返回結果後再進行系統block呼叫 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //模擬伺服器通訊 completion(PKPaymentAuthorizationStatusSuccess); }); }

支付完成回撥

1 2 3 -(void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{ [controller dismissViewControllerAnimated:YES completion:nil]; }














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

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    

    
    //1、判斷當前裝置是否支援蘋果支付
    
    // 2、判斷是否新增銀行卡
    
    
    if (![PKPaymentAuthorizationViewController class]) {
        //PKPaymentAuthorizationViewController需iOS8.0以上支援
        NSLog(@"作業系統不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援");
        return;
    }
   else if (![PKPaymentAuthorizationViewController canMakePayments]) {
        
        NSLog(@"當前裝置不支援applepay");
        
    }
    //PKPaymentNetworkChinaUnionPay  銀聯卡 。PKPaymentNetworkVisa vsa 卡
    //檢查使用者是否可進行某種卡的支付,是否支援Amex、MasterCard、Visa與銀聯四種卡,,根據自己專案的需要進行檢測
    else if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkChinaUnionPay,PKPaymentNetworkVisa]])
    {
        // 如果沒有新增銀行卡,建立一個跳轉按鈕,跳轉到新增銀行卡的介面
        PKPaymentButton *button=[PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];
        button.center=self.view.center;
        [self.view addSubview:button];
        [button addTarget:self action:@selector(jumpAddBank) forControlEvents:UIControlEventTouchUpInside];
        
    }
    else
    {
        // 建立一個夠買按鈕,當用戶點選按鈕時,購買一個商品
        PKPaymentButton *button=[PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleBlack];
        button.center=self.view.center;
        [self.view addSubview:button];
        [button addTarget:self action:@selector(clickBuy) forControlEvents:UIControlEventTouchUpInside];
    }
    
   
   
    
}
#pragma mark - 點選去購買
-(void)clickBuy
{
    
    // 1、建立一個支付請求
    PKPaymentRequest *request=[[PKPaymentRequest alloc]init];
    // 配置支付請求
    //1.1 配置商家ID
    [email protected]"merchant.com.cym.weiliaopay";
    
    //1.2 配置國家程式碼,以及貨幣程式碼
    [email protected]"CN";
    [email protected]"CNY";
    // 1.3 支付的銀行卡
    [email protected][PKPaymentNetworkChinaUnionPay,PKPaymentNetworkVisa];
    
    // 1.4配置商戶的處理方式//設定支援的交易處理協議,3DS必須支援,EMV為可選,目前國內的話還是使用兩者吧
    request.merchantCapabilities=PKMerchantCapability3DS|PKMerchantCapabilityEMV;
    
    
    // 1.5 配置購買的商品列表
    NSDecimalNumber *price=[NSDecimalNumber decimalNumberWithString:@"0.01"];
    PKPaymentSummaryItem *item=[PKPaymentSummaryItem summaryItemWithLabel:@"汽車保養" amount:price];
    [email protected][item];
    
    
    
    
     //配置請求的附加項
      //1、是否顯示發票收貨地址 。顯示哪些選項
//    request.requiredBillingAddressFields=PKAddressFieldAll;
//    // 2、是否顯示快遞地址,顯示哪些選項
//    request.requiredShippingAddressFields=PKAddressFieldAll;
    
    
    
    
    //2、 驗證使用者的支付授權
    
    PKPaymentAuthorizationViewController *PayVC=[[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:request];
    
    PayVC.delegate=self;
    
    [self presentViewController:PayVC animated:YES completion:nil];
    
    
    
    
    
}
#pragma mark  -代理方法
//如果當用戶授權成功,就會呼叫這個方法
/*
 引數一:授權控制器  
 引數二:支付物件
 引數三:系統給定的一個回撥程式碼塊,我們需要執行這個程式碼塊,來告訴系統當前的的支付狀態是否成功
 */
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
    
    NSLog(@"token=%@",payment.token);
    // 一般在此外,拿到支付資訊,傳送給伺服器處理,處理完畢之後,伺服器返回一個狀態,告訴客戶端,是否支付成功,然後由客戶端進行處理
    BOOL isSuccess=YES;
    

    
    
    if (isSuccess)
    {
        completion(PKPaymentAuthorizationStatusSuccess);
    }
    else
    {
        completion(PKPaymentAuthorizationStatusFailure);
    }
    
}

#pragma mari 當用戶授權成功,或者取消授權時呼叫
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
    
    [self dismissViewControllerAnimated:YES completion:nil];
    
    
    
}

#pragma mark - 新增銀行卡介面
-(void)jumpAddBank
{
    // 跳轉到新增銀行卡介面
    PKPassLibrary *pl=[[PKPassLibrary alloc]init];
    
    [pl openPaymentSetup];
    
    
    
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


相關推薦

iOS 整合apple Pay 接入詳細教程

Apple Pay執行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業證書新增。 環境搭建好後可以在模擬器上面執行,xcode7.2.1+iPhone6SP9.2系統下,系統會繫結幾種虛擬的銀行卡,和幾個聯絡人,

iOSApple Pay接入詳細教程

Apple Pay執行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業證書新增。 環境搭建好後可以在模擬器上面執行,xcode7.2.1+iPhone6SP9.2系統下,系統會繫結幾種虛擬的銀行卡,和幾個聯絡人,方便除錯,支付也不會發生真實的付款,

Apple Pay接入詳細教程

Apple Pay執行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業證書新增。 環境搭建好後可以在模擬器上面執行,xcode7.2.1+iPhone6SP9.2系統下,系統會繫結幾種虛擬的銀行卡,和幾個聯絡

[iOS概念]Apple Pay與IAP的區別

Apple Pay是什麼? 在Apple Pay的釋出會上,Eddy Cue表示,蘋果並沒有興趣建立一個收集使用者資料的業務,蘋果並不知道你購買了什麼,不知道你是從哪裡購買的,為了這個商品花了多少錢。所以這也就是蘋果和支付寶,微信等最大的不同:Apple Pay並不會將資金存放在Apple

spring boot整合activiti rest api詳細教程

1.匯入依賴 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-rest</artifac

SSM框架整合Maven工程整合Spring+Springmvc+Mybatis(詳細教程,附程式碼)

一、基本概念 1、Spring Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分

IOS 公司開發者賬號申請詳細教程

m 談到蘋果開發者賬號,我們需要區分一下個人賬號、公司賬號和企業賬號這三種,還有一種是教育賬號,這個就不多說了。     個人賬號:個人申請用於開發蘋果app所使用的賬號,僅限於個人使用,申請比較容易,$99。     公司賬號:以公司的名義申請的開發者賬號,用於公司內部的

整合騰訊Bugly日誌收集接入詳細步驟和錯誤解決方案-- IOS

一、登入BUGLY官網1、登入BUGLY官網以後,選擇新建產品,選擇IOS或ADNROID平臺,如圖: 完事以後點選儲存,點選當前專案檢視詳細資訊: 主要有:異常上報(異常概覽、崩潰分析、卡頓分析、高階搜尋、異常配置)、運營統計(運營概覽、使用者分析、渠道分析)、應用升級 2

SSM三大框架整合詳細教程(Spring+SpringMVC+MyBatis)

json轉換 需要 acc log4 err ppi junit測試 日誌 enc 使用 SSM ( Spring 、 SpringMVC 和 Mybatis )已經有三個多月了,項目在技術上已經沒有什麽難點了,基於現有的技術就可以實現想要的功能,當然肯定有很多可以改進的地

dede織夢系統接入熊掌號推送api,完整詳細教程

default ppi 模板 alt for fcm body ext plain 第一步: 根據熊掌號要求完成校驗頁面,官方文檔很詳細,照著弄就行了 第二步: 開始後臺改造 1.進入後臺文件夾dede(自己實際的文件夾),然後進入templets目錄,打開bo

dede織夢繫統接入熊掌號推送api,完整詳細教程

第一步:     根據熊掌號要求完成校驗頁面,官方文件很詳細,照著弄就行了 第二步: 開始後臺改造   1.進入後臺資料夾dede(自己實際的資料夾),然後進入templets目錄,開啟body_index.htm 大概104行左右,加入入口連結(c

springboot2.x簡單詳細教程--訊息佇列介紹及整合ActiveMQ (第十三章)

一、JMS介紹和使用場景及基礎程式設計模型     簡介:講解什麼是小寫佇列,JMS的基礎知識和使用場景     1、什麼是JMS: Java訊息服務(Java Message Service),Java平臺中關於面向訊息中介

springboot2.x簡單詳細教程--搜尋框架ElasticSearch介紹和整合(第十二章)

一、搜尋引擎知識和搜尋框架elasticsearch(es)基本介紹    1. 簡介:通過京東電商 介紹什麼是搜尋引擎,和開源搜尋框架ElasticSearch6.x新特性介紹         前言

springboot2.x簡單詳細教程--整合Logback日誌框架(第十一章)

一、新日誌框架LogBack介紹     簡介:日誌介紹和新日誌框架Logback講解     1.常用處理java的日誌元件 slf4j,log4j,logback,common-logging 等    &

springboot2.x簡單詳細教程--整合定時任務和非同步任務處理(第十章)

一、SpringBoot定時任務schedule講解      簡介:講解什麼是定時任務和常見定時任務區別         1、常見定時任務 Java自帶的java.util.Timer類  

springboot2.x簡單詳細教程--整合Redis實戰(第 九章)

一、分散式快取Redis介紹      簡介:講解為什麼要用快取和介紹什麼是Redis,新手練習工具      1.什麼是Redis ​ 由c語言編寫的,以鍵值對的形式儲存的非關係資料庫. 快取技術(駐留在記憶體中)

SSM三大框架整合詳細教程

使用 SSM ( Spring 、 SpringMVC 和 Mybatis )已經有三個多月了,專案在技術上已經沒有什麼難點了,基於現有的技術就可以實現想要的功能,當然肯定有很多可以改進的地方。之前沒有記錄 SSM 整合的過程, 這次剛剛好基於自己的一個小專案重新搭建了一次,而且比專案搭建的要更好一些。以前解

springboot2.x簡單詳細教程--常用Starter介紹和整合模板引擎Freemaker、thymeleaf(第七章)

一、SpringBoot Starter講解    簡單說springboot Starter 就是jar包的集合,集合了很多的依賴     簡介:介紹什麼是SpringBoot Starter和主要作用     1、官網地址:https://docs.spring.

Springboot SpringCloud整合OAuth2入門詳細教程

關於OAuth2的解釋,有一篇比較出名的文章——理解OAuth 2.0 - 阮一峰的網路日誌(http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html),可以瞭解一下OAuth2的基礎知識。簡單理解一下OAuth2,你要登入一

iOS中實現IAP和Apple Pay支付的注意點

IAP開發需要的注意點在沙箱環境測試Store Kit在模擬器上無法執行,需要使用真機測試sanbox和app store內容一致,只是不執行真實的支付動作在測試的iphone上面退出itunes賬戶不能在測試的iphone手機上登入測試賬戶登入在程式中購買商品後,store