Привет, XML, мой старый друг, я пришел, чтобы снова закодить тебя.
В зависимости от того, как долго вы были разработчиком, XML может быть термином, который звучит совершенно чужим. Для других это могло бы вернуть давно подавленные воспоминания о каких-то темных днях.
Я уже два месяца не писал посты, и даже забыл что у меня был блог ;) Два дня назад начал подключать одну платёжную систему под названием Paynet, которая существует с 2005 года и очень широко распространена в Узбекистане. Я вначале не думал о трудностях, даже когда слышал что эта платежная система работает с SOAP протоколом (я до этого один раз работал с SOAP, чуть позже расскажу в каком проекте), но когда я взял документацию…. Короче начнём с истории :)
Когда я использовал SOAP первый раз
Когда я первый раз слышал слово SOAP, сразу спрашивал - “Чё за мыло?)”
Когда я учился в бакалавре в городе Ургенче, мне предложили работу с зарплатой которая равна моей стипендии. Идея проекта была крутая, и из-за идии я принял предложение, мы разработали программу с называнием Kakadu Taxipay, через которую люди могли оплачивать проезд в такси при помощи пластиковой карты. Я работал андроид программистом(это была моя первая программа на андроиде), помимо этого я помог с северной частью.
Для оплаты, мы подняли биллинг на основе UPay, и она в своей очереди состояла из SOAP сервера. Вот тогда мы работали с SOAP прокотолом, наше серверное приложение было написано на Java, на фреймворке Spring и нам тогда не было тяжело работать с SOAP протоколом.
SOAP означает Simple Object Access Protocol(простой протокол доступа к объектам). Это протокол для обмена сообщениями,обмена данными в децентрализованной и распределенной среде. SOAP может работать с любым протоколом прикладного уровня, таким как HTTP, SMTP, TCP или UDP. Он возвращает данные получателю в формате XML. Безопасность, авторизация и обработка ошибок встроены в протокол и, в отличие от REST, не предполагают прямой связи «точка-точка». Поэтому он хорошо работает в распределенной корпоративной среде.
SOAP следует формальному и стандартизированному подходу, который определяет, как кодировать файлы XML, возвращаемые API. На самом деле сообщение SOAP - это обычный XML-файл, состоящий из следующих частей:
- Envelope (обязательный) - Это начальный и конечный теги сообщения.
- Header (необязательный) - Он содержит необязательные атрибуты сообщения. Это позволяет расширять сообщение SOAP модульным и децентрализованным способом. В загаловке могут быть токены, метадата и т.п.
- Body (обязательный) - Он содержит данные XML, которые сервер передает получателю.
- Fault (необязательный) - Он несет информацию об ошибках, возникших при обработке сообщения.
Вот как выглядит обычное SOAP-сообщение. Пример взят из документов W3C SOAP и содержит конверт SOAP, блок заголовка и тело:
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> <n:alertcontrol xmlns:n="http://example.org/alertcontrol"> <n:priority>1</n:priority> <n:expires>2001-06-22T14:00:00-05:00</n:expires> </n:alertcontrol> </env:Header> <env:Body> <m:alert xmlns:m="http://example.org/alert"> <m:msg>Pick up Mary at school at 2pm</m:msg> </m:alert> </env:Body> </env:Envelope>
Обычно SOAP использует заранее подготовленные методы и элементы так называемый WSDL. The Web Services Description Language (WSDL) - это язык описания интерфейса на основе XML, который используется для описания функциональных возможностей, предлагаемых веб-сервисом. Аббревиатура также используется для любого конкретного описания WSDL веб-службы (также называемой файлом WSDL), которая предоставляет машиночитаемое описание того, как можно вызвать службу, какие параметры она ожидает и какие структуры данных она возвращает. , Следовательно, его назначение примерно аналогично назначению сигнатуры типа в языке программирования.
Какова основная причина использования SOAP?
На сегодняшний день, SOAP, обычно используется для веб-сервисов корпоративного уровня, которые требуют высокой безопасности и сложных транзакций. Но, из-за неудобства работы с устаревшими технологиями XML, такие крупные сервисы которые используют SOAP очень мало. Есть исключении, например, общедоступный API-интерфейс PayPal, позволяющий принимать платежи через PayPal и кредитные карты, все еще используют этот протокол.
Приведем сравнение SOAP с REST.
SOAP vs REST
SOAP | REST | |
---|---|---|
значения | Simple Object Access Protocol | Representational State Transfer |
дизайн | Стандартизированный протокол с заранее определенными правилами. | Архитектурный стиль со свободными руководящими принципами и рекомендациями. |
подход | Функционально управляемый (данные доступны как сервисы, например: «getUser»). | Управляемый данными (данные, доступные как ресурсы, например, «User»). |
поддержка состояния | По умолчанию без сохранения состояния, но можно сделать API-интерфейс SOAP с сохранением состояния. | Без сохранения состояния (без сеансов на стороне сервера). |
кэширование | Вызовы API не могут быть кэшированы. | Вызовы API могут быть кэшированы. |
производительность | Требует большей пропускной способности и вычислительной мощности. | Требует меньше ресурсов. |
формат сообщения | Только XML. | Простой текст, HTML, XML, JSON, YAML и другие. |
протокол передачи | HTTP, SMTP, UDP и другие. | Только HTTP. |
рекомендуется для | Корпоративные приложения, приложения с высоким уровнем безопасности, распределенная среда, финансовые услуги, платежные шлюзы, телекоммуникационные услуги. | Публичные API для веб-сервисов, мобильных сервисов, социальных сетей. |
преимущества | Высокая безопасность, стандартизированный, расширяемость. | Масштабируемость, лучшая производительность, удобство браузера, гибкость. |
Недостатки | Низкая производительность, большая сложность, меньшая гибкость. | Меньше безопасности, не подходит для распределенных сред. |
UZPAYNET
Платёжная система PAYNET - лидер среди платежных систем Узбекистана по количеству производимых ежедневно оплат. Компания «UZPAYNET» действует на рынке Узбекистана с 2005 года. За этот период они имели более 270 поставщиков различных услуг, в их числе и коммунальные службы, услуги которых можно оплатить через мобильное приложение PAYNET.UZ и в любом из 15 000 пунктов приема оплаты по республике.
Приложению Paynet.uz почти никто не использует, но на территории Узбекистана где интернет плохо работает есть пункты Paynet,и также оборот составляет 1 млн сум
Зачем мне надо было подключить paynet
Недавно мы (я и моя команда) получили заказ и начали разрабатывать мобильное приложение AsaxiyBooks и заказчик хотел чтобы потребители этого приложения могли платить при помощи данной услуги. Четыре дня назад я начал писать сервис для получении транзакции от payneta.
Здесь был контент, в котором я неправильно написал о сотрудниках Paynet
В итоге через 2 дня, я сам нашёл ошибку перебирая, а также изменяя весь код в моем сервисе. Мы пишем систему на фреймворке Yii2, и когда я писал \Yii::$app->response->format=\yii\web\Response::FORMAT_XML
, наша система возврашает ответ с заголовком Content-Type: Application/xml
, а paynet требует заголовок Content-type: text/xml
и кроме этого заголовка не будет работать ;) И так, два дня сидел за компьютером чтобы добавить строчку Yii::$app->response->headers->add('Content-Type', 'text/xml');
Заключение
Я написал этот пост чтобы успокоить свои нервы и не высказать «paynet» возмущения, и чтобы внутри души не хранить никакого гнева. Может этот пост был безполезным для вас, может я не объяснил,как я написал код для работы с SOAP, но, в конце хочу поделить с репозиторией в которой выложено всё очень понятным кодом, даже с комментариями ;). Если в будущем вам нужно будет написать сервис для Paynetа, и вам поданобится мой шаблон, буду рад!
PS: Я прошу извинения, за то что написал о сотрудниках Paynet, я был не прав, и за это я прошу прощения. Я был очень рад с вами сотрудничать, набрался много опыта. Желаю вам удачи в дальнейшей работе!