Полоса API, проверка на наличие карты
Я уверен, что я упускаю что-то очевидное здесь, но я не могу понять, как проверить существующую карту для клиента.
Я использую API-интерфейс stripe connect в приложении laravel для управления платежами от имени других, и основной процесс заключается в следующем:
- полоса
token
создается черезstripe.js
и представлены с формой оплаты - если клиент существует в локальной базе данных, я беру его
stripe_id
в противном случае новый клиент создается с использованием токена в качестве источника / карты charge
затем создается с использованием восстановленного или нового клиентаstripe_id
В настоящее время, если клиент возвращается и использует другую карту, поскольку плата включает только клиента, а не источник, он будет списываться с карты по умолчанию, независимо от того.
Что я хотел бы сделать, это:
- создать полосу
token
- проверять
customer
против локальной базы данных и т. д. - проверять
card
отпечаток пальца на карточках клиента - при необходимости создайте новый
card
на записи клиента - создать заряд, используя оба
customer
а такжеcard
идентификаторы
Проще говоря: я не вижу, где в процессе постоянный card_id
генерируется; как те, что используются в stripe.js
ответ, и когда он создается на приборной панели полосы, кажется уникальным, что означает, что каждый заряд создает совершенно новый объект карты в полосе.
Я знаю, что могу получить список карточек, хранящихся в учетной записи клиента, но где я могу получить начальную card_id
от искать против?
Я видел вопрос, который касается этого здесь - могу ли я проверить, существует ли полоса карты, прежде чем создавать новую? - но я не знаю Руби, так что не могу понять, как это сделать.
РЕДАКТИРОВАТЬ:
Более простая версия - есть ли способ получить fingerprint
как описано в документах с полосами здесь - https://stripe.com/docs/api/php - без необходимости сначала создавать объект карты?
1 ответ
Так что идея здесь заключается в том, чтобы использовать fingerprint
на объекте Card или Token, а не на самом идентификаторе, так как они будут разными, если вы добавляете одну и ту же карту несколько раз.
Когда вы получаете новый токен карты, вы можете получить его с помощью API Retrieve Token и найти fingerprint
в card
хэш.
В вашей базе данных будет храниться список известных отпечатков пальцев, связанных с конкретным клиентом и / или картой, чтобы можно было обнаружить дубликаты карт.
ПРИМЕЧАНИЕ: убедитесь, что вы используете секретные ключи для получения этой информации. в противном случае, если вы используете публикуемый ключ, вы можете не получить значение отпечатка пальца.
Я создал для этого функцию:
$customer
это объект клиента полосы$stripe_account
это либо идентификатор полосы вашей учетной записи, либо идентификатор полосы подключенной учетной записи$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; }