創(chuàng)建支付請求(Apple Pay)

Creating Payment Requests

Payment Requests支付請求是PKPaymentRequest類的實例。支付請求包含一系列描述用戶的支付對象(為哪些東西付款)的概要項:可用的運(yùn)送方式的列表,用戶需要提供的運(yùn)送信息的描述,關(guān)于商家和支付處理的信息。

Decide Whether the User Can Make Payments 判決用戶是否有能力支付

在生成一個支付請求之前,通過調(diào)用PKPaymentAuthorizationViewController類中的canMakePaymentsUsingNetworks:方法判斷用戶是否能夠使用支持的系統(tǒng)完成支付。使用canMakePayments方法,檢查設(shè)備的硬件和父類控制是否支持Apple Pay。

如果canMakePayments返回NO,表示設(shè)備不支持Apple Pay。因此也不顯示Apple Pay按鈕,轉(zhuǎn)到其他的支付方式。

如果canMakePayments返回YES,但是canMakePaymentsUsingNetworks:返回NO,表示設(shè)備支持Apple Pay,但是用戶沒有添加任何符合要求的支付系統(tǒng)的卡片??蛇x擇性地去顯示一個支付設(shè)置按鈕,提示用戶設(shè)置卡片。一旦用戶點(diǎn)擊了該按鈕,初始化設(shè)置一個新卡的進(jìn)程(例如:調(diào)用openPaymentSetup方法)。

另外,一旦用戶按下Apple Pay按鈕,必須開始支付授權(quán)進(jìn)程。在展示支付請求之前不能要求用戶執(zhí)行其他任何任務(wù)。例如,如果用戶需要輸入折扣碼,必須在按下Apple Pay按鈕之前請求該代碼。

Bridging from Web-Based Interfaces 基于網(wǎng)絡(luò)接口進(jìn)行橋接

如果app使用網(wǎng)絡(luò)接口購買物品和服務(wù),必須在處理Apple Pay交易之前從網(wǎng)絡(luò)接口移動該請求到本地iOS代碼。列表3-1展示了需要處理web view的請求的步驟。

Listing 3-1Buying items from a web view
    // Called when the web view tries to load "myShoppingApp:buyItem"
    -(void)webView:(nonnull WKWebView *)webView
    decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction
    decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler {
        
        // Get the URL for the selected link.
        NSURL *URL = navigationAction.request.URL;
        
        // If the scheme and resource specifier match those defined by your app,
        // handle the payment in native iOS code.
        if ([URL.scheme isEqualToString:@"myShoppingApp"] &&
            [URL.resourceSpecifier isEqualToString:@"buyItem"]) {
            
            // Create and present the payment request here.
            
            // The web view ignores the link.
            decisionHandler(WKNavigationActionPolicyCancel);
        }
        
        // Otherwise the web view loads the link.
        decisionHandler(WKNavigationActionPolicyAllow);
    }

Payment Requests Include Currency and Region Information 包括貨幣和地區(qū)信息的支付請求

在支付請求中所有的概要數(shù)值均使用相同的貨幣(指定使用PKPaymentRequest類中的currencyCode屬性),均使用三個字母的ISO貨幣代碼,例如USD。

支付請求的國家碼表明在該國家發(fā)生購買操作或者在該國家購買將要被處理。使用兩個字母的ISO國家碼,例如US。

在支付請求中設(shè)置的商戶ID(merchant ID)必須與app中的entitlement中的merchant IDs相匹配.

    request.currencyCode = @"USD";
    request.countryCode = @"US";
    request.merchantIdentifier = @"merchant.com.example";

Payment Requests Have a List of Payment Summary Items支付請求有一個支付概要項的列表

展示在PKPaymentSummaryItem類中的支付概要項,描述給用戶的支付請求的不同部分。使用一個小部分的概要項- 典型地包含總和、任何折扣、運(yùn)費(fèi)、稅金和最終的總和。如果沒有任何其他額外的費(fèi)用(例如:運(yùn)費(fèi)或稅金),僅僅包含購物的總和。在app中提供逐項的消費(fèi)細(xì)節(jié)。

