Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- Tüm önkoşulları tamamladığınızdan emin olun.
- 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.
- 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.
- İş Ortağı Merkezi'nde kuruluşunuzun İş Ortağı Merkezi hesabını kuruluşunuzun Azure AD diziniile ilişkilendirin.
- 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. - 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.
- 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:
Azure portalınaoturum açın.
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.
Azure Active Directory'yi bulun ve seçin.
Yönet'in altında Uygulama kayıtları > Uygulamanızı seçin.
Sertifikalar ve gizli anahtarlar > İstemci gizli anahtarları > Yeni istemci gizli anahtarı.
İstemci sırrınız için bir açıklama ekleyin.
Sır için bir son kullanma tarihi seçin veya özel bir geçerlilik süresi belirtin.
İ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.
Ekle'yi seçin.
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 | Bİ |
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 | Gİ |
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 | Lİ |
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 | MÜ |
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:
- 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.
- İ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.
- 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.
- 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.
Windows developer