Как хранить данные для обработки платежа на странице подтверждения? - PullRequest
1 голос
/ 28 сентября 2011

Я добавляю страницу подтверждения вашего платежа в мой новый проект ASP.NET MVC 3.После проверки ввода я затем отображаю страницу подтверждения, чтобы пользователь мог убедиться, что он все правильно ввел.Моя следующая проблема - как «сохранить» введенные данные, чтобы я мог обработать платеж после того, как они нажали «Подтвердить».Очевидно, я не хочу создавать скрытые поля с полным номером кредитной карты.

Я использую сеансы для нашей корзины покупок, но шифрует ли это данные, чтобы номер кредитной карты не мог быть взломан?Каков рекомендуемый подход к этому?Поиски, которые я проводил в Google, на самом деле не сильно возросли.

Я отображаю информацию, введенную на предыдущей странице (для подтверждения ввода данных).Правильно маскируя номер кредитной карты, конечно.

Информация об оплате

Имя на кредитной карте: Имя

Номер кредитной карты: XXXX XXXX XXXX 1111

Срок действия: 10/2011

Код подтверждения карты: 100

Общая сумма, подлежащая списанию: $ 50,86

Все цифры в этом посте являются поддельными, конечно.

Воткод, который я использую до сих пор.

    //
    // POST: /Checkout/AddressAndPayment
    [HttpPost]
    public ActionResult AddressAndPayment(Cart cart, PaymentForm formData)
    {
        if (cart.Items.Count() == 0)
        {
            ModelState.AddModelError("", "Sorry your cart is empty!");
        }

        if (ModelState.IsValid)
        {
            var viewModel = new AddressPaymentViewModel
            {
                FormData = formData,
                Cart = cart
            };

            return View("Confirm", viewModel);
        }
        else
        {
            var viewModel = new AddressPaymentViewModel
            {
                FormData = formData,
                Cart = cart,
                States = States.GetStatesDDL(),
                CreditCardTypes = CreditCartTypes.GetCreditCardTypesDDL()
            };
            return View(viewModel);
        }
    }

    //
    // GET: /Checkout/Confirm
    public ViewResult Confirm()
    {
        return View();
    }

Итак, когда я запускаю

    //
    // POST: /Checkout/Confirm
    [HttpPost]
    public ViewResult Confirm(Cart cart, PaymentForm formData)
    {
        return View();
    }

, мне все еще нужно иметь данные формы для отправки процессору кредитной карты.

Есть ли лучший способ сделать это?Что такое «наилучшая практика»?

Другой метод , который я видел, состоит в том, чтобы выполнить «PreAuth» и «PostAuth» с процессором кредитной карты, а не сохранять этот период данных, простоИдентификатор заказа.

Ответы [ 4 ]

3 голосов
/ 29 сентября 2011

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

0 голосов
/ 28 сентября 2011

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

Я знаю, что вы, вероятно, хотите отобразить ее, чтобы убедиться, что они не напечатали ее неправильно.Помимо того факта, что немногие пользователи когда-либо будут дважды проверять весь номер кредитной карты, вы можете обнаружить большинство потенциальных ошибок, сравнив номер кредитной карты с алгоритмом Луна .Если номер кредитной карты введен неправильно, шансы его обойти алгоритм Луна очень и очень малы.Затем вы можете попросить их повторно ввести номер карты, прежде чем перейти на страницу сводки.

0 голосов
/ 29 сентября 2011

Концептуально вам просто нужно "сохранить" информацию на стороне сервера для последующей обработки. Нет причин отправлять эту информацию обратно клиенту в виде скрытых полей, файлов cookie, пармов или чего-либо еще. Теперь, если вам нужно сохранить его на стороне сервера, у вас есть несколько вариантов:

1) Состояние сеанса - преимущество, оно есть сейчас, оно очищается автоматически и (возможно) только для памяти. Недостатки, у вас есть только один из них за сеанс. С появлением просмотра с вкладками мы обнаружили, что хранение чего-либо транзакционного в состоянии сеанса проблематично.

2) Сохранение в БД - преимущество, его легко сохранить и легко извлечь. Вы можете получить его в том же сеансе, или в другом сеансе, или даже с другого компьютера, если у вас есть правильные ключи. Недостатки, вы сохраняете информацию, и вам нужно ее почистить.

Я бы выбрал вариант 2. Просто запишите информацию в таблицу и затем прочитайте ее, когда вам это нужно. Вы, конечно, должны зашифровать номер CC, но это тривиальная задача.

0 голосов
/ 28 сентября 2011

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

Session["submitted_data"] = util.Encrypt(Model); //Util.Encrypt would be your custom Encryption lib

РЕДАКТИРОВАТЬ

Упс, пропущен бит учетных данных CC.

Этонемного сложнее.Вы можете запросить учетные данные кредитной карты ПОСЛЕ страницы подтверждения заказа, ИЛИ вы можете создать таблицу Temp_Confirmation в вашей базе данных.Оттуда вы должны зашифровать учетные данные CC, хранить их в БД до тех пор, пока они не пройдут мимо страницы подтверждения (сохраните GUID таблицы в скрытом поле), и получить ее на другом конце.Обязательно зашифруйте и расшифруйте, а также удалите запись, когда закончите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...