结果证明帐单地址有回调,但它在PKPaymentAuthorizationControllerDelegate中
// update the summary items in response to the card type changing (for example, applying credit card surcharges)
//
// The delegate will receive no further callbacks except paymentAuthorizationControllerDidFinish:
// until it has invoked the completion block.
@available(iOS 11.0, *)
optional func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didSelectPaymentMethod paymentMethod: PKPaymentMethod, handler completion: @escaping (PKPaymentRequestPaymentMethodUpdate) -> Void)
问题是 Stripe 的 STPApplePayContext 没有实现它,因此没有将它传递给它自己的代表 STPApplePayContextDelegate,就像它对送货地址所做的那样。
快速的解决方案是自己实现:
struct AssociatedKeys {
static var postalCodeCompletion: String = "postalCodeCompletionKey"
}
extension STPApplePayContext {
// 1
var didUpdatePostalCodeCompletion: ((CNPostalAddress, (PKPaymentRequestPaymentMethodUpdate) -> Void) -> ())? {
get {
guard let value = objc_getAssociatedObject(self, &AssociatedKeys.postalCodeCompletion) as? (CNPostalAddress, (PKPaymentRequestPaymentMethodUpdate) -> Void) -> () else {
return nil
}
return value
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedKeys.postalCodeCompletion, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
@objc
public func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController,
didSelectPaymentMethod paymentMethod: PKPaymentMethod,
handler completion: @escaping (PKPaymentRequestPaymentMethodUpdate) -> Void) {
// 2
guard let address = paymentMethod.billingAddress?.postalAddresses.first?.value else {
let error = PKPaymentError(.billingContactInvalidError)
let paymenMethodUpdate = PKPaymentRequestPaymentMethodUpdate(errors: [error], paymentSummaryItems: [])
completion(paymenMethodUpdate)
return
}
didUpdatePostalCodeCompletion?(address, completion)
}
}
- 由于我们使用扩展,关联对象是存储值的方式
- 我只需要这里的地址(是的,它不完整)所以我只将它传递给存储的完成 + 来自委托的完成
注意:您必须在准备好计算后立即从委托中调用完成
使用方法:
let merchantIdentifier = "your merch ID"
let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: "US", currency: "USD")
// 1
paymentRequest.paymentSummaryItems = []
// Initialize an STPApplePayContext instance
if let applePayContext = STPApplePayContext(paymentRequest: paymentRequest, delegate: self) {
// Present Apple Pay payment sheet
applePayContext.didUpdatePostalCodeCompletion = { address, completion in
// 2
let newSummaryItems = [
PKPaymentSummaryItem(label: "my new fancy hat", amount: 1),
PKPaymentSummaryItem(label: "Tax", amount: 1),
PKPaymentSummaryItem(label: "Total", amount: 2)
]
let pkpaymentrequest = PKPaymentRequestPaymentMethodUpdate(errors: nil, paymentSummaryItems: newSummaryItems)
// 3
completion(pkpaymentrequest)
}
applePayContext.presentApplePay(completion: nil)
} else {
print("There is a problem with your Apple Pay configuration")
}
}
- 生成初始汇总项
- 根据地址进行任何计算以获取税款或任何额外费用
- 您必须调用从
PKPaymentAuthorizationControllerDelegate 传递的完成(尚未测试,但基于 didAuthorizePayment,您有大约 30 秒的时间来完成)