集成Apple Pay及碰到的那些坑

最近的項(xiàng)目需求中有集成ApplePay的需求渡蜻,先前看了點(diǎn)資料褐荷,覺得過(guò)程so easy,沒(méi)太多需要注意的地方饭入,也就沒(méi)太當(dāng)回事嵌器,哪知到了真正集成的時(shí)候,簡(jiǎn)直……[ sàng xīn bìng kuáng ]

集成apple pay需要的資料:
https://developer.apple.com/apple-pay/
about Apple Pay
Apple Pay 安全性與隱私政策概覽

.jpg

一谐丢、集成前置步驟
二爽航、集成
三、坑

一乾忱、集成前置步驟:

這里比較簡(jiǎn)單讥珍,主要是支付證書的配置,就不細(xì)寫了窄瘟,進(jìn)入開發(fā)者中心:

  • 注冊(cè) Merchant IDs(商戶ID)衷佃,上傳CSR文件(鑰匙鏈證書助理生成),生成支付證書
  • 在App IDs中創(chuàng)建或找到已有的App ID 進(jìn)行編輯Edit,打開Apple Pay功能蹄葱,Edit氏义,選中已經(jīng)生成好的Merchant ID(可以多選),點(diǎn)Continue
  • 在Xcode中配置锄列,TARGETS -->Capabilities,找到Apple Pay 打開這個(gè)功能

如果這些步驟沒(méi)有問(wèn)題的話惯悠,那么現(xiàn)在的看到的是這樣:

如果Steps里面的3個(gè)小勾都有的話邻邮,那就說(shuō)明配置OK。

同時(shí)項(xiàng)目中出現(xiàn)了這個(gè)東東:

配置沒(méi)有問(wèn)題了吮螺,那么接下來(lái)就要寫代碼了

二饶囚、集成

1、對(duì)當(dāng)前支付環(huán)境進(jìn)行判斷鸠补,是否可以進(jìn)行蘋果支付
- (BOOL)isCanMakeApplePayments {
    if (IOS9.2) {
        if ([PKPaymentAuthorizationViewController canMakePayments]) {
            if ([PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkChinaUnionPay]]) {
                return YES;
            } else {
                return NO;
            }
        }
    }
    return NO;
}
2萝风、創(chuàng)建支付請(qǐng)求
PKPaymentRequest *request         = [[PKPaymentRequest alloc] init];
// 配置商家ID
request.merchantIdentifier        = @"merchant.mailegouapplepay.com";
// 配置貨幣代碼, 以及國(guó)家代碼
request.countryCode               = @"CN";
request.currencyCode              = @"CNY";
// 配置請(qǐng)求支持的支付網(wǎng)絡(luò) 銀聯(lián)
request.supportedNetworks         = @[PKPaymentNetworkChinaUnionPay];
// 配置商戶的處理方式 3DS必須支持
request.merchantCapabilities      =  PKMerchantCapabilityEMV|PKMerchantCapability3DS;
// 配置購(gòu)買的商品列表
PKPaymentSummaryItem *orderAmout  = [PKPaymentSummaryItem summaryItemWithLabel:@"訂單金額" amount:[NSDecimalNumber decimalNumberWithString:self.payModel.orderSum]];
PKPaymentSummaryItem *totalAmount = [PKPaymentSummaryItem summaryItemWithLabel:@"麥樂(lè)購(gòu)" amount:[NSDecimalNumber decimalNumberWithString:self.payModel.orderSum]];
// 注意: 支付列表最后一個(gè), 代表匯總
request.paymentSummaryItems       = @[orderAmout,totalAmount];

以上這些配置是必須的,當(dāng)然還有一些可選的紫岩,比如物流信息规惰、發(fā)票地址等等,像下面這樣:

    
// 是否顯示發(fā)票收貨地址, 顯示哪些選項(xiàng)
request.requiredBillingAddressFields    = PKAddressFieldAll;
// 是否顯示快遞地址, 顯示哪些選項(xiàng)
request.requiredShippingAddressFields   = PKAddressFieldAll;
// 配置快遞方式NSArray<PKShippingMethod *>
NSDecimalNumber *price2                 = [NSDecimalNumber decimalNumberWithString:@"18.0"]; // 郵費(fèi)
PKShippingMethod *method                = [PKShippingMethod summaryItemWithLabel:@"順豐快遞" amount:price2];
method.detail                           = @"24小時(shí)內(nèi)送到";
method.identifier                       = @"shunfeng";

NSDecimalNumber *price3                 = [NSDecimalNumber decimalNumberWithString:@"0.1"];
PKShippingMethod *method2               = [PKShippingMethod summaryItemWithLabel:@"韻達(dá)快遞" amount:price3];
method2.identifier = @"yunda";
method2.detail = @"送貨上門";
request.shippingMethods                 = @[method, method2];
// 配置快遞的類型
request.shippingType                    = PKShippingTypeStorePickup;
// 添加一些附加數(shù)據(jù)
request.applicationData                 = [@"buyID=12345" dataUsingEncoding:NSUTF8StringEncoding];
3泉蝌、配置完成歇万,驗(yàn)證支付授權(quán):

