Aracılığıyla paylaş


MSI veya EXE uygulaması için Microsoft Store gönderim API'si

MSI veya EXE uygulaması için Microsoft Store gönderim API'sini kullanarak sizin veya kuruluşunuzun İş Ortağı Merkezi hesabı için MSI veya EXE uygulamalarına yönelik gönderimleri program aracılığıyla sorgulayın ve oluşturun. Hesabınız birçok uygulamayı yönetiyorsa ve bu varlıklar için gönderim sürecini otomatikleştirmek ve iyileştirmek istiyorsanız bu API kullanışlıdır. Bu API, uygulama veya hizmetinizden gelen çağrıların kimliğini doğrulamak için Azure Active Directory 'yi (Azure AD) kullanır.

Aşağıdaki adımlarda Microsoft Store gönderim API'sini kullanma işlemi uçtan uca açıklanmaktadır:

  1. Tüm önkoşulları tamamladığınızdan emin olun.
  2. Microsoft Store gönderim API'sinde bir yöntemi çağırmadan önce bir Azure AD erişim belirteci alın. Belirteci aldıktan sonra, belirtecin süresi dolmadan önce Microsoft Store gönderim API'sine yapılan çağrılarda bu belirteci kullanmak için 60 dakikanız vardır. Belirtecin süresi dolduktan sonra yeni bir belirteç oluşturabilirsiniz.
  3. MSI veya EXE uygulaması için Microsoft Store gönderim API'sini çağırın.

1. Adım: Microsoft Store gönderim API'sini kullanmak için önkoşulları tamamlayın

MSI veya EXE uygulaması için Microsoft Store gönderim API'sini çağırmak üzere kod yazmaya başlamadan önce aşağıdaki önkoşulları tamamladığınızdan emin olun.

  • Sizin (veya kuruluşunuzun) bir Azure AD dizinine sahip olması ve dizin için Genel yönetici izniniz olması gerekir. Microsoft 365 veya Microsoft'un diğer iş hizmetlerini zaten kullanıyorsanız Azure AD dizininiz zaten vardır. Aksi takdirde, ek ücret ödemeden yeni bir Azure AD oluşturabilirsiniz İş Ortağı Merkezi'nde.
  • Bir Azure AD uygulamasını İş Ortağı Merkezi hesabınızla ilişkilendirmeniz ve kiracı kimliğinizi, istemci kimliğinizi ve anahtarınızı almanız gerekir. Microsoft Store gönderim API'sine yönelik çağrılarda kullanacağınız bir Azure AD erişim belirteci almak için bu değerlere ihtiyacınız vardır.
  • Uygulamanızı Microsoft Store gönderim API'siyle kullanmak üzere hazırlayın:
    • Uygulamanız henüz İş Ortağı Merkezi'nde yoksa, uygulamanızın adını İş Ortağı Merkezi'nde rezerve ederek oluşturmanız gerekir. İş Ortağı Merkezi'nde uygulama oluşturmak için Microsoft Store gönderim API'sini kullanamazsınız; oluşturmak için İş Ortağı Merkezi'nde çalışmanız gerekir ve bundan sonra UYGULAMAYA erişmek ve program aracılığıyla bunun için gönderimler oluşturmak için API'yi kullanabilirsiniz.
    • Bu API'yi kullanarak belirli bir uygulama için gönderim oluşturabilmeniz için önce İş Ortağı Merkezi'nde uygulama için yaş derecelendirmeleri anketini yanıtlama da dahil olmak üzere bir gönderim oluşturmanız gerekir. Bunu yaptıktan sonra API'yi kullanarak bu uygulama için program aracılığıyla yeni gönderimler oluşturabilirsiniz.
    • Uygulama gönderimi oluşturuyor veya güncelleştiriyorsanız ve yeni paket eklemeniz gerekiyorsa paket ayrıntılarını hazırlayın.
    • Uygulama gönderimi oluşturuyor veya güncelliyorsanız ve Mağaza listesi için ekran görüntüleri veya resimler eklemeniz gerekiyorsa, uygulama ekran görüntüleri ve resimlerinihazırlayın.

Azure AD uygulamasını İş Ortağı Merkezi hesabınızla ilişkilendirme

MSI veya EXE uygulaması için Microsoft Store gönderim API'sini kullanabilmeniz için bir Azure AD uygulamasını İş Ortağı Merkezi hesabınızla ilişkilendirmeniz, uygulamanın kiracı kimliğini ve istemci kimliğini almanız ve bir anahtar oluşturmanız gerekir. Azure AD uygulaması, Microsoft Store gönderim API'sini çağırmak istediğiniz uygulamayı veya hizmeti temsil eder. API'ye geçirdiğiniz bir Azure AD erişim belirtecini almak için kiracı kimliğine, istemci kimliğine ve anahtara ihtiyacınız vardır.

Uyarı

Bu görevi yalnızca bir kez gerçekleştirmeniz gerekir. Kiracı kimliğiniz, istemci kimliğiniz ve anahtarınız olduktan sonra, yeni bir Azure AD erişim belirteci oluşturmanız gerektiğinde bunları yeniden kullanabilirsiniz.

  1. İş Ortağı Merkezi'nde kuruluşunuzun İş Ortağı Merkezi hesabını kuruluşunuzun Azure AD diziniile ilişkilendirin.
  2. Ardından, İş Ortağı Merkezi'nin Hesap ayarları bölümündeki Kullanıcılar sayfasından, İş Ortağı Merkezi hesabınızın gönderimlerine erişmek için kullanacağınız uygulamayı veya hizmeti temsil eden Azure AD uygulamasını ekleyin . Bu uygulamaya Yönetici rolünü atadığınızdan emin olun. Uygulama henüz Azure AD dizininizde yoksa,İş Ortağı Merkezi'nde yeni bir Azure AD uygulaması oluşturabilirsiniz.
  3. Kullanıcılar sayfasına dönün, Azure AD uygulamanızın adına tıklayarak uygulama ayarlarına gidin ve Kiracı Kimliği ve İstemci Kimliği değerlerini aşağı kopyalayın.
  4. Yeni bir anahtar veya İstemci gizli dizisi eklemek için aşağıdaki yönergelere bakın veya Uygulamayı Azure Portal aracılığıyla kaydetme yönergelerine bakın:

Uygulamanızı kaydetmek için:

  1. Azure portalınaoturum açın.

  2. Birden çok kiracıya erişiminiz varsa, uygulamayı kaydetmek istediğiniz kiracıya geçmek için üst menüdeki Dizinler + abonelikler filtresini kullanın.

  3. Azure Active Directory'yi bulun ve seçin.

  4. Yönet'in altında Uygulama kayıtları > Uygulamanızı seçin.

  5. Sertifikalar ve gizli anahtarlar > İstemci gizli anahtarları > Yeni istemci gizli anahtarı.

  6. İstemci sırrınız için bir açıklama ekleyin.

  7. Sır için bir son kullanma tarihi seçin veya özel bir geçerlilik süresi belirtin.

  8. İstemci sırrının geçerlilik süresi iki yıl (24 ay) veya daha kısa süreyle sınırlıdır. 24 aydan uzun bir özel yaşam süresi belirtemezsiniz.

    Uyarı

    Microsoft, 12 aydan kısa bir süre sonu değeri ayarlamanızı önerir.

  9. Ekle'yi seçin.

  10. Gizli anahtarın değerini istemci uygulama kodunuzda kullanmak üzere kaydedin. Bu sayfadan ayrıldıktan sonra bu gizli anahtar değeri hiçbir zaman görüntülenmez.

2. Adım: Azure AD erişim belirteci alma

MSI veya EXE uygulaması için Microsoft Store gönderim API'sindeki yöntemlerden herhangi birini çağırmadan önce, API'deki her yöntemin Yetkilendirme üst bilgisine geçirdiğiniz bir Azure AD erişim belirtecini edinmeniz gerekir. Erişim belirtecini aldıktan sonra süresi dolmadan önce kullanmak için 60 dakikanız olur. Belirtecin süresi dolduktan sonra, belirteci yenileyebilir, böylece API'ye yapılan diğer çağrılarda kullanmaya devam edebilirsiniz.

Erişim belirtecini almak için, [İstemci Kimlik Bilgilerini Kullanarak Hizmetten Hizmete Çağrılar]/azure/active-directory/azuread-dev/v1-oauth2-client-creds-grant-flow) yönergelerini izleyin. Ardından, "https://login.microsoftonline.com/<tenant_id>/oauth2/token" uç noktasına bir HTTP POST gönderin. Örnek bir istek aşağıda verilmiştir.

POST https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8

grant_type=client_credentials
&client_id=<your_client_id>
&client_secret=<your_client_secret>
&scope=https://api.store.microsoft.com/.default

tenant_id POST URI'si ve client_id ve client_secret parametrelerindeki değer için, önceki bölümde İş Ortağı Merkezi'nden aldığınız kiracı kimliğini, istemci kimliğini ve uygulamanızın anahtarını belirtin. Kapsam parametresi için belirtmelisiniz https://api.store.microsoft.com/.default.

Erişim belirtecinizin süresi dolduktan sonra buradaki yönergeleri izleyerek yenileyebilirsiniz.

C# veya Node.jskullanarak erişim belirtecinin nasıl alındığını gösteren örnekler için bkz. MSI veya EXE uygulaması için Microsoft Store gönderim API'si için kod örnekleri .

3. Adım: Microsoft Store gönderim API'sini kullanma

Azure AD erişim belirtecini aldıktan sonra MSI veya EXE uygulaması için Microsoft Store gönderim API'sinde yöntemleri çağırabilirsiniz. API, uygulamalar için senaryolar halinde gruplandırılmış birçok yöntem içerir. Gönderimleri oluşturmak veya güncelleştirmek için genellikle belirli bir sırada birden çok yöntem çağırırsınız. Her senaryo ve her yöntemin söz dizimi hakkında bilgi için aşağıdaki bölümlere bakın:

Uyarı

Erişim belirtecini aldıktan sonra, belirtecin süresi dolmadan önce MSI veya EXE uygulaması için Microsoft Store gönderim API'sindeki yöntemleri çağırmak için 60 dakikanız vardır.

Temel URL

EXE veya MSI uygulaması için Microsoft Store Gönderim API'sinin temel URL'si: https://api.store.microsoft.com

API Sözleşmeleri

Geçerli Taslak Gönderimi Meta Veri API'sini alma

Geçerli taslak gönderimi altında her modüldeki meta verileri (listelemeler, özellikler veya kullanılabilirlik) getirir.

Yol [Tüm Modüller]: /submission/v1/product/{productId}/metadata?languages={languages}&includelanguagelist={true/false}
Yol [Tek Modül]: /submission/v1/product/{productId}/metadata/{moduleName}?languages={languages}&includelanguagelist={true/false}
Yöntem: GET

Yol Parametreleri

Parametre Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği
modülAdı İş Ortağı Merkezi modülü – listelemeler, özellikler veya kullanılabilirlik

Sorgu Parametreleri

Parametre Açıklama
Diller Opsiyonel Listeleme dilleri virgülle ayrılmış dize [en fazla 200 Dil sınırı] olarak filtrelemektedir.

Eğer yoksa, kullanılabilir ilk 200 dilin listeleme meta verileri alınır. [ örneğin, "en-us, en-gb"].
dil listesini dahil et Opsiyonel Boole değeri: true ise, eklenen listeleme dillerinin listesini ve bunların tamlık durumunu döndürür.

Gerekli Üst Bilgiler

Başlık Değer
Authorization: Bearer <Token> İş Ortağı Merkezi hesabıyla kaydedilen Azure AD uygulama kimliği
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

Yanıt Üst Bilgileri

