Я получаю Paypal IPN в порядке, но мое приложение записывает его, только если это было сделано со счета PayPal.Вызывается UTF-8 / ISO-8859-1 - PullRequest
1 голос
/ 09 ноября 2011

Это делается в среде тестирования Ruby On Rails 3, которая является фанатом фьюжн с MySQL, идентичным производственному. Я использовал это руководство: http://railscasts.com/episodes/142-paypal-notifications?autoplay=true, чтобы получить IPN от PayPal, чтобы сообщить моему приложению об окончании платежа.

Я отлично работаю, когда оформление заказа выполнено в моей тестовой настройке, я могу видеть содержимое моей корзины на Paypal, я вхожу в учетную запись песочницы PayPal и PayPal уведомляет меня, и я создаю запись уведомления в моей базе данных.

Однако, если я решу оплатить не счет PayPal, а платежную карту, это необъяснимо не удастся. В журнале есть ответ от PayPal, но мое приложение никогда не создает ВСТАВКУ:

Вот журналы уведомлений пользователей PayPal:

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 хранится в таблице messages_paiements со вставкой.

Теперь пользователь не PayPal, не использующий PayPal платеж:

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 Ответ

1 голос
/ 18 ноября 2011

Проблема возникла из-за специального символа, такого как: é

Приложение полностью в UTF-8 (включая mysql UTF-8-совместимый драйвер ruby ​​и MySQL в UTF-8).

Чтобы установить IPN в utf 8, выполните следующие действия:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...