Share via


Webhook implementálása az SaaS szolgáltatásban

Amikor a Partnerközpontban létrehoz egy végrehajtható SaaS-ajánlatot, a partner megadja a HTTP-végpontként használandó Csatlakozás ion webhook URL-címét. Ezt a webhookot a Microsoft a POST HTTP-hívással hívja meg, hogy értesítse a közzétevőt a Következő eseményekről, amelyek a Microsoft oldalán történnek:

Webhook esemény 1. Fogadáskor 2. Ha elfogadják 3. Elutasítás esetén
ChangePlan Válasz HTTP 200-nal PATCH sikerrel (ez az esemény nem kötelező, és 10 másodperc alatt automatikusan elérhető) JAVÍTÁS hibával VAGY válasz 4xx-el (10 másodpercen belül)
ChangeQuantity Válasz HTTP 200-nal PATCH sikerrel (ez az esemény nem kötelező, és 10 másodperc alatt automatikusan elérhető) JAVÍTÁS hibával VAGY válasz 4xx-el (10 másodpercen belül)
Renew Válasz HTTP 200-nal Nem alkalmazható Nem alkalmazható
Suspend Válasz HTTP 200-nal Nem alkalmazható Nem alkalmazható
Unsubscribe Válasz HTTP 200-nal Nem alkalmazható Nem alkalmazható
Reinstate Válasz HTTP 200-nal Nem alkalmazható Nem alkalmazható (a törlési API meghívása törlés aktiválásához, ha az újbóli visszaállítás nem fogadható el)

A közzétevőnek webhookot kell implementálnia az SaaS szolgáltatásban, hogy az SaaS-előfizetés állapota konzisztens legyen a Microsoft oldalával. Az SaaS szolgáltatásnak meg kell hívnia a Get Operation API-t, hogy ellenőrizze és engedélyezze a webhook hívási és hasznos adatadatait, mielőtt a webhookértesítés alapján műveletet hajt végre. A közzétevőnek a webhookhívás feldolgozása után azonnal vissza kell adnia a HTTP 200-as értéket a Microsoftnak. Ez az érték elismeri, hogy a webhook-hívást sikeresen fogadta a közzétevő.

Fontos

A webhook URL-szolgáltatásának 24 x 7-et kell futtatnia, és készen kell állnia arra, hogy mindig új hívásokat fogadjon a Microsofttól. A Microsoftnak van egy újrapróbálkozási szabályzata a webhookhíváshoz (500 újrapróbálkozás nyolc órán keresztül), de ha a közzétevő nem fogadja el a hívást, és választ ad vissza, a webhook által küldött művelet végül meghiúsul a Microsoft oldalán.

Fontos

Az ISV-knek kerülnie kell a Webhook-séma szigorú deszerializálását. A Microsoft fenntartja a jogot, hogy a jövőben bővítse a sémát.

Fontos

Az ISV-knek ellenőrizniük kell a Microsoft Entra Tokent (JWT Token) a webhook végpontján a kérés fejlécéből. Ez egy szabványos tulajdonosi jogkivonat, amely részletes információkat ad az ISV-nek arról, hogy ki a hívó. További információ a jogkivonat érvényesítéséről ebben a cikkben. learn.microsoft.com/azure/active-directory/develop/access-tokens

A Webhook hasznos adatokra vonatkozó példája a ChangePlannak:

{
    "id": "<guid>",
    "activityId": "<guid>",
    "publisherId": "XXX",
    "offerId": "YYY",
    "planId": "plan2",
    "quantity": 10,
    "subscriptionId": "<guid>",
    "timeStamp": "2023-02-10T18:48:58.4449937Z",
    "action": "ChangePlan",
    "status": "InProgress",
    "operationRequestSource": "Azure",
    "subscription":
    {
      "id": "<guid>",
      "name": "Test",
      "publisherId": "XXX",
      "offerId": "YYY",
      "planId": "plan1",
      "quantity": 10,
      "beneficiary":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "purchaser":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "allowedCustomerOperations": ["Delete", "Update", "Read"],
      "sessionMode": "None",
      "isFreeTrial": false,
      "isTest": false,
      "sandboxType": "None",
      "saasSubscriptionStatus": "Subscribed",
      "term":
        {
          "startDate": "2022-02-10T00:00:00Z",
          "endDate": "2022-03-12T00:00:00Z",
          "termUnit": "P1M",
          "chargeDuration": null,
        },
      "autoRenew": true,
      "created": "2022-01-10T23:15:03.365988Z",
      "lastModified": "2022-02-14T20:26:04.5632549Z",
    },
    "purchaseToken": null
}

