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