【发布时间】:2021-11-29 07:18:19
【问题描述】:
我是这个网站的新手,我通过laravel 使用stripe 支付错误,我配置了我的cartalyst/stripe-laravel 包,但它给了我错误must provide source or customer.,我不知道哪里出错了,和错误是什么意思。
CheckoutController.php
public function store(Request $request)
{
//dd($request->all());
try {
$charge = Stripe::charges()->create([
'amount' => Cart::total() / 100,
'currency' => 'CAD',
'source' => $request->stripeToken,
'description' => 'Order',
'receipt_email' => $request->email,
'metadata' => [
//'contents' => $contents,
//'quantity' => Cart::instance('default')->count(),
],
]);
return back()->with('success_message', 'Thank you! Your payment has been successfully accepted!');
} catch (Exception $e) {
}
}
checkout.blade.php
<form action="{{ route('checkout.store') }}" method="post" id="payment-form">
@csrf
<div class="form-group">
<div class="card-header">
<label for="card-element">
Enter your credit card information
</label>
</div>
<div class="card-body">
<div id="card-element">
<!-- A Stripe Element will be inserted here. -->
</div>
<!-- Used to display form errors. -->
<div id="card-errors" role="alert"></div>
<input type="hidden" name="plan" value="" />
</div>
</div>
<div class="card-footer">
<button
id="card-button"
class="btn btn-dark"
type="submit"
data-secret="{{ $intent }}"
> Pay </button>
</div>
</form>
</div>
<script src="https://js.stripe.com/v3/"></script>
<script>
// Custom styling can be passed to options when creating an Element.
// (Note that this demo uses a wider set of styles than the guide below.)
var style = {
base: {
color: '#32325d',
lineHeight: '18px',
fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
fontSmoothing: 'antialiased',
fontSize: '16px',
'::placeholder': {
color: '#aab7c4'
},
},
invalid: {
color: '#fa755a',
iconColor: '#fa755a'
}
};
const stripe = Stripe('{{ $stripe_key }}', { locale: 'en' }); // Create a Stripe client.
const elements = stripe.elements(); // Create an instance of Elements.
const cardElement = elements.create('card', { style: style }); // Create an instance of the card Element.
const cardButton = document.getElementById('card-button');
const clientSecret = cardButton.dataset.secret;
cardElement.mount('#card-element'); // Add an instance of the card Element into the `card-element` <div>.
// Handle real-time validation errors from the card Element.
cardElement.addEventListener('change', function(event) {
var displayError = document.getElementById('card-errors');
if (event.error) {
displayError.textContent = event.error.message;
} else {
displayError.textContent = '';
}
});
// Handle form submission.
var form = document.getElementById('payment-form');
form.addEventListener('submit', function(event) {
event.preventDefault();
// Disable the submit button to prevent repeated clicks
document.getElementById('complete-order').disabled = true;
stripe.handleCardPayment(clientSecret, cardElement, {
payment_method_data: {
//billing_details: { name: cardHolderName.value }
}
})
.then(function(result) {
console.log(result);
if (result.error) {
// Inform the user if there was an error.
var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message;
} else {
console.log(result);
form.submit();
}
});
});
</script>
.env
STRIPE_KEY=pk_test_p7FbGbClL...............
STRIPE_SECRET=sk_test_PcR.............
services.php
'stripe' => [
'model' => App\User::class,
'key' => env('STRIPE_KEY'),
'secret' => env('STRIPE_SECRET'),
],
【问题讨论】:
-
令牌和费用已被弃用,您应该改用 PaymentMethods 和 PaymentIntents。与新的 PaymentIntents API 构建集成允许您的集成处理动态支付、支持身份验证方案(例如 3D Secure)并帮助满足全球不断发展的支付法规(例如强客户身份验证)。您可以在此处了解有关实施 PaymentIntents 的更多信息:stripe.com/docs/payments/payment-intents 或实施使用 PaymentIntents 的 Stripe Checkout:stripe.com/docs/payments/checkout。
标签: php laravel stripe-payments