此接口可用于查询指定订单当前的支付状态。
没有服务器的单机应用,只能调用getOrderDetail接口查询订单。有独立开发者服务器的应用,除了调用getOrderDetail接口,还可以直接向开发者服务器查询订单。
- HMSAgent.Pay.getOrderDetail(OrderRequest request, GetOrderHandler handler);
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
|---|---|---|---|
request | M | 查询订单信息的请求参数信息。 | |
handler | M | 接口调用后的回调结果,结果中包含的具体参数参见结果回调。 |
| 参数名称 | 必选(M)/可选(O | 类型 | 是否参与签名 | 参数说明 |
|---|---|---|---|---|
merchantId | M | string | 是 | 商户ID,即华为开发者联盟给开发者分配的“支付ID”。 支付ID的查询方法请参见查询支付服务信息。 |
requestId | M | string | 是 | 需要查询订单详情的支付订单号。支付订单号由开发者应用在支付时自行生成,用来唯一标识一次支付请求,订单号生成后开发者应用需自行维护订单号。 注意: 该字段中不能包含特殊字符,包括# " & / ? $ ^ *:) \ < > , | .并且不支持中文。 |
keyType | M | string | 是 | 秘钥类型。当前请填写固定值“1”,表示商户秘钥。 |
time | M | string | 是 | 当前时间的时间戳,即当前时间距离1970年的毫秒数。 |
sign | M | string | 否 | 用于验签的签名字符串。 为防止请求被篡改,应用需要根据支付签名的生成方法中的方法生成签名字符串,华为服务器在收到请求后会对签名字符串进行验签,验签成功后才会进行后续处理,否则将返回失败错误码。 |
- public interface GetOrderHandler {
- /**
- * 订单查询结果回调
- * @param retCode 返回码
- * @param checkPayResult 订单结果信息
- */
- void onResult(int retCode, OrderResult checkPayResult);
- }
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
|---|---|---|---|
retCode | M | int | 回调结果中订单查询结果的返回码,应用可以根据返回码判断查询是否成功或失败后如何处理,具体返回码参见返回码。 |
checkPayResult | M | 查询结果的对象信息。 获取checkPayResult对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“checkPayResult.getStatus()”为获取到的订单支付状态。 |
| 参数名称 | 必选(M)/可选(O) | 类型 | 是否参与验签 | 参数说明 |
|---|---|---|---|---|
returnCode | M | int | 是 | 查询结果的业务返回码,即与当前查询业务相关而非HMS SDK错误导致的错误码。 当有业务返回码时,HMS SDK会将此值赋值给retCode,具体请参见返回码中的业务错误码。 |
returnDesc | M | string | 是 | 返回码描述信息。 |
requestId | O | string | 是 | 应用侧生成的支付订单号,与请求参数中的requestId一致。 应用可以根据此订单号识别本次回调结果所属的订单。 此参数仅在returnCode等于0返回。 |
orderID | O | string | 是 | 华为支付平台订单号,在华为支付平台中唯一标识本次支付请求。 当支付出现异常需要华为协助定位时,开发者可提供华为支付平台的订单号作为依据。 此参数仅在查询成功时,即returnCode等于0返回。 |
orderTime | O | string | 是 | 下单时间,即用户点击购买后华为支付服务器收到应用订单请求的时间,格式为yyyy-MM-dd HH:mm:ss。 此参数仅在returnCode等于0返回。 |
tradeTime | O | string | 是 | 支付完成时间,即用户实际完成付款后华为支付服务器处理支付成功的时间,格式为yyyy-MM-dd HH:mm:ss。 此参数仅在returnCode等于0返回。 |
status | O | string | 是 | 订单的支付状态。 ●0:订单支付失败。 ●1:订单支付完成。 ●2:未处理,订单可能在等待支付或者等待支付应答,1天之内可以再次查询,1天后仍未处理则作为支付失败处理。 ●3:订单在处理中,1天之内可以再次查询,1天后仍在处理中则作为支付失败处理。 |
sign | O | string | 否 | 查询响应的签名字符串。 应用可以参考对响应消息验签的方法对签名字符串进行验签,确认响应消息是否被篡改。 此参数仅在returnCode等于0时返回。 |
| 类型 | 返回码常量 | 返回码值 | 返回码说明 | 处理建议 |
|---|---|---|---|---|
通用返回码 | 参见通用返回码。 | |||
业务返回码 | PayStatusCodes.PAY_STATE_SUCCESS | 0 | 查询成功。 | |
PayStatusCodes.PAY_STATE_FAILED | -1 | 通用失败错误码。 | 查询失败,查询流程结束,需重新调用接口。 | |
PayStatusCodes.PAY_STATE_PARAM_ERROR | 30001 | 参数错误(包含无参)。 | 请检查请求参数是否遗漏,参数值格式是否正确。 | |
PayStatusCodes.PAY_STATE_TIME_OUT | 30002 | 订单查询超时。 | 向用户给出提示,并定时调用getOrderDetail重新查询。 | |
PayStatusCodes.PAY_RESULT_INVALID_REQUEST | 30004 | 非法请求,例如:开发者服务器IP地址没有报备、请求中的签名字符串错误。 | 请检查请求中签名字符串是否按规定算法准确生成。 | |
PayStatusCodes.PAY_STATE_NET_ERROR | 30005 | 网络连接异常。 | 向用户给出提示,请用户检查网络后再重试。 | |
PayStatusCodes.ORDER_STATUS_HANDLING | 30012 | 订单正在处理中。 | 向用户给出提示,并定时调用getOrderDetail重新查询,1天后仍未处理则作为支付失败处理。 | |
PayStatusCodes.ORDER_STATUS_UNTREATED | 30013 | 订单还未处理,订单可能在等待支付或者等待支付应答。 | 向用户给出提示,并定时调用getOrderDetail重新查询,1天后仍在处理中则作为支付失败处理。 | |
PayStatusCodes.PAY_OTHER_ERROR | 30006 | 除以上错误以外的其他异常错误。 | 请联系华为技术支持定位。 | |
- HMSAgent.Pay.getOrderDetail(or, new GetOrderHandler() {
- @Override
- public void onResult(int retCode, OrderResult checkPayResult) {
- showLog("checkPay: requId="+reqId+" retCode=" + retCode);
- if (checkPayResult != null && checkPayResult.getReturnCode() == retCode) {
- // 处理返回码
- if (retCode == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS) {
- boolean checkRst = PaySignUtil.checkSign(checkPayResult, pay_pub_key);
- if (checkRst) {
- //TODO: 支付成功,发放对应商品
- showLog("checkPay: Pay successfully, distribution of goods");
- } else {
- //TODO: 验签失败,当支付失败处理
- showLog("checkPay: Failed to verify signature, pay failed");
- }
- // 不需要再查询
- removeCacheRequestId(checkPayResult.getRequestId());
- } else if (retCode == PayStatusCodes.ORDER_STATUS_HANDLING
- || retCode == PayStatusCodes.ORDER_STATUS_UNTREATED
- || retCode == PayStatusCodes.PAY_STATE_TIME_OUT) {
- //TODO: 未处理完,需要重新查询。如30分钟后再次查询。超过24小时当支付失败处理
- showLog("checkPay: Pay failed. errorCode="+retCode+" errMsg=" + checkPayResult.getReturnDesc());
- } else if (retCode == PayStatusCodes.PAY_STATE_NET_ERROR) {
- //TODO:网络失败,需要重新查询
- showLog("checkPay: A network problem caused the payment to fail. errorCode="+retCode+" errMsg=" + checkPayResult.getReturnDesc());
- } else {
- //TODO: 支付失败,不需要再查询
- showLog("checkPay: Pay failed. errorCode="+retCode+" errMsg=" + checkPayResult.getReturnDesc());
- removeCacheRequestId(reqId);
- }
- } else {
- //TODO: 没有结果回来,需要重新查询。如30分钟后再次查询。超过24小时当支付失败处理
- showLog("checkPay: Pay failed. errorCode="+retCode);
- }
- }
- });