目录

1. 接口功能

此接口用于根据商品编码查询托管商品的商品名称、描述、价格等信息。

2. 调用场景

为避免应用的虚拟商品价格在国际汇率变动时,应用显示的商品价格与实际华为商品服务器上管理的商品价格不一致,用户在应用中购买商品时,应用需要调用此接口获取最新的商品详情。

3. 接口约束

此接口仅在托管商品支付时才需要使用。

4. 调用方法

  1. HMSAgent.Pay.getProductDetails(ProductDetailRequest request, GetProductDetailsHandler handler);

5. 请求参数

参数名称必选(M)/可选(O)类型参数说明
request
M
ProductDetailRequest
查询商品的请求参数信息。
handler
M
GetProductDetailsHandler
接口调用后的回调结果,结果中包含的具体参数参见结果回调。
ProductDetailRequest
参数名称必选(M)/可选(O)类型参数说明
applicationID
M
string
应用ID,在创建应用后由华为开发者联盟为应用分配的唯一标识。应用ID的查询方法请参见查询应用ID。
requestId
M
string(0,32)

查询标识号,由开发者应用自行生成,用于唯一标识一次商品查询请求。

注意:
该字段中不能包含特殊字符,包括# " & / ? $ ^ *:) \ < > , | .并且不支持中文。
merchantId
M
string
商户ID,即华为开发者联盟给开发者分配的“支付ID”。
支付ID的查询方法请参见查询支付服务信息。
productNos
M
string
需要获取商品详情的商品ID列表,多个商品ID时以竖线“|”分割,一次查询最多支持20个商品。

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

注意:
所查询的商品ID必须在当前应用中已创建,且在应用内唯一。

6. 结果回调

  1. public interface GetProductDetailsHandler {
  2.        /**
  3.        * 结果回调
  4.        * @param rst 返回码
  5.        * @param result 商品详情
  6.        */
  7.       void onResult(int rst, ProductDetailResult result);
  8. }
参数名称必选(M)/可选(O)类型参数说明
rst
M
int
回调结果中支付结果的返回码,应用可以根据返回码判断支付是否成功或失败后如何处理,具体返回码处理参见返回码。
result
M
查询结果的对象信息。
获取ProductDetailResult对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“result.getProductList()”为成功查询到的商品信息。
ProductDetailResult
参数名称必选(M)/可选(O)类型参数说明
status
M
status
包含业务返回码的对象,可通过status.getStatusCode()获取返回码,具体返回码请参见返回码的业务返回码。
当有业务返回码时,HMS SDK会将此值赋值给rst,应用获取rst中的返回码即可。
requestId
M
string
商品查询请求的标识号,与请求参数中的requestId一致。
应用通过该参数识别本次回调结果所属的查询请求。
productList
O
成功查询到商品信息的商品列表,值为包含ProductDetail对象的数组。
获取ProductDetail对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“productDetail.getProductNo()”为查询成功商品信息中的商品ID。
failList
O
查询失败的商品信息列表,值为包含ProductFailObject对象的数组。
只有出现查询失败的商品时才会返回该参数。
获取ProductFailObject对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“failProduct.getProductNo()”为查询失败商品信息中的商品ID。
ProductDetail
参数名称必选(M)/可选(O)类型参数说明
productNo
M
string
查询成功的商品ID。
microsPrice
M
long
商品实际价格乘以1,000,000后的微单位价格。
例如某个商品实际价格是1.99美元,则该商品对应的微单位价格为:1.99*1000000=1990000。
price
M
string
商品的展示价格,包含商品货币单位和实际价格,格式为“货币单位 商品价格”,中间使用空格分隔,例如“CNY 0.15”。
currency
M
string
用于支付该商品的币种,必须符合ISO 4217标准标准,例如USD、CNY、MYR。
country
M
string
国家码,用于区分国家信息,必须符合ISO 3166标准,如US、CN、MY。
productName
O
string
商品名称,为配置商品信息时配置的名称。
productDesc
O
string
商品描述,为配置商品信息时配置的描述信息。
ProductFailObject
参数名称必选(M)/可选(O)类型参数说明
productNo
M
string
查询失败的商品ID。
code
M
int
查询失败的错误码,具体错误码请参见返回码。
msg
O
string
查询失败的错误描述。

