Здравствуйте.
стоит задача принимать на сайте платежи через 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);
}
}