javascript - Hvordan kan jeg vite at 3D Secure 2-autentisering fungerer etter oppgradering til stripe.js versjon 3


Jeg har oppdatert et nettsted slik at det bruker nyeste stripe-php (6.39.0) og det laster nå stripe.js versjon 3. Jeg har gjort alle nødvendige endringer i koden min slik at kredittkortfeltene mine nå vises ved bruk av Stripe Elements. Testtransaksjoner fungerer, og jeg har oppdatert det live nettstedet, og ekte betalinger blir akseptert.

Grunnen til at jeg laget denne oppdateringen var fordi jeg ble informert av Stripe om at jeg måtte oppgradere nettstedet slik at Stripe-integrasjonen fungerer med Strong Customer Authentication (SCA), som kreves i EU innen september 2019.

Stripe har forskjellige kredittkort testnumre du kan bruke for å teste ting som oppstår når du behandler betalinger. Disse numrene kan finnes her: https://stripe.com/docs/testing#cards

4000000000003220 simulerer en transaksjon der 3D Secure 2-autentisering må fullføres. Men når jeg bruker denne koden, avslår Stripe betalingen og returnerer meldingen:

"Kortet ditt ble avvist. Denne transaksjonen krever autentisering. Vennligst sjekk kortdetaljene dine og prøv igjen."

Betyr dette at 3D Secure 2 fungerer eller ikke?

I den virkelige verden ville det åpnet et vindu med et grensesnitt fra kundens kortutsteder. Så jeg er ikke sikker på om integrasjonen min fungerer eller ikke. Som sagt tidligere blir betalinger akseptert, men jeg må være klar når sterk kundebekreftelse kreves i september.

Svar #1

Det ser ut til at du har et integrasjonsproblem med JS-delen. For et enkelt gebyr (følgende eksempel fungerer ikke for abonnement), er dette måten du må implementere det på:

Først må du opprette en betalingsintensjon (dokumentasjon her: https://stripe.com/docs/api/payment_intents/create):

\Stripe\PaymentIntent::create([
  "amount" => 2000,
  "currency" => "usd",
  "payment_method_types" => ["card"],
]);

Når ditt PaymentIntent-svar er returnert, vil du ha en client_secret-nøkkel (dokumentasjon her: https://stripe.com/docs/api/payment_intents/object). Du kan se at betalingsstatusen din er "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å serversiden din må du lagre dette objektet. Du kan nå vise betalingsskjemaet ditt med JS-delen med den forrige client_secret-nøkkelen (dokumentasjon her: https://stripe.com/docs/payments/payment-intents/verifying-status). Ideen er at du må kalle Js-funksjonen ved klikk på send-knappen, men ikke sende! Vent på svar før du sender. Med litt jQuery bør dette se slik ut:

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();
        }
    });
});

Hvis alt går riktig, når du klikker på send-knappen din, vil du få en test 3D secure-popup med alternativene for å «lykkes» eller «mislykkes» i sikkerhetstesten. Hvis du klikker på Lykke-til-knappen, blir skjemaet ditt sendt inn, og du må vente på webhooken «charged.success» for å bekrefte transaksjonen.

Når mottatt, endre statusen til serverobjektet ditt og gi brukeren beskjed om transaksjonen.

I mitt tilfelle, når skjemaet er sendt inn, viser jeg en loader og sjekker med ajax-kall hvert sekund for å se om betalingsintensjonsstatusen min har endret seg (via webhook). For ditt testmiljø kan du bruke http://requestbin.net og Postman.

Advarsel: noen kort som refereres til på denne siden vil ikke fungere riktig (du kan ikke legge dem til) https://stripe.com/docs/testing#cards (seksjon 3D Secure testkortnumre og tokens). Bekreftet med deres support.

Hvis du arbeider med lagrede kort, kan du teste kun med disse kortene: https://stripe.com/docs/payments/cards/charging-saved-cards#testing