条带:验证可发布和秘密API密钥

时间:2013-05-05 19:19:30

标签: validation stripe-payments api-key

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

为了创作一个节目,煽动者填写一个表格(节目的名称,节目的日期,节目将在哪里播放,将播放什么乐队等)。此表格还要求节目发起人提供他的两个可发布和秘密条纹键。我的应用程序使用这两个令牌来检索信用卡信息(在客户端)和处理付款(在服务器端)。

问题是,我想确保节目发起人提供有效和现有的条带键。我不希望我的用户偶然发现付款错误,因为展示发起人没有提供有效的条带密钥。

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

6 个答案:

答案 0 :(得分:10)

知道了!

要验证您的可发布密钥,您只需使用 cURL 向条带请求新令牌。 如果给定密钥无效,则响应将包含以“提供的无效API密钥”开头的错误消息。

以下是用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";
}

验证密钥的相同想法。

答案 1 :(得分:2)

验证密钥很容易,只需在服务器端使用任何命令调用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的确认;这是一种有效且可以接受的方法。

答案 2 :(得分:1)

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

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

作为表单验证的一部分,当给出两个密钥时,submit a hidden form包含创建卡令牌所需的所有数据。您应该能够检查create card token response handler中的响应并确定可发布密钥是否有效。

如果您从包含卡片令牌的条带服务器获得成功回复,请右转并submit a test charge以0.50美元(最低费用金额)。

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

如果没有错误,将收取费用。由于您不想向合作伙伴收费,因此您需要立即从条带响应中捕获费用ID refund the charge

答案 3 :(得分: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;
}       

答案 4 :(得分: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>

答案 5 :(得分: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
            }
        });
    });