Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Paymill与rails集成-本地存储ID_Ruby On Rails_Paymill - Fatal编程技术网

Ruby on rails Paymill与rails集成-本地存储ID

Ruby on rails Paymill与rails集成-本地存储ID,ruby-on-rails,paymill,Ruby On Rails,Paymill,我正在致力于将Rails应用程序与Paymill支付网关(使用Paymill ruby gem)集成,我想知道是否有人可以就在标准订单过程中与API交互的最佳方式提供一些建议。我已经设法使基础工作正常,但是关于如何构建整个流程的资源很少 我有一个用户模型,我想在其中存储paymill客户id和付款id,还有一个付款模型,我在其中存储每笔交易的详细信息(参考订单id)。我的付款模式代码目前如下: class Payment < ActiveRecord::Base include Act

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

我有一个用户模型,我想在其中存储paymill客户id和付款id,还有一个付款模型,我在其中存储每笔交易的详细信息(参考订单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
classpaymentpaymill\u client\u id)
结束
如果paymill\u payment\u id为空?
#如果paymill\u payment\u id不存在,请创建新付款
payment=Paymill::payment.create令牌:Paymill\u卡\u令牌,客户端:Paymill\u客户端\u id
paymill\u payment\u id=payment.id
#使用paymill支付ID更新当前用户
User.where(“User\u id=?”,User\u id).update\u属性(:paymill\u payment\u id=>paymill\u payment\u id)
结束
transaction=Paymill::transaction.create client:Paymill_client_id,金额:“{amount.to_.gsub('.','')}0”,货币:'GBP',说明:“订单id{ORDER_id}”,付款:Paymill_payment_id
self.paymill_id=transaction.id
拯救
结束
救援薪资工厂::薪资工厂错误=>e
logger.error“创建客户时Paymill出错:#{e.message}”
错误。添加:base,“您的信用卡出现问题。请重试。”
假的
结束
结束
我在文档的某个地方读到paymill支付对象(客户保存的信用卡详细信息)仅在一年内有效-这是正确的吗?如果是这样,应该如何处理?在我的用户模型中存储此到期日以及用户信用卡到期日是否是一个好主意,以便我知道何时要求他们再次输入信用卡信息?

建议的更改:

  • 使用
    Payment
    模型存储
    Payment\u card\u token
    Payment\u id
    。这将允许您为每个客户端支持多张卡,以备将来需要时使用
  • 创建
    PaymentTransaction
    模型和db表。每次用户付款时,将详细信息存储在
    PaymentTransaction
    模型中,而不是
    payment
    模型中
  • 查看webhooks框架。我自己没有用过,但它可能会帮助你解决有关过期代币等问题
  • 另外,对rails代码的一般观察

    • 不要使用
      User.where(“User\u id=?”,User\u id).update\u attributes
      ,只需说
      User.update\u attributes
      ,因为您已经定义了关联
    • 如果您可以将
      if paymill\u client\u id
      代码块移动到用户模型中,则更好

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

    webhooks-目前没有针对过期paymentobject的webhook,但我们将实现这样一个令牌,它会在未来几天卡过期后提醒您。但这需要几个月的时间。到那时,你应该保存有效期。保存此信息的PCI安全性没有问题

    最好的,
    Christian

    感谢您将其清除Christian,在本地存储过期详细信息没有问题