Внимание будет уделено конкретному моменту — это получения криптограммы со стороны Apple после того как покупатель прошёл TouchID или FaceID. Языком на бэкенде будет PHP.
Меня зовут Александр, я младший PHP-программист компании Moguta, и мне пришлось столкнуться на своем пути с интеграцией Apple Pay в нашу Moguta.CMS. Сегодня я расскажу как авторизовать себя через Apple Pay для проведения оплаты без вникания в матчасть защищенных соединений и сертификатов, так как мне в начале своего пути не хватало такого материала.
Введение
Я не буду расписывать здесь всю простыню по внедрению Apple Pay себе на сайт. Инструкций о том, как зарегистрировать аккаунт разработчика Apple, где сделать Payment Processing сертификат, куда отправить полученный ответ, полно на рунете, достаточно спросить у Гугла "интеграция apple pay на сайт" и выбрать приглянувшийся агрегатор платежей, который подробно распишет вам по шагам все необходимые действия.
Краткий обзор
Минимальным требованием для этой инструкции будет наличие MacOS для работы с ключами, так как работать с сертификатами на других ОС — это уже отдельный материал, которому я здесь уделять внимание не буду.
Давайте сначала сориентируемся где будет место наших боевых действий. Алгоритм следующий:
- Пользователь начинает процесс оплаты через Apple Pay в интернет-магазине;
- Интернет-магазин отправляет сведения о платеже в Apple;
- Apple присылает в ответ ссылку, на которую необходимо отправить данные продавца;
- Интернет-магазин отправляет данные продавца по ссылке через Two-Way TLS;
- Apple присылает данные, содержащие PaymentData;
- Интернет-магазин переадресует PaymentData в платежный шлюз и обрабатывает ответ;
Нас интересует 4ый пункт, так как обычным cURL запросом тут не обойтись.
Обзаводимся сертификатами
Для того, чтобы Apple поверила, что имеет дело лично с нами, сначала нужно завести сертификат Merchant Identify (не путать с Payment Processing, он нужен для платежного шлюза). Для начала сформируем запрос на сертификат по официальной инструкции. Полученный файл прикрепляем в Apple Pay Merchant Identity Certificate вашего Merchant ID.
В ответ получаем merchant_id.cer, который добавляем в связку. Генерируем на основе его закрытого ключа .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 вы просто ввели неверное значение.
Итог
Буду рад услышать в комментариях предложения, советы или критику.
Надеюсь, что статья принесет пользу таким же заблудшим душам, как и я.