我确信我在这里遗漏了一些明显的东西,但是我无法理解如何检查现有的卡片对顾客。
我在laravel应用程序中使用条带连接api来代表其他人管理付款,基本过程如下:
token
是通过stripe.js
创建的,并使用付款方式提交stripe_id
,否则使用令牌作为源/卡创建新客户charge
stripe_id
目前,如果客户退回并使用其他卡,因为该费用仅包括客户,而非来源,无论如何都会根据其默认卡收费。
我想做的是:
token
customer
card
指纹card
customer
和card
ids 简单地说:我无法看到生成持久card_id
的过程中的哪个位置; stripe.js
响应中使用的那些以及在条带仪表板中创建的那些看起来都是唯一的,这意味着每次收费都会创建一个全新的卡片对象。
我知道我可以检索存储在客户帐户中的卡片列表 - 但是我从哪里获取初始card_id
来搜索?
我在这里看到了一个触及这个问题的问题 - Can I check whether stripe a card is already existed before going to create new one? - 但我不认识Ruby,所以不能做出头脑或尾巴。
修改
更简单的版本 - 有没有办法像这里的条纹文档中所述获得fingerprint
- https://stripe.com/docs/api/php#card_object - 而无需先创建卡片对象?
答案 0 :(得分:17)
所以这里的想法是使用Card对象或Token对象上的fingerprint
而不是id本身,因为如果你添加相同的卡多个那么会有所不同次。
当您获得新的卡片令牌时,您可以通过Retrieve Token API检索它,并在fingerprint
哈希中查找card
。
您将在数据库中保留与特定客户和/或卡相关联的已知指纹列表,以便您可以检测到重复的卡片。
注意:确保使用密钥来获取这些信息。否则,如果您使用可发布密钥,则可能无法获得指纹值。
答案 1 :(得分:0)
我创建了一个函数来做到这一点:
$customer
是条纹客户对象$stripe_account
是您帐户的条纹ID或关联帐户的条纹ID $token
来自stripe.js元素$check_exp
允许您决定是否还要检查卡的到期日期,因为如果卡号相同,指纹不会更改条带化PHP API 7.0.0
function check_duplicate_card($customer, $stripe_account, $token, $check_exp) {
$loc = "check_duplicate_card >> ";
$debug = true;
if ($debug) {
// see here for an explanation for logging: http://php.net/set_error_handler >> Examples
trigger_error("$loc started", E_USER_NOTICE);
}
try
{
// get token data
$response = \Stripe\Token::retrieve(
$token,
["stripe_account" => $stripe_account]
);
$token_fingerprint = $response->card->fingerprint;
$token_exp_month = $response->card->exp_month;
$token_exp_year = $response->card->exp_year;
if ($debug) {
trigger_error("$loc token_fingerprint = $token_fingerprint; token_exp_month = $token_exp_month; token_exp_year = $token_exp_year", E_USER_NOTICE);
}
// check for duplicate source
if ($debug) {
trigger_error("$loc customer sources = " . json_encode($customer->sources), E_USER_NOTICE);
}
$duplicate_found = false;
foreach ($customer->sources->data as &$value) {
// get data
$fingerprint = $value->fingerprint;
$exp_month = $value->exp_month;
$exp_year = $value->exp_year;
if ($fingerprint == $token_fingerprint) {
if ($check_exp) {
if (($exp_month == $token_exp_month) && ($exp_year == $token_exp_year)) {
$duplicate_found = true;
break;
}
} else {
$duplicate_found = true;
break;
}
}
}
if ($debug) {
trigger_error("$loc duplicate_found = " . json_encode($duplicate_found), E_USER_NOTICE);
}
} catch (Exception $e) {
if ($e instanceof \Stripe\Exception\ApiErrorException) {
$return_array = [
"status" => $e->getHttpStatus(),
"type" => $e->getError()->type,
"code" => $e->getError()->code,
"param" => $e->getError()->param,
"message" => $e->getError()->message,
];
$return_str = json_encode($return_array);
trigger_error("$loc $return_str", E_USER_WARNING);
http_response_code($e->getHttpStatus());
echo $return_str;
} else {
$return_array = [
"message" => $e->getMessage(),
];
$return_str = json_encode($return_array);
trigger_error("$loc $return_str", E_USER_ERROR);
http_response_code(500); // Internal Server Error
echo $return_str;
}
}
if ($debug) {
trigger_error("$loc ended", E_USER_NOTICE);
}
return $duplicate_found;
}