7. 返回码

类型返回码常量返回码值返回码说明处理建议
通用返回码
参见通用返回码。
业务返回码
PayStatusCodes.PAY_STATE_SUCCESS
0
查询成功。
PayStatusCodes.PAY_STATE_FAILED
-1
通用失败错误码。
查询失败,支付流程结束,需重新调用支付接口。
PayStatusCodes.PAY_STATE_PARAM_ERROR
30001
参数错误(包含无参)。
请检查请求参数是否遗漏,参数值格式是否正确。
PayStatusCodes.PAY_STATE_TIME_OUT
30002
查询超时。
向用户给出提示,并定时调用getProductDetails重新查询。
PayStatusCodes.PAY_STATE_NET_ERROR
30005
网络连接异常。
向用户给出提示,请用户检查网络后再重试。
PayStatusCodes.PAY_STATE_ERROR
30099
华为服务器返回给HMS SDK的数据格式错误,查询结果未知。
请联系华为技术支持定位。
PayStatusCodes.PRODUCT_NOT_EXIST
40001
商品ID在对应商户应用中不存在。
请检查productNos中的商品ID对应的商品已创建。
PayStatusCodes.PRODUCT_SERVER_INTERNAL_EXCEPTION
40003
商品服务器内部异常。
查询商品时服务器异常,请稍后重试,如仍未解决请联系华为技术支持定位。
PayStatusCodes.PRODUCT_SOME_NOT_EXIST
40004
商品ID在对应商户查询的应用中部分不存在,仅在失败商品(failList)的返回码(code参数)中返回。
检查查询失败的商品是否已在AppGllery Connect中创建。
PayStatusCodes.PAY_OTHER_ERROR
30006
除以上错误以外的其他异常错误。
请联系华为技术支持定位。

8. 调用示例

  1. HMSAgent.Pay.getProductDetails(request, new GetProductDetailsHandler() {
  2.    @Override
  3.    public void onResult(int rst, ProductDetailResult result) {
  4.        if (result != null) {
  5.           showLog("getProductDetails: getRequestId=" + result.getRequestId() + " rstCode=" + rst);
  6.           List<ProductDetail> productDetailsLst = result.getProductList();
  7.           if (productDetailsLst != null) {
  8.              for (int i=0; i<productDetailsLst.size(); i++) {
  9.                   ProductDetail detail = productDetailsLst.get(i);
  10.                   showLog("getProductDetails: No=" + detail.getProductNo()
  11.                                    + "\n Title=" + detail.getProductName()
  12.                                    + "\n Desc=" + detail.getProductDesc()
  13.                                    + "\n Price=" + detail.getPrice() + "\n");
  14.                            // TODO: 获取每个商品的信息并储存下来,后续逻辑处理
  15.        }
  16.            } else {
  17.                  showLog("productDetailsLst == null");
  18.               }
  19.               /**
  20.                 * productDetailsFailLst包括所有查询失败的订单
  21.               */
  22.           List<ProductFailObject> productDetailsFailLst = result.getFailList();
  23.           if (productDetailsFailLst != null) {
  24.                for (int i=0; i<productDetailsFailLst.size(); i++) {
  25.                    ProductFailObject detailFail = productDetailsFailLst.get(i);
  26.                    showLog("getProductDetailsFail: No=" + detailFail.getProductNo() + "  rstCode=" + detailFail.getCode()+"  msg=" + detailFail.getMsg() + "\n");
  27.                     // TODO: 获取每个失败的商品的信息并储存下来,后续逻辑处理
  28.          }
  29.              }
  30.       } else {
  31.             showLog("getProductDetails: error=" + rst + "\n");
  32.         }
  33.  }
  34. });