Başlık Değer
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek Ekibi ile paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
erişilebilirlik desteği Boolean (Boole Mantığı)
ek lisans şartları Dize
kullanılabilirlik Nesne Kullanılabilirlik modülü verileri
kategori Dize Aşağıdaki kategorilerin listesine bakın
Sertifikasyon Notları Dize
kod Dize İletinin hata kodu
iletişim bilgileri Dize
telif hakkı Dize
sürücülere veya NT'ye bağlıdır Boolean (Boole Mantığı)
Açıklama Dize
geliştirici Dize
bulunabilirlik Dize [BULUNABILIR, DEEPLINK_ONLY]
GelecekPiyasalardaEtkinleştir Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hata veya uyarı iletilerinin listesi
freeTrial Dize [ÜCRETSİZ_DENEME_YOK, ÜCRETSİZ_DENEME]
donanımÖğeTürü Dize
GizlilikPolitikasıGerekliMi Boolean (Boole Mantığı)
önerilenMi Boolean (Boole Mantığı)
gereklidir Boolean (Boole Mantığı)
başarılı mı Boolean (Boole Mantığı)
isSystemFeatureRequired Nesneler dizisi
dil Dize Aşağıdaki dillerin listesine bakın
İlanlar Nesneler dizisi Her dil için modül verilerini listeler
pazarlar Dize dizisi Aşağıdaki pazarların listesine bakın
mesaj Dize Hatanın açıklaması
asgari donanım Dize
minimumGereklilik Dize
Kalem ve Mürekkep Desteği Boolean (Boole Mantığı)
Fiyatlandırma Dize [ÜCRETSİZ, FREEMIUM, ABONELIK, ÜCRETLİ]
Gizlilik PolitikasıUrl Dize
ürün beyanları Nesne
Ürün Özellikleri Dize dizisi
özellikler Nesne Özellikler modülü verileri
önerilen donanım Dize
önerilen gereksinim Dize
yanıtVerisi Nesne Talep için gerçek yanıt verisi yükünü içerir
gereksinimleri Nesneler dizisi
arama terimleri Dize dizisi
kısaTanım Dize
Alt kategori Dize Aşağıdaki alt kategorilerin listesine bakın
destekİletişimBilgileri Dize
sistemGereksinimDetayları Nesneler dizisi
hedef Dize Hatanın kaynaklandığı varlık
web sitesi Dize
Yeni Neler Var Dize

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "availability":{
            "markets": ["US"],
            "discoverability": "DISCOVERABLE",
            "enableInFutureMarkets": true,
            "pricing": "PAID",
            "freeTrial": "NO_FREE_TRIAL"
        },
        "properties":{
            "isPrivacyPolicyRequired": true,
            "privacyPolicyUrl": "http://contoso.com",
            "website": "http://contoso.com",
            "supportContactInfo": "http://contoso.com",
            "certificationNotes": "Certification Notes",
            "category": "DeveloperTools",
            "subcategory": "Database",
            "productDeclarations": {
                "dependsOnDriversOrNT": false,
                "accessibilitySupport": false,
                "penAndInkSupport": false
            },
            "isSystemFeatureRequired": [
                {
                    "isRequired": true,
                    "isRecommended": false,
                    "hardwareItemType": "Touch"
                },
                {
                    "isRequired": true,
                    "isRecommended": false,
                    "hardwareItemType": "Keyboard"
                },
                {
                    "isRequired": false,
                    "isRecommended": false,
                    "hardwareItemType": "Mouse"
                },
                {
                    "isRequired": false,
                    "isRecommended": false,
                    "hardwareItemType": "Camera"
                },
                {
                    "isRequired": false,
                    "isRecommended": false,
                    "hardwareItemType": "NFC_HCE"
                },
                {
                    "isRequired": false,
                    "isRecommended": false,
                    "hardwareItemType": "NFC_Proximity"
                },
                {
                    "isRequired": false,
                    "isRecommended": false,
                    "hardwareItemType": "Bluetooth_LE"
                },
                {
                    "isRequired": false,
                    "isRecommended": false,
                    "hardwareItemType": "Telephony"
                },
                {
                    "isRequired": false,
                    "isRecommended": false,
                    "hardwareItemType": "Microphone"
                }
            ],
            "systemRequirementDetails": [
                {
                    "minimumRequirement": "1GB",
                    "recommendedRequirement": "4GB",
                    "hardwareItemType": "Memory"
                },
                {
                    "minimumRequirement": "",
                    "recommendedRequirement": "",
                    "hardwareItemType": "DirectX"
                },
                {
                    "minimumRequirement": "",
                    "recommendedRequirement": "",
                    "hardwareItemType": "Video_Memory"
                },
                {
                    "minimumRequirement": "",
                    "recommendedRequirement": "",
                    "hardwareItemType": "Processor"
                },
                {
                    "minimumRequirement": "",
                    "recommendedRequirement": "",
                    "hardwareItemType": "Graphics"
                }
            ]
        },
        "listings":[{
            "language": "en-us",
            "description": "Description",
            "whatsNew": "What's New",
            "productFeatures": ["Feature 1"],
            "shortDescription": "Short Description",
            "searchTerms": ["Search Ter 1"],
            "additionalLicenseTerms": "License Terms",
            "copyright": "Copyright Information",
            "developedBy": "Developer Details",
            "sortTitle": "Product 101",
            "requirements": [
                {
                    "minimumHardware": "Pentium4",
                    "recommendedHardware": "Corei9"
                }
            ],
            "contactInfo": "contactus@contoso.com"               
        }],      
        "listingLanguages": [{"language":"en-us", "isComplete": true}]
    }
}

Geçerli Taslak Gönderimi Meta Veri API'sini Güncelleştirme

Taslak gönderimi altındaki her Modüldeki meta verileri güncelleştirir. API denetimleri

  • Etkin Gönderim İçin Eğer varsa, hata mesajıyla başarısızlıkla sonuçlan.
  • Tüm modüller Taslağı Kaydet işlemine izin vermek için hazır durumdaysa.
  • Gönderimdeki her alan Mağaza'nın gereksinimlerine göre doğrulanır
  • Sistem Gereksinimi Ayrıntıları doğrulama kuralları:
    • hardwareItemType = Bellek: Bellekte İzin Verilen Değerler: 300 MB, 750 MB, 1 GB, 2 GB, 4 GB, 6 GB, 8 GB, 12 GB, 16 GB, 20 GB
    • hardwareItemType = DirectX'te İzin Verilen Değerler: DX9, DX10, DX11, DX12-FEATURELEVEL11, DX12-FEATURELEVEL12
    • hardwareItemType = Video_Memory İzin Verilen Değerler: 1 GB, 2 GB, 4 GB, 6 GB

Yol [Tam Modül Güncelleştirmesi]: /submission/v1/product/{productId}/metadata
Yöntem: PUT

Yol [Modül Düzeltme Eki Güncelleştirmesi]: /submission/v1/product/{productId}/metadata
Yöntem: PATCH

API Davranışı

Tam Modül Güncelleştirme API'si söz konusu olduğunda – Her alanın tam güncelleştirilmesi için İstekte Modül Verilerinin tamamının mevcut olması gerekir. İsteklerde bulunmayan herhangi bir alan için varsayılan değer, o alanın modülündeki mevcut değeri değiştirmek için kullanılır.
Düzeltme Eki Modülü Güncelleştirme API'si söz konusu olduğunda , yalnızca güncelleştirilecek alanların İstekte mevcut olması gerekir. İstek'ten gelen bu alan değerleri, mevcut değerlerinin üzerine yazılır ve İstekte bulunmayan diğer tüm alanları ilgili Modül için geçerli olduğu gibi tutar.

Yol Parametreleri

Parametre Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği

Gerekli Üst Bilgiler

Başlık Değer
Authorization: Bearer <Token> İş Ortağı Merkezi hesabıyla kaydedilen Azure AD uygulama kimliği
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

İstek Parametreleri

İsim Türü Açıklama
kullanılabilirlik Nesne Kullanılabilirlik Modülü meta verilerini tutacak nesne
pazarlar Dize dizisi Gerekli Aşağıdaki pazarların listesine bakın
bulunabilirlik Dize Gerekli [KEŞFEDİLEBİLİR, DEEPLINK_ONLY]
GelecekPiyasalardaEtkinleştir Boolean (Boole Mantığı) Zorunlu
Fiyatlandırma Dize Gerekli [ÜCRETSİZ, FREEMIUM, ABONELİK, ÜCRETLİ]
freeTrial Dize Fiyatlandırma ÜCRETLİyse veya abonelikse gereklidir [NO_FREE_TRIAL, FREE_TRIAL]
özellikler Nesne Özellikler Modülü meta verilerini barındıracak nesne
GizlilikPolitikasıGerekliMi Boolean (Boole Mantığı) Zorunlu
Gizlilik PolitikasıUrl Dize IsPrivacyPolicyRequired = true ise gereklidir Geçerli bir URL olmalıdır
web sitesi Dize Geçerli bir URL olmalıdır
destekİletişimBilgileri Dize Geçerli bir URL veya E-posta adresi olmalıdır
Sertifikasyon Notları Dize Önerilen Karakter sınırı = 2000
kategori Dize Gerekli Aşağıdaki kategorilerin listesine bakın
Alt kategori Dize Gerekli Aşağıdaki alt kategorilerin listesine bakın
ürün beyanları Nesne Zorunlu
isSystemFeatureRequired Nesneler dizisi [Dokunmatik, Klavye, Fare, Kamera, NFC_HCE, NFC_Proximity, Bluetooth_LE, Telefon, Mikrofon]
gereklidir Boolean (Boole Mantığı) Zorunlu
önerilenMi Boolean (Boole Mantığı) Zorunlu
donanımÖğeTürü Dize Zorunlu
sistemGereksinimDetayları Nesneler dizisi [İşlemci, Grafik, Bellek, DirectX, Video_Memory]
minimumGereklilik Dize Gerekli systemRequirementsText için, Maksimum Uzunluk = 200

HardwareItemType = Bellekte İzin Verilen Değerler: [300 MB, 750 MB, 1 GB, 2 GB, 4 GB, 6 GB, 8 GB, 12 GB, 16 GB, 20 GB]

hardwareItemType = DirectX'te İzin Verilen Değerler: [DX9, DX10, DX11, DX12-FEATURELEVEL11, DX12-FEATURELEVEL12]

hardwareItemType = Video_Memory'de İzin Verilen Değerler: [1 GB, 2 GB, 4 GB, 6 GB]
önerilen gereksinim Dize Gerekli systemRequirementsText için, Maksimum Uzunluk = 200

HardwareItemType = Bellekte İzin Verilen Değerler: [300 MB, 750 MB, 1 GB, 2 GB, 4 GB, 6 GB, 8 GB, 12 GB, 16 GB, 20 GB]

hardwareItemType = DirectX'te İzin Verilen Değerler: [DX9, DX10, DX11, DX12-FEATURELEVEL11, DX12-FEATURELEVEL12]

hardwareItemType = Video_Memory'de İzin Verilen Değerler: [1 GB, 2 GB, 4 GB, 6 GB]
sürücülere veya NT'ye bağlıdır Boolean (Boole Mantığı) Zorunlu
erişilebilirlik desteği Boolean (Boole Mantığı) Zorunlu
Kalem ve Mürekkep Desteği Boolean (Boole Mantığı) Zorunlu
İlanlar Nesne Tek bir dil için modül verilerini listeleme nesnesi
dil Dize Gerekli Aşağıdaki dillerin listesine bakın
Açıklama Dize Gerekli Karakter sınırı = 10000
Yeni Neler Var Dize Karakter sınırı = 1500
Ürün Özellikleri Dize Dizisi Özellik başına 200 karakter; En fazla 20 özellik
kısaTanım Dize Karakter sınırı = 1000
arama terimleri Dize Dizisi Arama terimi başına 30 karakter; En fazla 7 arama terimi

Tüm arama terimlerinde TOPLAM 21 benzersiz sözcük
ek lisans şartları Dize Gerekli Karakter sınırı = 10000
telif hakkı Dize Karakter sınırı = 200
geliştirici Dize Karakter sınırı = 255
gereksinimleri Nesneler dizisi Öğe başına 200 karakter; Minimum ve önerilen arasında en fazla 11 öğe TOPLAM]
asgari donanım Dize Karakter sınırı = 200
önerilen donanım Dize Karakter sınırı = 200
iletişim bilgileri Dize Karakter sınırı = 200
eklenecek listelemeler Dize dizisi Aşağıdaki dillerin listesine bakın
KaldırılacakGirdiler Dize dizisi Aşağıdaki dillerin listesine bakın

Piyasa

