Интеграция Paymill с rails — локальное хранение идентификаторов

Я работаю над интеграцией приложения Rails с платежным шлюзом Paymill (используя гем paymill-ruby), и мне было интересно, может ли кто-нибудь дать совет, как лучше всего взаимодействовать с API во время стандартного процесса заказа. Мне удалось заставить работать основы, но очень мало ресурсов о том, как структурировать весь процесс.

У меня есть модель пользователя, в которой я хочу хранить идентификатор клиента paymill и идентификатор платежа, и модель оплаты, в которой я храню сведения о каждой транзакции (со ссылкой на идентификатор заказа). Код модели My Payment в настоящее время выглядит следующим образом:

class Payment < ActiveRecord::Base
  include ActiveModel::ForbiddenAttributesProtection
  attr_accessor :paymill_card_token, :email, :paymill_client_id, :paymill_payment_id

  belongs_to :order
  belongs_to :user
  validates_presence_of :order_id
  validates_presence_of :user_id

  def save_with_payment
    if valid?

      if paymill_client_id.blank?
        #if user hasn't paid before, create paymill client
        client = Paymill::Client.create email: email, description: user_id
        paymill_client_id = client.id
        # update current user with paymill client ID
        User.where("user_id = ?", user_id).update_attributes(:paymill_client_id => paymill_client_id)
      end

      if paymill_payment_id.blank?
        #if paymill_payment_id isn't present, create new payment
        payment = Paymill::Payment.create token: paymill_card_token, client: paymill_client_id
        paymill_payment_id = payment.id
        # update current user with paymill payment ID
        User.where("user_id = ?", user_id).update_attributes(:paymill_payment_id => paymill_payment_id)

      end

      transaction = Paymill::Transaction.create client: paymill_client_id, amount: "#{amount.to_s.gsub('.', '')}0", currency: 'GBP', description: "ORDER ID #{order_id}", payment: paymill_payment_id

      self.paymill_id = transaction.id
      save!
    end
  rescue Paymill::PaymillError => e
    logger.error "Paymill error while creating customer: #{e.message}"
    errors.add :base, "There was a problem with your credit card. Please try again."
    false
  end
end

Я где-то читал в документации, что платежный объект paymill (сохраненные данные кредитной карты клиента) действителен только в течение одного года - это правильно? И если да, то как с этим бороться? Стоит ли хранить эту дату истечения срока действия, а также дату истечения срока действия кредитной карты пользователя в моей модели пользователя, чтобы я знал, когда попросить их снова ввести информацию о своей карте?


person Dave    schedule 13.09.2013    source источник


Ответы (2)


Предлагаемые изменения:

  1. Используйте модель Payment для хранения payment_card_token и payment_id. Это позволит вам поддерживать несколько карт для каждого клиента, если вам это понадобится в будущем.
  2. Создайте модель PaymentTransaction и таблицу БД. Каждый раз, когда пользователь совершает платеж, сохраняйте детали в модели PaymentTransaction вместо модели Payment.
  3. Посмотрите на фреймворк вебхуков. Я не использовал его сам, но это может помочь с вашими вопросами о просроченных токенах и т. д.

Кроме того, общее наблюдение о вашем коде рельсов

  • Вместо User.where("user_id = ?", user_id).update_attributes просто скажите user.update_attributes, так как вы уже определили ассоциацию.
  • Еще лучше, если бы вы могли переместить блок кода if paymill_client_id в модель User.
person Rajesh Kolappakam    schedule 13.09.2013

действительный объект платежа - да, вы правы, объект платежа действителен только в течение 364 дней, но он продлевается еще на 364 дня, начиная с последней транзакции. Важный! Токен следует использовать только один раз, пока вы не получите объект платежа в успешном ответе транзакции или предварительной аутентификации. После этого используйте объект платежа. Мы изменим это поведение, чтобы токен можно было использовать только один раз в нашем API версии 3.

webhooks — сейчас нет вебхука для объекта платежа с истекшим сроком действия, но мы реализуем такой токен, который будет предупреждать вас об истечении срока действия карты в ближайшие дни. Но это займет несколько месяцев. До этого вы должны сохранить дату истечения срока действия. В PCI Security нет проблем с сохранением этой информации.

Лучший, Кристиан

person cbraun75    schedule 13.09.2013
comment
Спасибо, что прояснил это, Кристиан, нет проблем с локальным хранением сведений об истечении срока действия. - person Dave; 13.09.2013