實(shí)現(xiàn) PKPaymentAuthorizationViewControllerDelegate 代理,必須實(shí)現(xiàn)的兩個(gè)代理方法為:

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
    //支付所需要的token
    NSData *data = payment.token.paymentData;
    NSString *paymentDataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    //收貨人地址
    NSString *street = payment.shippingContact.postalAddress.street;
    //收貨人電話
    NSString *phone = payment.shippingContact.phoneNumber.stringValue;
    //收貨人郵編
    NSString *post = payment.shippingContact.postalAddress.postalCode;
    //收貨人姓名
    NSString *familyName = payment.shippingContact.name.familyName;
    NSString *givenName = payment.shippingContact.name.givenName;
    /** 支付完成后需要在此代理方法中告訴蘋果支付結(jié)果用于UI顯示勋陪,如:*/
    // 支付成功 PKPaymentAuthorizationStatus是枚舉贪磺,里面有各種支付結(jié)果狀態(tài)
    completion(PKPaymentAuthorizationStatusSuccess);
}

// 當(dāng)用戶授權(quán)成功, 或者取消授權(quán)時(shí)調(diào)用
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
    [self dismissViewControllerAnimated:controller completion:nil];
}

三、坑

1诅愚、PKPaymentNetworkChinaUnionPay
 if ([PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkChinaUnionPay]]) {
      return YES;
  }

PKPaymentNetworkChinaUnionPay這個(gè)字段是9.2增加的寒锚,也就是說(shuō)國(guó)內(nèi)使用銀聯(lián)渠道進(jìn)行apple pay SDK需要是9.2以上,在這個(gè)判斷之前需要對(duì)系統(tǒng)版本加以判斷违孝,以免程序崩潰刹前。

2、[PKPaymentAuthorizationViewController canMakePayments]

由于項(xiàng)目中比較復(fù)雜的業(yè)務(wù)邏輯和成年累月的積累雌桑,舊的結(jié)構(gòu)不好改動(dòng)喇喉,一開始這個(gè)判斷我是在選擇蘋果支付以后再去執(zhí)行,如果返回NO校坑,告訴用戶不可以進(jìn)行apple pay拣技,返回YES就繼續(xù),很驚奇的發(fā)現(xiàn)耍目,在我的手機(jī)上(iPhone6 9.2)上过咬,這個(gè)方法每次返回的不一樣,有時(shí)候YES 有時(shí)候NO制妄,即使我已經(jīng)在Wallet中綁上了符合要求的銀聯(lián)卡,在完全符合支付條件的情況下泵三,這個(gè)方法還是會(huì)返回NO耕捞,而且是一陣一陣的衔掸,某一個(gè)時(shí)間內(nèi),全部是NO俺抽。就像神經(jīng)病人發(fā)作一樣敞映。后面參考了一些別人Demo,我把這個(gè)判斷放在了ViewDidLoad磷斧。返回NO就隱藏apple pay的選項(xiàng),YES照常進(jìn)行振愿。這時(shí)這個(gè)方法的判斷結(jié)果基本都是準(zhǔn)確的,極偶爾的情況下會(huì)返回跟預(yù)想不一致的情況弛饭。到現(xiàn)在還沒(méi)有找到原因~~希望后面可以找到冕末。

3、代理方法不執(zhí)行
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion;

這個(gè)代理方法是在彈出了PKPaymentAuthorizationViewController以后侣颂,按了正確的指紋或者輸入密碼后執(zhí)行的(某些銀行的卡還需要在輸入指紋后輸入銀行卡支付密碼)档桃。都輸入以后,等了2-3秒憔晒,PKPaymentAuthorizationViewController dismiss了藻肄,而上面的代理方法沒(méi)有執(zhí)行。這時(shí)第一就是檢查一下代理的設(shè)置是否正確拒担,如何確定呢嘹屯,就是看另一個(gè)代理方法

- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller;

如果這個(gè)方法在取消時(shí)正常執(zhí)行,不要著急从撼,十有八九是蘋果的服務(wù)器抽抽了州弟,等一陣子就好了,等多長(zhǎng)時(shí)間估計(jì)喬布斯也不知道谋逻。

4呆馁、如圖所示

彈出PKPaymentAuthorizationViewController控制器后,下方一直顯示正在處理的字樣毁兆,而不是用Touch ID支付的指紋圖標(biāo)浙滤,經(jīng)常這個(gè)圈轉(zhuǎn)一會(huì)程序就崩潰掉了。這時(shí)需要看看是不是除了必須實(shí)現(xiàn)的這兩個(gè)代理方法气堕,是不是還實(shí)現(xiàn)了其它非必須實(shí)現(xiàn)的代理方法并且沒(méi)有按要求實(shí)現(xiàn)纺腊。因?yàn)閍pple pay這一塊的代理方法名字比較長(zhǎng),長(zhǎng)的也比較像茎芭,需要認(rèn)真檢查一下揖膜。

5、自己碰到的奇怪符號(hào)