Pazar Kısaltma
Afganistan Atriyal Fibrilasyon
Arnavutluk AL
Cezayir DZ
Amerikan Samoası GİBİ
Andorra REKLAM
Angola AO
Anguilla Yapay zeka
Antarktika AQ
Antigua ve Barbuda AG
Arjantin Artırılmış Gerçeklik (AR)
Ermenistan Öğleden Önce (ÖÖ)
Aruba AW
Avustralya AU
Avusturya DA
Azerbaycan AZ
Bahamalar BSc
Bahreyn BH
Bangladeş BD
Barbados BB
Belarus TARAFINDAN
Belçika OLMAK
Belize BZ
Benin BJ
Bermuda BM
Butan British Telekom
Bolivarcı Venezuela Cumhuriyeti VE
Bolivya BO
Bonaire BQ
Bosna Hersek Sanat Lisansı
Botsvana BW
Bouvet Adası BV
Brezilya Brezilya
İngiliz Hint Okyanusu Bölgesi IO
İngiliz Virgin Adaları VG
Brunei BN
Bulgaristan BG
Burkina Faso BF
Burundi
Kamboçya KH
Kamerun cm
Kanada CA
Cabo Verde Özgeçmiş
Cayman Adaları KY
Orta Afrika Cumhuriyeti Kistik Fibrozis
Çad TD
Şili CL
Çin Çin
Christmas Adası Müşteri Deneyimi
Cocos (Keeling) Adaları CC
Kolombiya Karbonmonoksit
Komorlar KİLOMETRE
Kongo Cumhuriyeti Bilgisayar Grafikleri
Kongo (DRC) CD
Cook Adaları CK
Kosta Rika CR
Hırvatistan İnsan Kaynakları
Curaçao CW
Kıbrıs CY
Çek Cumhuriyeti CZ
Côte d'Ivoire CI
Danimarka DK
Cibuti DJ
Dominika Özel Mesaj
Dominik Cumhuriyeti YAP
Ekvador Avrupa Komisyonu
Mısır ÖRNEĞİN
El Salvador SV
Ekvator Gine Cumhuriyeti GQ
Eritre AS
Estonya EE
Etiyopya ET
Falkland Adaları FK
Faroe Adaları FO
Fiji FJ
Finlandiya FI
Fransa FR
Fransız Guyanası Kız Arkadaş
Fransız Polinezyası PF
Fransız Güney ve Antarktika Toprakları TF (İngilizce)
Gabon Georgia
Gambiya Genel Müdür
Gürcistan GE
Almanya Almanya
Gana Büyüme Hormonu
Cebelitarık
Yunanistan GR
Grönland GL
Grenada GD
Guadeloupe Aile Hekimi
Guam GU
Guatemala GT
Guernsey GG
Gine GN
Gine-Bissau GW
Guyana GY
Haiti HT
Heard Adası ve McDonald Adaları HM
Vatikan VA
Honduras HN
Hong Kong Özel İdari Bölgesi HK
Macaristan HU
İzlanda "IS"
Hindistan İÇERİDE
Endonezya Kimlik
Irak zeka seviyesi
İrlanda Internet Explorer
İsrail Illinois
İtalya BT
Jamaika JM
Japonya JP
Jersey JE
Ürdün JO
Kazakistan KZ
Kenya KE
Kiribati KI
Kore KR
Kuveyt kW
Kırgızistan kg
Laos LA
Letonya LV
Lübnan LB (Libre - İngiliz ölçü birimi)
Lesotho LS
Liberya LR
Libya LY
Liechtenstein
Litvanya LT
Lüksemburg LU
Makao Özel İdari Bölgesi MO
Kuzey Makedonya MK
Madagaskar MG
Malavi Megavat
Malezya Benim
Maldivler Müzik Videosu
Mali Makine Öğrenmesi (ML)
Malta MT
Man Adası Anlık Mesajlaşma
Marshall Adaları MH
Martinik MQ
Moritanya BEY
Mauritius
Mayotte YouTube
Meksika Meksika
Mikronezya FM
Moldova Tıp Doktoru
Monako MC
Moğolistan MN
Montenegr - ME
Montserrat Microsoft
Fas Yüksek Lisans
Mozambik MZ
Myanmar MM
Namibya NA
Nauru NR
Nepal NP
Hollanda Hollanda
Yeni Kaledonya NC
Yeni Zelanda NZ
Nikaragua NI
Nijer NE
Nijerya NG
Niue NU
Norfolk Adası NF
Kuzey Mariana Adaları Milletvekili
Norveç HAYIR
Umman OM
Pakistan PK
Palau PW
Filistin Yönetimi PS
Panama Pensilvanya
Papua Yeni Gine PG
Paraguay PY
Peru PE
Filipinler PH
Pitcairn Adaları PN
Polonya Polonya
Portekiz Portekiz
Katar Kalite Güvencesi
Buluşma YANIT
Romanya RO
Rusya Rusya
Ruanda RW
Saint Barthelemy BL
Saint Helena, Ascension ve Tristan da Cunha SH
Saint Kitts ve Nevis KN
Saint Lucia LC
Saint Martin (Fransız Bölümü) MF
Saint Pierre ve Miquelon Başbakan / ÖS
Saint Vincent ve Grenadinler VC
Samoa WS
San Marino SM
Suudi Arabistan SA
Senegal SN
Sırbistan RS (Türkçe)
Seyşeller SC
Sierra Leone SL
Singapur SG
Sint Maarten (Hollanda Bölümü) SX
Slovakya SK
Slovenya Uluslararası Birimler Sistemi
Solomon Adaları SB
Somali ÖYLE
Güney Afrika ZA
Güney Georgia ve Güney Sandwich Adaları GS
İspanya ES
Sri Lanka LK
Surinam SR
Svalbard ve Jan Mayen SJ
Svaziland SZ
İsveç SE
İsviçre CANER
Sao Tome ve Principe ST
Tayvan TW
Tacikistan TJ
Tanzanya TZ
Tayland LİK
Timor-Leste TL
Tog - TG
Tokelau TK
Tonga HEDEF
Trinidad ve Tobag - TT
Tunus Tennessee
Türkiye Translation required (Çeviri gereklidir)
Türkmenistan TM
Turks ve Caicos Adaları TC
Tuvalu Televizyon
ABD Küçük Dış Adalar UM
ABD Virgin Adaları VI (Altı)
Uganda Uganda
Ukrayna UA
Birleşik Arap Emirlikleri AE
Birleşik Krallık GB
Amerika Birleşik Devletleri ABD
Uruguay UY
Özbekistan UZ
Vanuatu VU
Vietnam VN
Wallis ve Futuna WF
Yemen YE
Zambiya ZM
Zimbabve ZW
Åland Adaları BALTA

Kategoriler ve Alt Kategoriler

Kategori Alt kategoriler
BooksAndReference EReader, Kurgu, Kurgu Dışı, Referans
İşletme Muhasebe ve Finans, İşbirliği, CRM, Veri ve Analitik, Dosya Yönetimi, Envanter ve Lojistik, Hukuk ve İK, Proje Yönetimi, Uzaktan Masaüstü, Satış ve Pazarlama, Zaman ve Giderler
Geliştirici Araçları Veritabanı, Tasarım Araçları, Geliştirme Kitleri, Ağ, Referans ve Eğitim, Sunucular, Araçlar, Web Barındırma
Eğitim EğitimKitaplarıVeBaşvuruKaynakları, ErkenÖğrenme, ÖğretimAraçları, Dil, ÇalışmaYardımları
Eğlence (Yok)
Yemek ve Dışarıda Yemek (Yok)
Hükümet ve Politika (Yok)
Sağlık ve Fitness (Yok)
KidsAndFamily ÇocuklarVeAilelerKitaplarVeKaynaklar, ÇocuklarVeAilelerEğlence, HobilerVeOyuncaklar, SporVeAktiviteler, ÇocuklarVeAilelerSeyahat
Yaşam tarzı Otomotiv, DYI, HomeAndGarden, İlişkiler, SpecialInterest, StyleAndFashion
Tıbbi (Yok)
Multimedya Tasarımı İllüstrasyon ve Grafik Tasarım, Müzik Prodüksiyonu, Fotoğraf ve Video Prodüksiyonu
Müzik (Yok)
NavigationAndMaps (Yok)
HaberlerVeHavaDurumu Haberler, Hava Durumu
Kişisel Finans Bankacılık ve Yatırımlar, Bütçeleme ve Vergiler
Kişiselleştirme Zil Sesleri ve Sesler, temalar, Duvar Kağıtları ve Kilit Ekranları
PhotoAndVideo (Yok)
Verimli -lik (Yok)
Güvenlik PCProtection, PersonalSecurity
Alışveriş (Yok)
Sosyal (Yok)
Spor (Yok)
Seyahat CityGuides, Oteller
Araçlar ve Gereçler BackupAndManage, FileManager

Diller

Dil adı Desteklenen dil kodları
Afrikaansça af, af-za
Arnavutça sq, sq-al
Amharca sabah, am-et
Ermenice hey, hy-am
Assamca olarak, as-in
Azerbaycanca az-arab, az-arab-az, az-cyrl, az-cyrl-az, az-latn, az-latn-az
Baskça (Bask dili) Avrupa, eu-es
Belarusça bulunmak, be-by
Bengalce bn, bn-bd, bn-in
Boşnakça bs, bs-cyrl, bs-cyrl-ba, bs-latn, bs-latn-ba
Bulgarca bg, bg-bg
Katalanca ca, ca-es, ca-es-Valensiya
Cherokee chr-cher, chr-cher-us, chr-latn
Çince (Basitleştirilmiş) zh-Hans, zh-cn, zh-hans-cn, zh-sg, zh-hans-sg
Çince (Geleneksel) zh-Hant, zh-hk, zh-mo, zh-tw, zh-hant-hk, zh-hant-mo, zh-hant-tw, zh-mo, zh-tw, zh-hant-hk, zh-hant-mo, zh-hant-tw
Hırvatça hr, hr-hr, hr-ba
Çekçe cs, cs-cz
Danca Evet, da-dk
Dari prs, prs-af, prs-arab
Flemenkçe nl, nl-nl, nl-be
İngilizce en, en-au, en-ca, en-gb, en-ie, en-in, en-nz, en-sg, en-us, en-za, en-bz, en-hk, en-id, en-jm, en-kz, en-mt, en-my, en-ph, en-pk, en-tt, en-vn, en-zw
Estonyaca et, et-ee
Filipin - fil, fil-latn, fil-ph
Fince fi, fi-fi
Fransızca fr, fr-be , fr-ca , fr-ch , fr-fr , fr-lu, fr-cd, fr-ci, fr-cm, fr-ht, fr-ma, fr-mc, fr-ml, fr-re, frc-latn, frp-latn
Galiçya lehçesi gl, gl-es
Gürcüce ka, ka-ge
Almanca de, de-at, de-ch, de-de, de-lu, de-li
Yunanca el, el-gr
Guceratça gu, gu-in
Hausa ha, ha-latn, ha-latn-ng
İbranice o, he-il
Hintçe merhaba, hi-in
Macarca hu, hu-hu
İzlandaca is-is'dir
Igb - ig-latn, ig-ng
Endonezce id, id-id
Inuktitut (Latin) iu-cans, iu-latn, iu-latn-ca
İrlanda dili ga, ga-ie
isiXhosa xh, xh-za
isiZulu zu, zu-za
İtalyanca it-it, it-ch
Japonca tamam, ja-jp
Kannada dili kn, kn-in
Kazakça kk, kk-kz
Khmer km, km-kh
K'iche' quc-latn, qut-gt, qut-latn
Kinyarwanda rw, rw-rw
Kiswahili sw, sw-ke
Konkani dili kok, kok-in
Korece ko, ko-kr
Kürtçe ku-arab, ku-arab-iq
Kırgızca ky-kg, ky-cyrl
Lao işte, lo-la
Letonca lv, lv-lv
Litvanca lt, lt-lt
Lüksemburgca lb, lb-lu
Makedonca mk, mk-mk
Malayca ms, ms-bn, ms-my
Malayalam dili ml, ml-in
Maltaca mt, mt-mt
Maori dili mi, mi-latn, mi-nz
Marathi bay, mr-in
Moğolca (Kiril) mn-cyrl, mn-mong, mn-mn, mn-phag
Nepalce ne, ne-np
Norveççe nb, nb-no, nn, nn-no, hayır, no-no
Odiya veya or-in
Farsça fa, fa-ir
Lehçe dili pl, pl-pl
Portekizce (Brezilya) pt-br
Portekiz'de konuşulan Portekizce pt, pt-pt
Pencap dili pa, pa-arab, pa-arab-pk, pa-deva, pa-in
Keçuva dilleri quz, quz-bo, quz-ec, quz-pe
Rumence ro, ro-ro
Rusça ru , ru-ru
İskoç Galcesi gd-gb, gd-latn
Sırpça (Latin) sr-Latn, sr-latn-cs, sr, sr-latn-ba, sr-latn-me, sr-latn-rs
Sırpça (Kiril) sr-cyrl, sr-cyrl-ba, sr-cyrl-cs, sr-cyrl-me, sr-cyrl-rs
Sesotho sa Leboa nso, nso-za
Setswana tn, tn-bw, tn-za
Sindhi dili sd-arab, sd-arab-pk, sd-deva
Sinhala dili evet, si-lk
Slovakça sk, sk-sk
Slovakça sl, sl-si
İspanyolca es, es-cl, es-co, es-es, es-mx, es-ar, es-bo, es-cr, es-do, es-ec, es-gt, es-hn, es-ni, es-pa, es-pe, es-pr, es-py, es-sv, es-us, es-uy, es-ve
İsveç dili sv, sv-se, sv-fi
Tacik dili (Kiril) tg-arab, tg-cyrl, tg-cyrl-tj, tg-latn
Tamil dili ta, ta-in
Tatarca tt-arab, tt-cyrl, tt-latn, tt-ru
Telugu dili te, te-in
Tayland th, th-th
Tigrinya ti, ti-et
Türkçe tr, tr-tr
Türkmence tk-cyrl, tk-latn, tk-tm, tk-latn-tr, tk-cyrl-tr
Ukrayna dili Birleşik Krallık, uk-ua
Urduca sizin, ur-pk
Uygur ug-arab, ug-cn, ug-cyrl, ug-latn
Özbekçe (Latin) uz, uz-cyrl, uz-latn, uz-latn-uz
Vietnamca vi, vi-vn
Galce cy, cy-gb
Wolof wo, wo-sn
Yoruba dili yo-latn, yo-ng

