前不久Apple Pay開始了,大家做好接入的準備了嗎?今天寫了個demo,悲催的是開發(fā)者賬號上設備滿了,只能用模擬器給大家看了。。。疑問是:在開發(fā)Apple Pay的時候,Xcode 7無法 無證書真機調(diào)試嗎?求解
由于想要使用Apple Pay,需要用到Apple頒布的merchant證書,所以要從申請APP ID開始:
根據(jù)工程的bundle id創(chuàng)建App ID,其他信息不多說,注意要在App Services欄,勾選 “Apple Pay”,如下圖: 
當創(chuàng)建完成后,查找到你的app id,結(jié)果如下圖:  發(fā)現(xiàn)Apple Pay狀態(tài)是黃色“configurable”,怎么激活呢,點擊“Edit”,找到“Apple Pay”,點擊對應的“Edit”,結(jié)果如圖:
發(fā)現(xiàn)Apple Pay狀態(tài)是黃色“configurable”,怎么激活呢,點擊“Edit”,找到“Apple Pay”,點擊對應的“Edit”,結(jié)果如圖:  這就是讓我們選擇一個Merchant 證書,圖中的兩個是我創(chuàng)建的,那么大家可能是空的,如果是空的,這就需要去創(chuàng)建Merchant 證書了,然后繼續(xù)這一步驟,為該App ID選擇綁定一個Merchant證書。 創(chuàng)建Merchant證書方法:從左側(cè)欄創(chuàng)建App IDs那找到Merchant IDs,點進去,新增一個ID!查找到該Merchant IDs,點擊“Edit”,選擇“YES”:
這就是讓我們選擇一個Merchant 證書,圖中的兩個是我創(chuàng)建的,那么大家可能是空的,如果是空的,這就需要去創(chuàng)建Merchant 證書了,然后繼續(xù)這一步驟,為該App ID選擇綁定一個Merchant證書。 創(chuàng)建Merchant證書方法:從左側(cè)欄創(chuàng)建App IDs那找到Merchant IDs,點進去,新增一個ID!查找到該Merchant IDs,點擊“Edit”,選擇“YES”:  下面就是生產(chǎn)證書的步驟了,不多說,根據(jù)操作continue就行啦!!!最后我們會在本地得到一個.cer文件,雙擊即可。
下面就是生產(chǎn)證書的步驟了,不多說,根據(jù)操作continue就行啦!!!最后我們會在本地得到一個.cer文件,雙擊即可。
 如圖操作,打開Apple Pay的開關,添加一個Merchant ID,如果沒有你創(chuàng)建的,刷新一下,再選擇即可。如果下面steps報紅,問題可能是剛剛創(chuàng)建的Merchant ID并沒有和App ID綁定,點擊fix,一般都沒問題了。
