交付状态在rails上的ruby中的notify_url IPN失败

时间:2015-08-17 19:22:43

标签: ruby-on-rails paypal paypal-ipn

我收到以下错误:

2015-08-17T18:46:59.095260+00:00 heroku[router]: at=info method=POST path="/payment_notification" status=500

这是我的模特:

class Product < ActiveRecord::Base
def paypal_encrypted(return_url, notify_url, cancel_return, useremail) 
        values = { 
        :business => 'facilitatoremail@example.com',
           :cmd => '_xclick',
        :upload => 1,
        :return => return_url,
        :rm => 1,
        :notify_url => notify_url,
        :cancel_return => cancel_return,
        :custom => useremail,
        :cert_id => 'myid'
        }   
        values.merge!({ 
        "amount" => unit_price,
        "item_name" => name,
        "item_number" => id,
        "quantity" => '1'
        })

        encrypt_for_paypal(values)
    end



    has_many :payment_notifications
end

PAYPAL_CERT_PEM = File.read("#{Rails.root}/certs/paypal_cert.pem")
APP_CERT_PEM = File.read("#{Rails.root}/certs/app_cert.pem")
APP_KEY_PEM = File.read("#{Rails.root}/certs/app_key.pem")

def encrypt_for_paypal(values)
  signed = OpenSSL::PKCS7::sign(OpenSSL::X509::Certificate.new(APP_CERT_PEM), OpenSSL::PKey::RSA.new(APP_KEY_PEM, ''), values.map { |k, v| "#{k}=#{v}" }.join("\n"), [], OpenSSL::PKCS7::BINARY)
  OpenSSL::PKCS7::encrypt([OpenSSL::X509::Certificate.new(PAYPAL_CERT_PEM)], signed.to_der, OpenSSL::Cipher::Cipher::new("DES3"), OpenSSL::PKCS7::BINARY).to_s.gsub("\n", "")
end

我的帖子控制器是:

class PaymentNotificationController < ApplicationController
    protect_from_forgery :except => [:create]

  def create
    @payment = PaymentNotification.create!(params: params, product_id: 1, status: params[:payment_status], transaction_id: params[:txn_id], email: params[:custom] )
    render nothing: true

    if @payment.status == 'Completed'
      PaymentTransactions.success(@payment).deliver_now
    end

  end
end

我的按钮:

<%= form_tag "https://www.sandbox.paypal.com/cgi-bin/webscr" do %>
  <%= hidden_field_tag :cmd, "_s-xclick" %>
  <%= hidden_field_tag :encrypted, @product.paypal_encrypted(root_url, payment_notification_index_url, root_url, :custom) %>
  <%= text_field_tag :custom %>
  <%= submit_tag 'checkout encrypted' %>
<% end %>

我不确定我在这里做错了什么。

Paypal发送POST但我收到错误STATUS = 500

所有付款都正常进行,但我只是希望paypal使用notify_url进行POST。

我在Heroku进行测试,因为在本地测试不起作用。

另外,如果我使用return_url代替帖子,它会起作用并返回STATUS = 200。

但我不想使用此功能,因为执行交易的用户与重定向回return_url之间存在差距。

修改

在整合Airbrake后,这就是我得到的回报

enter image description here

编辑2

我将从PayPal发送的数据的数据编码更改为UTF-8

enter image description here

当我再次尝试时,状态仍然是500但是我将事务保存在数据库中但是,PayPal仍然尝试失败并且保持重试而不是保存一条记录我有多条记录

我现在得到的错误就是这个:

enter image description here

现在至少保存了这些交易,但PayPal似乎未能认识到这一点。

解决

显然,这是我的邮件没有在生产中配置..我只能评论该部分并推进heroku并再次尝试。它已成功通过STATUS = 200并且错误已在Airbrake中解决。

谢谢大家!

1 个答案:

答案 0 :(得分:2)

您是否在PayPal帐户中设置了系统编码?它位于“PayPal”按钮编码的某个位置&#39;在您的个人资料中,您应该设置“以相同的编码方式向我发送数据”#39;到UTF-8。

正如在评论中发现的那样,另一个错误是由于错误配置的邮件程序。请注意,#render调用不会立即将数据发送到客户端,它会将其排队直到操作结束。