Stripe に 0.00 の金額を表示します。
P粉237125700
2023-07-31 14:36:38
<p>私は、ユーザーが 1 回の支払いでさまざまな有料プランに加入できる Stripe を使用しています。支払いは正常に行われますが、主な問題は、3D セキュア支払いプロセス中 (当社はヨーロッパで事業を行っており、3D セキュア支払いチェックは必須です)、ユーザーに表示される金額が 0,00 であることです。これは間違っているだけでなく、さらに重要なのは、支払いをしようとしている人を混乱させることです。</p>
<pre class="brush:php;toolbar:false;">パブリック関数の購入(リクエスト $request, プラン $plan)
{
$user = $request->user();
$paymentMethod = $request->input('payment_method');
$encryptedSystemId = $request->input('system_id');
$encryptedBoxId = $request->input('box_id');
// 暗号化された ID を復号化します
$systemId = Crypt::decrypt($encryptedSystemId);
$boxId = Crypt::decrypt($encryptedBoxId);
// ID とユーザー権限を検証します
$system = システム::findOrFail($systemId);
$box = Box::findOrFail($boxId);
$total = $plan->price;
試す {
$user->createOrGetStripeCustomer();
$user->updateDefaultPaymentMethod($paymentMethod);
$user->charge($total * 100, $paymentMethod, [
'メタデータ' =>
['システムID' => $システムID、
'box_id' => $boxId、
'テナント ID '=> $ユーザー->テナント->ID、
]
]); // * Stripe はセントを扱うため 100
} catch (例外 $例外) {
return back()->with('error', '支払い処理エラー: ' . $Exception->getMessage());
}
<スクリプト src="https://js.ストライプ.com/v3/"></script>
<スクリプト>
let Stripe = Stripe("{{ env('STRIPE_KEY') }}")
let 要素 = ストライプ.elements()
スタイル = { にします
ベース: {
色: '#32325d'、
fontFamily: '"Helvetica Neue"、Helvetica、サンセリフ',
fontSmoothing: 'アンチエイリアス',
フォントサイズ: '16px',
'::プレースホルダー': {
色: '#aab7c4'
}
}、
無効: {
色: '#fa755a'、
アイコンの色: '#fa755a'
}
}
let カード = elements.create('カード', {
スタイル: スタイル
})
Card.mount('#カード要素')
PaymentMethod = null にします
$('.card-form').on('submit', function(e) {
$('#pay-btn').attr('無効', true)
if (支払い方法) {
trueを返す
}
ストライプ.confirmCardSetup(
"{{ $intent->client_secret }}", {
支払方法: {
カード: カード、
支払明細: {
名前: $('.card_holder_name').val()
}
}
}
).then(関数(結果) {
if (結果.エラー) {
トースター.エラー(
'__("レンタル。入力したデータにエラーが含まれています。レビュー
それを試して、もう一度試してください")')
$('#pay-btn').removeAttr('無効')
}それ以外 {
PaymentMethod = result.setupIntent.payment_method
$('.支払い方法').val(支払い方法)
$('.card-form').submit()
$('span.icon').removeAttr('hidden');
$('#pay-btn').attr('無効', true)
}
})
falseを返す
})
<div class="tab-content mt-4 " id="card-tab" style="display:none">
<フォームメソッド="POST" アクション="{{ ルート('レンタル.購入', $プラン) }}"
class="カードフォーム mt-3 mb-3">
@csrf
<input type="hidden" name="支払い方法" class="支払い方法">
<input type="hidden" name="system_id" value="{{ encrypt($system->id) }}">
<input type="hidden" name="box_id" value="{{ encrypt($box->id) }}">
<div class="mb-4">
<input class="StripeElement form-input px-4 py-3rounded-lg w-full"
name="カード所有者名" プレースホルダー="{{ __('レンタル.カード所有者
名前') }}">
</div>
<div>
<div id="カード要素"></div>
</div>
<div id="card-errors" role="alert"></div>
<div class="mt-3 text-center">
<button type="submit" class="bg-red-500 text-white font-bold py-2 px-4rounded" id="pay-btn">{{ __('rental.Pay') } } {{ $plan->価格 }} &ユーロ; <span class="icon" hidden><i class="fas fa-sync fa-spin"></i></span></button>
</div>
</フォーム>
</div>
そしてこれは私がデバッグするとき
#_originalValues: 配列:39 [▼
"id" => 「pi_3NZqdIC6ZwDjQHNX1R7KJLoO」
「オブジェクト」=> 「支払いの意図」
「金額」=> 100
"amount_capturable" => 0
"金額の詳細" =>配列:1 [▼
「ヒント」=> []
]
"受け取った金額" => 100</pre>
<p><br /></p>
指定したコードに基づいて、SetupIntents を使用して支払い方法の詳細を収集しています。 SetupIntents は、将来の使用に備えて支払い方法の詳細を収集するために使用されます: https:// Stripe.com/docs/payments/save-and-reuse。 3DS が必要な場合は、支払い方法を受け取るときにカードに金額が請求されないため、金額は 0.00 になると予想してください。
サブスクリプション機能を使用している場合は、支払い時に支払いを収集して保存するには、次のガイドに従ってください: https:// Stripe.com/docs/billing/subscriptions/build-subscriptions?ui=elements方法。
1 回限りの支払いを使用している場合は、支払いと同時に支払い方法の詳細を収集して保存できます: https:// Stripe.com/docs/payments/save-during-支払い。