合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
HMS Core
此接口用于校验购买的商品,判断商品是否已经成功购买,是否在有效期内。
在完成一笔支付后,IAP客户端会返回商品购买单详情JSON字符串InAppPurchaseData和签名字符串dataSignature。InAppPurchaseData中有用于唯一标识商品和用户对应关系的purchaseToken。
通过签名验证,可确保InAppPurchaseData有效性。您还可以解析出InAppPurchaseData中的purchaseToken数据,调用华为应用内支付服务器提供的Subscription服务验证购买Token接口。为避免资金损失,您在验签成功后,必须校验InAppPurchaseData中的productId、price、currency等信息的一致性。验证方法和公钥获取方式可参见验证InAppPurchaseData。一般应该判断商品是否已经成功购买,对于订阅型商品返回最近的收费情况,包括何时收费以及是否在有效期内。
Request Header
Request Body
参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
subscriptionId | 是 | String | 订阅ID。 |
purchaseToken | 是 | String | 商品的购买Token,发起购买和查询订阅信息均会返回。 |
- POST /sub/applications/v2/purchases/get
- Content-Type: application/json; charset=UTF-8
- Authorization: Basic QVQ6Q1YzQ1NPbVlBaGwrZUtRWExtMTBVV2pyWXZHTVF4MmYvcVMya1B0ZElLY3UwaFJrdFNTMmxwdk1FQkIyYldXWGt0REVaR3I4UjFUTTRLMVlmNXdwWU80RG04THdXQWxjaFhEYjBMUjBNTUJtWnFYcGFtazc3THN3UnFJbkhHK28xekdqRzNSMg==
- Accept: application/json
- Content-Length: 171
- {
- "purchaseToken": "00000173741056a37eef310dff9c6a86fec57efafe318ae478e52d9c4261994d64c8f6fc8ea1abbdx5347.5.3089",
- "subscriptionId": "1581789719266.D40972AC.3089"
- }
Response Header
参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
Content-Type | 是 | String | 取值为:application/json; charset=UTF-8 |
Response Body
参数 | 是否必选 | 参数类型 | 描述 |
|---|---|---|---|
responseCode | 是 | String | 返回码。
|
responseMessage | 否 | String | 响应描述。 |
inappPurchaseData | 否 | String | 包含购买详情的字符串(JSONString格式),格式请参见InappPurchaseDetails。 |
dataSignature | 否 | String | inappPurchaseData基于应用RSA IAP私钥的签名信息,签名算法为signatureAlgorithm。应用请参见对返回结果验签使用IAP公钥对inappPurchaseData的JSON字符串进行验签。 |
signatureAlgorithm | 是 | String | 签名算法。默认为:SHA256WithRSA/PSS。 |
- HTTP/1.1 200 OK
- Content-Type: application/json; charset=UTF-8
- Content-Length: 1035
- {
- "responseCode": "0",
- "inappPurchaseData": "{\"autoRenewing\":true,\"subIsvalid\":true,\"orderId\":\"1581789719266.E359BC66.3089\",\"lastOrderId\":\"L1581789719266.E359BC66.3089\",\"packageName\":\"com.huawei.packagename\",\"applicationId\":123456,\"productId\":\"prd2\",\"kind\":2,\"productName\":\"订阅型商品名称\",\"productGroup\":\"0DED5AC93D084C489F94312E217E1DBD\",\"purchaseTime\":1597677768003,\"oriPurchaseTime\":1597677768003,\"purchaseState\":0,\"developerPayload\":\"payload data\",\"purchaseToken\":\"00000173741056a37eef310dff9c6a86fec57efafe318ae478e52d9c4261994d64c8f6fc8ea1abbdx5347.5.3089\",\"purchaseType\":0,\"currency\":\"CNY\",\"price\":50,\"country\":\"CN\",\"subscriptionId\":\"1581789719266.D40972AC.3089\",\"quantity\":1,\"daysLasted\":0,\"numOfPeriods\":1,\"numOfDiscount\":0,\"expirationDate\":1597677948003,\"retryFlag\":1,\"introductoryFlag\":0,\"trialFlag\":0,\"renewStatus\":1,\"renewPrice\":50,\"cancelledSubKeepDays\":30,\"payOrderId\":\"WX123456789ce8e23ee927\",\"payType\":\"17\",\"confirmed\":1}",
- "dataSignature": "FiJJZYRdVIFgEzDA4GbGrR/JbmExXgXJOnYLINc1besVPKakC01NuwfD54HFYKcm092iwoctqEbGleODbwjINRv047320p51dzeXozB8ozjqXQ2DlkaMgYUe0CLgB72ttkYG2EIrHyJullNpPuaMXNQ6R5DOrY0XRLDF4yOpiRoSHuQohTVk2wx5ugZ7537E2c5ZCc/AmiGLJT1Uxh4EDyTB8aGBZTWJgy2D/ogJLW86PKpVREhJEWxVco1IbVe5dvjutheh5oBfRcsJg+AgSLoNgbKvjn1dNlEGc4VoRsJSBP1M5ukYgh16r4y7DBqBA/QrRE7ocvzzPm/W/teeng==",
- "signatureAlgorithm":"SHA256WithRSA"
- }
在完成一笔支付后,您的客户端会获取到商品订单详情JSON字符串InAppPurchaseData。
更多语言示例代码请参见服务端示例代码,您可直接下载代码工程。相关的库和方法可参见代码工程。
- public class SubscriptionService {
- // TODO: 将(ip:port)替换为实际值,如果协议使用的是https,您还应该处理证书认证相关的逻辑
- public static final String TOC_SITE_URL = "https://ip:port";
-
- public static void getSubscription(String subscriptionId, String purchaseToken)
- throws Exception {
- // 获取应用级AccessToken
- String appAt = AtDemo.getAppAT();
- // 在请求头中构建Authorization
- Map<String, String> headers = AtDemo.buildAuthorization(appAt);
-
- // 包装request的body信息
- Map<String, String> bodyMap = new HashMap<>();
- bodyMap.put("subscriptionId", subscriptionId);
- bodyMap.put("purchaseToken", purchaseToken);
-
- String msgBody = JSONObject.toJSONString(bodyMap);
- // demo中使用5000作为超时时间,您可以按照需要调整
- String response = AtDemo.httpPost(TOC_SITE_URL + "/sub/applications/v2/purchases/get",
- "application/json; charset=UTF-8", msgBody, 5000, 5000, headers, true);
- // TODO: 在console中将response作为字符串打印,您可以根据业务逻辑替换处理方式
- System.out.println(response);
- }
- }
- class SubscriptionService:
- def __init__(self):
- # TODO: 将(ip:port)替换为实际值,如果协议使用的是https,您还应该处理证书认证相关的逻辑
- self.TOC_SITE_URL = "https://ip:port"
- self.getSubscriptionUrl = "%s/sub/applications/v2/purchases/get"
-
- def getSubscription(self, subscriptionId, purchaseToken):
- # 获取应用级AccessToken
- appAt = AtDemo.getAppAT()
- if appAt is None or appAt == "":
- return
- # 在请求头中构建Authorization
- headers = AtDemo.buildAuthorization(appAt)
- # 包装request的body信息
- bodyDict = {"subscriptionId": subscriptionId, "purchaseToken": purchaseToken}
- data = json.dumps(bodyDict)
- response = AtDemo.httpPost(self.getSubscriptionUrl % self.TOC_SITE_URL, str.encode(data), headers)
- # TODO: 在console中将response作为字符串打印,您可以根据业务逻辑替换处理方式.
- print(response)
- type SubscriptionClient struct {
- }
-
- // TODO: 将(ip:port)替换为实际值,如果协议使用的是https,您还应该处理证书认证相关的逻辑
- const TOC_SITE_URL = "https://ip:port"
-
- var SubscriptionDemo = &SubscriptionClient{}
-
- func (subscriptionDemo *SubscriptionClient) GetSubscription(subscriptionId, purchaseToken string) {
- bodyMap := map[string]string{
- "subscriptionId": subscriptionId,
- "purchaseToken": purchaseToken,
- }
- url := TOC_SITE_URL + "/sub/applications/v2/purchases/get"
- bodyBytes, err := SendRequest(url, bodyMap)
- if err != nil {
- log.Printf("err is %s", err)
- }
- // TODO: 在console中将response作为字符串打印,您可以根据业务逻辑替换处理方式.
- log.Printf("%s", bodyBytes)
- }
您可以使用Postman在线调试此接口。
合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
解决方案
精准高效的一站式服务支持,助力开发者商业成功