取消授权

在授权完成后,买家可在商户侧或支付方式侧取消授权。取消授权后令牌失效,之后将无法用于授权支付。

  • 商户侧取消授权:在商户侧提供授权协议取消功能可以保障买家授权协议的自主管理权,允许买家根据个人账户安全策略或服务使用需求,随时终止已建立的授权关系。

注意:由于部分支付方式限制,同一电子钱包在单个商户仅允许维持一个或者少量有效授权凭证。

  • 支付方式侧取消授权:买家在支付方式侧取消授权,在取消授权成功后您将收到授权取消通知(notifyAuthorization

注意:目前 Alipay、TrueMoney、Boost、Touch'n Go eWallet 均支持在支付方式侧取消授权,但系统仅会在 Alipay、Boost、Touch'n Go eWallet 的授权解除成功时发送通知。未来渠道能力可能存在升级,建议首次接入的时接入授权取消通知。

在商户侧取消授权

当买家在应用内取消授权时,您调用 revoke 接口并传入对应 accessToken 以使支付令牌失效,该令牌从您首次签约时接受的 notifyAuthorization 获取。接口调用成功后,该支付令牌将立即失效。

以下代码展示了如何调用 revoke 接口:

copy
public static void Cancel() {
    AlipayAuthRevokeTokenRequest alipayAuthRevokeTokenRequest = new AlipayAuthRevokeTokenRequest();

    // 替换为您的 accessToken
    alipayAuthRevokeTokenRequest.setAccessToken("281010033AB2F588D14B43238637264FCA5Axxxx");

    AlipayAuthRevokeTokenResponse alipayAuthRevokeTokenResponse = null;
    try {
        alipayAuthRevokeTokenResponse = CLIENT.execute(alipayAuthRevokeTokenRequest);
    } catch (AlipayApiException e) {
        String errorMsg = e.getMessage();
        // 处理错误情况
    }
}

以下是请求报文的示例:

copy
{
  "accessToken": "281010033AB2F588D14B43238637264FCA5Axxxx"
}

以下是响应报文的示例:

copy
{
  "result": {
    "resultCode": "SUCCESS",
    "resultStatus": "S",
    "resultMessage": "Success"
  }
}

下表展示了取消授权的响应中 resultStatus 字段可能返回的值,请您根据指引进行处理:

resultStatus

说明

处理建议

S

取消授权成功。

无需进一步操作。

F

取消授权失败。

检查并验证当前接口所需的请求字段(包括请求头和请求体)是否正确传递并有效。

U

取消授权状态未知。

保持 accessToken 不变重新调用接口以解决问题。如果问题未解决,请联系 Antom 技术支持。

注意:如果您未收到响应报文,可能是网络超时所致。保持 accessToken 不变重新调用接口以解决问题。如果问题未解决,请联系 Antom 技术支持。

在支付方式侧取消授权

当买家在支付方式侧取消授权时,系统将向您发送授权取消异步通知。为确保接收此类通知,您需预先配置授权取消通知的接收地址。该通知将包含被取消代扣服务对应的支付令牌(accessToken)。

  1. 设置接收通知的 Webhook URL:

登陆 Antom Dashboard > 开发者 > 通知地址,为 alipay.ams.authorizations.notify 接口增加通知地址。具体操作请参阅通知地址

以下是取消授权结果异步通知请求的代码示例:

copy
{
  "authorizationNotifyType": "TOKEN_CANCELED",
  "accessToken": "28100103_20215703001538122119",
  "result": {
    "resultCode": "SUCCESS",
    "resultMessage": "success",
    "resultStatus": "S"
  }
}

您可能会收到请求报文中 result.resultStatus 字段的不同值,请您根据下表指引进行处理:

result.resultStatus

信息

操作建议

S (仅支持返回 S

取消授权成功。

按照以下返回的字段进行处理:

  • accessToken :表示由 Antom 生成的代扣 ID,用于后续支付
  • authorizationNotifyType :本场景返回 TOKEN_CANCELED表示取消授权。当您收到该通知后,您需要解除您系统里用户的签约关系。
  1. Antom 发送的通知结果由 Antom 加签,故建议您验证签名以确认通知由 Antom 发送。参考以下代码示例对取消授权通知进行验签:
copy
@PostMapping("/receiveAuthNotify")
@ResponseBody
public Result receiveAuthNotify(HttpServletRequest request, @RequestBody String notifyBody) {
    // 从 HTTP 请求中获取必要参数
    String requestUri = request.getRequestURI();
    String requestMethod = request.getMethod();

    // 从请求头中获取必要参数
    String requestTime = request.getHeader("request-time");
    String clientId = request.getHeader("client-id");
    String signature = request.getHeader("signature");

    try {
        // 验证通知签名
        boolean verifyResult = WebhookTool.checkSignature(requestUri, requestMethod, clientId,
                requestTime, signature, notifyBody, ANTOM_PUBLIC_KEY);
        if (!verifyResult) {
            throw new RuntimeException("Invalid notify signature");
        }

        // 反序列化通知体
        AlipayAuthNotify authNotify = JSON.parseObject(notifyBody,AlipayAuthNotify.class);

        if (authNotify != null && "SUCCESS".equals(authNotify.getResult().getResultCode())
                 && "TOKEN_CANCELED".equals(authNotify.getAuthorizationNotifyType())) {
            // save user's PaymentMethodType corresponding to accessToken
            PaymentVO payment = authStatePayment.get(authNotify.getAuthState());
            User user = users.get(payment.getUserId());
            user.getPaymentMethodTypeAccessToken().put(payment.getPaymentMethodType(), authNotify.getAccessToken());
            return Result.builder().resultCode("SUCCESS").resultMessage("success.").resultStatus(ResultStatusType.S).build();
        }
        // 其他类型的通知

    } catch (Exception e) {
        return Result.builder().resultCode("FAIL").resultMessage("fail.").resultStatus(ResultStatusType.F).build();
    }

    return Result.builder().resultCode("SYSTEM_ERROR").resultMessage("system error.").resultStatus(ResultStatusType.F).build();
}
  1. 收到通知后,您无需对通知结果响应做加签处理,但是对于每个通知请求均需按以下固定格式响应,与取消授权成功与否无关。
copy
{
  "result": {
    "resultCode": "SUCCESS",
    "resultStatus": "S",
    "resultMessage": "success"
  }
}

常见问题

问:是否所有支付方式都支持从支付方式侧取消授权?

答:目前 Alipay、TrueMoney、Boost、Touch'n Go eWallet 均支持在支付方式侧取消授权。

问:商户侧是否一定要展示取消入口?

答:为了更好的用户体验,需要商家露透出取消入口。