首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >苹果支付账单地址税额计算

苹果支付账单地址税额计算
EN

Stack Overflow用户
提问于 2021-08-24 13:27:17
回答 2查看 545关注 0票数 0

我正尝试用Stripe实现Apple pay,如下所示

  • selecting
  • tap apple pay (项目/s的摘要显示在选择/更新计费地址时)
  • ,在选择/更新计费地址时,计算税收并更新paymentSummaryItems以显示最终金额
  • 执行

f 210

但我无法找到一种方法来提取付款授权前的账单信息,以计算和应用税收。对于传送地址,有一个委托回调。

代码语言:javascript
复制
func applePayContext(_ context: STPApplePayContext, didSelectShippingContact contact: PKContact, handler: @escaping (PKPaymentRequestShippingContactUpdate) -> Void) {}

每次更新发货地址时都会调用它,但对于计费地址则不一样。

这是否是要遵循的正确流程,还是应该在显示PKPaymentAuthorizationController之前计算税收?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-25 08:50:48

因此,结果是有一个对计费地址的回调,但它在PKPaymentAuthorizationControllerDelegate中。

代码语言:javascript
复制
    // 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

快速的解决方案是自己实现它:

代码语言:javascript
复制
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)
    }
}

由于我们使用的是扩展,关联对象是存储值的方法

注意事项:一旦准备好计算,就必须从委托调用完成

如何使用:

代码语言:javascript
复制
        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")
        }
    }

  1. 生成初始摘要项
  2. ,执行所需的任何计算以获得税收,或者根据地址
  3. 进行任何额外的费用,您必须调用从PKPaymentAuthorizationControllerDelegate传递的完成(尚未测试,但基于didAuthorizePayment,您有30秒的时间来完成)

G 223

票数 1
EN

Stack Overflow用户

发布于 2021-08-24 21:26:53

在使用Apple Pay时,如果没有发送地址,您应该在显示Apple支付表之前收集计算纳税所需的信息,并在要求客户支付时包括纳税信息(这意味着该税应作为Apple支付单上的一个单独的行项显示)。

如果您正在收集一个托运地址,您将使用STPApplePayContextDelegate更新显示在Apple上的税金,以便客户选择/更改他们的发货地址,从而根据发货地址计算税款。

由于隐私原因,Apple Pay不会在客户确认付款之前向您提供账单地址,而且在确认付款之前,只提供了发货地址的一部分:

为了维护

的隐私,运输信息是匿名的。例如,在美国,它只包括城市、州和邮政编码。这提供了足够的信息来计算运输成本,而在用户实际批准购买之前不会泄露敏感信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68908488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档