تنفيذ webhook على خدمة SaaS

عند إنشاء عرض SaaS قابل للتداول في مركز الشركاء، يوفر الشريك عنوان URL لخطاف ويب الاتصال لاستخدامه كنقطة نهاية HTTP. يتم استدعاء خطاف الويب هذا بواسطة Microsoft باستخدام استدعاء POST HTTP لإعلام جانب الناشر بالأحداث التالية التي تحدث على جانب Microsoft:

  • عندما يكون اشتراك SaaS في حالة اشتراك :
    • خطة التغيير
    • تغيير الكمية
    • تجديد
    • ⁦⁧⁩⁩توقف مرحلي⁦⁧⁩⁩
    • ⁦⁦⁩⁩إلغاء الاشتراك⁦⁦⁩⁩
  • عندما يكون اشتراك SaaS في حالة تعليق :
    • ⁦⁧⁩⁩إعادة المطالبة بالاشتراك⁦⁧⁩⁩
    • ⁦⁦⁩⁩إلغاء الاشتراك⁦⁦⁩⁩

يجب على الناشر تنفيذ خطاف ويب في خدمة SaaS للحفاظ على حالة اشتراك SaaS متسقة مع جانب Microsoft. يلزم على خدمة SaaS الاتصال بواجهة برمجة تطبيقات Get Operation للتحقق من صحة بيانات مكالمة وحمولة webhook وتفويضها قبل اتخاذ إجراء استنادا إلى إشعار webhook. يجب على الناشر إرجاع HTTP 200 إلى Microsoft بمجرد معالجة مكالمة webhook. تقر هذه القيمة بأن الناشر قد تلقى مكالمة webhook بنجاح.

هام

يجب أن تكون خدمة عنوان URL ل webhook قيد التشغيل 24x7 وجاهزة لتلقي مكالمات جديدة من Microsoft في جميع الأوقات. لدى Microsoft نهج إعادة محاولة لمكالمة webhook (500 إعادة محاولة على مدار 8 ساعات) ، ولكن إذا لم يقبل الناشر المكالمة وإرجاع استجابة ، فإن العملية التي يخطر بها webhook ستفشل في النهاية على جانب Microsoft.

مثال على حمولة Webhook ل ChangePlan:

{
  "id": "<guid>",
  "activityId": "<guid>",
  "operationRequestSource": "Azure",
  "subscriptionId": "<guid>",
  "timeStamp": "2021-06-23T05:05:29.9799053Z",
  "action": "ChangePlan"
}

مثال على حمولة Webhook لحدث ChangeQuantity:

