Stripeを使用している顧客のデフォルトカードを更新したい。
update customer
API docs では、card
パラメータに何をフィードするかが明確ではありません。
PHPでは、retrieve card
メソッドに基づいてcard
を次のように設定してみました。
$customer->card=$card['id']
しかし、それは機能していないようです。次のようなトークンも使用しません。
$customer->source=$_POST['stripe_token]
だから私は少し途方に暮れています。考え?
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();
新しいカードを作成して、その新しいカードをデフォルトのカードに設定する場合は、これを試してください。
*ストライプトークンはストライプ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();
@tim petersonの回答は完全であり、最初に提起された質問を満たします。ただし、このStackoverflowの質問は、Stripeのデフォルトカードを設定するための最初のヒットの1つなので、自分の調査結果をもう少し詳しく文書化したいと思いました。
カードを保存する流れを理解することが最初に重要であり、クレジットカードへの参照を安全に保存することは重要です。
一般的には、カードを追加してその場でデフォルトとして設定するか、データベースにクレジットカードID(クレジットカード番号ではない!)を保存して、アクションを実行します。
注最初のカードをユーザーに追加するとき、それはデフォルトでデフォルトになります。
customer->id
が含まれます。customer->id
をappに保存します。これは通常、user
テーブルなどにあります。255文字のVARCHARは適切と思われます-ただし、Stripeと直接チャットした後、システムにidのドキュメント長がありません。
後の段階で、カードを追加する必要があります。
成功するとStripe JSは次のデータを含む応答を返します。
Stripeの例では、DOMに一連の非表示フォーム要素を追加し、上記のデータを入力して、「今回はrealzのフォームを送信」します。
元の質問に戻ります。いくつかの段階で、複数のカードを持つユーザーがいて、1枚をデフォルトとして設定する必要がある場合があります。
上記のフォームからの戻りデータを保存したので、カード、カードIDなどのリストがデータベースにないはずです。したがって、単純にそれらをループし、デフォルトでユーザーがクリックするカードを選択して、カードIDを取得し、顧客オブジェクトに対してdefault_source
プロパティをカードID値で更新します。
これは、上記の3つのステップを非常に緩やかなコードスニペットでミラーリングします(PHPを使用しますが、簡単に理解できるはずです)。
注簡潔にするために、エラーのキャッチと例外はスキップしています。外部ソースとのやり取りを行うときは常に、例外処理に注意を払うことをお勧めします-基本的に、サービスが失敗すると仮定します。
// 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();
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;
})();
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
]);
}
Customer::retrieve($this->user->stripe_customer_id);
$customer->default_source = $cardId;
$customer->save();