Logo Site EngageLab Mark Colored TransparentDocumentation
Rechercher

Interface de callback de statut du cycle de vie

Ce document décrit la structure de données et la description des champs de l'interface de callback de statut du cycle de vie des messages. Lorsque le statut d'un message change, le système renvoie les informations de statut vers l'URL configurée par le client via une requête HTTP POST.

Méthode de callback

  • Méthode de requête : POST
  • Content-Type : application/json
  • Réponse de succès : code de statut HTTP 200 ou 204
  • Nouvelle tentative en cas d'échec : si le client ne renvoie pas de code de statut de succès, le système effectue automatiquement de nouvelles tentatives

Structure de données

1. Structure externe (ReportLifecycles)

{ "total": 1, "rows": [ { // Tableau d'objets ReportLifecycle } ] }
              
              {
  "total": 1,
  "rows": [
    {
      // Tableau d'objets ReportLifecycle
    }
  ]
}

            
Afficher ce bloc de code dans la fenêtre flottante
Nom du champ Type Description Toujours retourné
total int64 Nombre total d'enregistrements Oui
rows array Tableau de données de statut du cycle de vie Oui

2. Objet ReportLifecycle

La structure de chaque élément du tableau rows est la suivante :

Nom du champ Type Description Toujours retourné
message_id string ID du message Oui
to string Numéro du destinataire Oui
server string Type de service Oui
channel string Type de canal Oui
itime int64 Horodatage du callback (en secondes) Oui
custom_args map[string]any Paramètres personnalisés (transmis lors de l'envoi) Non
status object Objet de détails du statut Non

3. Objet Status

Objet de détails du statut :

Nom du champ Type Description Toujours retourné
message_status string Statut du message, par ex. : sent, sent_fail, delivered, delivered_fail, verified, etc. Oui
status_data object Objet de données de statut, voir ci-dessous Oui
billing object Objet d'informations de facturation, voir ci-dessous Non
error_code int Code d'erreur, 0 signifie aucune erreur Oui
error_detail object Objet de détails d'erreur, voir ci-dessous Non
kwai_extra object Informations d'extension spécifiques à Kwai, voir ci-dessous Non

Remarque : les champs suivants sont utilisés pour les statistiques internes et ne sont pas renvoyés au client via callback :

  • analysis - Champ d'analyse statistique interne

4. Objet StatusData

Données de base liées au statut :

Nom du champ Type Description Toujours retourné
msg_time int64 Horodatage de création du message (en secondes) Oui
message_id string ID du message Oui
current_send_channel string Nom du canal d'envoi actuel Oui
template_key string Clé de configuration du modèle Oui
business_id string ID de l'activité Oui

Remarque : les champs suivants sont des informations sensibles ou des champs internes, ils ont été filtrés et ne sont pas renvoyés au client via callback :

  • message_content - Contenu du message (information sensible)
  • parts - Nombre de fragments du message (champ interne)
  • msg_type - Type de message (champ interne)
  • protocol_type - Type de protocole (champ interne)
  • supplier_ids - ID du fournisseur (information sensible)

5. Objet Billing

Informations de facturation (renvoyées uniquement lorsqu'il existe des données de facturation) :

Nom du champ Type Description Toujours retourné
cost float64 Montant des frais (arrondi à 4 décimales) Oui
currency string Devise, fixée à « USD » Oui

Remarque : les champs suivants sont des champs de facturation internes et ne sont pas renvoyés au client via callback :

  • cost10000 - Champ de facturation interne (unité au 1/10000)
  • sender_cost10000 - Coût de l'expéditeur (unité au 1/10000)

6. Objet ErrorDetail

Détails d'erreur (renvoyés uniquement lorsqu'une erreur se produit) :

Nom du champ Type Description Toujours retourné
message string Description du message d'erreur Oui
channel_code string Code d'erreur d'origine renvoyé par le canal Oui
channel_message string Message d'erreur d'origine renvoyé par le canal Oui

7. Objet KwaiExtra

Informations d'extension spécifiques aux clients Kwai (renvoyées uniquement en statut livré et pour les clients Kwai) :

Nom du champ Type Description Toujours retourné
delivered_time int64 Horodatage de livraison (en millisecondes) Oui
parts int Nombre d'unités facturées Oui
duration int64 Durée d'écoute (en secondes), uniquement pour les messages vocaux Non

Description des statuts de message

Valeurs de statut de message courantes :

Valeur de statut Description
sent Envoyé au canal
sent_fail Échec de l'envoi
delivered Livré au terminal de l'utilisateur
delivered_fail Échec de la livraison
verified Vérifié par l'utilisateur (par ex. code OTP utilisé)

Exemples de callback

Exemple 1 : message livré avec succès

{ "total": 1, "rows": [ { "message_id": "123456789", "to": "+6598765432", "server": "sms", "channel": "sms", "itime": 1701234567, "custom_args": { "order_id": "ORDER123", "user_id": "USER456" }, "status": { "message_status": "delivered", "status_data": { "msg_time": 1701234560, "message_id": "123456789", "current_send_channel": "CHANNEL_A", "template_key": "verify_code", "business_id": "1001" }, "billing": { "cost": 0.005, "currency": "USD" }, "error_code": 0 } } ] }
              
              {
  "total": 1,
  "rows": [
    {
      "message_id": "123456789",
      "to": "+6598765432",
      "server": "sms",
      "channel": "sms",
      "itime": 1701234567,
      "custom_args": {
        "order_id": "ORDER123",
        "user_id": "USER456"
      },
      "status": {
        "message_status": "delivered",
        "status_data": {
          "msg_time": 1701234560,
          "message_id": "123456789",
          "current_send_channel": "CHANNEL_A",
          "template_key": "verify_code",
          "business_id": "1001"
        },
        "billing": {
          "cost": 0.005,
          "currency": "USD"
        },
        "error_code": 0
      }
    }
  ]
}

            
Afficher ce bloc de code dans la fenêtre flottante

Exemple 2 : échec de l'envoi du message

{ "total": 1, "rows": [ { "message_id": "123456790", "to": "+6598765433", "server": "sms", "channel": "sms", "itime": 1701234568, "status": { "message_status": "sent_fail", "status_data": { "msg_time": 1701234561, "message_id": "123456790", "current_send_channel": "CHANNEL_B", "template_key": "verify_code", "business_id": "1001" }, "error_code": 4001, "error_detail": { "message": "Invalid phone number", "channel_code": "INVALID_NUMBER", "channel_message": "The phone number format is invalid" } } } ] }
              
              {
  "total": 1,
  "rows": [
    {
      "message_id": "123456790",
      "to": "+6598765433",
      "server": "sms",
      "channel": "sms",
      "itime": 1701234568,
      "status": {
        "message_status": "sent_fail",
        "status_data": {
          "msg_time": 1701234561,
          "message_id": "123456790",
          "current_send_channel": "CHANNEL_B",
          "template_key": "verify_code",
          "business_id": "1001"
        },
        "error_code": 4001,
        "error_detail": {
          "message": "Invalid phone number",
          "channel_code": "INVALID_NUMBER",
          "channel_message": "The phone number format is invalid"
        }
      }
    }
  ]
}

            
Afficher ce bloc de code dans la fenêtre flottante

Exemple 3 : échec de la livraison du message (avec informations de facturation)

{ "total": 1, "rows": [ { "message_id": "123456791", "to": "+6598765434", "server": "sms", "channel": "sms", "itime": 1701234570, "custom_args": { "campaign": "new_year_promo" }, "status": { "message_status": "delivered_fail", "status_data": { "msg_time": 1701234562, "message_id": "123456791", "current_send_channel": "CHANNEL_C", "template_key": "marketing", "business_id": "1001" }, "billing": { "cost": 0.0045, "currency": "USD" }, "error_code": 5002, "error_detail": { "message": "Phone number unreachable", "channel_code": "UNREACHABLE", "channel_message": "Subscriber absent" } } } ] }
              
              {
  "total": 1,
  "rows": [
    {
      "message_id": "123456791",
      "to": "+6598765434",
      "server": "sms",
      "channel": "sms",
      "itime": 1701234570,
      "custom_args": {
        "campaign": "new_year_promo"
      },
      "status": {
        "message_status": "delivered_fail",
        "status_data": {
          "msg_time": 1701234562,
          "message_id": "123456791",
          "current_send_channel": "CHANNEL_C",
          "template_key": "marketing",
          "business_id": "1001"
        },
        "billing": {
          "cost": 0.0045,
          "currency": "USD"
        },
        "error_code": 5002,
        "error_detail": {
          "message": "Phone number unreachable",
          "channel_code": "UNREACHABLE",
          "channel_message": "Subscriber absent"
        }
      }
    }
  ]
}

            
Afficher ce bloc de code dans la fenêtre flottante

Exemple 4 : message vocal livré pour un client Kwai

{ "total": 1, "rows": [ { "message_id": "123456792", "to": "+6598765435", "server": "voice", "channel": "voice", "itime": 1701234575, "status": { "message_status": "delivered", "status_data": { "msg_time": 1701234565, "message_id": "123456792", "current_send_channel": "VOICE_CHANNEL_A", "template_key": "voice_verify", "business_id": "2001" }, "billing": { "cost": 0.012, "currency": "USD" }, "error_code": 0, "kwai_extra": { "delivered_time": 1701234575000, "parts": 1, "duration": 45 } } } ] }
              
              {
  "total": 1,
  "rows": [
    {
      "message_id": "123456792",
      "to": "+6598765435",
      "server": "voice",
      "channel": "voice",
      "itime": 1701234575,
      "status": {
        "message_status": "delivered",
        "status_data": {
          "msg_time": 1701234565,
          "message_id": "123456792",
          "current_send_channel": "VOICE_CHANNEL_A",
          "template_key": "voice_verify",
          "business_id": "2001"
        },
        "billing": {
          "cost": 0.012,
          "currency": "USD"
        },
        "error_code": 0,
        "kwai_extra": {
          "delivered_time": 1701234575000,
          "parts": 1,
          "duration": 45
        }
      }
    }
  ]
}

            
Afficher ce bloc de code dans la fenêtre flottante

Points d'attention

  1. Règles de retour des champs

    • Tous les champs marqués omitempty n'apparaissent pas dans le JSON retourné lorsque leur valeur est vide ou nulle
    • Les informations sensibles et les champs internes ont été filtrés ou effacés avant le callback
  2. Sécurité

    • Le contenu du message (message_content) n'est pas renvoyé au client via callback
    • Les informations sensibles telles que les ID de fournisseur (supplier_ids) ont été filtrées
    • Les champs de facturation internes (cost10000, sender_cost10000) ne sont pas renvoyés via callback
  3. Exigences de réception

    • L'interface de callback du client doit renvoyer une réponse dans un délai de 5 secondes
    • Elle doit renvoyer un code de statut HTTP 200 ou 204 pour indiquer une réception réussie
    • Si d'autres codes de statut sont renvoyés ou en cas d'expiration du délai, le système effectue automatiquement de nouvelles tentatives
  4. Mécanisme de nouvelle tentative

    • De nouvelles tentatives sont effectuées automatiquement après l'échec d'un callback
    • L'intervalle entre les tentatives augmente progressivement
    • Les données sont conservées dans Redis pendant la période des tentatives
  5. Description des horodatages

    • itime : horodatage du moment où le callback s'est produit, en secondes
    • msg_time : horodatage de création du message, en secondes
    • delivered_time : champ spécifique à Kwai, horodatage de livraison, en millisecondes
  6. Paramètres personnalisés

    • Le champ custom_args renvoie tels quels les paramètres personnalisés transmis lors de l'envoi du message
    • Si aucun paramètre personnalisé n'a été transmis lors de l'envoi, ce champ n'apparaît pas dans les données de callback

Référence des codes d'erreur

Description des codes d'erreur courants (pour les codes d'erreur spécifiques, veuillez vous référer à la documentation des codes d'erreur) :

Code d'erreur Description
0 Aucune erreur, opération réussie
4001 Erreur de format du numéro
4002 Le numéro n'existe pas
5001 Canal refusé
5002 Utilisateur injoignable
6001 Délai réseau dépassé

Pour une description plus détaillée des codes d'erreur, veuillez vous référer à la documentation distincte des codes d'erreur.

Journal des modifications

  • 2024-01 : version initiale
  • Ajout du champ kwai_extra pour prendre en charge les clients Kwai
  • Filtrage des champs d'informations sensibles pour renforcer la sécurité
Icon Solid Transparent White Qiyu
Contactez-nous