4

我正在将 Rails 应用程序与 Paymill 支付网关(使用 paymill-ruby gem)集成,并且想知道是否有人可以就在标准订单过程中与 API 交互的最佳方式提供一些建议。我已经设法使基础工作正常,但是关于如何构建整个过程的资源很少。

我有一个 User 模型,我想在其中存储 paymill 客户端 ID 和付款 ID,以及一个 Payment 模型,我在其中存储每笔交易的详细信息(引用订单 ID)。我的付款模式代码目前如下:

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 付款对象(客户保存的信用卡详细信息)仅有效期为一年 - 这是正确的吗?如果是这样,应该如何处理?将此到期日期以及用户信用卡到期日期存储在我的用户模型中是否是个好主意,以便我知道何时要求他们再次输入他们的卡信息?

4

2 回答 2

1

建议更改:

  1. 使用Payment模型来存储payment_card_tokenpayment_id。这将允许您为每个客户端支持多张卡,以备将来需要时使用
  2. 创建PaymentTransaction模型和数据库表。每次用户付款时,将详细信息存储在PaymentTransaction模型而不是Payment模型中。
  3. 查看 webhook 框架。我自己没有使用过,但它可能有助于解决您关于过期令牌等的问题

此外,关于您的 rails 代码的一般观察

  • 而不是User.where("user_id = ?", user_id).update_attributes,只是说user.update_attributes您已经定义了关联。
  • if paymill_client_id如果您可以将代码块移动到用户模型,那就更好了。
于 2013-09-13T06:04:02.703 回答
1

有效的支付对象 - 是的,你是对的,支付对象的有效期仅为 364 天,但从最后一次交易开始,它又延长了 364 天。重要的!令牌只能使用一次,直到您在交易或预授权的成功响应中收到支付对象。之后请使用支付对象。我们将改变这种行为,即令牌在我们的 API 版本 3 中只能使用一次。

webhook - 目前没有用于过期支付对象的 webhook,但我们将实施这样的令牌,它会在卡将在接下来的几天内到期时提醒您。但需要几个月的时间。直到你应该保存到期日期。PCI Security 保存此信息没有问题。

最好的,克里斯蒂安

于 2013-09-13T07:51:44.330 回答