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

Validation 条带:验证可发布和机密API密钥,validation,stripe-payments,api-key,Validation,Stripe Payments,Api Key,我正在构建一个web应用程序,允许我们的用户出售音乐节目的门票。为了处理买票人和演出策划者之间的付款,我使用了Stripe。 基本上,节目策划者在我的应用程序上创建他的节目页面,用户可以购买该节目的门票 为了制作一个节目,节目策划者填写一份表格(节目名称、演出日期、演出地点、乐队演奏等)。该表格还要求节目策划者提供其可发布和保密的条带密钥。我的应用程序使用这两个令牌来检索信用卡信息(在客户端)和处理付款(在服务器端) 问题是,我想确保show教唆器提供有效且现有的条带密钥。我不希望我的用户偶然发

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

为了制作一个节目,节目策划者填写一份表格(节目名称、演出日期、演出地点、乐队演奏等)。该表格还要求节目策划者提供其可发布和保密的条带密钥。我的应用程序使用这两个令牌来检索信用卡信息(在客户端)和处理付款(在服务器端)

问题是,我想确保show教唆器提供有效且现有的条带密钥。我不希望我的用户偶然发现支付错误,因为show煽动者没有提供有效的条带密钥

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

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

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

作为表单验证的一部分,当两个密钥都给定时,它包含创建卡令牌所需的所有数据。您应该能够检查数据库中的响应,并确定可发布密钥是否有效

如果您从包含卡令牌的条带服务器获得成功响应,请右转并支付$0.50(最低收费金额)

确保正确捕获了所有条带异常。我相信用一个无效的密钥,你应该抓住一个机会。如果引发异常,您可以向用户报告

如果没有抛出错误,将进行指控。由于您不想向您的合作伙伴收费,因此您需要从条带响应中捕获收费id并立即执行。

明白了

要验证可发布密钥,您需要使用cURL向stripe请求新令牌。 如果给定的密钥无效,响应将包含一条错误消息,以“提供的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,“卡[number]=4242和卡[exp_month]=12和卡[exp_year]=2017和卡[cvc]=123”);
卷曲设置($ch,卷曲设置桩,1);
curl_setopt($ch,CURLOPT_USERPWD,$publishableKey.:”);
$response=json_decode(curl_exec($ch),true);
if(旋度误差($ch)){
echo“Error:”.curl_Error($ch);
}
卷曲关闭($ch);
if(substr($response[“error”][“message”]、0、24)=“提供的API密钥无效”){
echo“提供的API密钥无效”;
}

验证您的密钥也有同样的想法。

我一直在试图找到一种验证提供的条带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;
}       

验证密钥很容易,只需在服务器端用任何命令调用stripeapi即可

但是对于公钥。。。我找到了一种使用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 )
let stripe=stripe();
设置超时(()=>{
stripe.createToken('pii',{personal_id_number:'test'})
。然后(结果=>{
if(result.token)
//公钥有效:o)
其他的
//不!
})
}, 300 )
请注意调用stripe.createToken()之前的超时。如果不这样做,createToken()返回的承诺将永远不会回来


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

这是一个使用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>

Stripe.setPublishableKey(“{{FILL_THIS_WITH_YOURS}}”);
Stripe.createToken({},函数(状态,响应){
如果(状态==401){
//无效公钥
}否则{
//有效公钥
}
});

这是我在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
            }
        });
    });

简单明了的解释。谢谢你,朋友!虽然这个解决方案是有效的,但我刚刚发现了Strip Connect。它比自己管理API密钥更安全、更简单。当我点击该端点时,我会收到一条消息
无法识别的请求URL(get:/v1/tokens)。请看https://stripe.com/docs 或者我们可以随时提供帮助https://support.stripe.com/.“
@AdamParkin/v1/tokens只接受POST,不接受GET请求。您还需要指定
curl\u setopt($ch,CURLOPT\u POST,true)
。不使用POST$url=”;“错误”:{“类型”:“无效的请求\u错误”,“消息”:”您必须提供卡、客户、pii数据或银行帐户才能创建令牌。“}此答案仅在测试模式下有效。在生产中,它将以以下内容结束:
“错误”:{“代码”:“卡被拒绝”、“拒绝代码”:“实时模式测试卡”…}
您也可以只获取余额,而不是创建实际对象。这可以保持您的stripe帐户干净。注意:当然,您需要将include放在代码ex.js.stripe.com/v3/“>