后面返回的json中梅桩,有這樣一個(gè)東東

screen1.jpg

在控制臺(tái)里不顯示壹粟,復(fù)制出來(lái)也沒(méi)有,只有用Beyond Compare這個(gè)軟件才能看到。這個(gè)看不見的符號(hào)導(dǎo)致請(qǐng)求失敗趁仙。目前還不知道這個(gè)鬼符號(hào)是什么鬼洪添。

6、與第三方支付服務(wù)提供商對(duì)接
  • 1雀费、一定要確認(rèn)好請(qǐng)求第三方sdk時(shí)的參數(shù)
    比如我們這邊干奢,主要是跨境電商,對(duì)于我們對(duì)接的第三方支付服務(wù)提供商盏袄,就有跨鏡服務(wù)忿峻,跨鏡貿(mào)易等不同類型,需要傳的參數(shù)不一樣辕羽,而涉及到報(bào)關(guān)逛尚,國(guó)家政策調(diào)整,這些參數(shù)還會(huì)發(fā)生改變逛漫,而很多時(shí)候黑低,國(guó)企提供的集成文檔都不是最新的,很多東西沒(méi)有酌毡。所以當(dāng)支付請(qǐng)求失敗時(shí)克握,需要第一時(shí)間聯(lián)系支付服務(wù)提供商這邊的技術(shù)人員進(jìn)行確認(rèn),少走彎路枷踏。
  • 2菩暗、溝通成本
    與國(guó)企的工作人員進(jìn)行溝通時(shí),基本是問(wèn)一句回一句旭蠕,很多時(shí)間還不是及時(shí)回復(fù)停团,一個(gè)簡(jiǎn)單的問(wèn)題溝通下來(lái)的時(shí)間可能是幾天,(當(dāng)然現(xiàn)在很多公司都是這樣掏熬,不是單黑國(guó)企)如果公司離的不遠(yuǎn)佑稠,最好是將問(wèn)題匯總,登門當(dāng)面討論旗芬,效率會(huì)BIU BIU的上升舌胶。
  • 3、上傳第三方支付服務(wù)商用到的私鑰
    我們合作的首信易支付公司需要的私鑰是這樣的:


是從CSR文件生成時(shí)產(chǎn)生的專用密鑰這里導(dǎo)出p12用于上傳疮丛,而不是和平常見的推送之類的幔嫂,從證書處導(dǎo)出p12。各家公司要求不同誊薄,需要問(wèn)清楚履恩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呢蔫,隨后出現(xiàn)的幾起案子切心,更是在濱河造成了極大的恐慌恃疯,老刑警劉巖黎比,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伪阶,死亡現(xiàn)場(chǎng)離奇詭異歼捏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)而涉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)联予,“玉大人啼县,你說(shuō)我怎么就攤上這事》芯茫” “怎么了季眷?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)卷胯。 經(jīng)常有香客問(wèn)我子刮,道長(zhǎng),這世上最難降的妖魔是什么窑睁? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任挺峡,我火速辦了婚禮,結(jié)果婚禮上担钮,老公的妹妹穿的比我還像新娘橱赠。我一直安慰自己,他們只是感情好箫津,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布狭姨。 她就那樣靜靜地躺著,像睡著了一般苏遥。 火紅的嫁衣襯著肌膚如雪饼拍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天田炭,我揣著相機(jī)與錄音师抄,去河邊找鬼。 笑死诫肠,一個(gè)胖子當(dāng)著我的面吹牛司澎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栋豫,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼挤安,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了丧鸯?” 一聲冷哼從身側(cè)響起蛤铜,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后围肥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剿干,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年穆刻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了置尔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氢伟,死狀恐怖榜轿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朵锣,我是刑警寧澤谬盐,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站诚些,受9級(jí)特大地震影響飞傀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诬烹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一砸烦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椅您,春花似錦外冀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至员舵,卻和暖如春脑沿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背马僻。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工庄拇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人韭邓。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓措近,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親女淑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞭郑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,799評(píng)論 25 707
  • 1.About Apple Pay Apple Pay是一種移動(dòng)支付技術(shù),讓使用者把它們對(duì)真實(shí)的物品和服務(wù)的支付信...
    NEWWORLD閱讀 5,189評(píng)論 14 51
  • 本文翻譯自Chris Grant的《iOS9 Day-by-Day :: Day8 :: Apple Pay》(h...
    戴維營(yíng)教育閱讀 957評(píng)論 4 7
  • 轉(zhuǎn)載自:Apple Pay的使用 Apple Pay的使用 關(guān)于Apple Pay 具體繼承步驟也可參考: 網(wǎng)址配...
    John_LS閱讀 976評(píng)論 5 0
  • 提著早餐跟同事走進(jìn)辦公樓鸭你,到了我們的樓層發(fā)現(xiàn)到處是積水屈张,幾個(gè)員工正在清掃擒权。說(shuō)是飲水機(jī)漏水,一片狼藉阁谆。 來(lái)到前臺(tái)打卡...
    安睡的貓閱讀 199評(píng)論 0 0