rails ruby 中的 notify_url IPN 传送状态失败

Delivery status Failed notify_url IPN in ruby on rails

我收到以下错误:

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

我的 post 控制器是:

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 代替 post,它会工作并且 return STATUS=200.

但我不想使用它,因为用户进行交易和被重定向回 return_url

编辑

集成后 Airbrake 这就是我在 return

中得到的

编辑 2

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

当我再次尝试时,状态仍然是 500,但我将交易保存在数据库中,但 paypal 一直尝试失败并不断重试,所以我没有保存一条记录,而是有多条记录

我现在遇到的错误是:

目前至少交易已保存,但 paypal 似乎无法识别。

已解决

显然,是我的邮件程序没有在生产环境中配置。我只能评论那部分并推送 heroku 并重试。它成功通过了 STATUS=200,错误在 Airbrake.

中得到解决

谢谢大家!

您是否在 PayPal 帐户中设置了系统编码?它位于您个人资料中 'PayPal button encoding' 下方的某处,您应该将 'Send the data to me in the same encoding' 设置为 UTF-8。

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