13

我正在构建一个 Web 应用程序,它允许我们的用户出售音乐节目的门票。为了处理购票者和演出策划者之间的付款,我使用 Stripe。基本上,节目发起人在我的应用程序上创建他的节目页面,用户可以购买该节目的门票。

为了创建一个节目,发起人填写一份表格(节目名称、演出日期、演出地点、将演奏哪些乐队等)。该表格还要求节目发起人提供他的 Publishable 和 Secret条纹键。我的应用程序使用这两个令牌来检索信用卡信息(在客户端)和处理付款(在服务器端)。

问题是,我想确保 show instigators 提供有效且现有的 Stripe keys。我不希望我的用户偶然发现付款错误,因为表演发起者没有提供有效的 Stripe 密钥。

所以,我的问题是: 如何验证 Publishable 和 Secret 密钥是否有效且存在?实现这一目标的最佳策略是什么?谢谢!

4

6 回答 6

12

知道了!

要验证您的可发布密钥,您需要使用cURL向 stripe 请求新令牌。如果给定的密钥无效,则响应将包含以"Invalid API Key provided"开头的错误消息。

这是一个用 PHP 编写的示例:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://api.stripe.com/v1/tokens");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "card[number]=4242424242424242&card[exp_month]=12&card[exp_year]=2017&card[cvc]=123");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, $publishableKey . ":");

$response = json_decode(curl_exec($ch),true);

if( curl_errno($ch) ){
    echo 'Error:' . curl_error($ch);
}
curl_close ($ch);

if(substr($response["error"]["message"],0, 24 ) == "Invalid API Key provided"){
    echo "Invalid API Key provided";
}

验证您的密钥的想法相同。

于 2014-03-12T22:53:55.020 回答
4

验证密钥很容易,只需在服务器端使用任何命令调用 Stripe API。

但是对于公钥......我找到了一种使用 Stripe.js 的方法:

let stripe = Stripe( <public key to test> );
setTimeout( ()=>{
    stripe.createToken('pii', {personal_id_number: 'test'})
        .then( result =>{
            if( result.token )
               // public key is valid :o)
            else 
              // nope !
        })
}, 300 )

在调用 stripe.createToken() 之前注意超时。如果你不这样做, createToken() 返回的承诺将永远不会回来。

更新:刚刚收到 Stripe 的确认;这是一种有效且可接受的方法。

于 2020-04-02T21:30:07.653 回答
2

我不知道有任何记录在案的 api 调用可以专门用于验证密钥。这是您可以尝试的建议:

要求您的合作伙伴提供有效的信用卡并通知他们,为了验证他们的 Stripe 密钥,您将向他们的卡收取 0.50 美元的费用,该费用将立即退还。

作为表单验证的一部分,当给出两个键时,提交一个隐藏表单,其中包含创建卡令牌所需的所有数据。您应该能够检查创建卡令牌响应处理程序中的响应并确定可发布密钥是否有效。

如果您从条带服务器收到包含卡令牌的成功响应,请右转并提交0.50 美元(最低收费金额)的测试费用。

确保您正确捕获了所有条带异常。我相信使用无效的密钥,您应该捕获Stripe_InvalidRequestError。如果抛出异常,您可以向用户报告。

如果没有抛出错误,将进行收费。由于您不想向合作伙伴收费,因此您需要从条带响应中获取费用 ID 并立即退还费用

于 2013-05-06T17:54:54.657 回答
1

我一直在尝试找出一种验证提供的 Stripe API 密钥的好方法。我想出了一种方法来验证密钥,而无需通过创建测试客户进行购买。我仍在研究验证可发布密钥,但我认为这可能对某人有所帮助。

这是一个 PHP 示例:

