You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java/SpringBoot获取微软商店应用订阅内购信息及可用API

微软商店应用后端对接开发指引

一、可用的微软商店Rest API清单

  • 购买查询API:用于获取指定用户的所有应用内购买、订阅权益,支持校验购买有效性、过期时间、自动续费状态
  • 订阅管理API:可查询订阅状态、变更历史、取消/恢复订阅操作,支持主动获取订阅续费通知
  • 交易凭据校验API:专门用于校验客户端上传的购买凭据合法性,避免伪造交易
  • 产品目录查询API:获取你在微软合作伙伴中心配置的所有内购商品、订阅的定价、状态等元数据

二、Java/SpringBoot对接前置准备

前置配置要求:

  1. 登录微软合作伙伴中心,找到你的应用,在「产品管理」-「API 访问」页面创建应用凭证,获取Tenant ID、Client ID、Client Secret
  2. 给凭证授权必要的Store服务权限,确保可访问购买、订阅相关的接口
  3. 记录你的应用的Store ID,后续接口调用需要作为参数传入

三、SpringBoot代码样例

首先引入必要依赖:

<!--  SpringBoot Web 依赖  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--  JSON 处理依赖  -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

编写接口调用服务类:

import org.springframework.web.client.RestTemplate;
import org.springframework.http.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.Map;

@Component
public class MsStoreApiService {
    private static final String TOKEN_URL = "https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";
    private static final String STORE_QUERY_API_URL = "https://purchase.mp.microsoft.com/v8.0/b2b/orders/query";
    
    @Value("${ms.store.tenant-id}")
    private String tenantId;
    @Value("${ms.store.client-id}")
    private String clientId;
    @Value("${ms.store.client-secret}")
    private String clientSecret;

    // 获取接口调用凭证,有效期1小时,建议本地缓存减少重复请求
    private String getAccessToken() {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        String body = "grant_type=client_credentials&client_id=" + clientId 
                    + "&client_secret=" + clientSecret 
                    + "&scope=https://onestore.microsoft.com/.default";
        HttpEntity<String> request = new HttpEntity<>(body, headers);
        ResponseEntity<Map> response = restTemplate.postForEntity(TOKEN_URL, request, Map.class, tenantId);
        return response.getBody().get("access_token").toString();
    }

    // 查询指定用户的购买、订阅信息
    // userPurchaseId为客户端获取的用户身份标识,需要从应用前端传递到后端
    public Map queryUserPurchaseInfo(String userPurchaseId, String appStoreId) {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setBearerAuth(getAccessToken());
        Map<String, Object> requestBody = Map.of(
            "userId", userPurchaseId,
            "productIds", Collections.singletonList(appStoreId)
        );
        HttpEntity<Map> request = new HttpEntity<>(requestBody, headers);
        ResponseEntity<Map> response = restTemplate.postForEntity(STORE_QUERY_API_URL, request, Map.class);
        return response.getBody();
    }
}

配置文件示例:

# application.properties 配置项
ms.store.tenant-id=你的合作伙伴中心租户ID
ms.store.client-id=创建的应用客户端ID
ms.store.client-secret=创建的应用客户端密钥

四、对接注意事项

  • Access Token有效期为1小时,建议本地做缓存处理,避免每次接口调用都重复请求凭证,影响接口性能
  • 校验交易有效性时,不要直接信任客户端传递的购买状态,必须调用微软服务端接口做二次校验,避免伪造交易
  • 订阅状态变更可以配合微软的通知能力,不需要后端主动轮询即可实时获取订阅续费、取消、过期等事件

内容的提问来源于stack exchange,提问作者Ashutosh Tripathy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:03