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 调用不会立即将数据发送到客户端,它只是将其排队直到操作结束。
我收到以下错误:
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
.
我正在 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 调用不会立即将数据发送到客户端,它只是将其排队直到操作结束。