Предотвращение сохранения дубликатов карточек с использованием PayPal SDK на PHP без доступа к данным карты

Вопросы и ответы

Я использую SDK PayPal для обработки платежей и хранения информации о кредитных картах после создания заказа. Поток действий следующий:

  1. Создается заказ.

  2. SDK PayPal захватывает заказ с введенными данными карты (у нас нет доступа к этим данным карты на клиентской стороне, так как SDK PayPal отображает поля для ввода карты)

  3. При успешном завершении карта сохраняется под идентификатором клиента.

Проблема, с которой я сталкиваюсь, заключается в том, что если тот же пользователь снова вводит ту же карту, карта сохраняется вторично, что создает дубликаты сохраненных карт.

Что мне нужно:

  1. Если пользователь пытается снова сохранить ту же карту, она не должна сохраняться.
  2. У нас нет доступа к данным карты на клиентской стороне, поэтому мы не можем напрямую сравнить номера карт.

Мои текущие атрибуты для сохранения выглядят так:

  $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.

Вот как вы можете подойти к решению проблемы:

Шаги по предотвращению добавления дубликатов карт

  1. Получение информации о карте: После успешной обработки заказа и сохранения карты, вы должны сохранить идентификатор платежного источника, который возвращает PayPal. Он будет уникален для каждой карты, который был добавлен в хранилище.

  2. Проверка существования карты: Перед тем, как вы будете пытаться сохранить новую карту, проверяйте, существует ли уже идентификатор платежного источника в вашем приложении. Это может быть простое SQL-запрос в базу данных или применение других методов хранения данных.

  3. Обновление логики сохранения карты:
    • При создании нового заказа или при добавлении карты для существующего пользователя, сначала проверьте, не существует ли уже карта с таким же идентификатором.
    • Если идентификатор уже есть, не выполняйте операцию по добавлению карты в хранилище.
    • Если идентификатор отсутствует, вы можете безопасно добавить новую карту в хранилище.

Пример реализации

Для примера, предположим, что ваш массив карт в базе данных выглядит следующим образом:

$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. Обязательно протестируйте реализацию, чтобы убедиться, что логика работает корректно в различных сценариях использования.

Оцените материал
Добавить комментарий

Капча загружается...