Я использую SDK PayPal для обработки платежей и хранения информации о кредитных картах после создания заказа. Поток действий следующий:
-
Создается заказ.
-
SDK PayPal захватывает заказ с введенными данными карты (у нас нет доступа к этим данным карты на клиентской стороне, так как SDK PayPal отображает поля для ввода карты)
-
При успешном завершении карта сохраняется под идентификатором клиента.
Проблема, с которой я сталкиваюсь, заключается в том, что если тот же пользователь снова вводит ту же карту, карта сохраняется вторично, что создает дубликаты сохраненных карт.
Что мне нужно:
- Если пользователь пытается снова сохранить ту же карту, она не должна сохраняться.
- У нас нет доступа к данным карты на клиентской стороне, поэтому мы не можем напрямую сравнить номера карт.
Мои текущие атрибуты для сохранения выглядят так:
$payment_source = $customer_exist ? [
"card" => [
"attributes" => [
"customer" => [
"id" => $customer_id,
],
],
"vault" => [
"store_in_vault" => "ON_SUCCESS",
"usage_type" => "PLATFORM",
"customer_type" => "CONSUMER",
"permit_multiple_payment_tokens" => true,
],
"verification" => [
"method" => "SCA_ALWAYS", // или "SCA_WHEN_REQUIRED"
]
],
"experience_context" => [
"shipping_preference" => "NO_SHIPPING",
"return_url" => isset($return_url) && $return_url ? $return_url : "https://example.com",
"cancel_url" => "https://example.com"
]
] : null;
Что я попробовал:
Я установил "permit_multiple_payment_tokens" => false, чтобы предотвратить создание нескольких токенов, но это не решило проблему.
Поскольку у нас нет доступа к фактическим данным карты (только токенизованная версия, управляемая PayPal), есть ли способ проверить, сохранена ли карта уже, прежде чем создавать для нее новую запись?
Есть ли какие-либо предложения по решению этой проблемы?
Ответ
Чтобы предотвратить добавление дублирующих карт в хранилище PayPal, вы можете использовать уникальный идентификатор для каждой карты, который будет храниться в вашем приложении. Хотя вы не имеете доступа к данным карты (например, номеру карты), существует способ узнать, была ли эта карта уже добавлена в хранилище, основываясь на идентификаторе платежного источника, который возвращает PayPal.
Вот как вы можете подойти к решению проблемы:
Шаги по предотвращению добавления дубликатов карт
-
Получение информации о карте: После успешной обработки заказа и сохранения карты, вы должны сохранить идентификатор платежного источника, который возвращает PayPal. Он будет уникален для каждой карты, который был добавлен в хранилище.
-
Проверка существования карты: Перед тем, как вы будете пытаться сохранить новую карту, проверяйте, существует ли уже идентификатор платежного источника в вашем приложении. Это может быть простое SQL-запрос в базу данных или применение других методов хранения данных.
- Обновление логики сохранения карты:
- При создании нового заказа или при добавлении карты для существующего пользователя, сначала проверьте, не существует ли уже карта с таким же идентификатором.
- Если идентификатор уже есть, не выполняйте операцию по добавлению карты в хранилище.
- Если идентификатор отсутствует, вы можете безопасно добавить новую карту в хранилище.
Пример реализации
Для примера, предположим, что ваш массив карт в базе данных выглядит следующим образом:
$user_cards = [
[
'payment_source_id' => '123456789',
'customer_id' => $customer_id,
// другие атрибуты
],
// другие карты
];
Когда вы готовы к созданию новой карты:
$new_card_id = 'новый_payment_source_id_от_PayPal';
// Проверьте, не существует ли уже карта с таким ID
$card_exists = false;
foreach ($user_cards as $card) {
if ($card['payment_source_id'] === $new_card_id) {
$card_exists = true;
break;
}
}
if (!$card_exists) {
// Логика для встраивания платежного источника
$payment_source = [
"card" => [
"attributes" => [
"customer" => [
"id" => $customer_id,
],
],
"vault" => [
"store_in_vault" => "ON_SUCCESS",
"usage_type" => "PLATFORM",
"customer_type" => "CONSUMER",
"permit_multiple_payment_tokens" => false, // Убедитесь, что это false
],
"verification" => [
"method" => "SCA_ALWAYS",
],
],
"experience_context" => [
"shipping_preference" => "NO_SHIPPING",
"return_url" => isset($return_url) && $return_url ? $return_url : "https://example.com",
"cancel_url" => "https://example.com"
],
];
// Ваш код для добавления карты через PayPal SDK
} else {
// Сообщить пользователю, что карта уже хранится
}
Заключение
Такой подход позволит предотвратить дублирование карт в вашем хранилище, используя идентификаторы платежных источников, предоставляемые PayPal. Обязательно протестируйте реализацию, чтобы убедиться, что логика работает корректно в различных сценариях использования.