PHP
Internet marketing
16 July

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

From Sandbox

Авторизация в 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 вы просто ввели неверное значение.


Итог


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


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


+13
3.5k 37
Comments 2
Top of the day