У меня есть вопрос о том, чтобы сайт всегда взимал правильную карту (или банковский счет) для конкретного клиента на определенном сайте при подключении нескольких веб-сайтов к одной учетной записи Stripe.
- Сайт A - example1.com подключен к Stripe Account 1 через API
- Сайт B - example2.com подключен к Stripe Account 1 через API
Клиент 1 покупает что-то на сайте A с помощью кредитной карты 1 (скажем, своей визитной карточки), используя свою личную учетную запись электронной почты. Их электронная почта сохраняется с идентификатором клиента, а их источник установлен на визитную карточку. Затем Клиент 1 заходит на сайт B и покупает что-то на сайте B с помощью кредитной карты 2 (своей личной карты), но использует тот же адрес электронной почты.
Как я могу указать сайту B использовать определенную карту каждый раз без обновления карты по умолчанию, используемой для сайта A?
Обычно перед созданием учетной записи я проверяю, чтобы убедиться, что у клиента еще нет учетной записи с этим конкретным адресом электронной почты. Поэтому, если на сайте B используется тот же адрес электронной почты, что и на сайте A, для обоих сайтов будет найдена одна и та же учетная запись клиента. (Код упрощен для пояснения.)
<?php
// namespace statement
// use \Stripe statements
function exists ($email) {
$customers = Customer::all(['email' => $email]);
$count = 0;
if (isset ($customers['data'])) {
$count = count($customers['data']);
}
if ($count == 1) {
$c = current ($customers['data']);
if ($c instanceof Customer) {
return $c->id;
}
}
return false;
}
function create_customer ($email) {
// Try to get the customer id by email.
$cid = exists ($email);
// Customer not found create them.
if (!$cid) {
try {
$c = Customer::create([
'email' => $e->mail,
]);
return $c->id;
} catch(Exception $e) {
return false;
}
}
return $cid;
}
function set_source ($cid, $token) {
try {
// This updates the default card, if I am understanding the documentation correctly.
Customer::update($customer_id, ['source' => $token]);
return true;
} catch(Exception $e) {
_sec_set_error_messages ($e, $sandbox_message);
}
return false;
}
function charge ($cid, $amount) {
try {
// This charges the default card, if I am understanding the documentation correctly.
$charge = Charge::create([
'amount' => $amount,
'currency' => 'usd',
'customer' => $cid
]);
return $charge;
} catch (Exception $e) {
return false;
}
}
// check_my_db_for_customer_id();
// Create customer if not found.
$email = 'personal@example.com';
$cid = create_customer ($email);
if ($cid) {
// save_to_my_db($email, $cid);
set_source ($cid, $token);
charge ($cid, $amount);
}
?>
Проблема заключается в том, что при начислении оплаты клиенту указывать каждому сайту использовать определенную карту? Могу ли я сохранить источник во время функции set_source, а затем использовать этот же источник для определенного сайта при зарядке карты?
<?php
function set_source ($cid, $token) {
try {
// Need to add a source if one is found, not update the default.
$get_source_id_somehow = Customer::update($customer_id, ['source' => $token]);
return $get_source_id_somehow;
} catch(Exception $e) {
_sec_set_error_messages ($e, $sandbox_message);
}
return false;
}
function charge ($cid, $amount, $src) {
try {
$charge = Charge::create([
'amount' => $amount,
'currency' => 'usd',
'customer' => $cid,
'source' => $src
]);
return $charge;
} catch (Exception $e) {
return false;
}
}
// check_my_db_for_customer_id_and_source_id();
// Create customer if not found.
$email = 'personal@example.com';
$cid = create_customer ($email);
if ($cid) {
// save_to_my_db($email, $cid);
$src = set_source ($cid, $token);
// save_source_id_to_my_db ($src); ????
charge ($cid, $amount, $src);
}
?>
Или это единственный способ сделать это, чтобы подключить каждый сайт к отдельной учетной записи Stripe? Благодаря.
РЕДАКТИРОВАТЬ - Дополнительный вопрос
Будет ли это также угрозой безопасности? Если пользователь 1 регистрируется на сайте A, а затем пользователь 2 регистрируется на сайте B, используя электронную почту пользователя 1, ему, безусловно, необходимо ввести новые реквизиты платежа, чтобы при регистрации пользователя 2 не взималась карта пользователя 1.
РЕДАКТИРОВАТЬ 2 - Дополнительные мысли
Кажется, что учетные записи клиентов должны быть каким-то образом привязаны к одному сайту или приложению. Я не знаю, будет ли это подтверждено, но, возможно, пометив адрес электронной почты или клиента этим доменом (и их идентификатором пользователя) на этом сайте, таким образом, когда вы ищете подходящего клиента, вы найдете только клиента с соответствующим адресом электронной почты для этого. домен (и убедитесь, что он не используется уже, ища идентификатор пользователя). В противном случае Пользователь 2 может зарегистрироваться с электронной почтой Пользователя 1, и в зависимости от сайта может быть разрешено изменить свою электронную почту без предварительной проверки другого, и в этом случае вы не сможете обновить учетную запись клиента Stripe для Пользователя 2 на Сайте B без проблем для пользователя 1 на сайте A.
Это может привести к тому, что один и тот же адрес электронной почты клиента будет отображаться в вашей учетной записи Stripe несколько раз, но вы можете отсортировать по тегу, чтобы найти хотя бы отдельные домены и узнать, какие из них использовались по идентификатору пользователя.
Теперь, если пользователь 1 подписывается с personal@email.com на сайте A, он создает учетную запись Stripe, помеченную доменом сайта A и его идентификатором пользователя. Если мы не связываем его с идентификатором учетной записи, тогда пользователь 1 может переключить адрес электронной почты своего сайта на нечтоnew@email.com (если Stripe не обновлен), а затем, если пользователь 2 зарегистрируется с personal@email.com. на сайте A, и теперь учетная запись обнаружит, что учетная запись Stripe связана с personal@email.com, и обе учетные записи будут работать с одной учетной записи Stripe.
Похоже, что попытка сопоставить клиента перед созданием нового является плохим недостатком безопасности. Или электронная почта учетной записи Stripe должна обновляться вместе с сайтом, но дополнительные теги по-прежнему необходимо добавлять, чтобы предотвратить захват учетной записи Stripe пользователя 1.
Возможное решение - кто-нибудь может подтвердить?
Создавайте новую учетную запись Stripe каждый раз, когда кто-то регистрируется, и привязывайте его к идентификатору пользователя домена сайта для будущих поисков - это единственный безопасный способ сделать это.
<?php
$customer = Customer::create([
'email' => 'paying.user.3@example.com',
'metadata' => [
'site' => 'test/',
'uid' => '6'
]
]);
Тогда вы можете искать вот так ... Не самый элегантный способ, поскольку вы теряете собственный способ разбивать на страницы результаты поиска в обмен на более точный результат, так как метаданные не доступны через Customer :: all () [который я знаю из].
<?php
$customers = Customer::all(['email' => $email]);
$matches = [];
foreach ($customers['data'] as $c) {
if (
$c->metadata && is_object ($c->metadata) &&
$c->metadata->site && $c->metadata->site == 'test/' &&
$c->metadata->uid && $c->metadata->uid == $uid
) {
$matches[] = $c;
}
}