A Webhook hasznos adatainak példája a ChangeQuantity eseményre:


{
    "id": "<guid>",
    "activityId": "<guid>",
    "publisherId": "XXX",
    "offerId": "YYY",
    "planId": "plan1",
    "quantity": 20,
    "subscriptionId": "<guid>",
    "timeStamp": "2023-02-10T18:54:00.6158973Z",
    "action": "ChangeQuantity",
    "status": "InProgress",
    "operationRequestSource": "Azure",
    "subscription": {
        "id": "<guid>",
        "name": "Test",
        "publisherId": "XXX",
        "offerId": "YYY",
        "planId": "plan1",
        "quantity": 10,
        "beneficiary":
            {
            "emailId": XX@outlook.com,
            "objectId": "<guid>",
            "tenantId": "<guid>",
            "puid": "1234567890",
            },
        "purchaser":
            {
            "emailId": XX@outlook.com,
            "objectId": "<guid>",
            "tenantId": "<guid>",
            "puid": "1234567890",
            },
        "allowedCustomerOperations": ["Delete", "Update", "Read"],
        "sessionMode": "None",
        "isFreeTrial": false,
        "isTest": false,
        "sandboxType": "None",
        "saasSubscriptionStatus": "Subscribed",
        "term":
            {
            "startDate": "2022-02-10T00:00:00Z",
            "endDate": "2022-03-12T00:00:00Z",
            "termUnit": "P1M",
            "chargeDuration": null,
            },
        "autoRenew": true,
        "created": "2022-01-10T23:15:03.365988Z",
        "lastModified": "2022-02-14T20:26:04.5632549Z",
    },
    "purchaseToken": null
}

A Webhook hasznos adatokra vonatkozó példája egy előfizetés visszaállítására vonatkozó eseménynek:

// end user's payment instrument became valid again, after being suspended, and the SaaS subscription is being reinstated


{
    "id": "<guid>",
    "activityId": "<guid>",
    "publisherId": "XXX",
    "offerId": "YYY",
    "planId": "plan1",
    "quantity": 100,
    "subscriptionId": "<guid>",
    "timeStamp": "2023-02-11T11:38:10.3508619Z",
    "action": "Reinstate",
    "status": "InProgress",
    "operationRequestSource": "Azure",
    "subscription":
    {
      "id": "<guid>",
      "name": "Test",
      "publisherId": "XXX",
      "offerId": "YYY",
      "planId": "plan1",
      "quantity": 100,
      "beneficiary":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "purchaser":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "allowedCustomerOperations": ["Delete", "Update", "Read"],
      "sessionMode": "None",
      "isFreeTrial": false,
      "isTest": false,
      "sandboxType": "None",
      "saasSubscriptionStatus": "Suspended",
      "term":
        {
          "startDate": "2022-02-10T00:00:00Z",
          "endDate": "2022-03-12T00:00:00Z",
          "termUnit": "P1M",
          "chargeDuration": null,
        },
      "autoRenew": true,
      "created": "2022-01-10T23:15:03.365988Z",
      "lastModified": "2022-02-14T20:26:04.5632549Z",
    },
    "purchaseToken": null
}
 

Webhook hasznos adatokra vonatkozó példa egy megújítási eseményre:

// end user's subscription renewal
 
