目录

1. 接口功能

此接口用于查询当前用户已订购的非消耗商品订单信息。

非消耗商品是指用户只需购买一次后续不会过期或随着使用而减少的商品,例如去广告,升级专业版等。

2. 调用场景

应用可在用户登录后或用户主动查看会员权益时,查询用户已经支付的非消耗商品订单信息。在用户使用此非消耗商品时,无需再次支付可直接发放商品。

3. 接口约束

此接口仅支持非消耗商品在AppGallery Connect中维护的应用。

4. 调用方法

  1. HMSAgent.Pay.getPurchaseInfo(PurchaseInfoRequest request, GetPurchaseInfoHandler handler);

5. 请求参数

参数名称必选(M)/可选(O)类型参数说明
request
M
PurchaseInfoRequest
查询非消耗商品订单的请求参数信息。
handler
M
GetPurchaseInfoHandler
接口调用后的回调结果,结果中包含的具体参数参见结果回调。
PurchaseInfoRequest
参数名称必选(M)/可选(O)类型是否参与签名参数说明
merchantId
M
string
是
商户ID,即华为开发者联盟给开发者分配的“支付ID”。
支付ID的查询方法请参见查询支付服务信息。
appId
M
string
是
应用ID,在创建应用后由华为开发者联盟为应用分配的唯一标识。应用ID的查询方法请参见查询应用ID。
priceType
M
string
是
价格类型。当前请填写固定值“3”,表示应用内非消耗商品。
productId
O
string
是
需要查询订单信息的非消耗商品ID,一次只能查询一个商品。如果不传该参数,则默认查询当前用户的所有非消耗商品订单。

商品ID来源于开发者在AppGallery Connect中配置商品信息时设置的“商品ID”,参见配置商品信息章节。

警告:
所查询的商品ID必须属于当前应用,且在应用内唯一。
ts
M
long
是
当前时间的时间戳,即当前时间距离1970年的毫秒数。
pageNo
M
long
是
请求查询记录数的页码。每页默认查询100条记录。
如果不传该参数,默认值为1,表示查询100条记录。
sign
O
string
否
用于华为服务器对请求参数验签的签名字符串。
为防止请求被篡改,应用需要根据支付签名的生成方法中的方法生成签名字符串,华为服务器在收到请求后会对签名字符串进行验签,验签成功后才会进行后续处理,否则将返回失败错误码。

6. 结果回调

  1. public interface GetPurchaseInfoHandler {
  2.        /**
  3.        * 结果回调
  4.        * @param rst 返回码
  5.        * @param result 订单详情
  6.        */
  7.       void onResult(int rst, PurchaseInfoResult result);
  8. }
参数名称必选(M)/可选(O)类型参数说明
rst
M
int
回调结果中查询结果的返回码,应用可以根据返回码判断查询是否成功或失败后如何处理,具体返回码处理参见返回码。
result
M
查询结果的对象信息。
获取result对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“result.getPurchaseInfoList()”为查询到的非消耗商品订单列表。
PurchaseInfoResult
参数名称必选(M)/可选(O)类型是否参与验签参数说明
status
M
status
否
包含业务返回码的对象,可通过status.getStatusCode()获取返回码,具体返回码请参见返回码。
当有业务返回码时,HMS SDK会将此值赋值给rst,应用获取rst中的返回码即可。
rtnCode
M
string
是
查询结果的业务返回码,与status中的返回码相同。
pageCount
O
long
是
查询结果的页数,每页默认包含100条记录。
purchaseInfoList
O
是
成功查询的非消耗商品订单列表,值为包含PurchaseInfo对象的数组。
获取PurchaseInfo对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“purchaseInfo.getProductId()”为订单信息中的非消耗商品ID。
sign
O
string
否
查询响应的签名字符串,查询成功时返回。
应用可以参考对响应消息验签的方法对签名字符串进行验签,确认响应消息是否被篡改。
一般建议使用PaySignUtil.checkSign方法直接在应用客户端验签。
PurchaseInfo
参数名称必选(M)/可选(O)类型是否参与验签参数说明
requestId
M
string
是
商户侧支付订单号。此订单号在应用发起非消耗商品的支付请求时由开发者自行生成。
merchantId
M
string
是
商户ID,即华为开发者联盟给开发者分配的“支付ID”。
appId
M
string
是
应用ID,即应用创建后华为开发者联盟为应用分配的唯一标识。
productId
M
string
是
非消耗商品的商品ID。商品ID来源于开发者在AppGallery Connect中配置商品信息时设置的“商品ID”。
tradeTime
M
string
是
支付完成时间,即用户确认付款后华为支付服务器支付处理成功的时间,格式为yyyy-MM-dd HH:mm:ss。

7. 返回码

类型返回码常量返回码值返回码说明处理建议
通用返回码
业务返回码
PayStatusCodes.PAY_STATE_SUCCESS
0
查询成功。
JosStatusCodes.RTN_CODE_PARAMS_ERROR
8100
参数校验失败。
请检查必选参数是否遗漏,参数格式是否正确。
无
2902
华为帐号未登录,HMS SDK拉起登录页面引导用户登录时,用户取消登录。
取消查询操作,待下次触发查询操作时再调用本接口。
JosStatusCodes.RNT_CODE_SERVER_ERROR
8200
华为服务器请求失败。
请检查当前网络,如网络没有问题,请联系华为技术支持定位。
JosStatusCodes.RNT_CODE_NETWORK_ERROR
8300
网络连接异常。
向用户给出提示,请用户检查网络后再重试。

8. 调用示例

  1. HMSAgent.Pay.getPurchaseInfo(req, new GetPurchaseInfoHandler() {
  2.    @Override
  3.    public void onResult(int rst, PurchaseInfoResult result) {
  4.        if (result != null) {
  5.            if (rst == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS) {
  6.                boolean checkSign = PaySignUtil.checkSign(result, pay_pub_key);
  7.                showLog("getPurchaseInfo: pageNo="+pageNo+" checkSign=" + checkSign);
  8.                if (checkSign) {
  9.                    List<PurchaseInfo> purchaseInfos = result.getPurchaseInfoList();
  10.                    if (purchaseInfos != null) {
  11.                        for (PurchaseInfo info : purchaseInfos) {
  12.                            String requestId = info.getRequestId();
  13.                            String appid = info.getAppId();
  14.                            String cpid = info.getMerchantId();
  15.                            String productId = info.getProductId();
  16.                            String tradeTime = info.getTradeTime();
  17.                            showLog("getPurchaseInfo: tradeTime=" + tradeTime
  18.                                            + "\n\t productId=" + productId
  19.                                            + "\n\t cpid=" + cpid
  20.                                            + "\n\t appid=" + appid
  21.                                            + "\n\t requestId=" + requestId);
  22.                        }
  23.                    }
  24.                    long pageCount = result.getPageCount();
  25.                    if (pageNo < pageCount) {
  26.                        // 请求下一页数据
  27.             getPurchaseInfo(pageNo+1);
  28.                    }
  29.                } else {
  30.                       // 验签失败,请检查公钥是否正确。如果确认无误,请联系华为方支持
  31.          }
  32.            } else {
  33.                showLog("getPurchaseInfo: pageNo="+pageNo+" result=null code=" + rst + " errMsg=" + result.getStatus().getStatusMessage());
  34.            }
  35.       } else {
  36.            showLog("getPurchaseInfo: pageNo="+pageNo+" result=null code=" + rst);
  37.       }
  38.    }
  39. });