如何通过Java/SpringBoot获取微软商店应用订阅内购信息及可用API
微软商店应用后端对接开发指引
一、可用的微软商店Rest API清单
- 购买查询API:用于获取指定用户的所有应用内购买、订阅权益,支持校验购买有效性、过期时间、自动续费状态
- 订阅管理API:可查询订阅状态、变更历史、取消/恢复订阅操作,支持主动获取订阅续费通知
- 交易凭据校验API:专门用于校验客户端上传的购买凭据合法性,避免伪造交易
- 产品目录查询API:获取你在微软合作伙伴中心配置的所有内购商品、订阅的定价、状态等元数据
二、Java/SpringBoot对接前置准备
前置配置要求:
- 登录微软合作伙伴中心,找到你的应用,在「产品管理」-「API 访问」页面创建应用凭证,获取Tenant ID、Client ID、Client Secret
- 给凭证授权必要的Store服务权限,确保可访问购买、订阅相关的接口
- 记录你的应用的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
相关产品推荐
相关产品推荐