Örnek İstek

{
    "availability":{
        "markets": ["US"],
        "discoverability": "DISCOVERABLE",
        "enableInFutureMarkets": true,
        "pricing": "PAID",
        "freeTrial": "NO_FREE_TRIAL"
    },
    "properties":{
        "isPrivacyPolicyRequired": true,
        "privacyPolicyUrl": "http://contoso.com",
        "website": "http://contoso.com",
        "supportContactInfo": "http://contoso.com",
        "certificationNotes": "Certification Notes",
        "category": "DeveloperTools",
        "subcategory": "Database",
        "productDeclarations": {
            "dependsOnDriversOrNT": false,
            "accessibilitySupport": false,
            "penAndInkSupport": false
        },
        "isSystemFeatureRequired": [
        {
            "isRequired": true,
                "isRecommended": false,
                "hardwareItemType": "Touch"
            },
            {
                "isRequired": true,
                "isRecommended": false,
                "hardwareItemType": "Keyboard"
            },
            {
                "isRequired": false,
                "isRecommended": false,
                "hardwareItemType": "Mouse"
            },
            {
                "isRequired": false,
                "isRecommended": false,
                "hardwareItemType": "Camera"
            },
            {
                "isRequired": false,
                "isRecommended": false,
                "hardwareItemType": "NFC_HCE"
            },
            {
                "isRequired": false,
                "isRecommended": false,
                "hardwareItemType": "NFC_Proximity"
            },
            {
                "isRequired": false,
                "isRecommended": false,
                "hardwareItemType": "Bluetooth_LE"
            },
            {
                "isRequired": false,
                "isRecommended": false,
                "hardwareItemType": "Telephony"
            },
            {
                "isRequired": false,
                "isRecommended": false,
                "hardwareItemType": "Microphone"
            }
        ],
        "systemRequirementDetails": [
            {
                "minimumRequirement": "1GB",
                "recommendedRequirement": "4GB",
                "hardwareItemType": "Memory"
            },
            {
                "minimumRequirement": "",
                "recommendedRequirement": "",
                "hardwareItemType": "DirectX"
            },
            {
                "minimumRequirement": "",
                "recommendedRequirement": "",
                "hardwareItemType": "Video_Memory"
            },
            {
                "minimumRequirement": "",
                "recommendedRequirement": "",
                "hardwareItemType": "Processor"
            },
            {
                "minimumRequirement": "",
                "recommendedRequirement": "",
                "hardwareItemType": "Graphics"
            }
        ]
    },
    "listings":{
        "language": "en-us",
        "description": "Description",
        "whatsNew": "What's New",
        "productFeatures": ["Feature 1"],
        "shortDescription": "Short Description",
        "searchTerms": ["Search Ter 1"],
        "additionalLicenseTerms": "License Terms",
        "copyright": "Copyright Information",
        "developedBy": "Developer Details",
        "sortTitle": "Product 101",
        "requirements": [
            {
                "minimumHardware": "Pentium4",
                "recommendedHardware": "Corei9"
            }
        ],
        "contactInfo": "contactus@contoso.com"               
    },      
    "listingsToAdd": ["en-au"],
    "listingsToRemove": ["en-gb"]
}

Yanıt Üst Bilgileri

Başlık Değer
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek Ekibi ile paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hata veya uyarı iletilerinin listesi
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne Talep için gerçek yanıt verisi yükünü içerir
AnketUrl Dize herhangi bir In-Progress Gönderiminin durumunu sorgulamak için Sorgulama URL'si
devamEdenÖneriId Dize Daha önce yapılmış herhangi bir In-Progress gönderimin ID'si

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "pollingUrl": "/submission/v1/product/{productId}/submission/{submissionId}/status",
        "ongoingSubmissionId": ""
    } 
}

Geçerli Taslak Paketler API'sini alma

Geçerli taslak gönderimi altında paket ayrıntılarını getirir.

Yol [Tüm Paketler]: /submission/v1/product/{productId}/packages
Yöntem: GET

Dizin [Tek Paket]: /submission/v1/product/{productId}/packages/{packageId}
Yöntem: GET

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği
packageId (paket kimliği) Getirilecek paketin benzersiz kimliği

Gerekli Üst Bilgiler

Başlık Değer
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD uygulama kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

Yanıt Üst Bilgileri

Başlık Değer
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hataların veya uyarı iletilerinin listesi
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne
Paketler Nesneler dizisi Paket modülü verilerini tutacak nesne
paket kimliği Dize
paketUrl Dize
Diller Dize dizisi
Mimarileri Dize dizisi [Tarafsız, X86, X64, Arm, Arm64]
isSilentInstall Boolean (Boole Mantığı) Yükleyiciniz, anahtar gerektirmeden sessiz modda çalışıyorsa bu, true olarak işaretlenmeli, aksi takdirde false olarak işaretlenmelidir.
yükleyiciParametreleri Dize
genericDocUrl Dize
hata detayları Nesneler dizisi
hataSenaryosu Dize
hataSenaryosuDetayları Nesneler dizisi
errorValue Dize
errorUrl Dize
paket Türü Dize

Örnek Yanıt

{   
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
    }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData":{
        "packages":[{
            "packageId": "pack0832",
            "packageUrl": "https://www.contoso.com/downloads/1.1/setup.exe",
            "languages": ["en-us"],
            "architectures": ["X86"],
            "isSilentInstall": true,
            "installerParameters": "/s",
            "genericDocUrl": "https://docs.contoso.com/doclink",
            "errorDetails": [{
                "errorScenario": "rebootRequired",
                "errorScenarioDetails": [{
                    "errorValue": "ERR001001",
                    "errorUrl": "https://errors.contoso.com/errors/ERR001001"
                }]
            }],
            "packageType": "exe",
        }]
    }
}

Geçerli Taslak Paketler API'sini Güncelleştirme

Geçerli taslak başvurusu altında paket ayrıntılarını güncelleştirir.

Yol [Tam Modül Güncelleştirmesi]: /submission/v1/product/{productId}/packages
Yöntem: PUT

Yol [Tek Paketli Yama Güncellemesi]: /submission/v1/product/{productId}/packages/{packageId}
Yöntem: PATCH

API Davranışı

Tam Modül Güncelleştirme API'si söz konusu olduğunda – her alanın tam güncelleştirilmesi için paket verilerinin tamamının istekte mevcut olması gerekir. İstek içerisinde yer almayan herhangi bir alan için, belirtilen modülün geçerli değeri yerine varsayılan değeri kullanılır. Bu, istekten gelen yeni yazılım paketleri kümesiyle tüm mevcut yazılım paketlerinin üzerine yazılmasına neden olur. Bu, Paket Kimliklerinin yeniden yenilenmesine neden olur ve kullanıcının en son Paket Kimlikleri için GET Packages API'sini çağırması gerekir.

Tek PaketLi Düzeltme Eki Güncelleştirme API'sinde – yalnızca belirli bir paket için güncelleştirilecek alanların istekte mevcut olması gerekir. İstekteki bu alan değerleri, var olan değerlerinin üzerine yazılır ve istekte bulunmayan tüm diğer alanları ilgili paket için geçerli olduğu gibi tutar. Kümedeki diğer paketler olduğu gibi kalır.

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği
paket kimliği Paketin benzersiz kimliği

Gerekli Üst Bilgiler

Başlık Değer
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD uygulama kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

İstek Parametreleri

İsim Türü Açıklama
Paketler Nesne Dizisi Paket Modülü verilerini tutacak nesne [Yalnızca Tam Modül Güncelleştirmesi için Gerekli]
paketUrl Dize Zorunlu
Diller Dize dizisi Zorunlu
Mimarileri Dize dizisi Gerekli Tek bir mimari içermelidir - Nötr, X86, X64, Arm, Arm64
isSilentInstall Boolean (Boole Mantığı) Gerekli Yükleyiciniz anahtar gerektirmeden sessiz modda çalışıyorsa veya yanlışsa bu true olarak işaretlenmelidir
yükleyiciParametreleri Dize isSilentInstall yanlışsa gereklidir
genericDocUrl Dize packageType exe ise gereklidir EXE tür yükleyicisi için özel hata kodlarının ayrıntılarını içeren belgeye bağlantı
hata detayları Nesne Dizisi EXE türü Yükleyicileri için özel hata kodlarını ve ayrıntılarını tutan meta veriler.
hataSenaryosu Dize Belirli bir hata senaryoyu belirleyin. [kurulumKullanıcıTarafındanİptalEdildi, uygulamaZatenMevcut, kurulumZatenDevamEdiyor, diskAlanıDolu, yenidenBaşlatmaGerekli, ağHatası, kurulumSırasındaPaketReddedildi, kurulumBaşarılı, çeşitli]
hataSenaryosuDetayları Nesne Dizisi
errorValue Dize Yükleme sırasında mevcut olabilecek hata kodu
errorUrl Dize Hatayla ilgili ayrıntıları içeren URL
paket Türü Dize Gerekli [exe, msi]

Örnek İstek [Tam Modül Güncelleştirmesi]

{
    "packages":[{
        "packageUrl": "https://www.contoso.com/downloads/1.1/setup.exe",
        "languages": ["en-us"],
        "architectures": ["X86"],
        "isSilentInstall": true,
        "installerParameters": "/s",
        "genericDocUrl": "https://docs.contoso.com/doclink",
        "errorDetails": [{
            "errorScenario": "rebootRequired",
            "errorScenarioDetails": [{
                "errorValue": "ERR001001",
                "errorUrl": "https://errors.contoso.com/errors/ERR001001"
            }]
        }],
        "packageType": "exe",
    }]
}

Örnek Talep [Tek Paketli Yama Güncellemesi]

{
    "packageUrl": "https://www.contoso.com/downloads/1.1/setup.exe",
    "languages": ["en-us"],
    "architectures": ["X86"],
    "isSilentInstall": true,
    "installerParameters": "/s",
    "genericDocUrl": "https://docs.contoso.com/doclink",
    "errorDetails": [{
        "errorScenario": "rebootRequired",
        "errorScenarioDetails": [{
            "errorValue": "ERR001001",
            "errorUrl": "https://errors.contoso.com/errors/ERR001001"
        }]
    }],
    "packageType": "exe",
}

