Вебхуки
Для работы с вебхуками должно быть выдано разрешение ManageWebhookData
.
Вебхуки нужны для того, чтобы получать уведомления о важных событиях в вашем сервисе или телеграм-каналах, связанных с вашими счетами.
Вебхук — это POST запрос на указанный url, в теле которого находится jwt токен в виде строки.
Этот jwt объект нужно расшифровать — алгоритм шифрования тела вебхука RS256
.
Для того чтобы убедиться, что вебхук пришёл от Точки, используйте наш публичный ключ OpenAPI.
Сейчас доступны пять видов событий: incomingPayment
, outgoingPayment
, incomingSbpPayment
,
incomingSbpB2BPayment
и acquiringInternetPayment
.
incomingPayment — о входящих платежах
Вебхук нужен для отправки информации о входящих платежах.
В течение 20 секунд после каждого входящего платежа будет отправлено уведомление с основными данными:
- реквизиты получателя и отправителя платежа,
- purpose — назначение,
- amount — сумма,
- webhookType — incomingPayment,
- customerCode - уникальный идентификатор клиента,
- paymentId — уникальный идентификатор платежа, который также содержится в выписке.
Пример с телом вебхука по событию incomingPayment:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJTaWRlUGF5ZXIiOiB7ImJhbmtDb2RlIjogIjAwMDAwMDAwMCIsICJiYW5rTmFtZSI6ICJcdTA0MWVcdTA0MWVcdTA0MWUgXHUwNDExXHUwNDMwXHUwNDNkXHUwNDNhIFx1MDQyMlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzMCIsICJiYW5rQ29ycmVzcG9uZGVudEFjY291bnQiOiAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiYWNjb3VudCI6ICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICJuYW1lIjogIlx1MDQxOFx1MDQxZiBcdTA0MjJcdTA0MzVcdTA0NDFcdTA0NDIiLCAiYW1vdW50IjogIjQwLjAiLCAiY3VycmVuY3kiOiAiUlVCIiwgImlubiI6ICIwMDAwMDAwMDAwIiwgImtwcCI6ICIwMDAwMDAwMDAwIn0sICJTaWRlUmVjaXBpZW50IjogeyJiYW5rQ29kZSI6ICIwMDAwMDAwMDAiLCAiYmFua05hbWUiOiAiXHUwNDFlXHUwNDFlXHUwNDFlIFx1MDQxMVx1MDQzMFx1MDQzZFx1MDQzYSBcdTA0MjJcdTA0M2VcdTA0NDdcdTA0M2FcdTA0MzAiLCAiYmFua0NvcnJlc3BvbmRlbnRBY2NvdW50IjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgImFjY291bnQiOiAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAibmFtZSI6ICJcdTA0MThcdTA0MWYgXHUwNDIyXHUwNDM1XHUwNDQxXHUwNDQyIiwgImFtb3VudCI6ICI0MC4wIiwgImN1cnJlbmN5IjogIlJVQiIsICJpbm4iOiAiMDAwMDAwMDAwMCIsICJrcHAiOiAiMDAwMDAwMDAwMCJ9LCAicHVycG9zZSI6ICJcdTA0MjJcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzNlx1MDQzMCIsICJkb2N1bWVudE51bWJlciI6ICIwMDAwMCIsICJwYXltZW50SWQiOiAiMDAwMDAwMDAwMCIsICJkYXRlIjogIjIwMTgtMTAtMDEiLCAid2ViaG9va1R5cGUiOiAiaW5jb21pbmdQYXltZW50IiwgImN1c3RvbWVyQ29kZSI6ICIzMDAxMjMxMjMifQ.j7FCYrHL6pmR7m8TZxtBPBdsHG3uOu6bBl7HZq-VaK_LDj7Lyjb_B0L6zWZjVTRWvyfi6CZ-T-yT8IWzXdN5csoIEiwSuzLeC17oW-9c359Z5AYbL9x4SHSlYd3Q_hPM4DQVxPnPKb_IYpZGDCTovU_wtlAxiBdXQbY3qWEzzDzCuqZNjlVQalu7XipuSt7nNDBuwcDWJAC8Ry0U7UwRH6wboufhL7WcrQgsEn-2ZV--sKzinhUyfyYMw8_cFt9MNX3x_x3Fhu56708MDviu57O5u9t-diWrw2X75QKjnlf-PAamb0idK_8bJ5XbLXymnaBuYgSZSd-HZMHYLWiMHDL-z1OIsLgPKanUPJeKsSlmiVA1VJH2oZVRMv9Pf05O_cbN26d-LIjqn9z_m8XeZ1w0I9sfGP96IfT7xONsTLdbTCiKAJ-he4nzscxpzQc3tYnaeqETTZiyjB1U_chh88bG2n_0tNlQEtRT3j0sPyCWX3qLSFlkp6kKmQkIfeBn
outgoingPayment — об исходящих платежах
Вебхук нужен для отправки информации об исходящих платежах.
В течение 20 секунд после каждого исходящего платежа будет отправлено уведомление с основными данными:
- реквизиты получателя и отправителя платежа,
- purpose — назначение,
- amount — сумма,
- webhookType — outgoingPayment,
- customerCode - уникальный идентификатор клиента,
- paymentId — уникальный идентификатор платежа, который также содержится в выписке.
Пример с телом вебхука по событию outgoingPayment:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJTaWRlUGF5ZXIiOiB7ImJhbmtDb2RlIjogIjAwMDAwMDAwMCIsICJiYW5rTmFtZSI6ICJcdTA0MWVcdTA0MWVcdTA0MWUgXHUwNDExXHUwNDMwXHUwNDNkXHUwNDNhIFx1MDQyMlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzMCIsICJiYW5rQ29ycmVzcG9uZGVudEFjY291bnQiOiAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiYWNjb3VudCI6ICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICJuYW1lIjogIlx1MDQxOFx1MDQxZiBcdTA0MjJcdTA0MzVcdTA0NDFcdTA0NDIiLCAiYW1vdW50IjogIjQwLjAiLCAiY3VycmVuY3kiOiAiUlVCIiwgImlubiI6ICIwMDAwMDAwMDAwIiwgImtwcCI6ICIwMDAwMDAwMDAwIn0sICJTaWRlUmVjaXBpZW50IjogeyJiYW5rQ29kZSI6ICIwMDAwMDAwMDAiLCAiYmFua05hbWUiOiAiXHUwNDFlXHUwNDFlXHUwNDFlIFx1MDQxMVx1MDQzMFx1MDQzZFx1MDQzYSBcdTA0MjJcdTA0M2VcdTA0NDdcdTA0M2FcdTA0MzAiLCAiYmFua0NvcnJlc3BvbmRlbnRBY2NvdW50IjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgImFjY291bnQiOiAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAibmFtZSI6ICJcdTA0MThcdTA0MWYgXHUwNDIyXHUwNDM1XHUwNDQxXHUwNDQyIiwgImFtb3VudCI6ICI0MC4wIiwgImN1cnJlbmN5IjogIlJVQiIsICJpbm4iOiAiMDAwMDAwMDAwMCIsICJrcHAiOiAiMDAwMDAwMDAwMCJ9LCAicHVycG9zZSI6ICJcdTA0MjJcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzNlx1MDQzMCIsICJkb2N1bWVudE51bWJlciI6ICIwMDAwMCIsICJwYXltZW50SWQiOiAiMDAwMDAwMDAwMCIsICJkYXRlIjogIjIwMTgtMTAtMDEiLCAid2ViaG9va1R5cGUiOiAib3V0Z29pbmdQYXltZW50IiwgImN1c3RvbWVyQ29kZSI6ICIzMDAxMjMxMjMifQ.UCRqWxMHocDG83NeHxL9DdaZuLdnvWKC-zcbQL80PM3LAauP9H98tC80krR_jfGP7aXa8kOKrP2Qq5JSy4_lITViSuJKhQW9tHxQA0zJwwHmUOGIU6RNDmPVKQScoh2LlTcCpu-94v8O2GSa5nssVVj4_3mZT8VdjagpxMCuISYFRaUTnvjskkNOSmrXZIuoUHHL9h5sc6o7E8i6mMI0tMHRArgsM2Ge7de4ajkEsGQsJNBXEJV9rA4Ba5a4XdPlo1wE5nMLziKh5w-CVkotO2KyKCTLgIlg6tNwmBs0saRMJU3kJfiBrLsuPoW34ZKPoqvgQEP8q9AayjC-eTrtsC94cNoiwz2I8-KLhnZmIXKahO_p-6kCBzQfJyz-H0sfJQjDBC1zFQieP79sarBPqYmCJ7eNNttyoGdJz2xDoLFStBRU2ua198PYSHsuBsdoBQ_6FO6BWCnnL66mzMKXPRpQ-uOIa-t73wTuzCre3HZVUpFKlzrfts4BxuG4Yy6o
incomingSbpPayment — о входящих платежах через СБП
По этому типу вебхука мы отправляем уведомление только, если деньги зачисляются через Систему быстрых платежей. В нём указываются:
- operationId — идентификатор операции,
- qrcId — идентификатор QR-кода,
- payerName — данные покупателя: имя, отчество и первая буква фамилии,
- payerMobileNumber — номер телефона,
- amount — сумма операции,
- brandName — наименование ТСП,
- webhookType — incomingSbpPayment,
- customerCode — уникальный идентификатор клиента,
- merchantId — идентификатор ТСП,
- refTransactionId — идентификатор транзакции, по которой осуществляется возврат,
- purpose — назначение платежа.
Уведомление обычно приходит в течение 5 секунд с момента зачисления денег по QR-коду.
Пример с телом вебхука по событию incomingSbpPayment:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJvcGVyYXRpb25JZCI6ICJBMjIwMDExMDAyNjM4MjAxMDAwMDA1MzNFNjI1RkNCMyIsICJxcmNJZCI6ICJBUzEwMDA2RFBSVEVGUEZTOUhKOVNRU0RTVlJISkQzTCIsICJhbW91bnQiOiAiMC4zMyIsICJwYXllck1vYmlsZU51bWJlciI6ICIrOTk5OTEyMzQ1NjciLCAicGF5ZXJOYW1lIjogIlx1MDQxOFx1MDQzMlx1MDQzMFx1MDQzZCBcdTA0MThcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDcgXHUwNDE4LiIsICJicmFuZE5hbWUiOiAiXHUwNDFhXHUwNDNlXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDNkXHUwNDRmIFx1MDQ0MyBcdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0M2NcdTA0MzAiLCAibWVyY2hhbnRJZCI6ICJNRjAwMDAwMDAwMDEiLCAicHVycG9zZSI6ICJcdTA0MWVcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQ0MVx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQ0MyBcdTIxMTYgMSBcdTA0M2VcdTA0NDIgMDEuMDEuMjAyMS4gXHUwNDExXHUwNDM1XHUwNDM3IFx1MDQxZFx1MDQxNFx1MDQyMSIsICJ3ZWJob29rVHlwZSI6ICJpbmNvbWluZ1NicFBheW1lbnQiLCAiY3VzdG9tZXJDb2RlIjogIjMwMDEyMzEyMyIsICJyZWZUcmFuc2FjdGlvbklkIjogImNiMWVmMTBiLTM5ZTktNGU1NS1hZWY5LWQ2YmNjMzk2ZmYwZiJ9.QroEOEYw-fxniFzvjcrgihSeYOhE9GLVuMwI9Uuc0ubuwc-wYP2pHRYF4Lu2-bqHZk2jP5QHn2aDYWFVWi3vBi6sbVTa_n3Y9qZ1ROjbRaF-Uuah5XyzijwNG0I--0jj-vvn3D3caC1mw6dOCP1Ehkd5ipZWtcsrzu0wPxni8bsiqDIBVcA4hg3a6Iu5AORANwy4whiFo295bzf1Y_fdBhZO1QjZqv3-Cc_fF9liKd56UMfljm3ChqVwCdNF85e69PXAjkeicp-pH12kkgeflA2zLq_LFurAZj9_JkrOS9qSpfDqYf0m-ciHYFVYJNGH4PZnIPOa7iYNlGi0WjVbxE6uJX2EDHnYCZ1qXAkdGlm3K1CNvmBzjIUEowWOmD9bkq4INGsd9MMmRRSo-K3fqqjPNXkVGw2-_ZbIgemG9TD4bGeZCWN4shXpzrWGcyfQ7mrhRW0XiECGxTy8K4QuK-WsijGBlkYGd-bZuBa9qyZXLnsX4FhTIdEHYDc_eW6v
incomingSbpB2BPayment — о входящих платежах через B2B QR-код по СБП
По этому типу вебхука мы отправляем уведомление только при зачислении денег через B2B QR-коды, созданные через Систему быстрых платежей. В вебхуке указываются:
- qrcId — идентификатор QR-кода,
- customerCode — уникальный идентификатор клиента,
- webhookType — incomingSbpB2BPayment,
- amount — сумма операции,
- purpose — назначение платежа.
Уведомление обычно приходит в течение 10 секунд с момента зачисления денег по QR-коду.
Пример с телом вебхука по событию incomingSbpB2BPayment:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJxcmNJZCI6ICJBUzEwMDA2RFBSVEVGUEZTOUhKOVNRU0RTVlJISkQzTCIsICJhbW91bnQiOiAiMC4zMyIsICJwdXJwb3NlIjogIlx1MDQxZVx1MDQzZlx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDQxXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDQzIFx1MjExNiAxIFx1MDQzZVx1MDQ0MiAwMS4wMS4yMDIxLiBcdTA0MTFcdTA0MzVcdTA0MzcgXHUwNDFkXHUwNDE0XHUwNDIxIiwgIndlYmhvb2tUeXBlIjogImluY29taW5nU2JwQjJCUGF5bWVudCIsICJjdXN0b21lckNvZGUiOiAiMzAwMTIzMTIzIn0.dty4QICBwDnglK9VKFchdKxG_QbOPHKHmqxSan5uDUadMT61391lNiRj7cKGiH35heZc7GEKp3rwmuqLIEwLcUQts2t90Baw7gVeHQSQMyeBjIEFoBXgkDCNsRwqJISmW8NfEv6xX87IEjLp6wKJi3VmfF_sffW6EpaXzyScA9DPIKjtUA9U-W5t8JmjgWMbXK41ghfiSlYiCOpOVOleod3R-jjzsGI3nEYExDqWWz3VgjsFGwHLGKoWBzhqtSL-NBTp5rE82N5eZrWF_4n8tkAmPzShQY9Rh2VxFVwAyqIezqYHYAcBBW_6vbZvA_XFVB8UkjOqJKRWSFHEOsmu7o3JYOq0WnI1iJ_Hfsi0W1HjjgaZuMhyezqNsGWib6u_g-86ekEPxXGFFlKglHg52t8iU-YE8dt7e7s890l_4_C2tRBbOuLrdnITrHzepiby6A74Qdt29j2Ffo0Vkd8qRNWx7RmWjy1X7NN0h595imLbBFWeYPYNOdG0M7CBQUox
acquiringInternetPayment — о входящих платежах только по платёжным ссылкам
По этому типу вебхука мы отправляем уведомление, только если по ссылке платят с карты или через Систему быстрых платежей.
Доставляется он обычно за 5-10 секунд с момента оплаты.
При платеже по номеру карты мы передадим следующую информацию:
- amount — сумма платежа,
- paymentType — card,
- operationId — идентификатор платежа,
- webhookType — acquiringInternetPayment,
- customerCode — уникальный идентификатор клиента,
- merchantId — идентификатор торговой точки в интернет-эквайринге,
- consumerId — идентификатор покупателя,
- purpose — назначение платежа,
- status — статус платежа. Может иметь следующие значения:
AUTHORIZED
— деньги успешно заморожены на счёте плательщика. Значение актуально только для двухэтапной оплаты.APPROVED
— деньги успешно списаны со счёта, оплата завершена.
Пример с телом вебхука по событию acquiringInternetPayment при оплате картой:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJjdXN0b21lckNvZGUiOiAiMzAwMTIzMTIzIiwgImFtb3VudCI6ICIwLjMzIiwgInBheW1lbnRUeXBlIjogImNhcmQiLCAib3BlcmF0aW9uSWQiOiAiYmVlYWM4YTQtNjA0Ny0zZjM4LTg5MjItYTY2NGU2YjVjNDNiIiwgInB1cnBvc2UiOiAiXHUwNDFlXHUwNDNmXHUwNDNiXHUwNDMwXHUwNDQyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0NDFcdTA0NDdcdTA0MzVcdTA0NDJcdTA0NDMgXHUyMTE2IDEgXHUwNDNlXHUwNDQyIDAxLjAxLjIwMjEuIFx1MDQxMVx1MDQzNVx1MDQzNyBcdTA0MWRcdTA0MTRcdTA0MjEiLCAid2ViaG9va1R5cGUiOiAiYWNxdWlyaW5nSW50ZXJuZXRQYXltZW50IiwgIm1lcmNoYW50SWQiOiAiMjAwMDAwMDAwMDAxMjM0IiwgImNvbnN1bWVySWQiOiAiOTE3ZWQzODktYTEyMC00MjkxLThlNzMtMzhjNmVmN2Q2NzcwIiwgInN0YXR1cyI6ICJBUFBST1ZFRCJ9.cFFVd_rpmBFSrefGm2jRM7NhahAY2Jhb_7vwQXs952q18SiIGfyJZdFqGh2uicwBNKOnv_Bto0gDoTZcToEfqPXbHCKCYsA7uu8JUR_DHJtxjYuiilXRgkyDfUxNb0jCqWEfMJz6sGM2AA7kKyQ-Ds9fnGipX9GzYBtksO38PWPmIAJmjYSXsnXYM6bqE8cl-EhbbBbHkCg7vDMV2kwiA0AoW7_SniT4LR0H_NosyaVe0WHq9d7pTipW8rxKl69tFebCl8iz2ZulU0qWLVWPifcF1SbnIAw5WMhEbWBJVNuKYMiGrU_YX958iIOTZ0CyajmEwQutnDIJoMpHi1xOc747ba14H1l1rfDVRXiuNOmzbXYnGBuZ6Bzy2vlJ-54PB4ToQt9nthpi65uWB4YUck3yuoFJzntqkVrmp3ZztoyvVPkpR8ub7nzAhDxLWVLdbM7Q4HQACMcnJXRfkkHlGFR9P8Ygji3OATvNcP0wnxqNxp9P629vG5uICke-Ex0I
При платеже через Систему быстрых платежей (СБП) мы передадим следующую информацию:
- amount — сумма платежа,
- paymentType — sbp,
- transactionId — идентификатор платежа в СБП,
- purpose — назначение платежа,
- qrcId — идентификатор QR-кода,
- merchantId — идентификатор торговой точки в интернет-эквайринге,
- operationId — идентификатор платежа,
- webhookType — acquiringInternetPayment,
- customerCode — уникальный идентификатор клиента,
- payerName — данные покупателя: имя, отчество и первая буква фамилии,
- status — статус платежа. Для платежей через СБП всегда будет значение
APPROVED
.
Пример с телом вебхука по событию acquiringInternetPayment при оплате через Систему быстрых платежей:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJjdXN0b21lckNvZGUiOiAiMzAwMTIzMTIzIiwgImFtb3VudCI6ICIwLjMzIiwgInBheW1lbnRUeXBlIjogInNicCIsICJvcGVyYXRpb25JZCI6ICJiZWVhYzhhNC02MDQ3LTNmMzgtODkyMi1hNjY0ZTZiNWM0M2IiLCAidHJhbnNhY3Rpb25JZCI6ICI0M2M2M2VjMS00MmZhLWE3MDQtZGRlNy02MDI1YzIwYjk2Y2UiLCAicHVycG9zZSI6ICJcdTA0MWVcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQ0MVx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQ0MyBcdTIxMTYgMSBcdTA0M2VcdTA0NDIgMDEuMDEuMjAyMS4gXHUwNDExXHUwNDM1XHUwNDM3IFx1MDQxZFx1MDQxNFx1MDQyMSIsICJxcmNJZCI6ICJBUzEwMDA2RFBSVEVGUEZTOUhKOVNRU0RTVlJISkQzTCIsICJwYXllck5hbWUiOiAiXHUwNDE4XHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQxOFx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0NyBcdTA0MTguIiwgIndlYmhvb2tUeXBlIjogImFjcXVpcmluZ0ludGVybmV0UGF5bWVudCIsICJtZXJjaGFudElkIjogIjIwMDAwMDAwMDAwMTIzNCIsICJzdGF0dXMiOiAiQVBQUk9WRUQifQ.mTw0f22N6XWE_mgJ1z6kv_4ASjACXYJUpPNHhz6crFT3KTeYIqQKRSWIFnQiqWLwneg8Mv3qfKWPdKSOjs-FnhM3HD20wq1rNWIF97HtzuT-kMTUZnProv7QDYU8iIBeMJmXYv91DW1WzE2OHJUHWEtYhwEI9yHLLIXvWkgnUYnTsiB1o8cACHxswT0drP09v607Jo31y58NmjqH1x5VYCr2YIaPunsTuY8KqusegTokqYlnQswZ3C41YZuROIXWcPetUuKp7l9m0c_y68REnMNw9KQTbyjzzjzb_cb3Qt8MYe16bWk8oe2bO4mlRs0I1tqHJtoIwcHoAPbKeMfG7qgQhz6xNnstlJsuhRh7g5OH9KgFmHYCqq3YAxrMQCRwyYKEoWa3N5c9KXMzpLkSwY6WG0UVjhJDlLghT2Rk1mSufpOFL_G5ED7gyTvdAJYzTtYMCTDSdR5sToH0EP7oijwMtlSEDV_v6-L5-NLZVeqM8_c4jRafICtO6S6ztIeF
Несколько особенностей в работе вебхуков
- Если на отправленный вебхук мы не получили ответ с кодом состояния HTTP 200, а получили любой другой код, то будем отправлять его повторно 30 раз с периодичностью в 10 секунд.
- Для проверки доступности указанного вами хоста при создании или изменении вебхука мы отправим на ваш url по одному тестовому вебхуку на каждое из событий, на которые вы подписаны.
Если в статусе ответа не придёт код HTTP 200, то вебхук не будет создан или изменён. - Подключить или изменить вебхук можно только по протоколу HTTPS на порт 443. Создать вебхук на другой порт или протокол не получится.
- Вебхук отправляется с заголовком
Content-Type: text/plain
.
Примеры обработки вебхуков
Примеры кода, который успешно обрабатывает вебхук
Python
from aiohttp import web
import jwt
from jwt import exceptions
import json
# Публичный ключ Точки. Может быть получен из https://enter.tochka.com/doc/openapi/static/keys/public
key_json = '{"kty":"RSA","e":"AQAB","n":"rwm77av7GIttq-JF1itEgLCGEZW_zz16RlUQVYlLbJtyRSu61fCec_rroP6PxjXU2uLzUOaGaLgAPeUZAJrGuVp9nryKgbZceHckdHDYgJd9TsdJ1MYUsXaOb9joN9vmsCscBx1lwSlFQyNQsHUsrjuDk-opf6RCuazRQ9gkoDCX70HV8WBMFoVm-YWQKJHZEaIQxg_DU4gMFyKRkDGKsYKA0POL-UgWA1qkg6nHY5BOMKaqxbc5ky87muWB5nNk4mfmsckyFv9j1gBiXLKekA_y4UwG2o1pbOLpJS3bP_c95rm4M9ZBmGXqfOQhbjz8z-s9C11i-jmOQ2ByohS-ST3E5sqBzIsxxrxyQDTw--bZNhzpbciyYW4GfkkqyeYoOPd_84jPTBDKQXssvj8ZOj2XboS77tvEO1n1WlwUzh8HPCJod5_fEgSXuozpJtOggXBv0C2ps7yXlDZf-7Jar0UYc_NJEHJF-xShlqd6Q3sVL02PhSCM-ibn9DN9BKmD"}'
key = json.loads(key_json)
jwk_key = jwt.jwk_from_dict(key)
async def handle(request: web.Request):
payload = await request.text()
try:
# тело вебхука
webhook_jwt = jwt.JWT().decode(
message=payload,
key=jwk_key,
)
except exceptions.JWTDecodeError:
# Неверная подпись, вебхук не от Точки или с ним что-то не так
pass
return web.Response(status=200)
app = web.Application()
app.router.add_route('POST', '/', handle)
if __name__ == '__main__':
web.run_app(app, port=80)
PHP
<?php
require __DIR__ . "/vendor/autoload.php";
use Firebase\JWT\JWK;
use Firebase\JWT\JWT;
$entityBody = file_get_contents("php://input");
// Публичный ключ Точки. Может быть получен из https://enter.tochka.com/doc/openapi/static/keys/public
$json_key = '{"kty":"RSA","e":"AQAB","n":"rwm77av7GIttq-JF1itEgLCGEZW_zz16RlUQVYlLbJtyRSu61fCec_rroP6PxjXU2uLzUOaGaLgAPeUZAJrGuVp9nryKgbZceHckdHDYgJd9TsdJ1MYUsXaOb9joN9vmsCscBx1lwSlFQyNQsHUsrjuDk-opf6RCuazRQ9gkoDCX70HV8WBMFoVm-YWQKJHZEaIQxg_DU4gMFyKRkDGKsYKA0POL-UgWA1qkg6nHY5BOMKaqxbc5ky87muWB5nNk4mfmsckyFv9j1gBiXLKekA_y4UwG2o1pbOLpJS3bP_c95rm4M9ZBmGXqfOQhbjz8z-s9C11i-jmOQ2ByohS-ST3E5sqBzIsxxrxyQDTw--bZNhzpbciyYW4GfkkqyeYoOPd_84jPTBDKQXssvj8ZOj2XboS77tvEO1n1WlwUzh8HPCJod5_fEgSXuozpJtOggXBv0C2ps7yXlDZf-7Jar0UYc_NJEHJF-xShlqd6Q3sVL02PhSCM-ibn9DN9BKmD"}';
$jwks = json_decode($json_key, true, 512, JSON_THROW_ON_ERROR);
try {
$decoded = JWT::decode($entityBody, JWK::parseKey($jwks,"RS256"));
} catch (\UnexpectedValueException $e) {
// Неверная подпись, вебхук не от Точки или с ним что-то не так
echo "Invalid webhook";
}
// Тело вебхука
$decoded_array = (array) $decoded;
http_response_code(200);
Java
import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.crypto.RSASSAVerifier;
import com.nimbusds.jose.jwk.JWK;
import com.nimbusds.jwt.SignedJWT;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
@RestController
@RequestMapping("/")
public class WebhookResource {
@PostMapping(value = "/")
public void tochkaWebhook(@RequestBody String webhookData) throws ParseException, JOSEException {
// Публичный ключ Точки. Может быть получен из https://enter.tochka.com/doc/openapi/static/keys/public
var jsonKey = "{\"kty\":\"RSA\",\"e\":\"AQAB\",\"n\":\"raJQJyBXIgS1YzYFkmQGq5XtadLVvMcx5u-guR2r5ZgSb-HGUG7HF5NM-NJeL9YrVtjjGf8VNLpwGbeejsS9LRniPfKkCYaVqV1DSGOZ6RTOtqN3jKW1W86cVb-LffrQo3eFhPX5V464uduPu9RouFplQ7wprY5ewke0Yj0FCOr6Ebxlpql-aJp_wk8JSzzFN17IC5tfUXgGDjEmnMjxag_CntnJtKWmw69ivhrq5sTPspclL3Ij8K_Qk0MwAZFCci25WxIuKQe7Mk4dvay6CUfrCbAgEtqMcWUSqoG7pdBig59lo-kIMWvVQIAWjo2JhI7VlI_ssvFtiJg5T9myE914aESFZ8jEheQv-4kZ81F0qk02k2mJ4C7AasGhbzC4F8YQ7nbr49v1n_j8udNZZXA8vI2hacG517A66-uvEHIxXRUo_gIcubR-vdbJbaK_k8JRLJNmdf4B9HchJ6VD9aGjMT0GYfhQ8jf16E1L_U4G4XLB5cnb0h88PD2MaMGP\"}";
var jwkKey = JWK.parse(jsonKey);
var jwtData = SignedJWT.parse(webhookData);
var verifier = new RSASSAVerifier(jwkKey.toRSAKey().toRSAPublicKey());
if (!jwtData.verify(verifier)) {
// Неверная подпись, вебхук не от Точки или с ним что-то не так
System.out.println("Invalid webhook");
return;
}
// Тело вебхука
var webhookParsedData = jwtData.getJWTClaimsSet().getClaims();
return;
}
}
Вебхуками можно управлять с помощью методов:
- Get Webhooks — чтобы получить список всех вебхуков, настроенных на приложение;
- Create Webhook — чтобы создать новый вебхук;
- Edit Webhook — чтобы изменить URL или тип существующего вебхука;
- Delete Webhook — чтобы удалить вебхук;
- Send Webhook — чтобы отправить тестовый вебхук.