每個概要項有一個標(biāo)記和數(shù)值,展示在Listing 3-2。標(biāo)記是用戶可讀的概要項總結(jié)的描述。該數(shù)值與支付數(shù)值是一致的。在支付請求中的所有數(shù)值均使用在支付請求中指定的貨幣。折扣或者優(yōu)惠劵的數(shù)值,則設(shè)置為負(fù)數(shù)。

當(dāng)支付被授權(quán)的時候,如果不知道某個實際的費(fèi)用(例如:打車費(fèi)),生成一個使用PKPaymentSummaryItemTypePending類型的總和概要項并且值為0.0。該系統(tǒng)然后標(biāo)記該費(fèi)用為未決定的。

Listing 3-2Creating a payment summary item
    // 12.75 subtotal
    NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:1275 exponent:-2 isNegative:NO];
    self.subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"Subtotal" amount:subtotalAmount];
    
    // 2.00 discount
    NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithMantissa:200 exponent:-2 isNegative:YES];
    self.discount = [PKPaymentSummaryItem summaryItemWithLabel:@"Discount" amount:discountAmount];

注意:
支付概要項使用NSDecimalNumber類存儲數(shù)量為以10為基的數(shù)。該類的實例可以通過明確地指定尾數(shù)和指數(shù)(展示在代碼列表中)或者提供一個string類型的數(shù)量并指定一個區(qū)域來創(chuàng)建??偸鞘褂靡?0為基的數(shù)來進(jìn)行金融計算,例如,確定5%折扣的數(shù)量。

即使IEEE的浮點(diǎn)類型數(shù)據(jù)例如floatDouble顯示起來非常方便,但不適合于金融計算。這些數(shù)據(jù)類型使用以2為基的數(shù)字表示出來,這意味著一些小數(shù)數(shù)值不能被精確地表示出來。例如:0.42很可能接近于0.419999無限循環(huán)。這類近似值會造成金融計算得到錯誤的結(jié)果。

在列表中最后的一個支付概要項是最終的總和。通過添加所有其他的概要項數(shù)值來計算總和數(shù)值。最終總和的顯示不同于其他的概要項:使用公司的名稱作為它的label內(nèi)容,使用所有其他的概要項的數(shù)值之和作為它的數(shù)值。使用paymentSummaryItems屬性添加支付概要項到支付請求。

    // 10.75 grand total
    NSDecimalNumber *totalAmount = [NSDecimalNumber zero];
    //  計算總和
    totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];
    totalAmount = [totalAmount decimalNumberByAdding:discountAmount];

    self.total = [PKPaymentSummaryItem summaryItemWithLabel:@"My Company Name" amount:totalAmount];
    
    self.summaryItems = @[self.subtotal, self.discount, self.total];
    request.paymentSummaryItems = self.summaryItems;

A Shipping Method Is a Special Payment Summary Item 運(yùn)送方式是一種特殊的支付概要項

為每個適用的運(yùn)送方式創(chuàng)建一個PKShippingMethod的實例。正如其他的支付概要項一樣,運(yùn)送方式有一個用戶可讀label內(nèi)容(例如“標(biāo)準(zhǔn)的運(yùn)送”或者“次日運(yùn)送”)和一個運(yùn)費(fèi)的數(shù)值。不像其他的概要項,運(yùn)送方式也有detail屬性-例如:“Arrives by July 29”或者“Ships in 24 hours”- 這說明了運(yùn)送方式之間的不同。

為了在代理方法中區(qū)分運(yùn)送方式,可使用identifier屬性。該屬性僅僅被用于在自己的app中-框架處理它作為一個不透明的值,也不顯示在UI界面中。當(dāng)創(chuàng)建每個運(yùn)送方式時,為它指定一個獨(dú)一無二的標(biāo)識。為了使調(diào)試容易些,使用摘要或者簡短的string值,例如“discount”,“standard”或者“next-day”。