Yanıt Üst Bilgileri

Başlık Değer
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi [Varsa hata veya uyarı iletilerinin listesi]
kod Dize İletinin Hata Kodu
mesaj Dize Hatanın Açıklaması
hedef Dize Hatanın kaynaklandığı Varlık
yanıtVerisi Nesne
AnketUrl Dize [Herhangi bir mevcut In-Progress Gönderimi durumunda Gönderim Durumunu almak için URL sorgulama]
devamEdenÖneriId Dize [Zaten In-Progress Olan Bir Gönderimin Kimliği]

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "pollingUrl": "/submission/v1/product/{productId}/submission/{submissionId}/status",
        "ongoingSubmissionId": ""
    } 
}

Paketleri İşleme API'si

Paket Güncelleştirme API'leri kullanılarak güncellenen yeni Paket kümesini, geçerli taslak gönderimi altında taahhüt eder. Bu API, Paket Yüklemesini izlemek için bir Yoklama URL'si döndürür.

Yol: /submission/v1/product/{productId}/packages/commit
Yöntem: POST

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği

Gerekli Üst Bilgiler

Başlık Değer
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD Uygulama Kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

Yanıt Üst Bilgileri

Başlık Değer
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi [Varsa hata veya uyarı iletilerinin listesi]
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne
AnketUrl Dize [Zaten In-Progress Gönderimi söz konusu olduğunda Paket Yükleme veya Gönderim Durumunu sorgulamak için Sorgulama URL'si]
devamEdenÖneriId Dize Herhangi bir In-Progress Gönderimin Gönderim Kodu

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "pollingUrl": "/submission/v1/product/{productId}/status",
        "ongoingSubmissionId": ""
    } 
}

Geçerli Taslak Liste Öğelerini API ile Alma

Mevcut taslak gönderimi altında varlık detaylarını alır.

Yol: /submission/v1/product/{productId}/listings/assets?languages={languages}
Yöntem: GET

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği

Sorgu Parametreleri

İsim Açıklama
Diller [İsteğe bağlı] Listeleme dilleri virgülle ayrılmış dize [en fazla 200 dil sınırı] olarak filtrelemektedir. Yoksa, kullanılabilir ilk 200 listeleme dilinin varlık verileri alınır. (örneğin, "en-us, en-gb")

Gerekli Üst Bilgiler

Başlık Değer
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD Uygulama Kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

Yanıt Üst Bilgileri

Başlık Değer
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hata veya uyarı iletilerinin listesi
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne
varlıkları listeleme Nesneler dizisi Her dil için varlık ayrıntılarını listeleme
dil Dize
mağazaLogoları Nesneler dizisi
ekran görüntüleri Nesneler dizisi
kimlik Dize
varlıkURL Dize Geçerli bir URL olmalıdır
görüntüBoyutu Nesne
Genişlik Tam sayı
yükseklik Tam sayı

Örnek Yanıt

{   
"isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData":{
        "listingAssets": [{
            "language": "en-us",
            "storeLogos": [
                {
                    "id": "1234567890abcdefgh",
                    "assetUrl": "https://contoso.com/blob=1234567890abcdefgh",
                    "imageSize": {
                        "width": 2160,
                        "height": 2160
                    }
                }
            ],
            "screenshots": [
                {
                    "id": "1234567891abcdefgh",
                    "assetUrl": "https://contoso.com/blob=1234567891abcdefgh",
                    "imageSize": {
                        "width": 2160,
                        "height": 2160
                    }
                }
            ]
        }]
    }
}

Liste Varlıkları API'si Oluşturma

Geçerli taslak gönderimi altında yeni bir İlan Varlığı Yükleme oluşturur.

Listelenen varlıkların güncellenmesi

EXE veya MSI uygulaması için Microsoft Store Gönderim API'si, her bir görüntü varlığının karşıya yüklenmesi için çalışma zamanında oluşturulan SAS URL'lerini Blob Depolarına kullanır ve yükleme başarıyla tamamlandıktan sonra Commit API çağrısı yapılır. Listeleme varlıklarını güncelleştirme ve buna karşılık listeleme modülünde yerel ayarları ekleme/kaldırma olanağına sahip olmak için aşağıdaki yaklaşım kullanılabilir:

  1. Varlık yüklemeyle ilgili isteği dil, tür ve varlık sayısıyla birlikte göndermek için Listeleme Varlığı Oluştur API'sini kullanın.
  2. İstenen varlık sayısına bağlı olarak Varlık Kimlikleri isteğe bağlı olarak oluşturulur ve kısa vadeli bir SAS URL'si oluşturularak varlık türleri olarak Yanıt Gövdesi içerisinde geri gönderilir. HTTP İstemcileri [Put Blob (REST API) - Azure Depolama | Microsoft Docs] kullanarak belirli türde görüntü varlıklarını yüklemek için bu URL'yi kullanabilirsiniz.
  3. Karşıya yükledikten sonra, önceki API çağrısından daha önce alınan yeni Varlık Kimliği bilgilerini göndermek için Liste Varlıklarını Taahhüt Et API'sini kullanabilirsiniz. Tek API, doğrulamadan sonra listeleme varlıkları verilerini dahili olarak onaylar ve kaydeder.
  4. Bu yaklaşım, istekte gönderilen belirli bir dil altında varlık türünün önceki görüntüleri kümesinin tamamını etkili bir şekilde üzerine yazar. Bu nedenle, daha önce karşıya yüklenen Varlıklar kaldırılacaktır.

Dizin Yolu: /submission/v1/product/{productId}/listings/assets/create
Yöntem: POST

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği

Gerekli Üst Bilgiler

Başlık Açıklama
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD Uygulama Kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

İstek Parametreleri

İsim Türü Açıklama
dil Dize Zorunlu
VarlıkOluşturmaİsteği Nesne Zorunlu
Ekran görüntüsü Tam sayı ISV'nin ekran görüntülerini güncelleştirmesi veya yeni listeleme dili eklemesi gerekiyorsa gereklidir [1 - 10]
Logo Tam sayı ISV'nin logoları güncelleştirmesi veya yeni listeleme dili eklemesi gerekiyorsa gereklidir [1 veya 2]

Yanıt Üst Bilgileri

Başlık Açıklama
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hata veya uyarı iletilerinin listesi
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne
varlıkları listeleme Nesne Yüklenmek üzere StoreLogos ve Ekran Görüntülerinin ayrıntılarını içeren nesne
dil Dize
mağazaLogoları Nesneler dizisi
ekran görüntüleri Nesneler dizisi
kimlik Dize
birincilVarlıkYüklemeUrl Dize Liste varlığını Azure Blob REST API kullanarak karşıya yüklemek için birincil URL
İkincilVarlıkYüklemeUrl Dize Azure Blob REST API kullanarak listeleme varlığını karşıya yüklemek için ikincil URL
httpMethod HTTP Yöntemi Varlık Yükleme URL'leri (Birincil veya İkincil) aracılığıyla Varlıkları karşıya yüklemek için kullanılması gereken HTTP yöntemi
httpHeaders (Http Başlıkları) Nesne Yükleme API çağrısında Varlık Yükleme URL'lerinde bulunması gereken zorunlu üst bilgiler olarak anahtarları olan bir nesne. Değer boş değilse, üst bilgilerin belirli değerlere sahip olması gerekir. Aksi halde, değerler API çağrısı sırasında hesaplanır.

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "listingAssets": {
            "language": "en-us",
            "storeLogos":[{
                "id": "1234567890abcdefgh",
                "primaryAssetUploadUrl": "https://contoso.com/upload?blob=1234567890abcdefgh&sig=12345",
                "secondaryAssetUploadUrl": "https://contoso.com/upload?blob=0987654321abcdfger&sig=54326",
                "httpMethod": "PUT",
                "httpHeaders": {"Required Header Name": "Header Value"}
            }],
            "screenshots":[{
                "id": "0987654321abcdfger",
                "primaryAssetUploadUrl": "https://contoso.com/upload?blob=0987654321abcdfger&sig=54321",
                "secondaryAssetUploadUrl": "https://contoso.com/upload?blob=0987654321abcdfger&sig=54322",
                "httpMethod": "PUT",
                "httpHeaders": {"Required Header Name": "Header Value"}

            }]
        }
    } 
}

Listeleme Varlıkları API'sini İşleme

Mevcut taslak gönderimi altında Varlık Oluşturma API'sinin ayrıntılarını kullanarak yeni Listeleme Varlığının karşıya yüklenmesini kaydeder.

Dizin: /submission/v1/product/{productId}/listings/assets/commit
Yöntem: PUT

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği

Gerekli Üst Bilgiler

Başlık Açıklama
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD Uygulama Kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

İstek Parametreleri

İsim Türü Açıklama
varlıkları listeleme Nesne
dil Dize
mağazaLogoları Nesne Dizisi
ekran görüntüleri Nesne Dizisi
kimlik Dize Ya mevcut Listeleme Varlıklarını Al API'sinden kullanıcının sürdürmek istediği mevcut bir kimlik olmalı ya da yeni bir Varlığın yüklendiği Listeleme Varlıkları Oluşturma API'sinde yeni kimlik olmalıdır.
varlıkURL Dize Kullanıcının Geçerli Listing Varlıklarını Al API'si üzerinden kalıcı hale getirmek istediği mevcut varlığın URL'si veya Yeni bir varlığın yüklendiği Listeleme Varlıkları Oluşturma API'sindeki Birincil veya İkincil Yükleme URL'si olmalıdır. Geçerli bir URL olmalıdır

Örnek İstek

{
    "listingAssets": { 
        "language": "en-us",    
        "storeLogos": [
            {
                "id": "1234567890abcdefgh",
                "assetUrl": "https://contoso.com/blob=1234567890abcdefgh",
            }
        ],
        "screenshots": [
            {
                "id": "1234567891abcdefgh",
                "assetUrl": "https://contoso.com/blob=1234567891abcdefgh",
            }
        ]
    }
}

Yanıt Üst Bilgileri

Başlık Açıklama
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hata veya uyarı iletilerinin listesi
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne
AnketUrl Dize Devam eden gönderimlerin durumunu almak için sorgulama URL'si
devamEdenÖneriId Dize Zaten devam etmekte olan herhangi bir gönderimin gönderim kimliği

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "pollingUrl": "/submission/v1/product/{productId}/submission/{submissionId}/status",
        "ongoingSubmissionId": ""
    } 
}

Modül Durumu Sorgulama API'si

Gönderim oluşturulmadan önce modülün hazır olup olmadığını denetlemek için API. Ayrıca paket yükleme durumunu da doğrular.

Dizin: /submission/v1/product/{productId}/status
Yöntem: GET

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği

Gerekli Üst Bilgiler

Başlık Açıklama
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD Uygulama Kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

Yanıt Üst Bilgileri

Başlık Açıklama
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hata veya uyarı iletilerinin listesi
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne
isReady Boolean (Boole Mantığı) Paket karşıya yükleme dahil olmak üzere tüm Modüllerin hazır durumda olup olmadığını gösterir
devamEdenÖneriId Dize Zaten devam etmekte olan herhangi bir gönderimin gönderim kimliği

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "isReady": true,
        "ongoingSubmissionId": ""
    }
}

Gönderim API'si Oluşturma

MSI veya EXE uygulaması için mevcut taslaktan bir gönderim oluşturur. API şunları denetler:

  • Aktif bir gönderim varsa hata iletisi verir ve işlem başarısız olur.
  • tüm modüller gönderim oluşturmaya hazır durumdaysa.
  • gönderimdeki her alan Mağaza'nın gereksinimlerine göre doğrulanır

Dizin:/gönderim/v1/ürün/{productId}/submit
Yöntem: POST

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği

Gerekli Üst Bilgiler

Başlık Açıklama
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD Uygulama Kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

Yanıt Üst Bilgileri

Başlık Açıklama
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hata veya uyarı iletilerinin listesi
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne
AnketUrl Dize Gönderim için paket yükleme dahil modül hazırlık durumunu sorgulamak amacıyla SORGULAMA URL'si
gönderiId Dize Yeni oluşturulan Gönderimin kimliği
devamEdenÖneriId Dize Zaten devam etmekte olan herhangi bir gönderimin gönderim kimliği

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "submissionId": "1234567890", 
        "pollingUrl": "/submission/v1/product/{productId}/submission/{submissionId}/status",
        "ongoingSubmissionId": ""
    }
}