{
    "id": "<guid>",
    "activityId": "<guid>",
    "publisherId": "XXX",
    "offerId": "YYY",
    "planId": "plan1",
    "quantity": 100,
    "subscriptionId": "<guid>",
    "timeStamp": "2023-02-10T08:49:01.8613208Z",
    "action": "Renew",
    "status": "Succeeded",
    "operationRequestSource": "Azure",
    "subscription":
    {
      "id": "<guid>",
      "name": "Test",
      "publisherId": "XXX",
      "offerId": "YYY",
      "planId": "plan1",
      "quantity": 100,
      "beneficiary":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "purchaser":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "allowedCustomerOperations": ["Delete", "Update", "Read"],
      "sessionMode": "None",
      "isFreeTrial": false,
      "isTest": false,
      "sandboxType": "None",
      "saasSubscriptionStatus": "Subscribed",
      "term":
        {
          "startDate": "2022-02-10T00:00:00Z",
          "endDate": "2022-03-12T00:00:00Z",
          "termUnit": "P1M",
          "chargeDuration": null,
        },
      "autoRenew": true,
      "created": "2022-01-10T23:15:03.365988Z",
      "lastModified": "2022-02-14T20:26:04.5632549Z",
    },
  "purchaseToken": null,
}

Webhook hasznos adatokra vonatkozó példa felfüggesztési eseményre:


{
    "id": "<guid>",
    "activityId": "<guid>",
    "publisherId": "XXX",
    "offerId": "YYY",
    "planId": "plan1",
    "quantity": 100,
    "subscriptionId": "<guid>",
    "timeStamp": "2023-02-10T08:49:01.8613208Z",
    "action": "Suspend",
    "status": "Succeeded",
    "operationRequestSource": "Azure",
    "subscription":
    {
      "id": "<guid>",
      "name": "Test",
      "publisherId": "XXX",
      "offerId": "YYY",
      "planId": "plan1",
      "quantity": 100,
      "beneficiary":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "purchaser":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "allowedCustomerOperations": ["Delete", "Update", "Read"],
      "sessionMode": "None",
      "isFreeTrial": false,
      "isTest": false,
      "sandboxType": "None",
      "saasSubscriptionStatus": "Suspended",
      "term":
        {
          "startDate": "2022-02-10T00:00:00Z",
          "endDate": "2022-03-12T00:00:00Z",
          "termUnit": "P1M",
          "chargeDuration": null,
        },
      "autoRenew": true,
      "created": "2022-01-10T23:15:03.365988Z",
      "lastModified": "2022-02-14T20:26:04.5632549Z",
    },
  "purchaseToken": null,
}

Webhook payload example of an unsubscribe event:

Ez csak értesítési esemény. Ehhez az eseményhez nincs küldés az ACK-nek.


{
    "id": "<guid>",
    "activityId": "<guid>",
    "publisherId": "XXX",
    "offerId": "YYY",
    "planId": "plan1",
    "quantity": 100,
    "subscriptionId": "<guid>",
    "timeStamp": "2023-02-10T08:49:01.8613208Z",
    "action": "Unsubscribe",
    "status": "Succeeded",
    "operationRequestSource": "Azure",
    "subscription":
    {
      "id": "<guid>",
      "name": "Test",
      "publisherId": "XXX",
      "offerId": "YYY",
      "planId": "plan1",
      "quantity": 100,
      "beneficiary":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "purchaser":
        {
          "emailId": XX@outlook.com,
          "objectId": "<guid>",
          "tenantId": "<guid>",
          "puid": "1234567890",
        },
      "allowedCustomerOperations": ["Delete", "Update", "Read"],
      "sessionMode": "None",
      "isFreeTrial": false,
      "isTest": false,
      "sandboxType": "None",
      "saasSubscriptionStatus": "Unsubscribed",
      "term":
        {
          "startDate": "2022-02-10T00:00:00Z",
          "endDate": "2022-03-12T00:00:00Z",
          "termUnit": "P1M",
          "chargeDuration": null,
        },
      "autoRenew": true,
      "created": "2022-01-10T23:15:03.365988Z",
      "lastModified": "2022-02-14T20:26:04.5632549Z",
    },
  "purchaseToken": null,
}

Webhookok védelme

