Авторизация в Apple Pay для самых маленьких

в 14:39, , рубрики: Apple Pay, Apple Pay Merchant, cms, curl, openssl, php, SSL, TLS, Two-Way TLS, интернет-магазин, интернет-маркетинг

Авторизация в Apple Pay для самых маленьких

Внимание будет уделено конкретному моменту — это получения криптограммы со стороны Apple после того как покупатель прошёл TouchID или FaceID. Языком на бэкенде будет PHP.

Меня зовут Александр, я младший PHP-программист компании Moguta, и мне пришлось столкнуться на своем пути с интеграцией Apple Pay в нашу Moguta.CMS. Сегодня я расскажу как авторизовать себя через Apple Pay для проведения оплаты без вникания в матчасть защищенных соединений и сертификатов, так как мне в начале своего пути не хватало такого материала.

Введение

Я не буду расписывать здесь всю простыню по внедрению Apple Pay себе на сайт. Инструкций о том, как зарегистрировать аккаунт разработчика Apple, где сделать Payment Processing сертификат, куда отправить полученный ответ, полно на рунете, достаточно спросить у Гугла "интеграция apple pay на сайт" и выбрать приглянувшийся агрегатор платежей, который подробно распишет вам по шагам все необходимые действия.

Краткий обзор

Минимальным требованием для этой инструкции будет наличие MacOS для работы с ключами, так как работать с сертификатами на других ОС — это уже отдельный материал, которому я здесь уделять внимание не буду.

Давайте сначала сориентируемся где будет место наших боевых действий. Алгоритм следующий:

  1. Пользователь начинает процесс оплаты через Apple Pay в интернет-магазине;
  2. Интернет-магазин отправляет сведения о платеже в Apple;
  3. Apple присылает в ответ ссылку, на которую необходимо отправить данные продавца;
  4. Интернет-магазин отправляет данные продавца по ссылке через Two-Way TLS;
  5. Apple присылает данные, содержащие PaymentData;
  6. Интернет-магазин переадресует PaymentData в платежный шлюз и обрабатывает ответ;

Нас интересует 4ый пункт, так как обычным cURL запросом тут не обойтись.

Обзаводимся сертификатами

Для того, чтобы Apple поверила, что имеет дело лично с нами, сначала нужно завести сертификат Merchant Identify (не путать с Payment Processing, он нужен для платежного шлюза). Для начала сформируем запрос на сертификат по официальной инструкции. Полученный файл прикрепляем в Apple Pay Merchant Identity Certificate вашего Merchant ID.

Create certificate

В ответ получаем merchant_id.cer, который добавляем в связку. Генерируем на основе его закрытого ключа .p12-файл. Для этого вызываем контекстное меню закрытого ключа и выбираем "Экспортировать..."

Export To p12

Вытаскиваем ключ следующей командой (тот пароль, который запросит терминал, будет являться паролем для ключа, он нам понадобиться при соединение с Apple)

 openssl pkcs12 -in <путь до файла>.p12 -out ApplePay.key.pem -nocerts -nodes

и перегоняем наш сертификат в pem

 openssl x509 -inform der -in merchant_id.cer -out merchant_id.pem

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

Отправляем запрос

Опускаем момент получения ссылки на валидацию (подробнее читайте в другой статье на Хабре), переходим к тому моменту, когда скрипт на JS в Safari отправил нашему серверу просьбу на авторизацию в Apple.

Для этого мы используем PHP с cURL. Пример кода:

$ch = curl_init();
$data = '{"merchantIdentifier":"<идентификатор, который мы создавали при заведение Merchan ID>", "domainName":"<домен интернет-магазина>", "displayName":"<Название интернет-магазина, которое будет выводится в окне авторизации TouchID/FaceID>"}';
curl_setopt($ch, CURLOPT_URL, '<ссылка от Apple, полученная из validationURL>');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_CERTINFO, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
curl_setopt($ch, CURLOPT_SSLCERT, '<путь до сертификата>.pem');
curl_setopt($ch, CURLOPT_SSLKEY, '<путь до ключа>.pem'>);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, '<пароль от ключа>');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$res = curl_exec($ch);

curl_close($ch);
echo json_encode($res);

Из полученного ответа выдергиваем paymentData и отправляем нашему платежному шлюзу. Поздравляю, авторизация пройдена, можно грести деньги.

Примечание

Судьба не дала мне долго радоваться налаженному соединению, и Apple отдала мне следующий ответ:

Payment Services Exception merchantId=<длинная строчка> unauthorized to service on behalf of merchantId=<другая длинная строчка> reason="The latter is not registered for Apple Pay on the web""

Текст сообщения не достаточно очевиден, как хотелось бы. Информации в сети опять же нету. Как оказалось, скорее всего это означает, что в поле merchantIdentifier вы просто ввели неверное значение.

Итог

Буду рад услышать в комментариях предложения, советы или критику.

Надеюсь, что статья принесет пользу таким же заблудшим душам, как и я.

Автор: lifeexample

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js