Gönderim Durumu Yoklama API'si

Gönderim Durumunu denetlemek için API.

Yol: /submission/v1/product/{productId}/submission/{submissionId}/status
Yöntem: GET

Yol Parametreleri

İsim Açıklama
Ürün Kimliği Ürünün İş Ortağı Merkezi Kimliği

Gerekli Üst Bilgiler

Başlık Açıklama
Authorization: Bearer <Token> İş Ortağı Merkezi hesabına kayıtlı Azure AD Uygulama Kimliğini kullanma
X-Seller-Account-Id İş Ortağı Merkezi hesabının satıcı ID’si

Yanıt Üst Bilgileri

Başlık Açıklama
X-Correlation-ID Her istek için GUID türündeki benzersiz kimlik. Bu, herhangi bir sorunu analiz etmek için Destek ekibiyle paylaşılabilir.
Retry-After Hız sınırlaması nedeniyle istemcinin API'leri yeniden çağırmadan önce beklemesi gereken saniye cinsinden süre.

Yanıt Parametreleri

İsim Türü Açıklama
başarılı mı Boolean (Boole Mantığı)
Hata Nesneler dizisi Varsa hata veya uyarı iletilerinin listesi
kod Dize İletinin hata kodu
mesaj Dize Hatanın açıklaması
hedef Dize Hatanın kaynaklandığı varlık
yanıtVerisi Nesne
yayınDurumu Dize Göndermenin Yayımlama Durumu - [INPROGRESS, YAYIMLANDI, BAŞARISIZ, BİlİNMİYOR]
başarısız oldu Boolean (Boole Mantığı) Yayımlamanın Başarısız olup olmadığını ve yeniden denenmeyeceğini gösterir

Örnek Yanıt

{
    "isSuccess": true,
    "errors": [{
        "code": "badrequest",
        "message": "Error Message 1",
        "target": "listings"
        }, {
        "code": "warning",
        "message": "Warning Message 1",
        "target": "properties"
    }],
    "responseData": {
        "publishingStatus": "INPROGRESS",
        "hasFailed": false
    }
}

Kod örnekleri

Aşağıdaki makaleler, Microsoft Store gönderim API'sinin farklı programlama dillerinde nasıl kullanılacağını gösteren ayrıntılı kod örnekleri sağlar:

C# örneği: MSI veya EXE uygulaması için Microsoft Store Gönderim API'si

Bu makalede, MSI veya EXE uygulaması için Microsoft Store gönderim API'sinin nasıl kullanılacağını gösteren C# kod örnekleri sağlanır. Gösterdiği görev hakkında daha fazla bilgi edinmek için her örneği gözden geçirebilir veya bu makaledeki tüm kod örneklerini bir konsol uygulamasına oluşturabilirsiniz.

Önkoşullar Bu örneklerde aşağıdaki kitaplık kullanılır:

  • Newtonsoft'tan Newtonsoft.Json NuGet paketi.

Ana program Aşağıdaki örnek, Microsoft Store gönderim API'sini kullanmanın farklı yollarını göstermek için bu makaledeki diğer örnek yöntemleri çağıran bir komut satırı programı uygular. Bu programı kendi kullanımınıza uyarlamak için:

  • SellerId özelliğini İş Ortağı Merkezi hesabınızın Satıcı Kimliğine atayın.
  • ApplicationId özelliğini yönetmek istediğiniz uygulamanın kimliğine atayın.
  • ClientId ve ClientSecret özelliklerini uygulamanızın istemci kimliğine ve anahtarına atayın ve TokenEndpoint URL'sindeki tenantid dizesini uygulamanızın kiracı kimliğiyle değiştirin. Daha fazla bilgi için bkz. Azure AD uygulamasını İş Ortağı Merkezi hesabınızla ilişkilendirme
using System;
using System.Threading.Tasks;

namespace Win32SubmissionApiCSharpSample
{
    public class Program
    {
        static async Task Main(string[] args)
        {
            var config = new ClientConfiguration()
            {
                ApplicationId = "...",
                ClientId = "...",
                ClientSecret = "...",
                Scope = "https://api.store.microsoft.com/.default",
                ServiceUrl = "https://api.store.microsoft.com",
                TokenEndpoint = "...",
                SellerId = 0
            };

            await new AppSubmissionUpdateSample(config).RunAppSubmissionUpdateSample();

        }
    }
}

C kullanan ClientConfiguration yardımcı sınıfı#

Örnek uygulama, Microsoft Store gönderim API'sini kullanan örnek yöntemlerin her birine Azure Active Directory verilerini ve uygulama verilerini geçirmek için ClientConfiguration yardımcı sınıfını kullanır.

using System;
using System.Collections.Generic;
using System.Text;

namespace Win32SubmissionApiCSharpSample
{
    public class ClientConfiguration
    {
        /// <summary>
        /// Client Id of your Azure Active Directory app.
        /// Example" 00001111-aaaa-2222-bbbb-3333cccc4444
        /// </summary>
        public string ClientId { get; set; }

        /// <summary>
        /// Client secret of your Azure Active Directory app
        /// </summary>
        public string ClientSecret { get; set; }

        /// <summary>
        /// Service root endpoint.
        /// Example: "https://api.store.microsoft.com"
        /// </summary>
        public string ServiceUrl { get; set; }

        /// <summary>
        /// Token endpoint to which the request is to be made. Specific to your Azure Active Directory app
        /// Example: https://login.microsoftonline.com/d454d300-128e-2d81-334a-27d9b2baf002/oauth2/v2.0/token
        /// </summary>
        public string TokenEndpoint { get; set; }

        /// <summary>
        /// Resource scope. If not provided (set to null), default one is used for the production API
        /// endpoint ("https://api.store.microsoft.com/.default")
        /// </summary>
        public string Scope { get; set; }

        /// <summary>
        /// Partner Center Application ID.
        /// Example: 3e31a9f9-84e8-4d2d-9eba-487878d02ebf
        /// </summary>
        public string ApplicationId { get; set; }


        /// <summary>
        /// The Partner Center Seller Id
        /// Example: 123456892
        /// </summary>
        public int SellerId { get; set; }
    }
}

C kullanarak uygulama gönderimi oluşturma#

Aşağıdaki örnek, bir uygulama gönderimini güncelleştirmek için Microsoft Store gönderim API'sinde çeşitli yöntemler kullanan bir sınıf uygular.

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace Win32SubmissionApiCSharpSample
{
    public class AppSubmissionUpdateSample
    {
        private ClientConfiguration ClientConfig;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="configuration">An instance of ClientConfiguration that contains all parameters populated</param>
        public AppSubmissionUpdateSample(ClientConfiguration configuration)
        {
            this.ClientConfig = configuration;
        }

        /// <summary>
        /// Main method to Run the Sample Application
        /// </summary>
        /// <returns></returns>
        /// <exception cref="InvalidOperationException"></exception>
        public async Task RunAppSubmissionUpdateSample()
        {
            // **********************
            //       SETTINGS
            // **********************
            var appId = this.ClientConfig.ApplicationId;
            var clientId = this.ClientConfig.ClientId;
            var clientSecret = this.ClientConfig.ClientSecret;
            var serviceEndpoint = this.ClientConfig.ServiceUrl;
            var tokenEndpoint = this.ClientConfig.TokenEndpoint;
            var scope = this.ClientConfig.Scope;

            // Get authorization token.
            Console.WriteLine("Getting authorization token");
            var accessToken = await SubmissionClient.GetClientCredentialAccessToken(
                tokenEndpoint,
                clientId,
                clientSecret,
                scope);

            var client = new SubmissionClient(accessToken, serviceEndpoint);

            client.DefaultHeaders = new Dictionary<string, string>()
            {
                {"X-Seller-Account-Id", this.ClientConfig.SellerId.ToString() }
            };

            Console.WriteLine("Getting Current Application Draft Status");
            
            dynamic AppDraftStatus = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.ProductDraftStatusPollingUrlTemplate,
                SubmissionClient.Version, appId), null);
            
            Console.WriteLine(AppDraftStatus.ToString());

            Console.WriteLine("Getting Application Packages ");

            dynamic PackagesResponse = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.PackagesUrlTemplate,
                SubmissionClient.Version, appId), null);

            Console.WriteLine(PackagesResponse.ToString());

            Console.WriteLine("Getting Single Package");

            dynamic SinglePackageResponse = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.PackageByIdUrlTemplate,
                SubmissionClient.Version, appId, (string)PackagesResponse.responseData.packages[0].packageId), null);

            Console.WriteLine(SinglePackageResponse.ToString());

            Console.WriteLine("Updating Entire Package Set");

            // Update data in Packages list to have final set of updated Packages

            // Example - Updating Installer Parameters
            PackagesResponse.responseData.packages[0].installerParameters = "/s /r new-args";

            dynamic PackagesUpdateRequest = new
            {
                packages = PackagesResponse.responseData.packages
            };

            dynamic PackagesUpdateResponse = await client.Invoke<dynamic>(HttpMethod.Put, string.Format(SubmissionClient.PackagesUrlTemplate,
                SubmissionClient.Version, appId), PackagesUpdateRequest);

            Console.WriteLine(PackagesUpdateResponse.ToString());

            Console.WriteLine("Updating Single Package's Download Url");

            // Update data in the SinglePackage object

            var SinglePackageUpdateRequest = SinglePackageResponse.responseData.packages[0];

            // Example - Updating Installer Parameters
            SinglePackageUpdateRequest.installerParameters = "/s /r /t new-args";

            dynamic PackageUpdateResponse = await client.Invoke<dynamic>(HttpMethod.Patch, string.Format(SubmissionClient.PackageByIdUrlTemplate,
                SubmissionClient.Version, appId, SinglePackageUpdateRequest.packageId), SinglePackageUpdateRequest);

            Console.WriteLine("Committing Packages");

            dynamic PackageCommitResponse = await client.Invoke<dynamic>(HttpMethod.Post, string.Format(SubmissionClient.PackagesCommitUrlTemplate,
                SubmissionClient.Version, appId), null);

            Console.WriteLine(PackageCommitResponse.ToString());

            Console.WriteLine("Polling Package Upload Status");

            AppDraftStatus = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.ProductDraftStatusPollingUrlTemplate,
                SubmissionClient.Version, appId), null);

            while (!((bool)AppDraftStatus.responseData.isReady))
            {
                AppDraftStatus = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.ProductDraftStatusPollingUrlTemplate,
                    SubmissionClient.Version, appId), null);

                Console.WriteLine("Waiting for Upload to finish");

                await Task.Delay(TimeSpan.FromSeconds(2));

                if(AppDraftStatus.errors != null && AppDraftStatus.errors.Count > 0)
                {
                    for(var index = 0; index < AppDraftStatus.errors.Count; index++)
                    {
                        if(AppDraftStatus.errors[index].code == "packageuploaderror")
                        {
                            throw new InvalidOperationException("Package Upload Failed. Please try committing packages again.");
                        }
                    }
                }
            }

            Console.WriteLine("Getting Application Metadata - All Modules");

            dynamic AppMetadata = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.AppMetadataUrlTemplate,
                SubmissionClient.Version, appId), null);

            Console.WriteLine(AppMetadata.ToString());

            Console.WriteLine("Getting Application Metadata - Listings");

            dynamic AppListingsMetadata = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.AppListingsFetchMetadataUrlTemplate,
                SubmissionClient.Version, appId), null);

            Console.WriteLine(AppListingsMetadata.ToString());

            Console.WriteLine("Updating Listings Metadata - Description");

            // Update Required Fields in Listings Metadata Object - Per Language. For eg. AppListingsMetadata.responseData.listings[0]

            // Example - Updating Description
            AppListingsMetadata.responseData.listings[0].description = "New Description Updated By C# Sample Code";

            dynamic ListingsUpdateRequest = new
            {
                listings = AppListingsMetadata.responseData.listings[0]
            };

            dynamic UpdateListingsMetadataResponse = await client.Invoke<dynamic>(HttpMethod.Put, string.Format(SubmissionClient.AppMetadataUrlTemplate,
                SubmissionClient.Version, appId), ListingsUpdateRequest);

            Console.WriteLine(UpdateListingsMetadataResponse.ToString());

            Console.WriteLine("Getting All Listings Assets");

            dynamic ListingAssets = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.ListingAssetsUrlTemplate,
                SubmissionClient.Version, appId), null);

            Console.WriteLine(ListingAssets.ToString());

            Console.WriteLine("Creating Listing Assets for 1 Screenshot");

            
            dynamic AssetCreateRequest = new
            {
                language = ListingAssets.responseData.listingAssets[0].language,
                createAssetRequest = new Dictionary<string, int>()
                {
                    {"Screenshot", 1 },
                    {"Logo", 0 }
                }
            };

            dynamic AssetCreateResponse = await client.Invoke<dynamic>(HttpMethod.Post, string.Format(SubmissionClient.ListingAssetsCreateUrlTemplate,
               SubmissionClient.Version, appId), AssetCreateRequest);

            Console.WriteLine(AssetCreateResponse.ToString());

            Console.WriteLine("Uploading Listing Assets");

            // Path to PNG File to be Uploaded as Screenshot / Logo
            var PathToFile = "./Image.png";
            var AssetToUpload = File.OpenRead(PathToFile);

            await client.UploadAsset(AssetCreateResponse.responseData.listingAssets.screenshots[0].primaryAssetUploadUrl.Value as string, AssetToUpload);

            Console.WriteLine("Committing Listing Assets");

            dynamic AssetCommitRequest = new
            {
                listingAssets = new
                {
                    language = ListingAssets.responseData.listingAssets[0].language,
                    storeLogos = ListingAssets.responseData.listingAssets[0].storeLogos,
                    screenshots = JToken.FromObject(new List<dynamic>() { new
                {
                    id = AssetCreateResponse.responseData.listingAssets.screenshots[0].id.Value as string,
                    assetUrl = AssetCreateResponse.responseData.listingAssets.screenshots[0].primaryAssetUploadUrl.Value as string
                }
                }.ToArray())
                }
            };

            dynamic AssetCommitResponse = await client.Invoke<dynamic>(HttpMethod.Put, string.Format(SubmissionClient.ListingAssetsCommitUrlTemplate,
               SubmissionClient.Version, appId), AssetCommitRequest);

            Console.WriteLine(AssetCommitResponse.ToString());

            Console.WriteLine("Getting Current Application Draft Status before Submission");

            AppDraftStatus = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.ProductDraftStatusPollingUrlTemplate,
                SubmissionClient.Version, appId), null);

            Console.WriteLine(AppDraftStatus.ToString());

            if (AppDraftStatus == null || !((bool)AppDraftStatus.responseData.isReady))
            {
                throw new InvalidOperationException("Application Current Status is not in Ready Status for All Modules");
            }

            Console.WriteLine("Creating Submission");

            dynamic SubmissionCreationResponse = await client.Invoke<dynamic>(HttpMethod.Post, string.Format(SubmissionClient.CreateSubmissionUrlTemplate,
                SubmissionClient.Version, appId), null);

            Console.WriteLine(SubmissionCreationResponse.ToString());

            Console.WriteLine("Current Submission Status");

            dynamic SubmissionStatus = await client.Invoke<dynamic>(HttpMethod.Get, string.Format(SubmissionClient.SubmissionStatusPollingUrlTemplate,
                SubmissionClient.Version, appId, SubmissionCreationResponse.responseData.submissionId.Value as string), null);

            Console.Write(SubmissionStatus.ToString());

            // User can Poll on this API to know if Submission Status is INPROGRESS, PUBLISHED or FAILED.
            // This Process involves File Scanning, App Certification and Publishing and can take more than a day.
        }
    }
}

