在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ iOS/ 創(chuàng)建支付請求
創(chuàng)建支付請求
處理支付
配置你的開發(fā)環(huán)境
授權(quán)支付
關(guān)于 Apple Pay

創(chuàng)建支付請求

支付請求是 PKPayementRequest 類的一個實列。一個支持請求包含用戶支付的物品概要清單、可選配送方式列表、用戶需提供的配送信息、商家的信息以及支付處理機構(gòu)。

判斷用戶是否能夠支付

創(chuàng)建支付請求前,可以先通過調(diào)用 PKPaymentAuthorizationViewController 類的方法 canMakePaymentsUsingNetworks 判斷用戶是否能使用你支持的支付網(wǎng)絡(luò)完成付款。canMakePayments 方法可以判斷當(dāng)前設(shè)備的硬件是否支持 Apple Pay 以及家長控制是否允許使用 Apple Pay。

如果 canMakePayments 返回 NO,則設(shè)備不支持 Apple Pay。不要顯示 Apple Pay 按扭,你可以選擇使用其它的支付方式。

如果 canMakePayments 返回 YES,但 canMakePayementsUsingNetworks: 返回 NO,則表示設(shè)備支持 Apple Pay,但是用戶并沒有為任何請求的支付網(wǎng)絡(luò)添加銀行卡。你可以選擇顯示一個支付設(shè)置按扭,引導(dǎo)用戶添加銀行卡。如果用戶點擊該按扭,則開始設(shè)置新的銀行卡流程 (例如,通過調(diào)用 openPaymentSetup 方法)。

一旦按下 Apple Pay 按扭,你就開始支付授權(quán)過程。在顯示支付請求之前不要讓用戶進行任何其它操作。例如,如果用戶需要輸入優(yōu)惠碼,你應(yīng)該在用戶按下 Apple Pay 按扭之前要求用戶輸入該優(yōu)惠碼。

注意:

在 iOS 8.3 以及以后的系統(tǒng)中,你可以選擇使用 PKPayementButton 方法在初始化支付請求時創(chuàng)建帶商標(biāo)的 Apple Pay 按扭。對于 iOS 8.2 以及更早的系統(tǒng),你可以使用《Apple Pay 標(biāo)志指南》 中提示的方法。 其它關(guān)于使用 Apple Pay 按扭以及支付標(biāo)志的指南請參考《iOS 人機界面準(zhǔn)則》 中的 Apple Pay 相關(guān)部分。

橋接基于 web 的支付接口

如果應(yīng)用使用的是基于 web 的接口進行商品或服務(wù)的支付,那么你在處理 Apple Pay 事務(wù)之前你需要將 web 接口的請求發(fā)送至 iOS 本地代碼。列表 3-1 展示了處理來自 web 視圖的付款請求步驟:

列表 3-1 在 web 視圖中購買商品或服務(wù)。

// 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);
}

包含貨幣以及地區(qū)信息的支付請求

在同一個支付請求中的所有匯總金額使用相同的貨幣。所使用的幣種可以通過 PKPaymentRequest 的 currencyCode 屬性指定。幣種由三個字符的 ISO 貨幣代碼指定,例如 USD 表示美元。

支付請求中的國家代碼表明支付發(fā)生的國家或者支付將在哪個國家處理。由三個字符的 ISO 國家代碼指定該屬性,例如 US。

在請求中指定的商戶 ID 必須是應(yīng)用程序有授權(quán)的商戶 ID 中的某一個。

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

支付請求包括一系列的支付匯總項

PKPaymentSummaryItem 類表示支付請求中的不同部分。一個支付請求包括多個支付匯總項,一般包括:小計、折扣、配送費用、稅以及總計。如果你沒有其它任何額外的費用 (例如,配送或稅),那么支付的總額直接是所有購買商品費用 的總和。關(guān)于每一項商品的費用的詳細信息你需要在應(yīng)用程序的其它合適位置顯示。

如列表 3-2 所示,每一個匯總項都有標(biāo)簽和金額兩個部分。標(biāo)簽是對該項的可讀描述。金額對應(yīng)于所需支付的金額。一個支付請求中的所有金額都使用該請求中指定的支付貨幣類型。對于折扣和優(yōu)惠券,其金額被設(shè)置為負值。

某些場景下,如果在支付授權(quán)的時候還不能獲取應(yīng)當(dāng)支付的費用(例如,出租車收費),則使用 PKPaymentSummaryItemTypePending 類型做小計項,并將其金額值設(shè)置為 0.0。系統(tǒng)隨后會設(shè)置該項的金額值。