try {
    \Stripe\Stripe::setApiKey($secret_key);

    // create a test customer to see if the provided secret key is valid
    $response = \Stripe\Customer::create(["description" => "Test Customer - Validate Secret Key"]); 

    return true;
}
// error will be thrown when provided secret key is not valid
catch (\Stripe\Error\InvalidRequest $e) {
    // Invalid parameters were supplied to Stripe's API
    $body = $e->getJsonBody();
    $err  = $body['error'];

    $messages = array();
    $messages[] = 'Status is: ' . $e->getHttpStatus();
    $messages[] = 'Type is: ' . $err['type'];
    $messages[] = 'Code is: ' . $err['code'];
    $messages[] = 'Decline Code is: ' . $err['decline_code'];
    $messages[] = 'Message: ' . $err['message'];

    return false;
}
catch (\Stripe\Error\Authentication $e) {
    // Authentication with Stripe's API failed
    // (maybe you changed API keys recently)
    $body = $e->getJsonBody();
    $err  = $body['error'];

    $messages = array();
    $messages[] = 'Status is: ' . $e->getHttpStatus();
    $messages[] = 'Type is: ' . $err['type'];
    $messages[] = 'Code is: ' . $err['code'];
    $messages[] = 'Decline Code is: ' . $err['decline_code'];
    $messages[] = 'Message: ' . $err['message'];

    return false;
}
catch (\Stripe\Error\ApiConnection $e) {
    // Network communication with Stripe failed
    $body = $e->getJsonBody();
    $err  = $body['error'];

    $messages = array();
    $messages[] = 'Status is: ' . $e->getHttpStatus();
    $messages[] = 'Type is: ' . $err['type'];
    $messages[] = 'Code is: ' . $err['code'];
    $messages[] = 'Decline Code is: ' . $err['decline_code'];
    $messages[] = 'Message: ' . $err['message'];

    return false;
}
catch (\Stripe\Error\Base $e) {
    // Display a very generic error to the user, and maybe send
    // yourself an email
    $body = $e->getJsonBody();
    $err  = $body['error'];

    $messages = array();
    $messages[] = 'Status is: ' . $e->getHttpStatus();
    $messages[] = 'Type is: ' . $err['type'];
    $messages[] = 'Code is: ' . $err['code'];
    $messages[] = 'Decline Code is: ' . $err['decline_code'];
    $messages[] = 'Message: ' . $err['message'];

    return false;
}
catch (Exception $e) {
    // Something else happened, completely unrelated to Stripe
    $body = $e->getJsonBody();
    $err  = $body['error'];

    $messages = array();
    $messages[] = 'Status is: ' . $e->getHttpStatus();
    $messages[] = 'Type is: ' . $err['type'];
    $messages[] = 'Code is: ' . $err['code'];
    $messages[] = 'Decline Code is: ' . $err['decline_code'];
    $messages[] = 'Message: ' . $err['message'];

    return false;
}       
于 2019-01-04T19:57:43.320 回答
0

这是使用 js 的有效客户端验证示例

<script type="text/javascript" src="https://js.stripe.com/v2/"></script>

<script>
    Stripe.setPublishableKey('{{FILL_THIS_WITH_YOURS}}');
    Stripe.createToken({}, function(status, response) {
        if (status == 401) {
            //invalid public key
        } else {
            //valid public key
        }
    });
</script>
于 2020-06-17T20:12:56.647 回答
0

这是我使用 Stripe JS v3 找到的用于验证公钥的最简单的解决方案。

然后,如果密钥有效,您可以使用 ajax 发送表单并使用同一系统验证密钥服务器端。

$('body').on('submit', '.stripe_validate_keys', function(e){
        e.preventDefault();

        //public key submitted by your form
        var public_key = $('.stripe_validate_keys').find('input[name="ba_stripe_public"]').val();

        
        stripe = Stripe( public_key, {
            betas: ['payment_intent_beta_3']
        });

        //Trying to retrieve a customer who don't exist
        //You have to pass only the prefix
        stripe.retrieveSource({
            id: 'src_',
            client_secret: 'src_client_secret_',
        })
        .then(function(result) {
            var res = result.error.message;
            

            var test = res.search( 'Invalid API Key' );
            

            if( test === 0 ){
                //Key invalid
            } else {
                //Now you can submit your form for validate secret key server side
            }
        });
    });
于 2021-03-13T11:59:48.130 回答