我正尝试用Stripe实现Apple pay,如下所示
paymentSummaryItems以显示最终金额f 210
但我无法找到一种方法来提取付款授权前的账单信息,以计算和应用税收。对于传送地址,有一个委托回调。
func applePayContext(_ context: STPApplePayContext, didSelectShippingContact contact: PKContact, handler: @escaping (PKPaymentRequestShippingContactUpdate) -> Void) {}每次更新发货地址时都会调用它,但对于计费地址则不一样。
这是否是要遵循的正确流程,还是应该在显示PKPaymentAuthorizationController之前计算税收?
发布于 2021-08-25 08:50:48
因此,结果是有一个对计费地址的回调,但它在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秒的时间来完成)G 223
发布于 2021-08-24 21:26:53
在使用Apple Pay时,如果没有发送地址,您应该在显示Apple支付表之前收集计算纳税所需的信息,并在要求客户支付时包括纳税信息(这意味着该税应作为Apple支付单上的一个单独的行项显示)。
如果您正在收集一个托运地址,您将使用STPApplePayContextDelegate更新显示在Apple上的税金,以便客户选择/更改他们的发货地址,从而根据发货地址计算税款。
由于隐私原因,Apple Pay不会在客户确认付款之前向您提供账单地址,而且在确认付款之前,只提供了发货地址的一部分:
为了维护
的隐私,运输信息是匿名的。例如,在美国,它只包括城市、州和邮政编码。这提供了足够的信息来计算运输成本,而在用户实际批准购买之前不会泄露敏感信息。
https://stackoverflow.com/questions/68908488
复制相似问题