Есть ли способ принять считывание кредитной карты с помощью считывателя из неродного веб-приложения?

Я работаю над приложением, которое является своего рода торговой площадкой и использует API Stripe для подписок и т. д.

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

Конечные пользователи должны будут принимать платежи от своих клиентов лично, и я пытаюсь найти решение для этого, проводя карту клиента. Однако все технологические решения, которые я нахожу (например, Cardflight и т. д.), предназначены специально для нативных приложений (iOS или Android).

Кто-нибудь слышал или сделал это в веб-приложении?


comment
Он поддерживается неофициально, но вам необходимо убедиться, что вы соответствуете стандарту PCI (самостоятельно), прежде чем использовать его. Обратитесь по адресу [email protected] для получения дополнительной информации.   -  person korben    schedule 15.12.2016
comment
Спасибо, korben, я действительно/все еще жду ответа об этом от службы поддержки Stripe. Я подумал, что должен спросить. Я полагаю, что соответствие PCI будет таким же процессом, как получение кредитных карт по телефону - вы это имеете в виду?   -  person IfTrue    schedule 15.12.2016
comment
Привет, IfTrue, я пытаюсь сделать то же самое, вы когда-нибудь находили решение для этого?   -  person dave4jr    schedule 18.03.2017
comment
@ dave4jr Я не знал и не верю, что сейчас это возможно.   -  person IfTrue    schedule 07.06.2017


Ответы (1)


Если это правда, я столкнулся с той же проблемой (как показано в моем комментарии ранее в этом году). Я понял, как это сделать, но не без недостатков (безопасность, PCI и т.д.). Во-первых, мне нужен был способ в Javascript запускать события, основанные на пролистывании, сканировании и т. д. Я нашел эту библиотеку, https://github.com/CarlRaymond/jquery.cardswipe, который дает вам обратные вызовы javascript (сканирование завершено, успешное сканирование и ошибка сканирования), привязанные к событиям сканирования. Что мне особенно понравилось, так это то, что вам не нужно было сосредотачиваться на форме, чтобы перетаскиваемые данные попадали туда, куда нужно, вы можете просто выбрать форму, и независимо от того, где вы находитесь в приложении, она заполнит это сформироваться. Опять же, автор предупреждает о возможных угрозах безопасности в своем файле README.

После того, как я проанализировал данные сканирования кредитной карты, я использовал библиотеку stripes jquery.payments, которая предоставляет вам функции для проверки данных, а также для создания ваших собственных форм с использованием входных данных. Ключом была возможность использовать настоящие входные данные формы, чтобы я мог присвоить значение проанализированных данных каждому входному сигналу перед отправкой формы. http://stripe.github.io/jquery.payment/example/

Stripe пытается отойти от такого подхода. Они не заинтересованы в том, чтобы люди создавали свои собственные входные данные для форм из-за проблем с PCI и других связанных с этим проблем безопасности. В конечном итоге я не стал этого делать, потому что не хотел нести ответственность за дополнительные правила PCI. Кроме того, с помощью этих простых USB-сканеров (которые я использовал) кто-то технически мог перехватить данные. Это единственный способ, который я знаю, как это сделать, и он отлично работал, и я бы все еще использовал его, если бы не проблемы с безопасностью. Вот часть моего кода. Надеюсь это поможет.

            var complete = function(data) {
                if (data.type == "generic") {
                    sweetAlert("Oops...", "Card Type Not Recognized!", "error");
                    return false;
                }
                $("#cc-fullname").val(data.firstName + " " + data.lastName);
                $("#cc-number").val(data.account);
                $("#cc-exp").val(data.expMonth + " / " + data.expYear);

                window["stripe_fullname"] = data.firstName + " " + data.lastName;
                window["stripe_number"] = data.account;
                window["stripe_exp_month"] = data.expMonth;
                window["stripe_exp_year"] = data.expYear;
            };
            var failure = function() {
                swal("Oops...", "Something went wrong... Please try again!", "error");
            }

            /*  Success Function
            ========================================= */
            var success = function(event, data) {
                Stripe.setPublishableKey("{{ stripe_publishable_key }}");


                /*  Create Token
                ======================= */
                Stripe.card.createToken({
                    name: window["stripe_fullname"],
                    number: window["stripe_number"],
                    exp_month: window["stripe_exp_month"],
                    exp_year: window["stripe_exp_year"],
                }, stripeResponseHandler);


                /*  Response Callback
                ======================== */
                function stripeResponseHandler(status, response) {
                    var $form = $('#payment-card-form');
                    if (response.error) {
                        $form.find('.payment-errors').text(response.error.message);
                        $form.find('button').prop('disabled', false);
                    } else {
                        var token = response.id;
                        $form.append($('<input type="hidden" name="stripeToken" />').val(token));
                        $form.get(0).submit();
                    }
                }


            }

            $.cardswipe({
                firstLineOnly: true,
                success: complete,
                parsers: ["visa", "amex", "mastercard", "discover", "generic"],
                debug: false
            });
            $(document).on("success.cardswipe", success).on("failure.cardswipe", failure);
person dave4jr    schedule 20.07.2017
comment
Привет, dave4jr, большое спасибо за ответ. Я прочитал все это, и это очень похоже на один из подходов, которые я собирался использовать, но, как вы обнаружили, риск безопасности был слишком велик для моего клиента. Еще раз спасибо за продолжение! - person IfTrue; 29.07.2017
comment
Нет проблем, сэр! =) Спасибо! - person dave4jr; 29.07.2017
comment
Привет @ dave4jr. Я знаю, что это довольно старый пост, но мне было интересно, не могли бы вы рассказать о некоторых проблемах безопасности, которые вы упомянули. Я провожу расследование по аналогичному подходу. Сканер --› нативное/веб-приложение --› веб-сервис --› платежный шлюз. На мой взгляд, достаточно просто быть совместимым с PCI, чтобы отказаться от этого, но я немного обосновываю эту тему. Ваш вклад был бы полезен и оценен. Спасибо! - person yul-dev; 02.09.2020