我收到以下错误:
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
后,这就是我得到的回报
编辑2
我将从PayPal发送的数据的数据编码更改为UTF-8
当我再次尝试时,状态仍然是500但是我将事务保存在数据库中但是,PayPal仍然尝试失败并且保持重试而不是保存一条记录我有多条记录
我现在得到的错误就是这个:
现在至少保存了这些交易,但PayPal似乎未能认识到这一点。
解决
显然,这是我的邮件没有在生产中配置..我只能评论该部分并推进heroku并再次尝试。它已成功通过STATUS = 200并且错误已在Airbrake
中解决。
谢谢大家!
答案 0 :(得分:2)
您是否在PayPal帐户中设置了系统编码?它位于“PayPal”按钮编码的某个位置&#39;在您的个人资料中,您应该设置“以相同的编码方式向我发送数据”#39;到UTF-8。
正如在评论中发现的那样,另一个错误是由于错误配置的邮件程序。请注意,#render调用不会立即将数据发送到客户端,它会将其排队直到操作结束。