C kullanan IngestionClient yardımcı sınıfı#

IngestionClient sınıfı, aşağıdaki görevleri gerçekleştirmek için örnek uygulamadaki diğer yöntemler tarafından kullanılan yardımcı yöntemler sağlar:

  • Microsoft Store gönderim API'sindeki yöntemleri çağırmak için kullanılabilecek bir Azure AD erişim belirteci edinin. Belirteci aldıktan sonra, belirtecin süresi dolmadan önce Microsoft Store gönderim API'sine yapılan çağrılarda bu belirteci kullanmak için 60 dakikanız vardır. Belirtecin süresi dolduktan sonra yeni bir belirteç oluşturabilirsiniz.
  • Microsoft Store gönderim API'sinin HTTP isteklerini işleme.
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace Win32SubmissionApiCSharpSample
{
    /// <summary>
    /// This class is a proxy that abstracts the functionality of the API service
    /// </summary>
    public class SubmissionClient : IDisposable
    {
        public static readonly string Version = "1";
        private HttpClient httpClient;
        private HttpClient imageUploadClient;

        private readonly string accessToken;

        public static readonly string PackagesUrlTemplate = "/submission/v{0}/product/{1}/packages";
        public static readonly string PackageByIdUrlTemplate = "/submission/v{0}/product/{1}/packages/{2}";
        public static readonly string PackagesCommitUrlTemplate = "/submission/v{0}/product/{1}/packages/commit";
        public static readonly string AppMetadataUrlTemplate = "/submission/v{0}/product/{1}/metadata";
        public static readonly string AppListingsFetchMetadataUrlTemplate = "/submission/v{0}/product/{1}/metadata/listings";
        public static readonly string ListingAssetsUrlTemplate = "/submission/v{0}/product/{1}/listings/assets";
        public static readonly string ListingAssetsCreateUrlTemplate = "/submission/v{0}/product/{1}/listings/assets/create";
        public static readonly string ListingAssetsCommitUrlTemplate = "/submission/v{0}/product/{1}/listings/assets/commit";
        public static readonly string ProductDraftStatusPollingUrlTemplate = "/submission/v{0}/product/{1}/status";
        public static readonly string CreateSubmissionUrlTemplate = "/submission/v{0}/product/{1}/submit";
        public static readonly string SubmissionStatusPollingUrlTemplate = "/submission/v{0}/product/{1}/submission/{2}/status";

        public const string JsonContentType = "application/json";
        public const string PngContentType = "image/png";
        public const string BinaryStreamContentType = "application/octet-stream";

        /// <summary>
        /// Initializes a new instance of the <see cref="SubmissionClient" /> class.
        /// </summary>
        /// <param name="accessToken">
        /// The access token. This is JWT a token obtained from Azure Active Directory allowing the caller to invoke the API
        /// on behalf of a user
        /// </param>
        /// <param name="serviceUrl">The service URL.</param>
        public SubmissionClient(string accessToken, string serviceUrl)
        {
            if (string.IsNullOrEmpty(accessToken))
            {
                throw new ArgumentNullException("accessToken");
            }

            if (string.IsNullOrEmpty(serviceUrl))
            {
                throw new ArgumentNullException("serviceUrl");
            }

            this.accessToken = accessToken;
            this.httpClient = new HttpClient
            {
                BaseAddress = new Uri(serviceUrl)
            };
            this.imageUploadClient = new HttpClient();
            this.DefaultHeaders = new Dictionary<string, string>();
        }

        /// <summary>
        /// Gets or Sets the default headers.
        /// </summary>
        public Dictionary<string, string> DefaultHeaders { get; set; }

        /// <summary>
        /// Performs application-defined tasks associated with freeing, releasing, or resetting
        /// unmanaged resources.
        /// </summary>
        public void Dispose()
        {
            if (this.httpClient != null)
            {
                this.httpClient.Dispose();
                this.httpClient = null;
                GC.SuppressFinalize(this);
            }
        }

        /// <summary>
        /// Gets the authorization token for the provided client id, client secret, and the scope.
        /// This token is usually valid for 1 hour, so if your submission takes longer than that to complete,
        /// make sure to get a new one periodically.
        /// </summary>
        /// <param name="tokenEndpoint">Token endpoint to which the request is to be made. Specific to your
        /// Azure Active Directory app. Example: https://login.microsoftonline.com/d454d300-128e-2d81-334a-27d9b2baf002/oauth2/v2.0/token </param>
        /// <param name="clientId">Client Id of your Azure Active Directory app. Example" 00001111-aaaa-2222-bbbb-3333cccc4444</param>
        /// <param name="clientSecret">Client secret of your Azure Active Directory app</param>
        /// <param name="scope">Scope. If not provided, default one is used for the production API endpoint.</param>
        /// <returns>Autorization token. Prepend it with "Bearer: " and pass it in the request header as the
        /// value for "Authorization: " header.</returns>
        public static async Task<string> GetClientCredentialAccessToken(
            string tokenEndpoint,
            string clientId,
            string clientSecret,
            string scope = null)
        {
            if (scope == null)
            {
                scope = "https://api.store.microsoft.com/.default";
            }

            dynamic result;
            using (HttpClient client = new HttpClient())
            {
                string tokenUrl = tokenEndpoint;
                using (
                    HttpRequestMessage request = new HttpRequestMessage(
                        HttpMethod.Post,
                        tokenUrl))
                {
                    string strContent =
                        string.Format(
                            "grant_type=client_credentials&client_id={0}&client_secret={1}&scope={2}",
                            clientId,
                            clientSecret,
                            scope);

                    request.Content = new StringContent(strContent, Encoding.UTF8,
                        "application/x-www-form-urlencoded");

                    using (HttpResponseMessage response = await client.SendAsync(request))
                    {
                        string responseContent = await response.Content.ReadAsStringAsync();
                        result = JsonConvert.DeserializeObject(responseContent);
                    }
                }
            }

            return result.access_token;
        }


        /// <summary>
        /// Invokes the specified HTTP method.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="httpMethod">The HTTP method.</param>
        /// <param name="relativeUrl">The relative URL.</param>
        /// <param name="requestContent">Content of the request.</param>
        /// <returns>instance of the type T</returns>
        /// <exception cref="ServiceException"></exception>
        public async Task<T> Invoke<T>(HttpMethod httpMethod,
            string relativeUrl,
            object requestContent)
        {
            using (var request = new HttpRequestMessage(httpMethod, relativeUrl))
            {
                this.SetRequest(request, requestContent);

                using (HttpResponseMessage response = await this.httpClient.SendAsync(request))
                {
                    T result;
                    if (this.TryHandleResponse(response, out result))
                    {
                        return result;
                    }

                    if (response.IsSuccessStatusCode)
                    {
                        var resource = JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync());
                        return resource;
                    }

                    throw new Exception(await response.Content.ReadAsStringAsync());
                }
            }
        }

        /// <summary>
        /// Uploads a given Image Asset file to Asset Storage
        /// </summary>
        /// <param name="assetUploadUrl">Asset Storage Url</param>
        /// <param name="fileStream">The Stream instance of file to be uploaded</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public async Task UploadAsset(string assetUploadUrl, Stream fileStream)
        {
            using (var request = new HttpRequestMessage(HttpMethod.Put, assetUploadUrl))
            {
                request.Headers.Add("x-ms-blob-type", "BlockBlob");
                request.Content = new StreamContent(fileStream);
                request.Content.Headers.ContentType = new MediaTypeHeaderValue(PngContentType);
                using (HttpResponseMessage response = await this.imageUploadClient.SendAsync(request))
                {
                    if (response.IsSuccessStatusCode)
                    {
                        return;
                    }
                    throw new Exception(await response.Content.ReadAsStringAsync());
                }
            }
        }

        /// <summary>
        /// Sets the request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="requestContent">Content of the request.</param>
        protected virtual void SetRequest(HttpRequestMessage request, object requestContent)
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", this.accessToken);

            foreach (var header in this.DefaultHeaders)
            {
                request.Headers.Add(header.Key, header.Value);
            }

            if (requestContent != null)
            {
                request.Content = new StringContent(JsonConvert.SerializeObject(requestContent),
                        Encoding.UTF8,
                        JsonContentType);
                
            }
        }


        /// <summary>
        /// Tries the handle response.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="response">The response.</param>
        /// <param name="result">The result.</param>
        /// <returns>true if the response was handled</returns>
        protected virtual bool TryHandleResponse<T>(HttpResponseMessage response, out T result)
        {
            result = default(T);
            return false;
        }
    }
}

Node.js örneği: MSI veya EXE uygulaması için Microsoft Store Gönderim API'si

