PayPal表示ActiveMerchant网关无法正常工作

时间:2018-01-20 13:01:03

标签: ruby jruby activemerchant paypal

根据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的评论之后编辑:

我对此进行了硬编码,而不是将它们视为来自Java的params而且它有效:

  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中的选项哈希?

1 个答案:

答案 0 :(得分:0)

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