显示0.00金额给Stripe。
P粉237125700
2023-07-31 14:36:38
[PHP讨论组]
<p>我正在使用Stripe,在这里用户通过一次付款订阅不同的付费计划。付款成功进行,但主要问题是在3D Secure付款过程中(我们在欧洲运营,3D Secure付款检查是强制性的),显示给用户的金额是0,00。这不仅是错误的,更重要的是,对即将进行付款的人来说是令人困惑的。</p>
<pre class="brush:php;toolbar:false;">public function purchase(Request $request, Plan $plan)
{
$user = $request->user();
$paymentMethod = $request->input('payment_method');
$encryptedSystemId = $request->input('system_id');
$encryptedBoxId = $request->input('box_id');
// Decrypt the encrypted IDs
$systemId = Crypt::decrypt($encryptedSystemId);
$boxId = Crypt::decrypt($encryptedBoxId);
// Validate the IDs and user authorization
$system = System::findOrFail($systemId);
$box = Box::findOrFail($boxId);
$total = $plan->price;
try {
$user->createOrGetStripeCustomer();
$user->updateDefaultPaymentMethod($paymentMethod);
$user->charge($total * 100, $paymentMethod, [
'metadata' =>
['system_id' => $systemId,
'box_id' => $boxId,
'tenant_id '=> $user->tenant->id,
]
]); // * 100 because Stripe deals with cents
} catch (Exception $exception) {
return back()->with('error', 'Error processing payment: ' . $exception->getMessage());
}
<script src="https://js.stripe.com/v3/"></script>
<script>
let stripe = Stripe("{{ env('STRIPE_KEY') }}")
let elements = stripe.elements()
let style = {
base: {
color: '#32325d',
fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
fontSmoothing: 'antialiased',
fontSize: '16px',
'::placeholder': {
color: '#aab7c4'
}
},
invalid: {
color: '#fa755a',
iconColor: '#fa755a'
}
}
let card = elements.create('card', {
style: style
})
card.mount('#card-element')
let paymentMethod = null
$('.card-form').on('submit', function(e) {
$('#pay-btn').attr('disabled', true)
if (paymentMethod) {
return true
}
stripe.confirmCardSetup(
"{{ $intent->client_secret }}", {
payment_method: {
card: card,
billing_details: {
name: $('.card_holder_name').val()
}
}
}
).then(function(result) {
if (result.error) {
toastr.error(
'__("rental.The data you entered contains errors! Review
it and try again")')
$('#pay-btn').removeAttr('disabled')
} else {
paymentMethod = result.setupIntent.payment_method
$('.payment-method').val(paymentMethod)
$('.card-form').submit()
$('span.icon').removeAttr('hidden');
$('#pay-btn').attr('disabled', true)
}
})
return false
})
<div class="tab-content mt-4 " id="card-tab" style="display:none">
<form method="POST" action="{{ route('rentals.purchase', $plan) }}"
class="card-form mt-3 mb-3">
@csrf
<input type="hidden" name="payment_method" class="payment-method">
<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-3 rounded-lg w-full"
name="card_holder_name" placeholder="{{ __('rental.Cardholder
Name') }}">
</div>
<div>
<div id="card-element"></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-4 rounded" id="pay-btn">{{ __('rental.Pay') }} {{ $plan->price }} &euro; <span class="icon" hidden><i class="fas fa-sync fa-spin"></i></span></button>
</div>
</form>
</div>
and this when I debug
#_originalValues: array:39 [▼
"id" => "pi_3NZqdIC6ZwDjQHNX1R7KJLoO"
"object" => "payment_intent"
"amount" => 100
"amount_capturable" => 0
"amount_details" => array:1 [▼
"tip" => []
]
"amount_received" => 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,在付款时收集和保存付款方式。
如果您正在使用一次性付款,则可以在付款同时收集和保存付款方式的详细信息:https://stripe.com/docs/payments/save-during-payment。