Bu makalede MSI veya EXE uygulaması için Microsoft Store gönderim API'sinin nasıl kullanılacağını gösteren Node.js kod örnekleri sağlanmaktadır. Gösterdiği görev hakkında daha fazla bilgi edinmek için her örneği gözden geçirebilir veya bu makaledeki tüm kod örneklerini bir konsol uygulamasına oluşturabilirsiniz.

Önkoşullar Bu örneklerde aşağıdaki kitaplık kullanılır:

  • node-fetch v2 [npm install node-fetch@2]

node.js kullanarak uygulama gönderimi oluşturma

Aşağıdaki örnek, Microsoft Store gönderim API'sini kullanmanın farklı yollarını göstermek için bu makaledeki diğer örnek yöntemleri çağırır. Bu programı kendi kullanımınıza uyarlamak için:

  • SellerId özelliğini İş Ortağı Merkezi hesabınızın Satıcı Kimliğine atayın.
  • ApplicationId özelliğini yönetmek istediğiniz uygulamanın kimliğine atayın.
  • ClientId ve ClientSecret özelliklerini uygulamanızın istemci kimliğine ve anahtarına atayın ve TokenEndpoint URL'sindeki tenantid dizesini uygulamanızın kiracı kimliğiyle değiştirin. Daha fazla bilgi için bkz. Azure AD uygulamasını İş Ortağı Merkezi hesabınızla ilişkilendirme

Aşağıdaki örnek, bir uygulama gönderimini güncelleştirmek için Microsoft Store gönderim API'sinde çeşitli yöntemler kullanan bir sınıf uygular.

const config = require('./Configuration');
const submissionClient = require('./SubmissionClient');
const fs = require('fs');

var client = new submissionClient(config);

/**
 * Main entry method to Run the Store Submission API Node.js Sample
 */
async function RunNodeJsSample(){
    print('Getting Access Token');
    await client.getAccessToken();
    
    print('Getting Current Application Draft Status');
    var currentDraftStatus = await client.callStoreAPI(client.productDraftStatusPollingUrlTemplate, 'get');
    print(currentDraftStatus);

    print('Getting Application Packages');
    var currentPackages = await client.callStoreAPI(client.packagesUrlTemplate, 'get');
    print(currentPackages);

    print('Getting Single Package');
    var packageId = currentPackages.responseData.packages[0].packageId;
    var packageIdUrl = `${client.packageByIdUrlTemplate}`.replace('{packageId}', packageId);
    var singlePackage = await client.callStoreAPI(packageIdUrl, 'get');
    print(singlePackage);

    print('Updating Entire Package Set');
    // Update data in Packages list to have final set of updated Packages
    currentPackages.responseData.packages[0].installerParameters = "/s /r new-args";
    var packagesUpdateRequest = {
        'packages': currentPackages.responseData.packages
    };
    print(packagesUpdateRequest);
    var packagesUpdateResponse = await client.callStoreAPI(client.packagesUrlTemplate, 'put', packagesUpdateRequest);
    print(packagesUpdateResponse);

    print('Updating Single Package\'s Download Url');
    // Update data in the SinglePackage object
    singlePackage.responseData.packages[0].installerParameters = "/s /r /t new-args";
    var singlePackageUpdateResponse = await client.callStoreAPI(packageIdUrl, 'patch', singlePackage.responseData.packages[0]);
    print(singlePackageUpdateResponse);

    print('Committing Packages');
    var commitPackagesResponse = await client.callStoreAPI(client.packagesCommitUrlTemplate, 'post');
    print(commitPackagesResponse);

    await poll(async ()=>{
        print('Waiting for Upload to finish');
        return await client.callStoreAPI(client.productDraftStatusPollingUrlTemplate, 'get');
    }, 2);

    print('Getting Application Metadata - All Modules');
    var appMetadata = await client.callStoreAPI(client.appMetadataUrlTemplate, 'get');
    print(appMetadata);

    print('Getting Application Metadata - Listings');
    var appListingMetadata = await client.callStoreAPI(client.appListingsFetchMetadataUrlTemplate, 'get');
    print(appListingMetadata);

    print('Updating Listings Metadata - Description');   
    // Update Required Fields in Listings Metadata Object - Per Language. For eg. AppListingsMetadata.responseData.listings[0]
    // Example - Updating Description
    appListingMetadata.responseData.listings[0].description = 'New Description Updated By Node.js Sample Code';
    var listingsUpdateRequest = {
        'listings': appListingMetadata.responseData.listings[0]
    };
    var listingsMetadataUpdateResponse = await client.callStoreAPI(client.appMetadataUrlTemplate, 'put', listingsUpdateRequest);
    print(listingsMetadataUpdateResponse);

    print('Getting All Listings Assets');
    var listingAssets = await client.callStoreAPI(client.listingAssetsUrlTemplate, 'get');
    print(listingAssets);

    print('Creating Listing Assets for 1 Screenshot');
    var listingAssetCreateRequest = {
        'language': listingAssets.responseData.listingAssets[0].language,
        'createAssetRequest': {
            'Screenshot': 1,
            'Logo': 0
        }
    };
    var listingAssetCreateResponse = await client.callStoreAPI(client.listingAssetsCreateUrlTemplate, 'post', listingAssetCreateRequest);
    print(listingAssetCreateResponse);

    print('Uploading Listing Assets');
    const pathToFile = './Image.png';
    const stats = fs.statSync(pathToFile);
    const fileSize = stats.size;
    const fileStream = fs.createReadStream(pathToFile);
    await client.uploadAssets(listingAssetCreateResponse.responseData.listingAssets.screenshots[0].primaryAssetUploadUrl, fileStream, fileSize);

    print('Committing Listing Assets');
    var assetCommitRequest = {
        'listingAssets': {
            'language': listingAssets.responseData.listingAssets[0].language,
            'storeLogos': listingAssets.responseData.listingAssets[0].storeLogos,
            'screenshots': [{
                'id': listingAssetCreateResponse.responseData.listingAssets.screenshots[0].id,
                'assetUrl': listingAssetCreateResponse.responseData.listingAssets.screenshots[0].primaryAssetUploadUrl
            }]
        }
    };
    var assetCommitResponse = await client.callStoreAPI(client.listingAssetsCommitUrlTemplate, 'put', assetCommitRequest);
    print(assetCommitResponse);

    print('Getting Current Application Draft Status before Submission');
    currentDraftStatus = await client.callStoreAPI(client.productDraftStatusPollingUrlTemplate, 'get');
    print(currentDraftStatus);
    if(!currentDraftStatus.responseData.isReady){
        throw new Error('Application Current Status is not in Ready Status for All Modules');
    }

    print('Creating Submission');
    var submissionCreationResponse = await client.callStoreAPI(client.createSubmissionUrlTemplate, 'post');
    print(submissionCreationResponse);

    print('Current Submission Status');
    var submissionStatusUrl = `${client.submissionStatusPollingUrlTemplate}`.replace('{submissionId}', submissionCreationResponse.responseData.submissionId);
    var submissionStatusResponse = await client.callStoreAPI(submissionStatusUrl, 'get');
    print(submissionStatusResponse);

    // User can Poll on this API to know if Submission Status is INPROGRESS, PUBLISHED or FAILED.
    // This Process involves File Scanning, App Certification and Publishing and can take more than a day.
}

/**
 * Utility Method to Poll using a given function and time interval in seconds
 * @param {*} func 
 * @param {*} intervalInSeconds 
 * @returns 
 */
async function poll(func, intervalInSeconds){
var result = await func();
if(result.responseData.isReady){
    Promise.resolve(true);
}
else if(result.errors && result.errors.length > 0 && result.errors.find(element => element.code == 'packageuploaderror') != undefined){
throw new Error('Package Upload Failed');
}
else{
    await new Promise(resolve => setTimeout(resolve, intervalInSeconds*1000));
    return await poll(func, intervalInSeconds); 
}
}

/**
 * Utility function to Print a Json or normal string
 * @param {*} json 
 */
function print(json){
    if(typeof(json) == 'string'){
        console.log(json);
    }
    else{
        console.log(JSON.stringify(json));
    }
    console.log("\n");
}

/** Run the Node.js Sample Application */
RunNodeJsSample();

ClientConfiguration yardımcısı

Örnek uygulama, Microsoft Store gönderim API'sini kullanan örnek yöntemlerin her birine Azure Active Directory verilerini ve uygulama verilerini geçirmek için ClientConfiguration yardımcı sınıfını kullanır.

/** Configuration Object for Store Submission API */
var config = {
    version : "1",
    applicationId : "...",
    clientId : "...",
    clientSecret : "...",
    serviceEndpoint : "https://api.store.microsoft.com",
    tokenEndpoint : "...",
    scope : "https://api.store.microsoft.com/.default",
    sellerId : "...",
    jsonContentType : "application/json",
    pngContentType : "image/png",
    binaryStreamContentType : "application/octet-stream"
};

module.exports = config;

node.js kullanan IngestionClient yardımcısı

IngestionClient sınıfı, aşağıdaki görevleri gerçekleştirmek için örnek uygulamadaki diğer yöntemler tarafından kullanılan yardımcı yöntemler sağlar:

  • Microsoft Store gönderim API'sindeki yöntemleri çağırmak için kullanılabilecek bir Azure AD erişim belirteci edinin. Belirteci aldıktan sonra, belirtecin süresi dolmadan önce Microsoft Store gönderim API'sine yapılan çağrılarda bu belirteci kullanmak için 60 dakikanız vardır. Belirtecin süresi dolduktan sonra yeni bir belirteç oluşturabilirsiniz.
  • Microsoft Store gönderim API'sinin HTTP isteklerini işleme.
const fetch = require('node-fetch');
/**
 * Submission Client to invoke all available Store Submission API and Asset Upload to Blob Store
 */
class SubmissionClient{

    constructor(config){
        this.configuration = config;
        this.accessToken = "";
        this.packagesUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/packages`;
        this.packageByIdUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/packages/{packageId}`;
        this.packagesCommitUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/packages/commit`;
        this.appMetadataUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/metadata`;
        this.appListingsFetchMetadataUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/metadata/listings`;
        this.listingAssetsUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/listings/assets`;
        this.listingAssetsCreateUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/listings/assets/create`;
        this.listingAssetsCommitUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/listings/assets/commit`;
        this.productDraftStatusPollingUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/status`;
        this.createSubmissionUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/submit`;
        this.submissionStatusPollingUrlTemplate = `/submission/v${this.configuration.version}/product/${this.configuration.applicationId}/submission/{submissionId}/status`;
    }
    
    async getAccessToken(){
        var params = new URLSearchParams();
        params.append('grant_type','client_credentials');
        params.append('client_id',this.configuration.clientId);
        params.append('client_secret',this.configuration.clientSecret);
        params.append('scope',this.configuration.scope);
        var response = await fetch(this.configuration.tokenEndpoint,{
            method: "POST",
            body: params
        });    
        var data = await response.json();
        this.accessToken = data.access_token;
    }

    async callStoreAPI(url, method, data){
        var request = {
            method: method,
            headers:{
                'Authorization': `Bearer ${this.accessToken}`,
                'Content-Type': this.configuration.jsonContentType,
                'X-Seller-Account-Id': this.configuration.sellerId
            },            
        };
        if(data){
            request.body = JSON.stringify(data);
        }
        var response = await fetch(`${this.configuration.serviceEndpoint}${url}`,request);
        var jsonResponse = await response.json();
        return jsonResponse;
    }

    async uploadAssets(url, stream, size){
        var request = {
            method: 'put',
            headers:{
                'Content-Type': this.configuration.pngContentType,
                'x-ms-blob-type': 'BlockBlob',
                "Content-length": size
            },            
            body: stream
        };
        var response = await fetch(`${url}`,request);
        if(response.ok){
            return response;
        }
        else{
            throw new Error('Uploading of assets failed');
        }
    }
}
module.exports = SubmissionClient;

Ek yardım

Microsoft Store gönderim API'siyle ilgili sorularınız varsa veya bu API ile gönderimlerinizi yönetme konusunda yardıma ihtiyacınız varsa aşağıdaki kaynakları kullanın:

  • Sorularınızı forumlarımızda sorun.
  • destek sayfamızı ziyaret edin ve İş Ortağı Merkezi için yardımlı destek seçeneklerinden birini isteyin. Bir sorun türü ve kategori seçmeniz istenirse, sırasıyla Uygulama gönderme ve onaylama ve Uygulama gönderme'yi seçin.