传递状态在rails上的ruby中的notify_url IPN失败
我收到以下错误:
2015-08-17T18:46:59.095260+00:00 heroku[router]: at=info method=POST path="/payment_notification" status=500
这是我的模特:
class Product '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 [: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
我的按钮:
我不确定我在这里做错了什么。
Paypal发送POST但我收到错误STATUS = 500
所有付款都正常进行但我只是希望paypal使用notify_url
进行POST。
我在Heroku
测试这个,因为在本地测试不会起作用。
此外,如果我使用return_url
代替发布post,它将工作并返回STATUS = 200。
但我不想使用这个,因为用户执行事务和重定向回return_url
之间的差距。
编辑
整合Airbrake
这就是我得到的回报
编辑2
我将从PayPal发送的数据的数据编码更改为UTF-8
当我再次尝试时,状态仍然是500,但我将事务保存在数据库中但是,paypal保持尝试失败并继续重试,因此没有保存一条记录我有多条记录
我现在得到的错误就是这个:
现在至少保存了交易但PayPal似乎未能认识到这一点。
解决了
显然,这是我的邮件没有在生产中配置..我只是能够评论该部分并推进heroku并再次尝试。 它成功地以STATUS = 200进入低谷,并且在Airbrake
中解决了错误。
谢谢你们!
您是否在PayPal帐户中设置了系统编码? 它位于您的个人资料中的“PayPal按钮编码”下,您应该将“以相同编码方式发送数据”设置为UTF-8。
正如在评论中发现的那样,另一个错误是由于错误配置的邮件程序。 请注意,#render调用不会立即将数据发送到客户端,它只会将其排队直到操作结束。