当前位置: 首页 > 知识库问答 >
问题:

针对支付问题的Siri集成

周睿范
2023-03-14

在我的应用程序中,我只支持欧元和美元货币。例如,当用户试图用Siri将付款发送到英镑时,我要求他在欧元和美元之间进行选择。

之后我在屏幕上看到:

  • 100美元
  • 100欧元

如果我选择100$在intent.currencyAmount!。这很奇怪。

这是我的代码:

func resolveCurrencyAmount(forSendPayment intent: INSendPaymentIntent, with completion: @escaping (INCurrencyAmountResolutionResult) -> Void) {
        if let currencyAmount = intent.currencyAmount { // need to check if we have proper value
            if let amount = currencyAmount.amount {

                if amount.doubleValue == 0 { // wrong amount
                    completion(INCurrencyAmountResolutionResult.unsupported())
                    return
                }

                if let currencyCode = currencyAmount.currencyCode {
                    if let _ = EnumCurrency(rawValue: currencyCode) { // we found currency code that we know
                        completion(INCurrencyAmountResolutionResult.success(with: INCurrencyAmount(amount: NSDecimalNumber(value: abs(amount.doubleValue)), currencyCode: currencyCode)))
                        return
                    }
                }


                // if we are here so we don't have proper currency, try to offer user to choose the same amount but with all possible currencies
                let disambiguationArray: [INCurrencyAmount] = EnumCurrency.allValues.map({ (currency) -> INCurrencyAmount in
                    return INCurrencyAmount(amount: NSDecimalNumber(value: abs(amount.doubleValue)), currencyCode: currency.rawValue)
                })
                completion(INCurrencyAmountResolutionResult.disambiguation(with: disambiguationArray))
            }
        }
        else { // we don't have value
            completion(INCurrencyAmountResolutionResult.needsValue())
        }
    }

enum EnumCurrency : String {
    case EUR = "EUR"
    case USD = "USD"

    static let allValues = [EUR, USD]
}

更新:如何繁殖(根据大卫的问题):

1)创建一个新的意图扩展

2) 在plist文件中,只保留一种类型的意图:http://take.ms/pt16N

3)您的IntentHandler类(将由xCode创建)必须确认到INSendPaymentIntentHandling协议

4) 在IntentHandler类中添加以下内容:

func resolveCurrencyAmount(forSendPayment intent: INSendPaymentIntent, with completion: @escaping (INCurrencyAmountResolutionResult) -> Void) {
            if let currencyAmount = intent.currencyAmount { // need to check if we have proper value
                if let amount = currencyAmount.amount {

                    if amount.doubleValue == 0 { // wrong amount


                 completion(INCurrencyAmountResolutionResult.unsupported())
                    return
                }

                if let currencyCode = currencyAmount.currencyCode {
                    if let _ = EnumCurrency(rawValue: currencyCode) { // we found currency code that we know
                        completion(INCurrencyAmountResolutionResult.success(with: INCurrencyAmount(amount: NSDecimalNumber(value: abs(amount.doubleValue)), currencyCode: currencyCode)))
                        return
                    }
                }


                // if we are here so we don't have proper currency, try to offer user to choose the same amount but with all possible currencies
                let disambiguationArray: [INCurrencyAmount] = EnumCurrency.allValues.map({ (currency) -> INCurrencyAmount in
                    return INCurrencyAmount(amount: NSDecimalNumber(value: abs(amount.doubleValue)), currencyCode: currency.rawValue)
                })
                completion(INCurrencyAmountResolutionResult.disambiguation(with: disambiguationArray))
            }
        }
        else { // we don't have value
            completion(INCurrencyAmountResolutionResult.needsValue())
        }
    }

enum EnumCurrency : String {
    case EUR = "EUR"
    case USD = "USD"

    static let allValues = [EUR, USD]
}

// MARK: - Confirm

    func confirm(sendPayment intent: INSendPaymentIntent, completion: @escaping (INSendPaymentIntentResponse) -> Void) {
// success
        completion(INSendPaymentIntentResponse(code: INSendPaymentIntentResponseCode.success, userActivity: nil))

}

// MARK: - Handle

    func handle(sendPayment intent: INSendPaymentIntent, completion: @escaping (INSendPaymentIntentResponse) -> Void) {

// just for test
completion(INSendPaymentIntentResponse(code: .failureRequiringAppLaunch, userActivity: userActivity))
}

5)你可以用Siri启动:你会看到,如果你选择中国货币或任何其他非常规货币,然后我在代码中让你在欧元和美元之间进行选择,但之后在RESOLVE函数中(当siri想要解决货币时称为在更多的时间里)你会得到中国货币(所以你不需要像大卫要求的那样为按钮添加任何代码,因为所有的按钮界面都将由Siri提供)


