web-dev-qa-db-ja.com

Stripe update customer default card(PHP)

Stripeを使用している顧客のデフォルトカードを更新したい。

update customer AP​​I docs では、cardパラメータに何をフィードするかが明確ではありません。

PHPでは、retrieve cardメソッドに基づいてcardを次のように設定してみました。

$customer->card=$card['id']

しかし、それは機能していないようです。次のようなトークンも使用しません。

$customer->source=$_POST['stripe_token]

だから私は少し途方に暮れています。考え?

17
tim peterson

IRC #stripe channel でStripeのサポートを利用して、自分の質問に答えることができました。

cardパラメータは、次のようにdefault_sourceによって指定されます。

Stripe::setApiKey($stripe_private_key);
$customer = Stripe_Customer::retrieve($stripe_cus_id);
$customer->default_source=$card['id'];
$customer->save();  
20
tim peterson

新しいカードを作成し、デフォルトのソースとしてカードを割り当てます

新しいカードを作成して、その新しいカードをデフォルトのカードに設定する場合は、これを試してください。

*ストライプトークンはストライプjsリクエストからのものであり、ストライプカスタマーIDは認証されたユーザーからのものである可能性が高いことに注意してください。

// Get the customer
$customer = Customer::retrieve("cus_9jF6ku4f2pztRo");

// Add a new card to the customer
$card = $customer->sources->create(['source' => "tok_19PmcMI94XzVK71QeIwtUJmM"]);

// Set the new card as the customers default card
$customer->default_source = $card->id;
$customer->save();
13
Rob

1。概要

@tim petersonの回答は完全であり、最初に提起された質問を満たします。ただし、このStackoverflowの質問は、Stripeのデフォルトカードを設定するための最初のヒットの1つなので、自分の調査結果をもう少し詳しく文書化したいと思いました。

2.フロー

カードを保存する流れを理解することが最初に重要であり、クレジットカードへの参照を安全に保存することは重要です。

一般的には、カードを追加してその場でデフォルトとして設定するか、データベースにクレジットカードID(クレジットカード番号ではない!)を保存して、アクションを実行します。

最初のカードをユーザーに追加するとき、それはデフォルトでデフォルトになります。

2.1。顧客の創造

  1. appから、APIを介してStripeで顧客を作成します
  2. 顧客オブジェクトは、Stripeによって返されます。これには、customer->idが含まれます。
  3. 少なくとも、customer->idappに保存します。これは通常、userテーブルなどにあります。

255文字のVARCHARは適切と思われます-ただし、Stripeと直接チャットした後、システムにidのドキュメント長がありません。

2.2。カード作成

後の段階で、カードを追加する必要があります。

  1. 最初にStripe JSライブラリを使用し、それらの site にも記載されています。ここでの考え方は、フォームの送信アクションがStripeサーバーを直接指しているため、フォームが送信されるときに実際のクレジットカードの詳細がサーバーに到達することはありません。 Stripe JSなしでカードを作成することは技術的には可能ですが、正当な理由がない限り、私は推奨される方法に固執し、それを重労働に任せます。
  2. ユーザーはクレジットカードフォームを使用しており、次のことが起こります。
  3. 彼らはあなたのフォームにクレジットカードの詳細を入力します
  4. 彼らは送信を押します
  5. すべてのフォーム入力はajax経由でStripeに送信されます
  6. 成功するとStripe JSは次のデータを含む応答を返します。

    • response.id
    • response.card.id
    • response.card.last4
    • response.card.brand
    • response.card.exp_month
    • response.card.exp_year
  7. Stripeの例では、DOMに一連の非表示フォーム要素を追加し、上記のデータを入力して、「今回はrealzのフォームを送信」し​​ます。

  8. バックエンドは、何であれ、上記のデータを受信し、必要に応じて保存できます。

2.3。デフォルトの設定

元の質問に戻ります。いくつかの段階で、複数のカードを持つユーザーがいて、1枚をデフォルトとして設定する必要がある場合があります。

上記のフォームからの戻りデータを保存したので、カード、カードIDなどのリストがデータベースにないはずです。したがって、単純にそれらをループし、デフォルトでユーザーがクリックするカードを選択して、カードIDを取得し、顧客オブジェクトに対してdefault_sourceプロパティをカードID値で更新します。

3例

これは、上記の3つのステップを非常に緩やかなコードスニペットでミラーリングします(PHPを使用しますが、簡単に理解できるはずです)。

簡潔にするために、エラーのキャッチと例外はスキップしています。外部ソースとのやり取りを行うときは常に、例外処理に注意を払うことをお勧めします-基本的に、サービスが失敗すると仮定します。

3.1顧客の創造

// Send details to Stripe
$customer = \Stripe\Customer::create([
    'email' => $this->user->email,
    'description' => $this->user->name,
]);

// Then update our application
$this->user->stripe_customer_id = $customer->id;
$this->user->save();

3.2カードの作成

3.2.1 JavaScript

module.exports = (function() {
    function CreditCard() {
        $('#payment-form').submit(function(e) {
            var $form = $(this);

            // Disable the submit button to prevent repeated clicks
            $form.find('button').prop('disabled', true);

            Stripe.card.createToken($form, function(status, response) {
                var $form = $('#payment-form');
                if (response.error) {
                    // Show the errors on the form
                    $form.find('.payment-errors').text(response.error.message);
                    $form.find('.payment-errors').parents(".row").show();
                    $form.find('button').prop('disabled', false);
                } else {
                    // token contains id, last4, and card type
                    var token = response.id;
                    var cardId = response.card.id;
                    var last4 = response.card.last4;
                    var brand = response.card.brand;
                    var expMonth = response.card.exp_month;
                    var expYear = response.card.exp_year;

                    // Insert the token into the form so it gets submitted to the server
                    $form.append($('<input type="hidden" name="stripeToken" />').val(token));
                    $form.append($('<input type="hidden" name="cardId" />').val(cardId));
                    $form.append($('<input type="hidden" name="last4" />').val(last4));
                    $form.append($('<input type="hidden" name="brand" />').val(brand));
                    $form.append($('<input type="hidden" name="expMonth" />').val(expMonth));
                    $form.append($('<input type="hidden" name="expYear" />').val(expYear));

                    // and re-submit
                    $form.get(0).submit();
                }
            });

            // Prevent the form from submitting with the default action
            return false;
        });
    }

    return CreditCard;
})();

3.2.2バックエンド

public function save(string $token, string $cardId, string $last4, string $brand, int $expMonth, int $expYear)
{
    // Store in our application
    $creditCard = $this->user->creditCards()->create([
        'token_id' => $token,
        'card_id' => $cardId,
        'last4' => $last4,
        'brand' => $brand,
        'exp_month' => $expMonth,
        'exp_year' => $expYear
    ]);
}

3.3デフォルトの設定

    Customer::retrieve($this->user->stripe_customer_id);
    $customer->default_source = $cardId;
    $customer->save();
13
Chris