列表 3-2 創(chuàng)建支付匯總項

// 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 類存儲金額,并且金額使用 10 進制數(shù)表示。如示例代碼演示的一樣,可以通過顯示地指定小數(shù)部分與指數(shù)部分創(chuàng)建該類的實例,也可以直接使用字符串的方式指定金額。在財務(wù)計算中絕大部分情況下都是使用的 10 進制數(shù)進行計算的,例如,計算 5% 的折扣。

盡管 IEEE 浮點數(shù) float 或 double 計算更加方便一些,但是它們并不適用于財務(wù)計算中,因為這些數(shù)字使用 2 進制表示。這意味著有些符點數(shù)不能被準(zhǔn)確的表示,例如 0.42 只能被近似的表示為 0.41999...。這樣的近似可能導(dǎo)致財務(wù)計算返回錯誤的結(jié)果。

匯總項列表中最后一項是總計項??傆嬳椀慕痤~是其它所有匯總項的金額的和??傆嬳椀娘@示不同用于其它項。在該項中,你應(yīng)該使用你的公司名稱作為其標(biāo)簽,使用所有其它項的金額之和作為其金額值。最后,使用 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;

配送方式是一個特殊的支付匯總項

為每一個可選的配送方式創(chuàng)建一個 PKShippingMethod 實例。與其它支付匯總項一些,配送方式也有一個用戶可讀的標(biāo)簽,例如標(biāo)準(zhǔn)配送或者可隔天配送,和一個配送金額值。與其它匯總項不同的時,配送方法有一個 detail 屬性值,例如,7 月 29 日送達或者 24 小時之內(nèi)送達等等。該屬性值說明不同配送方式之間的區(qū)別。

為了在委托方法中區(qū)分不同的配送方式,你可以使用 identifier 屬性。這個屬性只被該應(yīng)用使用,它對于支付框架是不可見。同樣,它也不會出現(xiàn)在 UI 中。在創(chuàng)建每個配送方式的時候為其分配一個唯一的標(biāo)識符。為了便于調(diào)試,推薦使用簡短字符串或者字符串縮寫,例如 “discount”、“standard”、“next-day” 等等。

有些配送方式并不是在所有地區(qū)都是可以使用的,或者它們費用會根據(jù)配送地址的不同而發(fā)生變化。你需要在用戶選擇配送地址或方法時更新其信息,詳情請見 委托方法更新配送方法與費用。

指定應(yīng)用程序支持的支付處理機制

supportedNetworks 屬性是一個字符串常量,通過設(shè)置該值可以指定應(yīng)用所支持的支付網(wǎng)絡(luò)。 merchantCapabilities 屬性值說明應(yīng)用程序支持的支付處理協(xié)議。3DS 協(xié)議是須支持的支付處理協(xié)議, EMV 是可選的支付處理協(xié)議。

request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkDiscover, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];

// Supports 3DS only
request.merchantCapabilities = PKMerchantCapability3DS;

// Supports both 3DS and EMV
request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV;

說明所需的配送信息和賬單信息

修改支付授權(quán)視圖控制器的 requiredBillingAddressFields 屬性和 requiredShippingAddressFields 屬性可以設(shè)置所需的賬單信息和配送信息。當(dāng)你顯示視圖控制器時,它會提示用戶輸入必需的賬單信息和配送信息。這個域的值是通過這些屬性組合而成的,如下所示:

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

注意:

請求只包括處理支付和配送商品或服務(wù)的必需的賬單信息和配送信息。額外的非必需信息都會增加處理事務(wù)的復(fù)雜度。每個多余的步驟都可能會增加用戶取消支付的風(fēng)險。

如果已有最新賬單信息以及配送聯(lián)系信息,你可以直接為支付請求設(shè)置這些值。 Apple Pay 會默認使用這些信息。但是,用戶仍然可以選擇在本次支付中使用其它聯(lián)系信息。

PKContact *contact = [[PKContact alloc] init];

NSPersonNameComponents *name = [[NSPersonNameComponents alloc] init];
name.givenName = @"John";
name.familyName = @"Appleseed";

contact.name = name;

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 中很多地方獲取到,請在使用它之前確保該信息是有效的。

保存其它信息

保存支付中其它與應(yīng)用相關(guān)的信息,例如購物車標(biāo)識,你可以使用 applicationData 屬性。這個屬性對于系統(tǒng)來說是不可見的。用戶授權(quán)支付后,應(yīng)用數(shù)據(jù)的哈希值也會成為支付令牌的一部分。