触发 Stripe SCA 重定向以进行身份​​验证

问题描述

我有这个条纹文件 const [mounted,setMounted]=useState(false) const handleChange=useCallback(_.debounce(selectFilter,1000),[]) const router = useRouter() const [value,setValue]=useState('') function selectFilter(value){ let filter_search=(filter.id+'-'+value+'-'+value) let qs= {...router.query} let last_qsf=qs['filters']; let filters; if (value!==null){//add filter alert(JSON.stringify(qs)) if (Array.isArray(last_qsf)){ alert('is array') filters=[...last_qsf,filter_search] } else if (typeof last_qsf==='string'){ alert('is string') let [id,opt,val]=last_qsf.split('-') alert(id) filters= [last_qsf,filter_search] }else{//always comes here without refresh alert('undefined') filters=[filter_search] } } router.push({ pathname: router.pathname,query:{...router.query,filters:filters} },undefined,{ shallow: true }) } return ( <NumberFormat placeHolder={filter.label} onValueChange={(values)=> { setValue(values.value) handleChange(values.value) }} displayType={'number'} value={value} thousandSeparator={true} className="form-control c-form-builder-input mt-15" />)

StripePayment.PHP

我是这样给卡充电的

<?PHP

require_once 'vendor/autoload.PHP';

use \Stripe\Stripe;
use \Stripe\Customer;
use \Stripe\ApiOperations\Create;
use \Stripe\Charge;

class StripePayment
{

    private $apiKey;

    private $stripeService;

    public function __construct()
    {
        require_once "config.PHP";
        $this->apiKey = STRIPE_SECRET_KEY;
        $this->stripeService = new \Stripe\Stripe();
        $this->stripeService->setVerifySslCerts(false);
        $this->stripeService->setApiKey($this->apiKey);
    }

    public function addCustomer($customerDetailsAry)
    {
        
        $customer = new Customer();
        
        $customerDetails = $customer->create($customerDetailsAry);
        
        return $customerDetails;
    }

    public function chargeAmountFromCard($cardDetails)
    {
        $customerDetailsAry = array(
            'email' => $cardDetails['email'],'source' => $cardDetails['token']
        );
        $customerResult = $this->addCustomer($customerDetailsAry);
        $charge = new Charge();
        $cardDetailsAry = array(
            'customer' => $customerResult->id,'amount' => $cardDetails['amount']*100,'currency' => $cardDetails['currency_code'],'description' => $cardDetails['item_name'],'Metadata' => array(
                'order_id' => $cardDetails['item_number']
            )
        );
        $result = $charge->create($cardDetailsAry);

        return $result->jsonSerialize();
    }
}

代码可以充值卡,但不能充值需要 3D/SCA 的卡,即欧洲卡。

我的问题是,有没有办法可以请求 Stripe 将用户重定向到发卡银行进行身份验证,以便用户可以授权交易?

我的条纹表单代码如下

<?PHP
ini_set('display_errors','1');
ini_set('display_startup_errors','1');
error_reporting(E_ALL);

require_once "config.PHP";

if (!empty($_POST["token"])) {
    require_once 'StripePayment.PHP';
    $stripePayment = new StripePayment();
    
    $stripeResponse = $stripePayment->chargeAmountFromCard($_POST);
    
    require_once "DBController.PHP";
    $dbController = new DBController();
    
    $amount = $stripeResponse["amount"] /100;
    
    $param_type = 'ssdssss';
    $param_value_array = array(
        $_POST['email'],$_POST['item_number'],$amount,$stripeResponse["currency"],$stripeResponse["balance_transaction"],$stripeResponse["status"],json_encode($stripeResponse)
    );

根据有关如何手动要求用户重定向到银行网址以进行进一步身份验证的文档https://stripe.com/docs/payments/3d-secure#manual-three-ds

<form id="frmStripePayment" action=""
                method="post">
                <div class="field-row">
                    <label>Card Holder Name</label> <span
                        id="card-holder-name-info" class="info"></span><br>
                    <input type="text" id="name" name="name"
                        class="demoInputBox">
                </div>
                <div class="field-row">
                    <label>Email</label> <span id="email-info"
                        class="info"></span><br> <input type="text"
                        id="email" name="email" class="demoInputBox">
                </div>
                <div class="field-row">
                    <label>Card Number</label> <span
                        id="card-number-info" class="info"></span><br> <input
                        type="text" id="card-number" name="card-number"
                        class="demoInputBox">
                </div>
                <div class="field-row">
                    <div class="contact-row column-right">
                        <label>Expiry Month / Year</label> <span
                            id="userEmail-info" class="info"></span><br>
                        <select name="month" id="month"
                            class="demoselectBox">
                <option value="02">02</option>
                            <option value="03">03</option>
                            <option value="04">04</option>
                            <option value="05">05</option>
                            <option value="06">06</option>
                            <option value="07">07</option>
                            <option value="08">08</option>
                            <option value="08">08</option>
                            <option value="08">08</option>
                            <option value="09">09</option>
                            <option value="10">10</option>
                            <option value="11">11</option>
                            <option value="12">12</option>
                        </select> <select name="year" id="year"
                            class="demoselectBox">
                            <option value="21">2021</option>
                            <option value="22">2022</option>
                            <option value="23">2023</option>
                            <option value="24">2024</option>
                            <option value="25">2025</option>
                            <option value="26">2026</option>
                            <option value="27">2027</option>
                            <option value="28">2028</option>
                            <option value="29">2029</option>
                            <option value="30">2030</option>
                        </select>
                    </div>
                    <div class="contact-row cvv-Box">
                        <label>CVC</label> <span id="cvv-info"
                            class="info"></span><br> <input type="text"
                            name="cvc" id="cvc"
                            class="demoInputBox cvv-input">
                    </div>
                </div>
                <div>
                    <input type="submit" name="pay_Now" value="Submit"
                        id="submit-btn" class="btnAction"
                        onClick="stripePay(event);">

                    <div id="loader">
                        <img alt="loader" src="LoaderIcon.gif">
                    </div>
                </div>
                <input type='hidden' name='amount' value='1100'> <input
                    type='hidden' name='currency_code' value='USD'> <input
                    type='hidden' name='item_name' value='Solidroof Product'>
                <input type='hidden' name='item_number'
                    value='SCA#Test'>
            </form>


    <script>
function cardValidation () {
    var valid = true;
    var name = $('#name').val();
    var email = $('#email').val();
    var cardNumber = $('#card-number').val();
    var month = $('#month').val();
    var year = $('#year').val();
    var cvc = $('#cvc').val();

    $("#error-message").html("").hide();

    if (name.trim() == "") {
        valid = false;
    }
    if (email.trim() == "") {
           valid = false;
    }
    if (cardNumber.trim() == "") {
           valid = false;
    }

    if (month.trim() == "") {
            valid = false;
    }
    if (year.trim() == "") {
        valid = false;
    }
    if (cvc.trim() == "") {
        valid = false;
    }

    if(valid == false) {
        $("#error-message").html("All Fields are required").show();
    }

    return valid;
}
//set your publishable key
Stripe.setPublishableKey("<?PHP echo STRIPE_PUBLISHABLE_KEY; ?>");

//callback to handle the response from stripe
function stripeResponseHandler(status,response) {
    if (response.error) {
        //enable the submit button
        $("#submit-btn").show();
        $( "#loader" ).css("display","none");
        //display the errors on the form
        $("#error-message").html(response.error.message).show();
    } else {
        //get token id
        var token = response['id'];
        //insert the token into the form
        $("#frmStripePayment").append("<input type='hidden' name='token' value='" + token + "' />");
        //submit form to the server
        $("#frmStripePayment").submit();
    }
}
function stripePay(e) {
    e.preventDefault();
    var valid = cardValidation();

    if(valid == true) {
        $("#submit-btn").hide();
        $( "#loader" ).css("display","inline-block");
        Stripe.createtoken({
            number: $('#card-number').val(),cvc: $('#cvc').val(),exp_month: $('#month').val(),exp_year: $('#year').val()
        },stripeResponseHandler);

        //submit from callback
        return false;
    }
}
</script>

stripe sdk 是否会自动知道要重定向到的银行 URL 或提供该信息的人?

解决方法

银行托管的身份验证 URL 通过通过 redirect_to_url.url 重定向来处理,或者在 Stripe.js v3 (migration guide) 中使用带有 confirmCardPayment 的 Stripe 支付意图 API 时自动管理.如果您使用 confirmCardPayment,则您自己根本不需要管理重定向。这是支持 3D Secure 的推荐方法。

您可以support 3DS using the Sources API,但已弃用且不再推荐。

,

将 return_url 指定为 return_url:window.location.href 它将返回到付款开始的页面。