PankovAlxndr
@PankovAlxndr
Fullstack web developer

Как связать Apple pay и сбербанк?

Здравствуйте.
стоит задача принимать на сайте платежи через apple pay, а шлюзом является сбербанк
аккаунты созданы, добавлены сертификаты в сбер и в аккаунт апл, руками сгеренированы 2 файла pem
согласно данной инструкции делал https://digital-spectr.com/blog/integratsiya-apple...

кнопку я показываю, вот код:
$(document).on('click', '.js-payment', function (event) {
        var request = {
            countryCode: 'RU',
            currencyCode: 'RUB',
            supportedNetworks: ['visa', 'masterCard'],
            merchantCapabilities: ['supports3DS', 'supportsEMV', 'supportsCredit', 'supportsDebit'],
            lineItems: [
                {label: 'test 1', amount: 2.00},
                {label: 'test 2', amount: 1.00}
            ],
            total: {
                label: '№18890',
                amount: 3.00
            },
        };

        var session = new ApplePaySession(3, request);

        // обработчик события для создания merchant session. 1ый запрос на бекенд
        session.onvalidatemerchant = function (event) {
            let data = {
                validationUrl: event.validationURL,
                action: 'validatemerchant'
            };
            $.post("/_ajax/_applepay.php", data).then(function (merchantSession) {
                session.completeMerchantValidation(JSON.parse(merchantSession));
            }, function (reason) {
                console.log(reason)
            });
        };

        // обработчик события авторизации платежа 2ый запрос на бекенд
        session.onpaymentauthorized = function (event) {
            var data = {
                cryptogram: JSON.stringify(event.payment.token.paymentData),
                action: 'paymentauthorized'
            };
            $.post("/_ajax/_applepay.php", data).then(function (result) {
                let status;
                if (result.Success) {
                    status = ApplePaySession.STATUS_SUCCESS;
                } else {
                    status = ApplePaySession.STATUS_FAILURE;
                }
                session.completePayment(status);
            }, function (reason) {
                console.log(reason)
            });
        };

        session.begin();
    })


Выше сторона клиента,
а теперь у меня вопрос по стороне сервера, на сервер идет 2 запроса:

  • 1ый создать сессию (апл возвращает объект с какими-то данными)
  • 2 отправить все в сбер (берем полученный от апл объект и кидаем его в сбер)


что самое интересное у меня НЕ вылазит ошибок в 1ом запросе никогда.
А 2ой всегда возвращает: Расшифровка переданных данных неуспешна (10)
вот почему он это говорит?

тут либо я не верно кодирую данные и отправляю 2ым запросом (там от эпла приходит объект и его в base64 и в сбер)
либо не правильно открываю сессию, что ее сбербанк не принимает (те сначала с неверными ключами пытаюсь открыть, а потом в base64-то все правильно технически, но содержание не верное )

Мне бы хотелось увидеть как другие люди реализуют это на php

вот мой код:

use Voronkovich\SberbankAcquiring\Client;
class MyApplePay
{

    //real location of your two .pem files. keep them above/outside your webroot folder
    private static $CERTIFICATE_KEY = '.........ApplePay.key.pem';
    private static $CERTIFICATE_PATH = '.........ApplePay.crt.pem';
    private static $CERTIFICATE_KEY_PASS = '........';
    private static $MERCHANT_IDENTIFIER = '........';
    private static $DOMAIN_NAME = '........';
    private static $DISPLAY_NAME = '........';

    public static function validateMerchant(string $validation_url) // получаю сессию (1ый запрос)
    {
        if ($validation_url) {
            $ch = curl_init();

            $data = json_encode([
                'merchantIdentifier' => self::$MERCHANT_IDENTIFIER,
                'initiativeContext' => self::$DOMAIN_NAME,
                'displayName' => self::$DISPLAY_NAME,
                'initiative' => 'web',
            ]);

            curl_setopt($ch, CURLOPT_URL, $validation_url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_SSLCERT, $_SERVER['DOCUMENT_ROOT'] . self::$CERTIFICATE_PATH);
            curl_setopt($ch, CURLOPT_SSLKEY, $_SERVER['DOCUMENT_ROOT'] . self::$CERTIFICATE_KEY);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//            curl_setopt($ch, CURLOPT_SSLKEYPASSWD, self::$CERTIFICATE_KEY_PASS);
//            curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
//            curl_setopt($ch, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_2');
            $result = curl_exec($ch);
            if ($result === false) {
                AddMessage2Log(curl_error($ch));
                return '{"error":"' . curl_error($ch) . '"}';
            } else {
                return $result; //  всегда есть ответ, на основе которого потом пуляем в сбер, думаю ошибка тут и неверно открываю сессию, не смотря на то, что она открывается.
            }
            curl_close($ch);
        } else {
            return '{"error":"invalid validation url"}';
        }
    }

    public static function paymentAuthorized($paymentData)  // отправляю на оплату (2ой запрос)
    {

        $client = new Client([
            'userName' => SBER_NAME,
            'password' => SBER_PASS,
        ]);
        $orderNumber = substr(hash('sha256', 3 . time()), 0, 30); // такой номер заказа
        $merchant = self::$DISPLAY_NAME; // название,а не ИД мерчата
        $paymentToken = base64_encode($paymentData);
        $result = $client->payWithApplePay($orderNumber, $merchant, $paymentToken);  // тут всегда ошибка 10
        return json_encode($result);
    }

}
  • Вопрос задан
  • 3347 просмотров
Пригласить эксперта
Ответы на вопрос 1
PankovAlxndr
@PankovAlxndr Автор вопроса
Fullstack web developer
Решено, проблема в сбербанке: у них есть старая версия ЛК, просите поддержку открыть вам доступ к старому интерфейсу, в нем создаете все ключи и настраивайте согласно инструкции все заново и тогда начинает работать, после этого просите перевести вас обратно на новую (текущую) версия личного кабинета (ЛК).

из нового ЛК ключи выгружаются "криво" как сказал сбербанк.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы