应用调用此接口用于非托管商品的支付,即开发者在接口中自行设置商品价格,而不是从华为开发者平台获取价格。
此接口不提供商品信息自动全球化能力,需要开发者在接口中指定价格、币种和国家。
如果应用的虚拟商品信息由开发者自行维护,用户在应用中付款时应用需要调用此接口向HMS SDK发起支付请求。
pay接口当前只支持发布地区为中国大陆地区的应用使用,中国大陆以外的地区必须使用productPay接口。由于pay接口不支持商品信息自动全球化能力,国际汇率变动会导致应用内商品价格不一致,华为后续将主推使用productPay接口,请中国大陆地区的开发者尽快迁移到productPay接口。
HMSAgent.Pay.pay(PayReq request, PayHandler handler);
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
| request | M | 支付请求的参数信息。 | |
| handler | M | 接口调用后的回调结果,支付结束后,通过此回调实例回调给应用。回调结果中包含的具体参数参见结果回调。 |
| 参数名称 | 必选(M)/可选(O) | 类型 | 是否参与签名 | 参数说明 |
| productName | M | string(0,50) | 是 | 商户对商品的自定义名称。此名称将会在支付时显示给用户确认。 警告: 该字段中不能包含特殊字符,包括# " & / ? $ ^ *:) \ < > , | % + |
| productDesc | M | string(0,100) | 是 | 商户对商品的自定义描述。 警告: 该字段中不能包含特殊字符,包括# " & / ? $ ^ *:) \ < > , | % + |
| applicationID | M | string | 是 | 应用ID,在创建应用后由华为开发者联盟为应用分配的唯一标识。应用ID的查询方法请参见查询应用ID。 |
| requestId | M | string(2,32) | 是 | 商户侧的支付订单号,用于唯一标识一次支付请求。 支付订单号由开发者自行生成,需由字母和数字组成,不能包含特殊字符,包括# " & / ? $ ^ *:) \ < > , | .并且不支持中文。 支付订单号每次支付请求需唯一,即使订单被取消或支付失败订单号也不可重复。 华为支付服务器在接口回调结果中会原样返回requestId的值。 |
| amount | M | string | 是 | 商品金额,商品需要支付的金额。此金额将会在支付时显示给用户确认。 警告: 配置商品金额时: ● 请保留小数点后两位,如20.00。如果不按照此格式传入金额,会导致支付失败。 ● 部分币种只能设置为整数金额,例如只能是5.00,不能设置为5.02。涉及币种包括:BEF、XOF、XAF、XPF、KMF、GRD、GNF、HUF、IDR、JPY、LUF、MGA、MGF、PYG、PTE、RWF、KRW、ESP、TRL、VND。 |
| merchantId | M | string | 是 | 商户ID,即华为开发者联盟给开发者分配的“支付ID”。 支付ID的查询方法请参见查询支付服务信息。 |
| serviceCatalog | M | string | 否 | 商品类型。 ● X4:主题 ● X5:应用商店 ● X6:游戏 ● X7:天际通 ● X8:云空间 ● X9:电子书 ● X10:华为学习 ● X11:音乐 ● X12: 视频 ● V0:vmall实体商品 ● X31:话费充值 ● X32:机票/酒店 ● X33:电影票 ● X34:团购 ● X35:手机预购 ● X36:公共缴费 ● X37:基金理财 ● X38:彩票 ● X39:流量充值 游戏应用请设置为“X6”,普通应用请设置为“X5”。 如果传入类型错误,会影响风控,请开发者按照真实业务类型传入。 |
| merchantName | M | string(0,128) | 否 | 商户名称,配置为注册开发者时配置的公司名。 |
| sdkChannel | M | int | 是 | 渠道信息。 ● 0:自有应用,无渠道 ● 1:华为应用市场渠道 ● 2:预装渠道 ● 3:游戏中心 游戏设置为3,普通应用设置为1。 |
| url | O | string(0,255) | 是 | 支付结果回调地址,用于华为支付服务器在支付完成后调用支付成功回调接口将支付结果通知给开发者服务器。 如果开发者在申请支付服务时已配置“回调地址”,则华为支付服务器会优先使用申请支付服务时配置的回调地址。如果未配置,则使用此参数中的回调地址。 回调地址必须是合法的url,长度最大255,不能以‘/’结尾,不能包含get参数。 正确示例:http://domain.com/path 错误示例:http://domain.com/path?key=value 说明: 只有部署了自己开发者服务器的应用才需要配置本参数,单机应用无需配置。 |
| currency | Y | string | 是 | 用于支付该商品的币种,必须符合ISO 4217标准,例如USD、CNY、MYR。 中国大陆传值为CNY。 |
| country | Y | string | 是 | 国家码,用于区分国家信息,必须符合ISO 3166标准,如US、CN、MY。 中国大陆传值为CN。 |
| urlVer | O | string | 是 | 支付结果回调版本。 警告: 在生成签名字符串时该字段的名称必须修改为“urlver”, 字母v小写,否则会导致验签失败。 |
| extReserved | O | string(0, 128) | 否 | 商户侧保留信息。如果该字段有值,在接口回调结果中原样返回。 |
| sign | M | string | 否 |
public interface PayHandler {
/**
* 支付结果回调
* @param retCode 返回码
* @param payInfo 支付结果信息
*/
void onResult(int retCode, PayResultInfo 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 | 是 | 返回码描述信息。 |
| orderID | M | string | 是 | 华为支付平台生成的支付订单号。 当出现异常需要华为协助定位时,开发者可提供华为支付平台的订单号作为依据。 |
| amount | M | string | 是 | 本次支付的实际金额。 |
| currency | O | string | 否 | 本次支付的币种。必须符合ISO 4217标准,例如USD、CNY、MYR。 |
| country | O | string | 否 | 本次支付的国家码。必须符合ISO 3166标准,如US、CN、MY。 |
| time | M | string | 是 | 本次支付完成的时间戳,即支付完成时间距离1970年的毫秒数。 |
| requestId | M | string | 是 | 商户侧的支付订单号,与请求参数中的requestId一致。 |
| userName | M | string | 是 | 商户名称,对应请求参数中的merchantName参数。 |
| 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.PAY_OTHER_ERROR | 30006 | 除以上错误以外的其他异常错误。 | 请联系华为技术支持定位。 | |
PayReq payReq = createPayReq(amount);
HMSAgent.Pay.pay(payReq, new PayHandler() {
@Override
public void onResult(int retCode, PayResultInfo payInfo) {
if (retCode == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS && payInfo != null) {
// 校验签名
boolean checkRst = PaySignUtil.checkSign(payInfo, pay_pub_key);
showLog("pay: onResult: pay success and checksign=" + checkRst);
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) {
// TODO: 需要查询订单状态。
} else {
showLog("pay: onResult: pay fail=" + retCode);
// 其他错误码意义参照支付api参考
}
}
});
//将requestid缓存,供查询订单
addRequestIdToCache(payReq.getRequestId());
}