【问题标题】:PayPal express ActiveMerchant gateway not workingPayPal express ActiveMerchant 网关不工作
【发布时间】:2018-06-29 14:25:08
【问题描述】:

根据this,ActiveMerchant PayPal Express Gateway 初始化如下:

paypal_options = {
  login: "API_USERNAME_HERE",
  password: "API_PASSWORD_HERE",
  signature: "API_SIGNATURE_HERE"
}

::EXPRESS_GATEWAY = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)

我确实提供了一个签名,但我收到了这个错误:

向 PayPal 发出请求需要 API 证书或 API 签名

PayPal 初始化程序如下所示(找到 here):

def initialize(options = {})
    requires!(options, :login, :password)

    headers = {'X-PP-AUTHORIZATION' => options.delete(:auth_signature), 'X-PAYPAL-MESSAGE-PROTOCOL' => 'SOAP11'} if options[:auth_signature]
    options = {
        :pem => pem_file,
        :signature => signature,
        :headers => headers || {}
    }.update(options)

    if options[:pem].blank? && options[:signature].blank?
        raise ArgumentError, "An API Certificate or API Signature is required to make requests to PayPal"
    end

    super(options)
end

我不明白这个初始化程序对签名做了什么以及为什么它不按照示例接受它。

这是我要传递的选项,我已将其放入 STDOUT:

{  
   "password"   =>"***************",
   "signature"   =>"AVtrAKGQXoUNJFduUU0pn1dewq80AK9KYWenyFwYcduz8elS85B8T0Wc",
   "allow_guest_checkout"   =>true,
   "login"   =>"********************",
   "test"   =>true
}

有人可以帮我解决这个问题吗?
请注意,我在 JRuby 中使用了它,但我认为这在这种情况下没有任何区别。


在@PiersC 的 cmets 之后编辑:

我对此进行了硬编码,而不是将它们作为 Java 的参数,并且它起作用了:

  options = {
      login: "*************",
      password: "*****************",
      signature: "AVtrAKGQXoUNJFduUU0pn1dewq80AK9KYWenyFwYcduz8elS85B8T0Wc"
  }

然而,这又引出了另一个问题。我一直在将 Java 映射转换为 Ruby 哈希,如下所示:

def self.convert_hash(map)
    hsh = {}
    map.each {|key, value| hsh[key] = value}
    hsh.with_indifferent_access
end

这在所有其他网关上都有效。如何正确将 Java 映射转换为 Ruby 中的选项哈希?

【问题讨论】:

    标签: ruby jruby activemerchant paypal


    【解决方案1】:

    您的选项键是字符串,但应该是符号,例如。 { password: '***', ... } ActiveSupport::HashWithInvalidAccess 隐藏(掩盖?)符号键和字符串键之间的区别,但如果您使用常规哈希,则 { 'signature' => signature } 不是与{签名:签名}相同。

    【讨论】:

    • 我认为这正是puts 打印它们的方式。其他网关都没有抱怨,代码很常见。我的假设是这是在做一些讨厌的事情::signature => signature。在这种情况下,signature 在做什么?
    • 我不太确定。值得摆弄检查和puts h['signature']puts h[:signature]
    • 我更新了问题,因为评论不允许回复。
    • 已解决。关键是像这样转换 java 映射:def self.convert_hash(map) hsh = {} map.each {|key, value| hsh[key] = value} hsh.symbolize_keys end
    猜你喜欢
    • 2011-06-01
    • 2013-01-01
    • 2012-03-14
    • 2014-01-15
    • 2012-06-30
    • 2011-02-03
    • 2011-10-13
    • 2018-05-28
    • 2011-04-23
    相关资源
    最近更新 更多