我正在构建一个允许我们的用户销售音乐节目门票的网络应用程序。为了处理购票者和节目发起人之间的付款,我使用Stripe。 基本上,节目发起人在我的应用程序上创建他的节目页面,用户可以购买此节目的门票。
为了创作一个节目,煽动者填写一个表格(节目的名称,节目的日期,节目将在哪里播放,将播放什么乐队等)。此表格还要求节目发起人提供他的两个可发布和秘密条纹键。我的应用程序使用这两个令牌来检索信用卡信息(在客户端)和处理付款(在服务器端)。
问题是,我想确保节目发起人提供有效和现有的条带键。我不希望我的用户偶然发现付款错误,因为展示发起人没有提供有效的条带密钥。
所以,我的问题是: 如何验证可发布密钥和密钥是否有效且存在?实现这一目标的最佳策略是什么?谢谢!
答案 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
}
});
});