应用可调用此接口完成托管商品的支付,托管商品是指在华为AppGallery Connect中维护的商品。
开发者提前在华为AppGallery Connect网站中创建虚拟商品,消费者在应用界面发起商品支付请求,应用根据已经配置的商品ID调用此接口即可拉起华为支付收银台,收银台中显示商品最新价格和支付方式,消费者付款成功后即可发放商品。
如果开发者未按接入规范导致的消费者投诉或经济损失,由开发者自行承担。
- HMSAgent.Pay.productPay(ProductPayRequest request, final ProductPayHandler handler);
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
request | M | 支付请求的参数信息。 | |
handler | M | 接口调用后的回调结果,支付结束后,通过此回调实例回调给应用。回调结果中包含的具体参数参见结果回调。 |
| 参数名称 | 必选(M)/可选(O) | 类型 | 是否参与签名 | 参数说明 |
productNo | M | string(0,50) | 是 | 待支付的商品ID。 商品ID来源于开发者在AppGallery Connect中配置商品信息时设置的“商品ID”,参见配置商品信息章节。 |
applicationID | M | string | 是 | 应用ID,在创建应用后由华为开发者联盟为应用分配的唯一标识。应用ID的查询方法请参见查询应用ID。 |
requestId | M | string(0,32) | 是 | 商户侧的支付订单号,用于唯一标识一次支付请求。 支付订单号由开发者自行生成,需由字母和数字组成,不能包含特殊字符,包括# " & / ? $ ^ *:) \ < > , | .并且不支持中文。 支付订单号每次支付请求需唯一,即使订单被取消或支付失败订单号也不可重复。 华为支付服务器在接口回调结果中会原样返回requestId的值。 |
merchantId | M | string | 是 | 商户ID,即华为开发者联盟给开发者分配的“支付ID”。 支付ID的查询方法请参见查询支付服务信息。 |
serviceCatalog | M | string | 否 | 商品类型。 联运游戏请设置为“X6”,联运应用请设置为“X5”。 如果传入类型错误,会影响风控,请开发者按照真实业务类型传入。 |
merchantName | M | string(0,50) | 否 | 商户名称,配置为注册开发者时配置的公司名。 |
sdkChannel | M | int | 是 | 渠道信息。 ● 0:自有应用,无渠道 ● 1:华为应用市场渠道 ● 2:预装渠道 ● 3:游戏中心 游戏设置为3,普通应用设置为1。 |
url | O | string(0,255) | 是 | |
urlVer | O | string | 是 | 支付结果回调版本。该参数可以不传,如果传值则必须传入固定值2,否则会导致支付不成功。 警告: 在生成签名字符串时该字段的名称必须修改为urlver, 字母v小写,否则会导致验签失败。 |
extReserved | O | string(0, 128) | 否 | 商户侧保留信息。如果该字段有值,在接口回调结果中原样返回。 |
sign | M | string | 否 |
- final interface ProductPayHandler {
- /**
- * 支付结果回调
- * @param retCode 返回码
- * @param payInfo 支付结果信息
- */
- void onResult(int retCode, ProductPayResultInfo payInfo);
- }
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
retCode | M | int | 回调结果中支付结果的返回码,应用可以根据返回码判断支付是否成功或失败后如何处理,具体返回码处理参见返回码。 |
payInfo | M | 支付结果的对象信息。 获取payInfo对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“payInfo.Time()”为本次支付完成的时间。 |
| 参数名称 | 必选(M)/可选(O) | 类型 | 是否参与验签 | 参数说明 |
returnCode | M | int | 是 | 支付结果的业务返回码,即与当前支付业务相关而非HMS SDK错误导致的返回码。 当有业务返回码时,HMS SDK会将此值赋值给retCode,具体请参见返回码中的业务错误码。 |
errMsg | O | string | 是 | 返回码描述信息。 |
merchantId | M | string | 是 | 商户ID,即华为开发者联盟为开发者分配的“支付ID”。 |
orderID | O | string | 是 | 华为支付平台生成的支付订单号。 当出现异常需要华为协助定位时,开发者可提供华为支付平台的订单号作为依据。 |
requestId | M | string | 是 | 商户侧的支付订单号,与请求参数中的requestId一致。 |
productNo | M | string | 是 | 所购买商品的商品ID。 |
microsAmount | M | long | 是 | 商品微单位价格。 值为商品实际价格乘以1,000,000。例如某个商品实际价格是1.99美元,则该商品对应的微单位价格为:1.99*1000000=1990000。 |
currency | M | string | 是 | 本次支付的币种。必须符合ISO 4217标准,例如USD、CNY、MYR。 |
country | M | string | 是 | 本次支付的国家码。必须符合ISO 3166标准,如US、CN、MY。 |
time | M | string | 是 | 本次支付完成的时间戳,即支付完成时间距离1970年的毫秒数。 |
sign | O | string | 否 | 响应消息中的签名字符串。 应用可以参考对响应消息验签的方法对签名字符串进行验签,确认响应消息是否被篡改。 |
| 类型 | 返回码常量 | 返回码值 | 返回码说明 | 处理建议 |
通用返回码 | 参见通用返回码。 | |||
业务返回码 | PayStatusCodes.PAY_STATE_SUCCESS | 0 | 支付成功。 | |
PayStatusCodes.PAY_STATE_FAILED | -1 | 通用支付失败错误码。 | 支付失败,支付流程结束,需重新调用支付接口。 | |
PayStatusCodes.PAY_STATE_CANCEL | 30000 | 用户取消支付。 | 记录订单号,待用户再次执行支付操作时再执行支付流程。 | |
PayStatusCodes.PAY_STATE_PARAM_ERROR | 30001 | 参数错误(包含无参)。 | 请检查请求参数是否遗漏,参数值格式是否正确。 | |
PayStatusCodes.PAY_STATE_TIME_OUT | 30002 | 执行支付后HMS SDK向支付服务器查询支付结果超时。 | 应用保存当前订单号,定时调用getOrderDetail接口查询订单支付状态,直到结果为支付成功或支付失败。 | |
PayStatusCodes.PAY_STATE_NET_ERROR | 30005 | 网络连接异常。 | 应用向用户给出提示请用户检查网络,并保存当前订单号,立即调用getOrderDetail接口查询订单支付状态。 | |
PayResult.PAY_RESULT_ACCOUNT_ERROR | 30008 | 用户使用第三方帐号(QQ、微信)登录,支付时HMS SDK引导用户关联华为帐号时,用户取消。 | 记录订单号,待用户再次执行支付操作时再执行支付流程。 | |
PayStatusCodes.PAY_STATE_ERROR | 30099 | 华为服务器返回给HMS SDK的数据格式错误,查询结果未知。 | 请联系华为技术支持定位。 | |
PayStatusCodes.HWPAY_COUNTRY_CODE_ERROR | 30011 | 支付服务不可用,请切换华为帐号服务地。 | 帐号服务地与商户传递的国家码不一致导致无法使用支付服务,需要切换帐号服务地。 | |
PayStatusCodes.ORDER_STATUS_HANDLING | 30012 | 执行支付后支付订单的状态为订单处理中。 | 应用保存当前订单号,定时调用getOrderDetail接口查询订单支付状态,直到结果为支付成功或支付失败。 | |
PayStatusCodes.ORDER_STATUS_UNTREATED | 30013 | 执行支付后支付订单的状态为订单还未处理。 | 应用保存当前订单号,定时调用getOrderDetail接口查询订单支付状态,直到结果为支付成功或支付失败。 | |
PayStatusCodes.PRODUCT_NOT_EXIST | 40001 | 商品ID在对应商户查询的应用中不存在。 | 请检查productNos中的商品ID对应的商品是否已创建。 | |
PayStatusCodes.PRODUCT_SERVER_INTERNAL_EXCEPTION | 40003 | 商品服务器内部异常。 | 执行支付操作时查询商品时商品服务器异常,请稍后重试,如仍未解决请联系华为技术支持定位。 | |
ReturnCodeStatus.HUAWEIPAY_ERROR_900042 | 900042 | ● 支付参数requestId重复。 ● 使用同一个华为帐号重复购买非消耗商品。 | ● requestId在一个开发者帐号下所有应用中必须保持唯一。 ● 请勿使用同一个华为帐号重复购买相同的的非消耗商品。 | |
PayStatusCodes.PAY_OTHER_ERROR | 30006 | 除以上错误以外的其他异常错误。 | 请联系华为技术支持定位。 | |
- private void pmsPay(String productNo) {
- showLog("PMS pay: begin");
- ProductPayRequest payReq = createProductPayReq(productNo);
- HMSAgent.Pay.productPay(payReq, new ProductPayHandler() {
- @Override
- public void onResult(int retCode, ProductPayResultInfo payInfo) {
- if (retCode == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS && payInfo != null) {
- boolean checkRst = PaySignUtil.checkSign(payInfo, pay_pub_key);
- showLog("PMS pay: onResult: pay success and checksign=" + checkRst + "\n");
- if (checkRst) {
- // TODO: 支付成功并且验签成功,发放商品
- } else {
- // TODO: 签名失败,需要查询订单状态:对于没有服务器的单机应用,调用查询订单接口查询;其他应用到开发者服务器查询订单状态。
- }
- } else if (retCode == HMSAgent.AgentResultCode.ON_ACTIVITY_RESULT_ERROR
- || retCode == PayStatusCodes.PAY_STATE_TIME_OUT
- || retCode == PayStatusCodes.PAY_STATE_NET_ERROR) {
- showLog("PMS pay: onResult: need wait for result, rstcode=" + retCode + "\n");
- // TODO: 需要查询订单状态:对于没有服务器的单机应用,调用查询订单接口查询;其他应用到开发者服务器查询订单状态。
- } else {
- showLog("PMS pay: onResult: pay fail=" + retCode + "\n");
- // 其他错误码意义参照支付api参考
- }
- }
- });
- //将requestid缓存,供查询订单
- addRequestIdToCache(payReq.getRequestId());
- }