-
Planes Team, Professional, Business y Enterprise
Ponte en contacto con el equipo de ventas para preguntar por nuestros planes.
Los webhooks notifican eventos a servicios externos como clientes de chat u otras API externas. Un webhook puede establecer una URL cuando ocurre un evento específico.
Importante
File uploads only trigger the uploads:crear
and uploads:processing
webhook events.
keys:crear
, keys:actualizar
, translations:crear
y translations:actualizar
eventos webhook no se activan por uploads de archivos o importaciones automatizadas a través de:
Hay un período de retención de 30 días para el historial webhook.
Respuesta webhook
Un extremo webhook debe devolver un código de estado HTTP en el rango 200–299 dentro de los 5 segundos de recibir una rellamada. Otros códigos de estado y tiempos de espera de solicitud se consideran errores de entrega. Un webhook se desactivará si la entrega falla durante más de 10 eventos consecutivos. Las devoluciones de llamadas no se repiten.
Si recibe una rellamada, responda dentro del período de tiempo de espera de la solicitud de 5 segundos. Para garantizar que las aplicaciones no activan un tiempo de espera accidentalmente, aplace el procesamiento hasta después de que se haya enviado la respuesta HTTP.
Integridad de la solicitud webhook
Cada solicitud webhook incluye un encabezado de firma X-PhraseApp
que se genera utilizando como secreto el identificador único (token) de verificación webhook junto con los datos enviados en la solicitud. Verificar el origen de la solicitud calculando el compendio de HMAC del organismo solicitante y comparándolo con el valor del encabezado de la firma X-PhraseApp
.
Ejemplos:
Rubí
def verify_webhook(signatureheader) digest = OpenSSL::Digest::Digest.new('sha256') hmac = OpenSSL::HMAC.digest(digest, VERIFICATION_TOKEN, request.body) hmac = Base64.encode64(hmac).strip hmac == signatureheader end
PHP
function verify_webhook($signatureheader){ $hmac = hash_hmac('sha256', $requestBody, $verificationToken, true); $hmac = trim(base64_encode($hash)); return $hmac == $signatureheader; }
Nombre del evento |
Descripción |
---|---|
|
Se creó una rama. |
|
Se fusionó una rama. |
|
Se agregó un comento sobre una clave de traducción. |
|
Se actualizó un valor de campo de metadatos personalizado en varias claves. |
|
Se actualizó un valor de campo de metadatos personalizado a nivel de clave. |
|
Un trabajo se marcó como Completado. |
|
Se crea un trabajo. |
|
La localización de un trabajo se marcó como completada. |
|
Se reabrió la localización de un trabajo. |
|
La localización del trabajo fue revisada y marcada como Completada. |
|
La localización del trabajo fue revisada y reabierta. |
|
Se reabrió un trabajo. |
|
Se inició un trabajo. |
|
Un trabajo se actualiza. |
|
Se han eliminado varias claves. |
|
Se creó una clave. |
|
Se eliminó una clave. |
|
Una clave fue renombrada o cambiada. |
|
Se creó una nueva versión idioma en un proyecto. |
|
Se eliminó una versión idioma. |
|
Se cambió, renombró o reconconfiguró una versión idioma. |
|
Un proyecto fue cambiado o reconfigurado. |
|
Se creó una versión OTA. |
|
Se ha eliminado una versión OTA. |
|
Se creó una captura de pantalla. |
|
Se eliminó una captura de pantalla. |
|
Se cambió o renombró una captura de pantalla. |
|
Se ha eliminado una lista de traducciones. |
|
Una lista de traducciones ha sido revisada. |
|
No se ha revisado la lista de traducciones. |
|
Se ha sin verificar una lista de traducciones. |
|
Se ha verificado una lista de traducciones. |
|
Se añadió una traducción de una clave en una versión de un idioma determinado. |
|
Un proveedor de servicios de idiomas entregó una traducción de una clave en una determinada versión del idioma. |
|
Una traducción de una clave en una determinada versión del idioma fue revisada. |
|
No se revisó una traducción de una clave en una versión de un determinado idioma. |
|
Una traducción de una clave en una determinada versión del idioma estaba sin verificar. |
|
Se editó una traducción de una clave en una versión de un determinado idioma. |
|
Una traducción de una clave en una versión de un determinado idioma fue verificada. |
|
Se ha procesado correctamente un archivo de localización. |
|
Se está procesando un archivo de localización. |
Para agregar un webhook, sigue estos pasos:
-
Desde la página Configurar.
, ve hasta y haz clic enSe abre la página
. -
Haz clic en Agregar webhook.
Se abre la ventana
. -
Proporciona detalles webhook.
-
Opcionalmente,
. -
Haz clic en Guardar. Al webhook especificado se le añade la lista de la página
.
Un webhook se puede desactivar desde el menú
de un webhook específico.Para probar un webhook:
-
En la página Enviar notificación de prueba en el menú .
, selecciona un webhook y seleccionaSe presenta un aviso indicando que la prueba tuvo éxito.
Usa un servicio como RequestBin para capturar el contenido de un webhook. RequestBin proporciona una URL que recopila los datos de solicitud para su inspección.
Se envía una solicitud POST a la URL de rellamada especificada cada vez que ocurre un evento del tipo especificado. La carga útil POST de la solicitud es un documento codificado con JSON con datos relevantes para el evento. Siempre se incluirán los atributos evento
y mensaje
, junto con atributos adicionales relevantes para el evento, como el usuario, proyecto y rama desde la que se activó el webhook.
Encabezados de respuesta
Las solicitudes HTTP realizadas a la URL de rellamada contendrán varios encabezados especiales.
-
X-PhraseApp-Event
: El tipo de evento que activó el webhook. -
Firma X-PhraseApp
: el resumen hexagonal HMAC de la carga útil, usando el secreto del gancho como clave.
Ejemplo:
Content-Type: application/json X-PhraseApp-Event: translation:create X-PhraseApp-Signature: abc123 { "event": "translations:create", "message": "Peter translated page.help.title in fr.", "user": { "id": "abcd1234cdef1234abcd1234cdef1234", "username": "joe.doe", "name": "Joe Doe", "email": "joe@phrase.com", "position": "Lead Developer", "created_at": "2015-01-28T09:52:53Z", "updated_at": "2015-01-28T09:52:53Z" }, "project": { "id": "abcd1234cdef1234abcd1234cdef1234", "name": "My Android Project", "main_format": "xml", "project_image_url": "http://assets.phrase.com/project.png", "account": "account", "created_at": "2015-01-28T09:52:53Z", "updated_at": "2015-01-28T09:52:53Z" }, "branch": { "name": "branch_name" }, "translation": { "id": "abcd1234cdef1234abcd1234cdef1234", "content": "My translation", "unverified": false, "excluded": false, "plural_suffix": "", "key": { "id": "abcd1234cdef1234abcd1234cdef1234", "name": "home.index.headline", "plural": false }, "locale": { "id": "abcd1234cdef1234abcd1234cdef1234", "name": "de", "code": "de-DE" }, "placeholders": [ "%{count}" ], "created_at": "2015-01-28T09:52:53Z", "updated_at": "2015-01-28T09:52:53Z" } }