Должны ли транзакции с кредитной картой только для аутентификации храниться отдельно от транзакций с аутентификацией и захватом в базе данных?

Задний план

Я создал приложение электронной коммерции, которое подключается к платежному шлюзу Authorize.net. Администраторы могут обрабатывать кредитные карты следующими способами:

  1. «Захват» транзакции, когда администратор немедленно списывает средства с кредитной карты клиента.
  2. Транзакция «только для аутентификации», при которой администратор авторизует $X с кредитной карты, а затем фактически фиксирует сумму позже (см. номер 3 ниже).
  3. Транзакция «Prior-Auth-Capture», когда администратор фиксирует сумму, равную или меньшую, чем сумма, ранее полученная из транзакции «Auth-Only».

Этот вопрос относится к тому, как эти типы транзакций должны храниться в базе данных. У меня есть следующая схема в моей таблице «Платежи»:

таблица платежей  схема

Когда производится новый платеж, я сохраняю информацию о способе оплаты в поле PaymentAmount (например, кредитная карта, чек, наличные).

Если PaymentType — «Кредитная карта», я сохраняю TransactionType (например, Capture, Auth-Only, Prior-Auth-Capture).

Столбец PaymentAmount содержит сумму платежа (если TransactionType имеет значение "capture" или "preor-auth-capture". Если TrandactionType имеет значение "Auth-Only", я сохраняю сумма в столбце AuthorizedAmount и отслеживайте дату, на которую разрешена сумма авторизации, в AuthExpDate.

Поля, связанные с транзакционными/справочными данными Authorize.net, хранятся в столбцах ApprovalCode и TransactionID.

Вернуться к вопросу

Теперь, когда у вас есть небольшая предыстория, давайте углубимся в детали моего вопроса: должна ли каждая транзакция иметь свою собственную запись в этой таблице? Или мне следует обновить существующие транзакции для транзакций «только для аутентификации», когда я получаю от них средства?

Примеры:

  1. Новая запись для каждого действия: если пользователь совершает транзакцию «только для авторизации», я создам новую запись в таблице «Платежи». Если пользователь позже запускает транзакцию «pre-auth-capture» в исходной транзакции, должен ли я создать вторую строку в базе данных или обновить исходную транзакцию и добавить полученную сумму в столбец PaymentAmount?

    PaymentsID  TransactionID  PaymentType  PaymentAmount  AuthorizedAmount
    ------------------------------------------------------------------------
        1          ABC123         Auth           0.00           100.00
        2          ABC123      Auth-Capture    100.00             0.00
    
  2. Одна строка для каждого TransactionID и обновление исходной транзакции при каждом автоматическом захвате.

    PaymentsID  TransactionID  PaymentType  PaymentAmount  AuthorizedAmount
    ------------------------------------------------------------------------
        1          ABC123         Auth           100.00           100.00
    

Логически я вижу аргументы для обоих случаев. С одной стороны, если я создам новую строку с каждой транзакцией, я смогу увидеть хорошую историю каждого обращения к каждой транзакции «только для авторизации». Недостатком является то, что в обстоятельствах, когда вы выполняете несколько транзакций «до аутентификации» против одной транзакции «только для аутентификации», потому что, чтобы выяснить, сколько у вас осталось, вам нужно написать немного более сложный запрос (присоединение таблицы к самой себе). и группировка по TransactionID для получения суммы PaymentAmount).

Если я создам одну строку для каждого TransactionID, я смогу легко обновить PaymentAmount и вычислить сумму, оставшуюся в авторизации, используя простой расчет (AuthorizedAmount - PaymentAmount = AuthorizedBalance). Этот подход также делает вещи чище, поскольку TransactionID, ApprovalCode, информация о платеже и почти все остальное останутся прежними, поэтому у вас будет меньше избыточных данных в таблице. Кроме того, с точки зрения отчетности большинство пользователей просто хотят видеть одну строку для каждой транзакции для простоты.

Я хотел бы услышать ваши мысли о правильном подходе к этой проблеме.


person Dave L    schedule 14.09.2016    source источник


Ответы (2)


Я бы избегал искушения потерять данные/гибкость ради простоты; если вы обновите исходную строку, как бы вы независимо определили дату/время аутентификации и захвата (ов)? Сколько захватов было сделано? Какие индивидуальные коды авторизации и другие новые значения были возвращены API-интерфейсом шлюза для каждого из них?

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

person Alex K.    schedule 15.09.2016

Я не думаю, что здесь есть правильный или неправильный ответ (поэтому вопрос следует закрыть как основанный на мнении). Однако я бы предложил третий способ...

Используйте свою модель «обновляемой строки», но затем добавьте новую таблицу для хранения сообщений низкого уровня с помощью Authorize.net. Новая таблица будет фиксировать идентификатор платежа, дату/время, тип аутентификации, значение аутентификации и т. д.

Таким образом, у вас есть что-то, с чем вы можете отлаживаться, а также история дат/времени/значений для каждой карты, а также когда они были авторизованы и списаны.

person PaulG    schedule 15.09.2016