4

私は Rails アプリを Paymill 支払いゲートウェイ (paymill-ruby gem を使用) と統合する作業を行っていますが、標準的な注文プロセス中に API を操作するための最良の方法について誰かがアドバイスできるかどうか疑問に思っていました。私はなんとか基本を機能させることができましたが、完全なプロセスを構築する方法に関するリソースはほとんどありません.

Paymill クライアント ID と支払い ID を保存する User モデルと、すべてのトランザクションの詳細 (注文 ID を参照) を保存する 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

ドキュメントのどこかで、ペイミル支払いオブジェクト (クライアントの保存されたクレジット カードの詳細) が 1 年間のみ有効であると読みましたが、これは正しいですか? もしそうなら、これはどのように対処されるべきですか?この有効期限とユーザーのクレジットカードの有効期限を User モデルに保存して、いつカード情報を再入力するように依頼するかを知ることは良い考えですか?

4

2 に答える 2

1

有効な支払いオブジェクト - はい、そうです、支払いオブジェクトは 364 日間のみ有効ですが、最後の取引から再び 364 日間延長されます。重要!トークンは、トランザクションまたは事前認証の成功応答で支払いオブジェクトを受け取るまで、1 回だけ使用する必要があります。その後、支払いオブジェクトを使用してください。API バージョン 3 では、トークンを 1 回しか使用できないように、この動作を変更します。

webhooks - 現在、有効期限が切れた支払いオブジェクト用の webhook はありませんが、カードの有効期限が数日後に切れる前に警告するようなトークンを実装します。でも数ヶ月かかります。有効期限まで保存する必要があります。この情報を保存する PCI セキュリティについては問題ありません。

ベスト、クリスチャン

于 2013-09-13T07:51:44.330 に答える
1

提案された変更:

  1. モデルを使用してとPaymentを保存しpayment_card_tokenますpayment_id。これにより、将来必要になった場合に備えて、クライアントごとに複数のカードをサポートできます。
  2. PaymentTransactionモデルと db テーブルを作成します。ユーザーが支払いを行うたびに、PaymentTransactionモデルではなくモデルに詳細を保存しPaymentます。
  3. Webhook フレームワークを調べます。私自身は使用していませんが、期限切れのトークンなどに関する質問に役立つかもしれません

また、レールコードに関する一般的な観察

  • の代わりに、すでに関連付けを定義しているUser.where("user_id = ?", user_id).update_attributesとだけ言ってください。user.update_attributes
  • if paymill_client_idコードのブロックを User モデルに移動できればさらに良いでしょう。
于 2013-09-13T06:04:02.703 に答える