如圖操作,打開Apple Pay的開關,添加一個Merchant ID,如果沒有你創(chuàng)建的,刷新一下,再選擇即可。如果下面steps報紅,問題可能是剛剛創(chuàng)建的Merchant ID并沒有和App ID綁定,點擊fix,一般都沒問題了。
如果手機上wallet已經(jīng)有了用戶的賬單和配送信息,可以直接在支付請求中使用它們。但是盡管Apple Pay默認使用了這些信息,用戶仍然可以在授權支付的過程中修改這些信息:
ABRecordRef record = ABPersonCreate();CFErrorRef error;BOOL success;success = ABRecordSetValue(record, kABPersonFirstNameProperty, @"John", &error);if (!success) { /* ... handle error ... */ }success = ABRecordSetValue(record, kABPersonLastNameProperty, @"Appleseed", &error);if (!success) { /* ... handle error ... */ }ABMultiValueRef shippingAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);NSDictionary *addressDictionary = @{(NSString *) kABPersonAddressStreetKey: @"1234 Laurel Street",(NSString *) kABPersonAddressCityKey: @"Atlanta",(NSString *) kABPersonAddressStateKey: @"GA",(NSString *) kABPersonAddressZIPKey: @"30303"};ABMultiValueAddValueAndLabel(shippingAddress,(__bridge CFDictionaryRef) addressDictionary,kABOtherLabel,nil);success = ABRecordSetValue(record, kABPersonAddressProperty, shippingAddress, &error);if (!success) { /* ... handle error ... */ }request.shippingAddress = record;CFRelease(shippingAddress);CFRelease(record);1234567891011121314151617181920212223額外信息怎么辦?使用reques.applicationData來存儲一些在你的應用中關于這次支付請求的唯一標識信息,比如一個購物車的標識符。在用戶授權支付之后,這個屬性的哈希值會出現(xiàn)在這次支付的token中。 到此已經(jīng)完成了Apple Pay的接入 ^ _ ^
支付授權過程是由支付授權view controller和它的代理協(xié)作完成的。支付授權view controller做了兩件事情:它讓用戶選擇支付請求所必需的賬單和配送信息,還有讓用戶最終授權同意這次支付。當用戶和view controller交互時,代理方法就會被調(diào)用,這樣你的應用就可以不斷地更新顯示的信息–例如在配送地址更改后更新配送費用。用戶最終授權支付請求之后代理方法同樣也會被調(diào)用。
注意:在實現(xiàn)這些方法時注意,這些方法可能會被多次調(diào)用,而它們被調(diào)用的順序取決于用戶的行為的順序。
當用戶提供配送信息之后,授權view controller 會調(diào)用paymentAuthorizationViewController:didSelectShippingAddress:completion: 和 paymentAuthorizationViewController:didSelectShippingMethod:completion:這兩個代理方法。在這兩個方法中根據(jù)最新信息來更新支付請求。
func paymentAuthorizationViewController(controller: PKPaymentAuthorizationViewController, didSelectShippingMethod shippingMethod: PKShippingMethod, completion: (PKPaymentAuthorizationStatus, [PKPaymentSummaryItem]) -> Void) { print(shippingMethod.detail) completion(PKPaymentAuthorizationStatus.Success, self.summaryItems) } func paymentAuthorizationViewController(controller: PKPaymentAuthorizationViewController, didSelectShippingAddress address: ABRecord, completion: (PKPaymentAuthorizationStatus, [PKShippingMethod], [PKPaymentSummaryItem]) -> Void) { print(address) completion(PKPaymentAuthorizationStatus.Success, self.shippingMethods,self.summaryItems) }123456789當支付被授權后,支付token會被創(chuàng)建
當用戶最終授權了一個支付請求,框架會通過與蘋果服務器和嵌入在設備中的一個安全模塊進行通信,生成一個支付token。然后你在paymentAuthorizationViewController:didAuthorizePayment:completion:方法中將這個token和其它一些你需要用來處理這次購買的信息–例如配送地址和購物車標識–發(fā)送給你的服務器。這個過程是這樣的:
框架發(fā)送支付請求給安全模塊,只有安全模塊可以訪問存儲在設備上的標記化的卡信息。 安全模塊把特定的卡和商家等支付數(shù)據(jù)加密,以保證只有蘋果可以讀取,然后發(fā)送給框架。框架會將這些數(shù)據(jù)發(fā)送給蘋果。 蘋果服務器再次加密這些支付數(shù)據(jù),以保證只有商家可以讀取。然后服務器對它進行簽名,生成支付token,然后發(fā)送給設備。 框架調(diào)用相應的代理方法并傳入這個token,然后你的代理方法傳送token給你的服務器。
至于你的服務器采取的行為要取決于你是自己處理這次支付或者你是和其它支付平臺合作來進行支付處理。不管怎樣,你的服務器處理這個訂單然后傳送一個狀態(tài)信息給設備,代理方法會把這個狀態(tài)信息傳送給completion塊,像在“Processing a Payment”中討論過的。
func paymentAuthorizationViewController(controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: (PKPaymentAuthorizationStatus) -> Void) { print(payment.token) let asyncSuccessful:Bool = false; /** 將支付令牌payment上傳服務器端,驗證簽名,獲取token? */ let error:NSError let addressMultiValue = ABRecordCopyValue(payment.billingContact, kABPersonAddressProperty) as! ABMultiValue let addressDictionary = ABMultiValueCopyValueAtIndex(addressMultiValue, 0) as! AnyObject do { let json = try NSJSONSerialization.dataWithJSONObject(addressDictionary, options: NSJSONWritingOptions.PrettyPrinted) } catch { } // 根據(jù)返回,判斷成功與否 if asyncSuccessful { completion(PKPaymentAuthorizationStatus.Success) print("支付成功") } else { completion(PKPaymentAuthorizationStatus.Failure) print("支付失敗") } }1234567891011121314151617181920212223242526
5、 支付處理
處理一個支付請求涉及以下幾個步驟:
把支付信息,以及支付流程+所需的其他信息,一起發(fā)送給你的服務器 驗證支付數(shù)據(jù)的哈希表和簽名 為加密過的支付數(shù)據(jù)解碼 向支付處理系統(tǒng)提交支付數(shù)據(jù) 向訂單追蹤系統(tǒng)提交訂單
處理支付請求時,你有兩個選擇:你既可以利用支付平臺處理支付請求,也可以自己實現(xiàn)支付請求處理流程。一個常用的支付平臺可以完成上述大部分操. Demo 地址:https://github.com/jakajacky/ApplePayDemo.git
新聞熱點
疑難解答