共有2个答案

湛鸿
2023-03-14

在确认MSendPayment方法中,创建INSendPaymentIntentSolutions实例,并将INPaymentRecment实例分配给paymentRecment属性。我做了一个助手方法来做这件事。

func confirm(sendPayment intent: INSendPaymentIntent, completion: (INSendPaymentIntentResponse) -> Void) {
    let response = INSendPaymentIntentResponse(code: .Ready, userActivity: nil)
    response.paymentRecord = getPaymentRecord(fromIntent: intent)
    completion(response)
}

private func getPaymentRecord(fromIntent intent: INSendPaymentIntent) -> INPaymentRecord? {
    let currencyAmount = INCurrencyAmount(amount: intent.currencyAmount?.amount ?? 0.0, currencyCode: "INR")
    return INPaymentRecord(payee: intent.payee, payer: nil, currencyAmount: currencyAmount, paymentMethod: nil, note: nil, status: .Pending)
}

希望这能有所帮助。

慕璞
2023-03-14

我创造了这个问题:Siri和错误的货币

您只需确认用户选择的货币。您的确认方法执行错误,您应该使用以下内容确认货币:

let response = INSendPaymentIntentResponse(code: .ready, userActivity: nil)
response.paymentRecord = INPaymentRecord(
    payee: intent.payee, 
    payer: nil, 
    currencyAmount: intent.currencyAmount, 
    paymentMethod: nil, 
    note: nil, 
    status: .pending, 
    feeAmount: nil)
completion(response)
 类似资料:
  • 我必须将Siri集成到我们向个人付款的应用程序中。关于这个我有一些问题,, > 我得到了一些示例应用程序,其中人名是从手机或用户生成的联系人中获取的。因此,请任何人告诉我,是否有可能获取一些名单,例如受益人名单,我们可以从中选择受益人,然后在解决收款人详细信息时将其用作收款人。假设无法提取受益人名单,那么付款是如何工作的? 如何获取谁(付款人)向其他人汇款的详细信息。例如,因为我必须将其集成到银行

  • 我用贝宝支付预付我的Magento购物车。我发现一个来自加拿大的客户的信用卡不断下降。我直接和客户谈了一下,做了以下测试: > 转到我的Paypal管理器中的虚拟终端,只测试授权,它也不工作。虚拟终端的单个事务测试给出错误:结果代码:12响应消息:Decreded:15005-无法处理此事务。 我在我的贝宝账户里发了一张2美元的发票,但这也不起作用。 客户然后使用信用卡从其他地方和它的工作很好。然

  • 我需要一个支付网关为我的php应用程序。我经营一家软件咨询公司,员工来自世界各地。我已经建立了一个应用程序来管理发票并向他们付款。我需要将其与支付网关集成。 我的组织在美国。 我查看了一些支付网关,但他们需要每个员工的卖家帐户。这是不可能的。 我的直接要求是现金必须从我的卡/银行账户转移到我员工的银行账户。我想通过网上银行、信用卡/借记卡、电汇等方式付款。请帮忙!! 非常感谢。

  • 因此,我试图将登录和支付与Amazon小部件集成,但遇到了一些问题。 所以,我把我的卖家帐户都设置在 https://sellercentral.amazon.de/gp/ 我有权访问我的API凭据,我需要获得一个LWA客户端。所以,我已经在 https://sellercentral.amazon.com/gp/homepage.htm 以创建应用程序。我已经设置了应用程序,在web设置上我已经

  • 本文向大家介绍SpringBoot集成支付宝沙箱支付(支付、退款),包括了SpringBoot集成支付宝沙箱支付(支付、退款)的使用技巧和注意事项,需要的朋友参考一下 前言 支付宝推出一个沙箱环境,能够很好的模拟支付宝支付,并且还提供了demo,但demo是一个普通web项目,怎么整合到Spring Boot项目呢,其实很简单 简单配置请参照支付宝沙箱支付开发文档 一、支付部分 AlipayCon

  • 本文向大家介绍springboot 集成支付宝支付的示例代码,包括了springboot 集成支付宝支付的示例代码的使用技巧和注意事项,需要的朋友参考一下 最简单的springboot集成支付宝 1 注册沙箱 沙箱是一个模拟环境登录,百度蚂蚁金服开放平台,支付宝扫码登录如下 然后沙箱需要注册一下,非常之简单,注册好以后进入到如下页面,选沙箱工具,然后下载一个生成密钥的工具。然后解压按照里面的rea