{
"id": "<guid>",
"activityId": "<guid>",
"publisherId": "XXX",
"offerId": "offerid",
"planId": "planid",
"quantity": 100,
"subscriptionId": "<guid>",
"timeStamp": "2022-02-14T20:26:05.1419317Z",
"action": "ChangeQuantity",
"status": "InProgress",
"operationRequestSource": "Partner",

مثال على حمولة Webhook لحدث إعادة الاشتراك:

// end user's payment instrument became valid again, after being suspended, and the SaaS subscription is being reinstated
{
  "id": "<guid>",
  "activityId": "<guid>",
  "subscriptionId": "<guid>",
  "publisherId": "contoso",
  "offerId": "offer2 ",
  "planId": "gold",
  "quantity": 20,
  "timeStamp": "2019-04-15T20:17:31.7350641Z",
  "action": "Reinstate",
  "status": "InProgress"
}

مثال على حمولة Webhook لحدث تجديد:

// end user's subscription renewal
 {
    "id": "<guid>",
    "activityId": "<guid>",
    "publisherId": "contoso",
    "offerId": "offer1",
    "planId": "plan1",
    "quantity": 1,
    "subscriptionId": "<guid>",
    "timeStamp": "2021-12-04T19:48:06.7054737Z",
    "action": "Renew",
    "status": "Succeeded",
    "operationRequestSource": "Azure",
    "subscription": {
        "id": "<guid>",
        "name": "name",
        "publisherId": "contoso",
        "offerId": "offerId",
        "planId": "planId",
        "quantity": null,
        "beneficiary": {
            "emailId": "XXX@gmail.com",
            "objectId": "<guid>",
            "tenantId": "<guid>",
            "puid": null
        },
        "purchaser": {
            "emailId": "XXX@gmail.com",
            "objectId": "<guid>",
            "tenantId": "<guid>",
            "puid": null
        },
        "allowedCustomerOperations": [
            "Delete",
            "Update",
            "Read"
        ],
        "sessionMode": "None",
        "isFreeTrial": false,
        "isTest": false,
        "sandboxType": "None",
        "saasSubscriptionStatus": "Subscribed",
        "term": {
            "startDate": "2021-12-04T00:00:00Z",
            "endDate": "2022-01-03T00:00:00Z",
            "termUnit": "P1M",
            "chargeDuration": null
        },
        "autoRenew": true,
        "created": "2021-09-10T07:03:17.5098444Z",
        "lastModified": "2021-12-04T19:48:06.0754649Z"
    },
    "purchaseToken": null
}

مثال على حمولة Webhook لحدث تعليق مؤقت:

{
  "id": "<guid>",
  "activityId": "<guid>",
  "publisherId": "testpublisher",
  "offerId": "testoffer",
  "planId": "starter",
  "quantity": 1,
  "subscriptionId": "<guid>",
  "timeStamp": "2022-03-10T16:34:41.137017Z",
  "action": "Suspend",
  "status": "Succeeded",
  "operationRequestSource": "Azure",
  "subscription": {
    "id": "<guid>",
    "name": "testcms",
    "publisherId": "testpublisher",
    "offerId": "cmstestoffer",
    "planId": "starter",
    "quantity": null,
    "beneficiary": {
      "emailId": "XXX",
      "objectId": "<guid>",
      "tenantId": "<guid>",
      "puid": "XXX"
    },
    "purchaser": {
      "emailId": "XXX",
      "objectId": "<guid>",
      "tenantId": "<guid>",
      "puid": "XXX"
    },
    "allowedCustomerOperations": [ "Delete", "Update", "Read" ],
    "sessionMode": "None",
    "isFreeTrial": false,
    "isTest": false,
    "sandboxType": "None",
    "saasSubscriptionStatus": "Subscribed",
    "term": {
      "startDate": "2022-03-09T00:00:00Z",
      "endDate": "2022-04-08T00:00:00Z",
      "termUnit": "P1M",
      "chargeDuration": null
    },
    "autoRenew": true,
    "created": "2022-03-09T18:45:49.0735944Z",
    "lastModified": "2022-03-09T22:49:25.4181451Z"
  },
  "purchaseToken": null
}

مثال على حمولة Webhook لحدث إلغاء الاشتراك:

{
  "id": "<guid>",
  "activityId": "<guid>",
  "publisherId": "testpublisher",
  "offerId": "saasteam4-preview",
  "planId": "standard",
  "quantity": 1,
  "subscriptionId": "<guid>",
  "timeStamp": "2022-03-12T01:53:14.5038009Z",
  "action": "Unsubscribe",
  "status": "Succeeded",
  "operationRequestSource": "Azure",
  "subscription": {
    "id": "<guid>",
    "name": "Sub-test-ng",
    "publisherId": "testpublisher",
    "offerId": "saasteam4-preview",
    "planId": "standard",
    "quantity": null,
    "beneficiary": {
      "emailId": "*******************************",
      "objectId": "<guid>",
      "tenantId": "<guid>",
      "puid": "****************"
    },
    "purchaser": {
      "emailId": "*******************************",
      "objectId": "<guid>",
      "tenantId": "<guid>",
      "puid": "****************"
    },
    "allowedCustomerOperations": [ "Delete", "Update", "Read" ],
    "sessionMode": "None",
    "isFreeTrial": false,
    "isTest": false,
    "sandboxType": "None",
    "saasSubscriptionStatus": "Unsubscribed",
    "term": {
      "startDate": "2022-03-07T00:00:00Z",
      "endDate": "2022-04-06T00:00:00Z",
      "termUnit": "P1M",
      "chargeDuration": null
    },
    "autoRenew": true,
    "created": "2021-12-07T12:47:12.7474496Z",
    "lastModified": "2022-03-11T22:32:06.720473Z"
  },
  "purchaseToken": null
}

مثال على حمولة Webhook لحدث إعادة التشغيل:

{
  "subscriptionId": "<guid>",
  "operationType": "Reinstate"
}

التطوير والاختبار

لبدء عملية التطوير، نوصي بإنشاء استجابات وهمية لواجهة برمجة التطبيقات على جانب الناشر. يمكن أن تستند هذه الردود إلى نماذج الردود المقدمة في هذه المقالة.

عندما يكون الناشر جاهزا للاختبار من البداية إلى النهاية:

  • انشر عرض SaaS لجمهور معاينة محدود واحتفظ به في مرحلة المعاينة.
  • اضبط سعر الخطة على 0، لتجنب تشغيل نفقات الفوترة الفعلية أثناء الاختبار. خيار آخر هو تحديد سعر غير صفري وإلغاء جميع مشتريات الاختبار في غضون 24 ساعة.
  • تأكد من استدعاء جميع التدفقات من البداية إلى النهاية ، لمحاكاة سيناريو عميل حقيقي.
  • إذا أراد الشريك اختبار تدفق الشراء والفوترة بالكامل، فقم بذلك باستخدام عرض يزيد سعره عن 0 دولار. ستتم فوترة عملية الشراء، وسيتم إنشاء فاتورة.

يمكن تشغيل تدفق الشراء من مدخل Azure أو مواقع Microsoft AppSource، استنادا إلى مكان نشر العرض.

يتم اختبار إجراءات تغيير الخطةوتغيير الكميةوإلغاء الاشتراك من جانب الناشر. من جانب Microsoft، يمكن تشغيل إلغاء الاشتراك من كل من مدخل Azure ومركز الإدارة (البوابة الإلكترونية التي تتم فيها إدارة عمليات شراء Microsoft AppSource). يمكن تشغيل تغيير الكمية والخطة فقط من مركز الإدارة.

الحصول على الدعم

راجع دعم برنامج السوق التجاري في مركز الشركاء للاطلاع على خيارات دعم الناشرين.

الخطوات التالية

راجع واجهات برمجة تطبيقات خدمة قياس السوق التجارية لمزيد من الخيارات لعروض SaaS في السوق التجارية.

مراجعة واستخدام العملاء للغات البرمجة والعينات المختلفة.