Biztonságossá kell tennie a webhookokat, hogy a Microsoft-végpontokon kívül senki más ne kezdeményezhesse ezeket a Webhook-hívásokat. A webhookok implementálásához bármilyen technológiát használhat, azonban a Webhook implementációjának az alábbi biztonsági irányelveket kell követnie.

  • A Microsoft engedélyezési fejlécekkel hívja meg a webhookokat, amelyek a hívások ellenőrzéséhez szükséges információkat tartalmazzák. Engedélyeznie kell a webhookok számára az engedélyezési fejlécek fogadását. (Ne adjon hozzá engedélyezési adatokat vagy biztonsági jogkivonatokat, például SAS-jogkivonatokat közvetlenül a webhook URL-címeiben. Előfordulhat, hogy az ilyen webhookok nem kérik le a Microsoft által a webhookok hívása során küldött engedélyezési fejléceket.

  • Az Engedélyezési fejlécben átadott JWT Bearer-jogkivonat a következő adatokat tartalmazza a hasznos adatokban, amelyekkel biztonságossá teheti a végpontokat.

  • "aud": "ez a Microsoft Entra Identity alkalmazásazonosító, amelyet hozzáad az ajánlat műszaki konfigurációjához a Microsoft Partnerközpontban"

  • "appid" vagy "azp": Ezt az erőforrás-azonosítót használja a közzétevő engedélyezési jogkivonatának létrehozásakor az SaaS fulfillment API-k meghívásához. Az alkalmazás beállításától függően az erőforrás-azonosító értéke "appid" vagy "azp" lehet. A jogkivonat a két jogcím valamelyikével rendelkezik, és ennek megfelelően kell reagálnia a kódban.

  • "tid": "ez a Microsoft Entra-bérlőazonosító, amelyet hozzáad az ajánlat műszaki konfigurációjához a Microsoft Partnerközpontban"

  • A fenti átadott mezők alapján ellenőrizheti, hogy a Webhook-hívás érvényes-e.

Fontos

A Microsoft megköveteli, hogy az isv-k biztonságos módon hozzák létre a webhookokat, és elfogadják az engedélyezési fejléceket. Ha a jelenlegi Webhook-implementáció nem tudja elfogadni az engedélyezési fejléceket, frissítenie kell a webhookokat, és biztonságossá kell tennie ezeket a végpontokat (a fenti irányelvek alapján), hogy elkerülje a fennakadásokat.

Fejlesztés és tesztelés

A fejlesztési folyamat elindításához javasoljuk, hogy hozzon létre hamis API-válaszokat a közzétevő oldalán. Ezek a válaszok a cikkben megadott mintaválaszokon alapulhatnak.

Ha a közzétevő készen áll a végpontok közötti tesztelésre:

  • Közzétehet egy SaaS-ajánlatot egy korlátozott előzetes verziójú közönségnek, és megtarthatja az előzetes verzióban.
  • Állítsa a csomag árát nullára, hogy a tesztelés során ne aktiválja a tényleges számlázási költségeket. Egy másik lehetőség a nonzero ár beállítása és az összes tesztvásárlás lemondása 24 órán belül.
  • Győződjön meg arról, hogy az összes folyamat végpontok közötti meghívása valós ügyfélforgatókönyv szimulálásához szükséges.
  • Ha a partner szeretné tesztelni a teljes vásárlási és számlázási folyamatot, tegye ezt a 0 usd feletti ajánlattal. A vásárlás kiszámlázva lesz, és a rendszer létrehoz egy számlát.

A vásárlási folyamat az Azure Portalról vagy a Microsoft AppSource-webhelyekről indítható el attól függően, hogy az ajánlat hol van közzétéve.

A terv módosítása, a mennyiség módosítása és a leiratkozási műveletek tesztelése a közzétevő oldalról végezhető. A Microsoft részéről a leiratkozás az Azure Portalról és a Rendszergazda központból is aktiválható (az a portál, ahol a Microsoft AppSource-vásárlásokat kezelik). A mennyiség és a terv módosítása csak a Rendszergazda Központból indítható el.

Támogatás kérése

A közzétevők támogatási lehetőségeiről a Partnerközpont kereskedelmi piactér programjának támogatása című témakörben olvashat.

Következő lépések