我收到 Paypal IPN 罚款,但我的应用程序仅在从 paypal 帐户完成时才记录它。由 UTF-8/ISO-8859-1 引起
Posted
技术标签:
【中文标题】我收到 Paypal IPN 罚款,但我的应用程序仅在从 paypal 帐户完成时才记录它。由 UTF-8/ISO-8859-1 引起【英文标题】:I receive Paypal IPN fine, but my application only record it if it has been done from a paypal account. Caused by UTF-8/ISO-8859-1 【发布时间】:2011-12-25 13:09:58 【问题描述】:这是在 Ruby On Rails 3 测试环境中完成的,这是一个与生产相同的 mysql 的 phusion 乘客。 我使用本教程:http://railscasts.com/episodes/142-paypal-notifications?autoplay=true 获得了来自 paypal 的 IPN,以通知我的应用程序付款结束。
我工作得很好,在我的测试设置中完成结帐后,我可以在 Paypal 上看到我的购物车的内容,我登录到 paypal 沙箱帐户,paypal 通知我,我在我的数据库中创建了一个通知条目。
但是,如果我决定不使用 paypal 帐户而是使用支付卡付款,它会莫名其妙地失败。在日志上有来自贝宝的答案,但我的应用程序从未创建 INSERT :
以下是贝宝用户通知的日志:
Started POST "/notification_paiements?secret=testsecret" for 173.0.82.126 at 2011-11-09 18:25:18 +0100
Processing by NotificationPaiementsController#create as html
Parameters: "mc_gross"=>"287.04", "invoice"=>"36", "protection_eligibility"=>"Ineligible", "address_status"=>"unconfirmed", "item_number1"=>"1", "payer_id"=>"N9JJ8RH7BM8EU", "tax"=>"47.04", "address_street"=>"Av. de la Pelouse, 87648672 Mayet", "payment_date"=>"09:25:14 Nov 09, 2011 PST", "payment_status"=>"Completed", "charset"=>"windows-1252", "address_zip"=>"75002", "mc_shipping"=>"0.00", "mc_handling"=>"0.00", "first_name"=>"Test", "mc_fee"=>"10.01", "address_country_code"=>"FR", "address_name"=>"Test User", "notify_version"=>"3.4", "custom"=>"", "payer_status"=>"verified", "business"=>"syl_1315650606_biz@bellino.fr", "address_country"=>"France", "num_cart_items"=>"1", "mc_handling1"=>"0.00", "address_city"=>"Paris", "verify_sign"=>"AwOJnPNRFHZdnSqc35Btm-KkMwvbA-NWFOONFl0sDe.h8qfGzX3T3iVE", "payer_email"=>"sylvai_1320835836_per@bellino.fr", "mc_shipping1"=>"0.00", "txn_id"=>"67D29474V1031193M", "payment_type"=>"instant", "last_name"=>"User", "address_state"=>"Alsace", "item_name1"=>"Blopsters", "receiver_email"=>"syl_1315650606_biz@bellino.fr", "payment_fee"=>"", "quantity1"=>"2", "receiver_id"=>"VENU3QCG22URG", "txn_type"=>"cart", "mc_gross_1"=>"240.00", "mc_currency"=>"EUR", "residence_country"=>"FR", "test_ipn"=>"1", "transaction_subject"=>"Shopping CartBlopsters", "payment_gross"=>"", "ipn_track_id"=>"1HUPu0oG.fhexChWw61WQA", "secret"=>"testsecret"
Collection Load (0.6ms) SELECT `collections`.* FROM `collections`
BijouType Load (0.2ms) SELECT `bijou_types`.* FROM `bijou_types`
SQL (0.2ms) BEGIN
AREL (0.6ms) INSERT INTO `carts` (`purchased_at`, `status`, `created_at`, `updated_at`) VALUES (NULL, 'Panier', '2011-11-09 17:25:18', '2011-11-09 17:25:18')
SQL (12.4ms) COMMIT
Before actualize
AREL (13.6ms) UPDATE `carts` SET `updated_at` = '2011-11-09 17:25:18' WHERE (`carts`.`id` = 37)
LineItem Load (0.6ms) SELECT `line_items`.* FROM `line_items` WHERE (`line_items`.cart_id = 37)
After actualize
SQL (0.2ms) BEGIN
SQL (0.7ms) describe `notification_paiements`
AREL (0.4ms) INSERT INTO `notification_paiements` (`params`, `cart_id`, `status`, `transaction_id`, `created_at`, `updated_at`) VALUES ('--- !map:ActiveSupport::HashWithIndifferentAccess \nmc_gross: \"287.04\"\ninvoice: \"36\"\nprotection_eligibility: Ineligible\naddress_status: unconfirmed\nitem_number1: \"1\"\npayer_id: N9JJ8RH7BM8EU\ntax: \"47.04\"\naddress_street: Av. de la Pelouse, 87648672 Mayet\npayment_date: 09:25:14 Nov 09, 2011 PST\npayment_status: Completed\ncharset: windows-1252\naddress_zip: \"75002\"\nmc_shipping: \"0.00\"\nmc_handling: \"0.00\"\nfirst_name: Test\nmc_fee: \"10.01\"\naddress_country_code: FR\naddress_name: Test User\nnotify_version: \"3.4\"\ncustom: \"\"\npayer_status: verified\nbusiness: syl_1315650606_biz@bellino.fr\naddress_country: France\nnum_cart_items: \"1\"\nmc_handling1: \"0.00\"\naddress_city: Paris\nverify_sign: AwOJnPNRFHZdnSqc35Btm-KkMwvbA-NWFOONFl0sDe.h8qfGzX3T3iVE\npayer_email: sylvai_1320835836_per@bellino.fr\nmc_shipping1: \"0.00\"\ntxn_id: 67D29474V1031193M\npayment_type: instant\nlast_name: User\naddress_state: Alsace\nitem_name1: Blopsters\nreceiver_email: syl_1315650606_biz@bellino.fr\npayment_fee: \"\"\nquantity1: \"2\"\nreceiver_id: VENU3QCG22URG\ntxn_type: cart\nmc_gross_1: \"240.00\"\nmc_currency: EUR\nresidence_country: FR\ntest_ipn: \"1\"\ntransaction_subject: Shopping CartBlopsters\npayment_gross: \"\"\nipn_track_id: 1HUPu0oG.fhexChWw61WQA\nsecret: testsecret\naction: create\ncontroller: notification_paiements\n', 36, 'Completed', '67D29474V1031193M', '2011-11-09 17:25:18', '2011-11-09 17:25:18')
SQL (3.3ms) COMMIT
Rendered text template (0.0ms)
Completed 200 OK in 96ms (Views: 20.4ms | ActiveRecord: 32.7ms)
如您所见,来自 paypal 的信息存储在带有 INSERT 的 notification_paiements 表中。
现在一个非贝宝用户取消支付宝付款:
Started POST "/notification_paiements?secret=testsecret" for 173.0.82.126 at 2011-11-09 18:39:01 +0100
Processing by NotificationPaiementsController#create as HTML
Parameters: "mc_gross"=>"143.52", "invoice"=>"38", "protection_eligibility"=>"Ineligible", "address_status"=>"unconfirmed", "item_number1"=>"1", "payer_id"=>"TVV27PV4CE9WN", "tax"=>"23.52", "address_street"=>"1 Rue moli\xE8re", "payment_date"=>"09:28:02 Nov 09, 2011 PST", "payment_status"=>"Completed", "charset"=>"windows-1252", "address_zip"=>"06000", "mc_shipping"=>"0.00", "mc_handling"=>"0.00", "first_name"=>"Sylvain", "mc_fee"=>"5.13", "address_country_code"=>"FR", "address_name"=>"Sylvain Bellino", "notify_version"=>"3.4", "custom"=>"", "payer_status"=>"unverified", "business"=>"syl_1315650606_biz@bellino.fr", "address_country"=>"France", "num_cart_items"=>"1", "mc_handling1"=>"0.00", "address_city"=>"Quinper", "verify_sign"=>"AqbqXETD.PxAAbSmxayIN78tg6E5A8bGf00DQNeRfx1TbcIGu8oSrIKM", "payer_email"=>"test@test.com", "mc_shipping1"=>"0.00", "txn_id"=>"7L144405TP446563S", "payment_type"=>"instant", "last_name"=>"Bellino", "address_state"=>"", "item_name1"=>"Blopsters", "receiver_email"=>"syl_1315650606_biz@bellino.fr", "payment_fee"=>"", "quantity1"=>"1", "receiver_id"=>"VENU3QCG22URG", "txn_type"=>"cart", "mc_gross_1"=>"120.00", "mc_currency"=>"EUR", "residence_country"=>"FR", "test_ipn"=>"1", "receipt_id"=>"4652-2775-4616-8599", "transaction_subject"=>"Shopping CartBlopsters", "payment_gross"=>"", "ipn_track_id"=>"gfqdiv.LSFZQPO3RomLrBw", "secret"=>"testsecret"
Collection Load (0.4ms) SELECT `collections`.* FROM `collections`
BijouType Load (0.1ms) SELECT `bijou_types`.* FROM `bijou_types`
SQL (0.1ms) BEGIN
SQL (0.7ms) SHOW TABLES
SQL (0.6ms) describe `carts`
AREL (0.6ms) INSERT INTO `carts` (`purchased_at`, `status`, `created_at`, `updated_at`) VALUES (NULL, 'Panier', '2011-11-09 17:39:01', '2011-11-09 17:39:01')
SQL (7.0ms) COMMIT
Before actualize
AREL (10.1ms) UPDATE `carts` SET `updated_at` = '2011-11-09 17:39:01' WHERE (`carts`.`id` = 45)
LineItem Load (0.7ms) SELECT `line_items`.* FROM `line_items` WHERE (`line_items`.cart_id = 45)
After actualize
SQL (0.2ms) BEGIN
SQL (0.1ms) ROLLBACK
Completed in 134ms
当它应该在数据库中创建条目时会发生某种回滚。
控制器的代码相当简单:
class NotificationPaiementsController < ApplicationController
protect_from_forgery :except =>[:create]
skip_before_filter :authorize, :only => [:create]
def create
@notification_paiement = NotificationPaiement.create!(:params => params,
:cart_id => params[:invoice],
:status=> params[:payment_status], :transaction_id => params[:txn_id])
render :nothing=>true
end
end
create 方法中发生了阻止记录某些通知的事情,但是什么? 有没有办法拥有更详细的创建方法?
【问题讨论】:
【参考方案1】:问题来自特殊字符,例如:é
该应用程序是完整的 UTF-8(包括 mysql UTF-8 兼容的 ruby 驱动程序和 UTF-8 中的 MySQL)。
要在 utf 8 中设置 IPN,请执行以下操作:
ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
vparams =
params.each do |k,v|
vparams[k]=v.force_encoding('ISO-8859-1').encode!('UTF-8')
end
【讨论】:
以上是关于我收到 Paypal IPN 罚款,但我的应用程序仅在从 paypal 帐户完成时才记录它。由 UTF-8/ISO-8859-1 引起的主要内容,如果未能解决你的问题,请参考以下文章