javascript - Hur vet jag att 3D Secure 2-autentisering fungerar efter uppgradering till stripe.js version 3
Jag har uppdaterat en webbplats så att den använder senaste stripe-php (6.39.0) och den laddar nu stripe.js version 3. Jag har gjort alla nödvändiga ändringar i min kod så att mina kreditkortsfält nu visas med Stripe Elements. Testtransaktioner fungerar och jag har uppdaterat den live webbplatsen och riktiga betalningar accepteras.
Anledningen till att jag gjorde denna uppdatering var att jag fick information från Stripe att jag behövde uppgradera webbplatsen så att dess Stripe-integration fungerar med Strong Customer Authentication (SCA), vilket krävs i EU från september 2019.
Stripe har olika testnummer för kreditkort som du kan använda för att testa saker som uppstår när du behandlar betalningar. Dessa nummer kan hittas här: https://stripe.com/docs/testing#cards
4000000000003220 simulerar en transaktion där 3D Secure 2-autentisering måste slutföras. Men när jag använder denna kod avvisar Stripe betalningen och returnerar meddelandet:
"Ditt kort avvisades. Denna transaktion kräver autentisering. Vänligen kontrollera dina kortuppgifter och försök igen."
Betyder detta att 3D Secure 2 fungerar eller inte?
I verkliga världen skulle det öppna ett fönster med ett gränssnitt från kundens kortutgivare. Så jag är inte säker på om min integration fungerar eller inte. Som sagt tidigare accepteras betalningar, men jag behöver vara redo när stark kundautentisering krävs i september.
Svar #1
Det verkar som att du har ett integrationsproblem med JS-delen. För en enkel betalning (följande exempel fungerar inte för prenumeration), är detta sättet du måste implementera det på:
Först måste du skapa en betalningsavsikt (dokumentation här: https://stripe.com/docs/api/payment_intents/create):
\Stripe\PaymentIntent::create([
"amount" => 2000,
"currency" => "usd",
"payment_method_types" => ["card"],
]);
När ditt PaymentIntent-svar returneras kommer du att ha en client_secret-nyckel (dokumentation här: https://stripe.com/docs/api/payment_intents/object). Du kan se att din betalningsstatus är "requires_payment_method"
{
"id": "pi_1Dasb62eZvKYlo2CPsLtD0kn",
"object": "payment_intent",
"amount": 1000,
"amount_capturable": 0,
"amount_received": 0,
...
"client_secret": "pi_1Dasb62eZvKYlo2CPsLtD0kn_secret_6aR6iII8CYaFCrwygLBnJW8js",
...
"status": "requires_payment_method",
...
}
På din serversida måste du spara detta objekt. Du kan nu visa ditt betalningsformulär med JS-delen med den tidigare client_secret-nyckeln (dokumentation här: https://stripe.com/docs/payments/payment-intents/verifying-status). Idén är att du måste kalla JS-funktionen när du klickar på skicka-knappen men inte skicka! Vänta på svaret innan du skickar. Med lite jQuery kan det se ut så här:
var $mySubmitButton = $('#my-submit-button'),
$myPaymentForm = $('#my-payment-form'),
clientSecret = $cardButton.data('client-secret'); // put your client-secret somewhere
$mySubmitButton.on('click', function(e) {
e.preventDefault();
// Disable button to disallow multiple click
$(this).attr("disabled", true);
stripe.handleCardPayment(
clientSecret,
{
payment_method: clientMethod, // if you have a clientMethod
}
).then(function(result) {
if (result.error) {
// show error message
// then enable button
$mySubmitButton.attr("disabled", false);
} else {
// Submit form
$myPaymentForm.submit();
}
});
});
Om allt går rätt, när du klickar på din skicka-knapp, kommer du att ha en test 3D secure popin med alternativen att "lyckas" eller "misslyckas" med säkerhetstestet. Om du klickar på lyckas-knappen skickas ditt formulär och du måste vänta på webhooken "charged.success" för att bekräfta transaktionen.
När det tas emot, ändra din serverobjektsstatus och meddela användaren om transaktionen.
I mitt fall, när formuläret har skickats, visar jag en laddare och kontrollerar med ett ajax-anrop varje sekund för att se om min betalningsavsiktsstatus har ändrats (genom webhooken). För din testmiljö kan du använda http://requestbin.net och Postman.
Varning: några kort som nämns på denna sida fungerar inte korrekt (du kan inte lägga till dem) https://stripe.com/docs/testing#cards (avsnittet 3D Secure testkortnummer och tokens). Bekräftat med deras support.
Om du arbetar med sparade kort kan du bara testa med dessa kort: https://stripe.com/docs/payments/cards/charging-saved-cards#testing