一些運(yùn)送方式不適用于所有的區(qū)域或者對不同的地址有不同的運(yùn)費(fèi)。當(dāng)用戶選擇一個運(yùn)送地址或者方式時可以更新這些信息,正如Your Delegate Updates Shipping Methods and Costs中描述的。

Indicating Your Support Payment Processing Mechanisms 指定支持的支付處理機(jī)制

通過用string常量的數(shù)組填充supportNetworks屬性來指定支持何種支付系統(tǒng)。通過給merchantCapabilities屬性設(shè)定一個值來指定支持何種支付處理協(xié)議。必須支持3DS,支持EMV是可選的。

商家支付能力是位掩碼,聯(lián)合展示如下:

    request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkDiscover, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];
    
    // Supports 3DS only
    request.merchantCapabilities = PKMerchantCapability3DS;
    
    // Supports both 3DS and EMV
    request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV;

Indicating What Shipping and billing Information Is Needed 指定哪些運(yùn)送和賬單信息是必需的

填充支付授權(quán)視圖控制器的requiredBillingAddressFields和requiredShippingAddressFields屬性來指定哪些賬單和運(yùn)送信息是必需的。當(dāng)展示該視圖控制器時,它提示用戶提供要求的賬單和運(yùn)送信息。這些區(qū)域的常量按照下面的方式聯(lián)合設(shè)定這些屬性的值:

    request.requiredBillingAddressFields = PKAddressFieldEmail;
    request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;

注意:
僅僅請求需要用來處理支付的賬單和運(yùn)送信息和傳送商品或者服務(wù)。請求不必要的信息會增加不需要的復(fù)雜性。每個額外的步驟會增加用戶簡單地取消了該交易的可能性。

如果你有最新的賬單和運(yùn)送聯(lián)系方式信息,可以在支付請求時設(shè)置這些內(nèi)容。Apple Pay會默認(rèn)使用這些信息;然而,用戶仍然可以選擇其他的聯(lián)系方式信息作為支付授權(quán)處理的一部分。

    PKContact *contact = [[PKContact alloc] init];
    
    //  聯(lián)系人姓名
    NSPersonNameComponents *name = [[NSPersonNameComponents alloc] init];
    name.givenName = @"John";
    name.familyName = @"Appleseed";
    
    contact.name = name;
    
    // 聯(lián)系人地址
    CNMutablePostalAddress *address = [[CNMutablePostalAddress alloc] init];
    address.street = @"1234 Laurel Street";
    address.city = @"Atlanta";
    address.state = @"GA";
    address.postalCode = @"30303";
    
    contact.postalAddress = address;
    
    request.shippingContact = contact;

注意:
地址信息可以來自在iOS中的廣泛的輸入源。在使用它之前總是驗證這些信息。

Storing Additional Information 存儲額外的信息

為了存儲每個app特定的支付請求的信息,例如一個購物車標(biāo)識,使用applicationData屬性。該屬性被對待作為一個系統(tǒng)提供的不透明的值。當(dāng)用戶授權(quán)支付請求之后一大把應(yīng)用數(shù)據(jù)會顯示在支付密鑰中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內(nèi)容

  • 1.About Apple Pay Apple Pay是一種移動支付技術(shù),讓使用者把它們對真實的物品和服務(wù)的支付信...
    NEWWORLD閱讀 5,230評論 14 51
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,701評論 25 708
  • 轉(zhuǎn)載自:Apple Pay的使用 Apple Pay的使用 關(guān)于Apple Pay 具體繼承步驟也可參考: 網(wǎng)址配...
    John_LS閱讀 1,012評論 5 0
  • 關(guān)于 Apple Pay apple pay 是一種移動支付技術(shù),它可以讓用戶將自己在現(xiàn)實生活中購物、享受服務(wù)的支...
    LuxDark閱讀 542評論 0 2
  • 《一個叫劉洪斌的人火了,道德底線卻被撕破了》十三郎吐槽,不吐不快[微笑] 昨晚到今,這個劉神醫(yī),一夜之間火遍了我中...
    好郝說話閱讀 604評論 3 5