Antom, leading provider of tailored payment solutions

集成 Google Pay 订阅支付

订阅支付是一种周期性自动扣款解决方案,可以帮助您完成周期性自动收款。仅需一次授权即可绑定支付账户享受持续的订阅服务,且支持动态调整订阅配置(如修改周期/金额、取消续订或终止服务等)。整个流程既便捷高效,又安全可靠。
本文主要针对 Google Pay 支付方式进行集成说明。通过 Google Pay 服务,买家可以使用存储在其 Google Pay 账户中的信用卡或借记卡进行支付。采用 Native API 方式时,商户前端需直接集成 Google Pay SDK,获取卡资产信息后调用 Antom 的 pay(单笔支付)接口发起支付。有关 Google Pay SDK 的集成说明,请参见 Google Pay for Payments (Web) 或 Google Pay for Payments (Android)。​

用户体验

以下图片展示了集成 Google Pay 进行支付的用户体验:
Web 端
Mobile 端

支付流程

您可以选择以下两种解密方式对获取的 paymentToken 进行解密,对应的支付流程也不同:
  • 托管解密:由 Antom 负责证书管理和解密操作,您无需具备 PCI 资质。
  • 商户解密:您自行管理证书并执行解密操作,您需具备相应的 PCI 资质。
注意:有关 PCI DSS 合规要求的更多信息,请参阅 PCI DSS 标准。
以下图片展示了集成 Google Pay 订阅支付的流程:
托管解密
首次订阅
以下为 Antom 托管解密 paymentToken 的首次订阅支付流程示意图:
后续扣款
以下为 Antom 托管解密 paymentToken 的后续扣款的支付流程示意图:

集成准备

在您开始集成前,请阅读集成指南及接口概述文档,了解服务端接口的集成步骤及调用接口的注意事项,并确保已完成以下预配置:
  • 已获得 client ID。
  • 已完成密钥配置。
  • 已完成异步通知接收地址的配置。
  • 集成服务端 SDK 资源包,并完成接口库安装及请求示例初始化。具体操作请参阅服务端 SDK。

集成步骤

请按照以下步骤开始集成:
  1. 获取 paymentToken
  2. 创建订阅支付请求
  3. (可选)跳转至 3D 验证页面
  4. 授权结果通知
  5. 请款并获取请款结果
  6. 获取订阅通知

步骤 1:获取 paymentToken

在您获取到 paymentToken 以后,您可以选择 Antom 托管解密,从而调用 pay(单笔支付)接口来发起授权支付请求。

步骤 2:创建订阅支付请求
服务端

在您集成 Google Pay SDK 后,请使用 Antom 在 Google Pay 的配置进行交互。Antom 在 Google Pay 的收单机构信息如下:
参数
描述
gateway
值为 alipayintl。
gatewayMerchantId
商户在 Antom 入驻的 merchantId。
以下是进行交互的示例代码:
const tokenizationSpecification = {
  type: "PAYMENT_GATEWAY",
  parameters: {
    gateway: "alipayintl",
    gatewayMerchantId: "2188XXXXXXXX", //商户在 Antom 入驻相应环境(PROD/SANBOX)的 merchant id
  },
};
private static JSONObject getGatewayTokenizationSpecification() throws JSONException {
  return new JSONObject() {
    {
      put("type", "PAYMENT_GATEWAY");
      put(
        "parameters",
        new JSONObject() {
          {
            put("gateway", "alipayintl");
            put("gatewayMerchantId", "2188XXXXXXXX"); //商户在 Antom 入驻相应环境(PROD/SANBOX)的 merchant id
          }
        }
      );
    }
  };
}
您获取到 paymentToken 并托管 Antom 解密后,请使用 Antom 卡的授权支付能力发起支付。您可以通过 pay(单笔支付)的 paymentMethod.paymentMethodMetaData.googlePayConfiguration 参数传入解密的 paymentToken。
按照步骤 2:创建订阅支付请求的操作调用 pay(单笔支付)接口提交授权支付请求,并在请求中传入基础参数、订单参数和设备参数,同时,您无需传入卡支付相关参数,但需要传入以下参数:
参数名称
是否必需
描述
paymentMethod.paymentMethodType
是
支付方式枚举值。Google Pay 支付场景下,Antom 托管解密 paymentToken 时,请指定此字段的值为 GOOGLEPAY。
paymentMethod.paymentMethodMetaData.googlePayConfiguration.googleToken
是
请传入您获取的 paymentToken。
paymentMethod.paymentMethodMetaData.is3DSAuthentication
是
Google Pay 支付场景下,Antom 托管解密 paymentToken 时,请指定此字段的值为 true 用于发起 3DS 交易以完成买家身份验证。
注意:如果 Antom 解密 paymentToken 后的信息为 DPAN,则会自动进入授权过程,不会让买家二次验证身份。
有关发起授权订阅支付请求参数的更多信息,请参阅步骤 2:创建订阅支付请求。
以下示例代码展示了如何调用 pay(单笔支付)接口:
public static void payByGooglePayServer2Server() {
  AlipayPayRequest alipayPayRequest = new AlipayPayRequest();
  alipayPayRequest.setProductCode(ProductCodeType.CASHIER_PAYMENT);

  // 替换为您的 paymentRequestId
  String paymentRequestId = UUID.randomUUID().toString();
  alipayPayRequest.setPaymentRequestId(paymentRequestId);

  // 设置订阅信息
  SubscriptionInfo subscriptionInfo = new SubscriptionInfo();
  subscriptionInfo.setSubscriptionDescription("Subscription test");
  LocalDateTime localNow = LocalDateTime.now();
  OffsetDateTime offsetDateTime = localNow.atOffset(ZoneOffset.of("+08:00"));
  String startTime = offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
  subscriptionInfo.setSubscriptionStartTime(startTime);

  subscriptionInfo.setSubscriptionNotifyUrl("https://www.yourDomain.com/subscription/notify");
  PeriodRule periodRule = new PeriodRule();
  periodRule.setPeriodType("MONTH");
  periodRule.setPeriodCount(1);
  subscriptionInfo.setPeriodRule(periodRule);
  alipayPayRequest.setSubscriptionInfo(subscriptionInfo);

  // 设置金额
  Amount amount = Amount.builder().currency("SGD").value("4200").build();
  alipayPayRequest.setPaymentAmount(amount);

  // settlementStrategy
  SettlementStrategy settlementStrategy = SettlementStrategy.builder()
    .settlementCurrency("SGD")
    .build();
  alipayPayRequest.setSettlementStrategy(settlementStrategy);

  // 设置支付方式
  PaymentMethod paymentMethod = PaymentMethod.builder().paymentMethodType("GOOGLEPAY").build();
  alipayPayRequest.setPaymentMethod(paymentMethod);

  // 设置 Google Pay 的相关参数 --托管解密
  Map<String, String> googlePayToken = new HashMap<>();
  googlePayToken.put("googlePayToken", "googlePay token");
  Map<String, Object> paymentMethodMetaData = new HashMap<>();
  paymentMethodMetaData.put("googlePayConfiguration", googlePayToken);
  paymentMethodMetaData.put("is3DSAuthentication", false);
  paymentMethod.setPaymentMethodMetaData(paymentMethodMetaData);

  // 替换为您的 orderId
  String orderId = UUID.randomUUID().toString();

  // 设置买家信息
  Buyer buyer = Buyer.builder().referenceBuyerId("yourBuyerId").build();

  // 设置订单信息
  Order order = Order.builder()
    .referenceOrderId(orderId)
    .orderDescription("antom testing order")
    .orderAmount(amount)
    .buyer(buyer)
    .build();
  alipayPayRequest.setOrder(order);

  // 设置设备环境信息
  Env env = Env.builder().terminalType(TerminalType.WEB).clientIp("1.2.3.4").build();
  alipayPayRequest.setEnv(env);

  // 设置授权请款模式
  PaymentFactor paymentFactor = PaymentFactor.builder().isAuthorization(true).build();
  alipayPayRequest.setPaymentFactor(paymentFactor);

  // 替换为您的通知地址
  alipayPayRequest.setPaymentNotifyUrl("https://www.yourNotifyUrl.com");

  // 替换为您的跳转地址
  alipayPayRequest.setPaymentRedirectUrl("https://www.yourMerchantWeb.com");
  // 支付
  AlipayPayResponse alipayPayResponse = null;
  try {
    alipayPayResponse = CLIENT.execute(alipayPayRequest);
  } catch (AlipayApiException e) {
    String errorMsg = e.getMessage();
    // 处理错误情况
  }
}
以下代码显示了请求报文的示例:
{
    "env": {
        "clientIp": "1.2.3.4",
        "terminalType": "WEB"
    },
    "order": {
        "buyer": {
            "referenceBuyerId": "yourBuyerId"
        },
        "orderAmount": {
            "currency": "SGD",
            "value": "4200"
        },
        "orderDescription": "antom testing order",
        "referenceOrderId": "2a7772b2-4eae-43cf-8f1a-07c8dec3****"
    },
    "paymentAmount": {
        "currency": "SGD",
        "value": "4200"
    },
    "paymentFactor": {
        "isAuthorization": true
    },
    "paymentMethod": {
        "paymentMethodMetaData": {
            "is3DSAuthentication": true,
            "googlePayConfiguration": {
                "googlePayToken": "{\"signature\":"MEQCIB1/pqJy8Z7565NKYN8Mx+Rl57M0xVPOKAnuLdSpm/RaAiAH8t+q+aJA9KAOXXnyFVU13qJ2J4Uuhu2iggNd6hgJnw\u003d\u003d","intermediateSigningKey":{"signedKey":"{\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKWkTmXgqxeLpsCa4POKjunH+b4aIdKOr37TJAn1a0x8gduKJy8UJSCoDU****ASHYmQoWA8TDr+Gq0Ie8pA9LoA\\u003d\\u003d\",\"keyExpiration\":\"1774047508238\"}","signatures":["MEUCIQDa+BMhD7nmJq2xaf6uJnV+2fx8B4s1XGaJXF/zG4w9pQIgIdDlhrBarzgbuWSmYpiemS92jy9zxK3UJguJsfaPWrQ\u003d"]},"protocolVersion":"ECv2","signedMessage":"{\"encryptedMessage\":\"DMJ8HqrPreS67BYJseOLUlox42ZFpgmbv/wU5a1JMS0KdawwC7JmDrvm57Ysot3VxmG0jZwVd54Ru78Z22j5lGd8W145sgI30gIWgRHT1ru9yt/lTdLuJExNeNUGGjrSUPBHinGy4sOILFWGRilNtuQaftt0NHnuPEEUUb1GdN/8+J5RNxNLXFI7AFlaC5tCrDshLsh3K1pzLSVK024B5Q+LbZxaWeiOygZ7OJqWzpFuUg6i2GOdXEOW8hrNv2dUHa7Jn07+G2xVa++5YT8dMpbOQ+bUn6MiH95+k3Ppl8ipFx2e2KKhMH8VoF5vRQIppCrCrJm6f/IRoZwh7x4785d73oLtoFMk6MPSFnw46s8PJ+jBDOQhhvFzzXwr+0tZbrqNtXui3PHSVt86ED+axRpuUog5ePzaSJQ+AVdSxQwCxT19avooAZPHjw9jT4U9Eo18BFIAQSaxtgNhaAJltaZdOKxZ+EYiWOnEZDs3BZCrWtgfiRKA5PD0gJAFl+fEet1JwH/HSmHFOSvBt4csIe1s8KpUeubnoZMrBSPAZDfjNvhrSzHaKHpFi3WLi6DSP4pyHiHNg/LZRI4L5CpWQnEk/Dxu19A\\u003d\",\"ephemeralPublicKey\":\"BJbQqCHVXHkg/3vioDJAQNoNQMClUmmsjTJ9loy5+IacdR7Qb28Z2t8L6IlO3jgZvx6RFvD9ikR2zQWAa4RzYYQ\\u003d\",\"tag\":\"gAbroVixfH3Ayet2BVsuJ608Sw45u1HigVMiIRlif9k\\u003d\"}"}"
            }
        },
        "paymentMethodType": "GOOGLEPAY"
    },
    "paymentNotifyUrl": "https://www.yourNotifyUrl.com",
    "paymentRedirectUrl": "https://www.yourMerchantWeb.com",
    "paymentRequestId": "713c6f16-fca5-4507-8291-beea32dc****",
    "productCode": "CASHIER_PAYMENT",
    "settlementStrategy": {
        "settlementCurrency": "SGD"
    },
    "subscriptionInfo": {
        "periodRule": {
            "periodCount": 1,
            "periodType": "MONTH"
        },
        "subscriptionDescription": "Subscription test",
        "subscriptionNotifyUrl": "https://www.yourDomain.com/subscription/notify",
        "subscriptionStartTime": "2026-03-13T14:42:55.062+08:00"
    }
}
以下代码显示了一个响应示例:
{
  "normalUrl": "https://iexpfront-sea.alipay.com/authorise3d?merchantId=1887SjzZ56b1lvObJWQTaqG4PhACjUGncnl0Sihzg8en5I%3D&ddcId=m47qH0MLK7A7yJNVdjLYJMrfAGZ7ZPgbv5TmV3FoZ4U%3D&pass=lt%5E1&needDDC=Y&from=iexpcore",
  "paymentActionForm": {
    "method": "POST",
    "parameters": {
      "Bin": "4***11",
      "JWT": "eyJraWQiOiJDQVJESU5BTF9KV1RfYWxpcGF5IiwiY3R5IjoiQ****QUxfSldUX2FsaXBheSIsImFsZyI6IkhTMjU2In0.eyJPcmdVbml0SWQiOiI1ZDVmMTA2MjRiNzkyYTFhZTBkN2Y3MTEiLCJSZWZlcmVuY2VJZCI6Ijk2OTQ2ZWQ0LTRiZDEtNDBkOS05Y2I2LTQ4NjExMjlhZDVkYyIsIlJldHVyblVybCI6Imh0dHBzOi8vb3Blbi1uYS5hbGlwYXkuY29tL2FwaS9vcGVuL3VybF9jYWxsYmFja19nZXQvY2FyZGluYWwvY2FyZGluYWwwMDcuaHRtP3NpZ25EYXRhPWpKa1IlMkZQdnYweldCeEZvJTJCOUtXM1B5TFZDM2h4WHpkUEVVQWpHRmszQjR0anJ4eW5LTHRKJTJGR3pMekZFR1RYSEVhcWlJd05Jb2xqTW0xUEw2MlllYVFFZUU4S2pYeVNCUUt0M01iMVBNbEo0dXolMkY2WHllSW5UJTJCZW92QWJXSDclMkJDc0V1RmtqckdwOHpQYmJkMDA1M0IlMkYlMkZhcXc3VEN5RklXQXdWOGkxcyUyQjE5R1pzTXJKZGpoRkk4NVc5RjVvWTBJclZrQTlsRSUyRk5VZ1p6c3N0VGtSVFFVYjl0azJTbmM5WGJBZ096JTJCek5MNkc3UlhTeURNanNtZ0pqR0pWdjVDWUpFR3htaSUyRjVWMk5MRlBRZ3Nrd1RPSEdCVlVMY1VGM1RUaXhHM0JnbjlsdXlDU0hvbnN1RHY5M0Q3bnhXZ3gzS2JsSloxY1hVbGxaU2Q4V2Q2bVU5VGZiZyUzRCUzRCZpblNlcmlhbE5vPTIwMjYwMzEzODkwMzEzNDEwMDAxSjM3NDMyNTc3MjQmb3V0T3JkZXJObz0yMDI2MDMxMzg5MDMxMzQxMDAwMUozNzQzMjU3NzI0IiwiZXhwIjoxNzczMzg1MDc4LCJpYXQiOjE3NzMzODQxNzgsImlzcyI6IjVkNWZkZGU4Y2NlZjc2MWFkOGI4MmI2OCIsImp0aSI6IjIwMjYwMzEzODkwMzEzNDEwMDAxSjM3NDMyNTc3MjQifQ.hBMn31v0ntxmMhDjqnYByylVufj7EjUyZj55WPivQu4",
      "DDCFlag": "Y"
    },
    "paymentActionFormType": "RedirectActionForm",
    "redirectUrl": "https://iexpfront-sea.alipay.com/authorise3d?merchantId=1887SjzZ56b1lvObJWQTaqG4PhACjUGncnl0Sihzg8en5I%3D&ddcId=m47qH0MLK7A7yJNVdjLYJMrfAGZ7ZPgbv5TmV3FoZ4U%3D&pass=lt%5E1&needDDC=Y&from=iexpcore"
  },
  "paymentAmount": {
    "currency": "SGD",
    "value": "4200"
  },
  "paymentCreateTime": "2026-03-12T23:42:56-07:00",
  "paymentId": "2026031319401****1001881J0284139383",
  "paymentRequestId": "713c6f16-fca5-4507-8291-beea32dc****",
  "paymentResultInfo": {
    "cardBrand": "VISA",
    "cardNo": "************1111",
    "credentialTypeUsed": "PAN",
    "threeDSResult": {}
  },
  "redirectActionForm": {
    "method": "POST",
    "parameters": {
      "Bin": "411111",
      "JWT": "eyJraWQiOiJDQVJESU5BTF9KV1RfYWxpcGF5IiwiY3R5I*****SRElOQUxfSldUX2FsaXBheSIsImFsZyI6IkhTMjU2In0.eyJPcmdVbml0SWQiOiI1ZDVmMTA2MjRiNzkyYTFhZTBkN2Y3MTEiLCJSZWZlcmVuY2VJZCI6Ijk2OTQ2ZWQ0LTRiZDEtNDBkOS05Y2I2LTQ4NjExMjlhZDVkYyIsIlJldHVyblVybCI6Imh0dHBzOi8vb3Blbi1uYS5hbGlwYXkuY29tL2FwaS9vcGVuL3VybF9jYWxsYmFja19nZXQvY2FyZGluYWwvY2FyZGluYWwwMDcuaHRtP3NpZ25EYXRhPWpKa1IlMkZQdnYweldCeEZvJTJCOUtXM1B5TFZDM2h4WHpkUEVVQWpHRmszQjR0anJ4eW5LTHRKJTJGR3pMekZFR1RYSEVhcWlJd05Jb2xqTW0xUEw2MlllYVFFZUU4S2pYeVNCUUt0M01iMVBNbEo0dXolMkY2WHllSW5UJTJCZW92QWJXSDclMkJDc0V1RmtqckdwOHpQYmJkMDA1M0IlMkYlMkZhcXc3VEN5RklXQXdWOGkxcyUyQjE5R1pzTXJKZGpoRkk4NVc5RjVvWTBJclZrQTlsRSUyRk5VZ1p6c3N0VGtSVFFVYjl0azJTbmM5WGJBZ096JTJCek5MNkc3UlhTeURNanNtZ0pqR0pWdjVDWUpFR3htaSUyRjVWMk5MRlBRZ3Nrd1RPSEdCVlVMY1VGM1RUaXhHM0JnbjlsdXlDU0hvbnN1RHY5M0Q3bnhXZ3gzS2JsSloxY1hVbGxaU2Q4V2Q2bVU5VGZiZyUzRCUzRCZpblNlcmlhbE5vPTIwMjYwMzEzODkwMzEzNDEwMDAxSjM3NDMyNTc3MjQmb3V0T3JkZXJObz0yMDI2MDMxMzg5MDMxMzQxMDAwMUozNzQzMjU3NzI0IiwiZXhwIjoxNzczMzg1MDc4LCJpYXQiOjE3NzMzODQxNzgsImlzcyI6IjVkNWZkZGU4Y2NlZjc2MWFkOGI4MmI2OCIsImp0aSI6IjIwMjYwMzEzODkwMzEzNDEwMDAxSjM3NDMyNTc3MjQifQ.hBMn31v0ntxmMhDjqnYByylVufj7EjUyZj55WPivQu4",
      "DDCFlag": "Y"
    },
    "redirectUrl": "https://iexpfront-sea.alipay.com/authorise3d?merchantId=1887SjzZ56b1lvObJWQTaqG4PhACjUGncnl0Sihzg8en5I%3D&ddcId=m47qH0MLK7A7yJNVdjLYJMrfAGZ7ZPgb****V3FoZ4U%3D&pass=lt%5E1&needDDC=Y&from=iexpcore"
  },
  "result": {
    "resultCode": "PAYMENT_IN_PROCESS",
    "resultMessage": "payment in process",
    "resultStatus": "U"
  }
}
商户解密
首次订阅
以下为商户解密 paymentToken 的首次订阅支付流程示意图:
后续扣款
以下为商户解密 paymentToken 的后续扣款的支付流程示意图:

集成准备

在您开始集成前,请阅读集成指南及接口概述文档,了解服务端接口的集成步骤及调用接口的注意事项,并确保已完成以下预配置:
  • 已获得 client ID。
  • 已完成密钥配置。
  • 已完成异步通知接收地址的配置。
  • 集成服务端 SDK 资源包,并完成接口库安装及请求示例初始化。具体操作请参阅服务端 SDK。

集成步骤

请按照以下步骤开始集成:
  1. 获取 paymentToken
  2. 创建订阅支付请求
  3. (可选)跳转至 3D 验证页面
  4. 授权结果通知
  5. 请款并获取请款结果
  6. 获取订阅通知

步骤 1:获取 paymentToken

在您获取到 paymentToken 以后,您可以选择商户自行解密,从而调用 pay(单笔支付)接口来发起授权支付请求。

步骤 2:创建订阅支付请求
服务端

在您集成 Google Pay SDK 后,您可通过直接令牌化方式拿到 paymentToken,详情请参见针对商家的付款数据加密。在拿到 paymentToken 并完成自解密后,请根据解密结果中的卡交易身份认证场景(PAN_ONLY 或CRYPTOGRAM_3DS)传入相应的参数,调用 pay(单笔支付)接口发起授权支付请求。
注意:商户解密需要您具备 PCI 资质,并在 Google Pay 后台上传 PCI 证明。
以下代码显示了获取到的 Google Pay 报文,分为PAN_ONLY 和 CRYPTOGRAM_3DS 两种卡交易身份认证场景:
  • PAN_ONLY:该认证方法与存储在用户 Google 账户中的支付卡相关。此场景下拿到的解密卡信息为 FPAN。
  • CRYPTOGRAM_3DS:该认证方法与作为 Android 设备令牌存储的卡相关。此场景下拿到的解密卡信息为 DPAN。
PAN_ONLY
获取到的 Google Pay 报文:
"paymentMethod": "CARD",
"paymentMethodDetails": {
  "authMethod": "PAN_ONLY",
  "pan": "1111222233334444",
  "expirationMonth": 10,
  "expirationYear": 2020
},  "gatewayMerchantId": "some-merchant-id",  "messageId": "some-message-id",
"messageExpiration": "1577862000000"
}
当解密结果中的卡交易身份认证场景为PAN_ONLY 时(即解密后拿到的卡信息类型为 FPAN),以下是支付请求中与 Google Pay 相关的关键参数说明:
参数名称
是否必需
描述
paymentMethod.paymentMethodType
是
支付方式枚举值。Google Pay 支付场景下,您自行解密 paymentToken 且拿到的信息为 FPAN 时,请指定此字段的值为 CARD。
paymentMethod.paymentMethodMetaData.is3DSAuthentication
是
Google Pay 支付场景下,您自行解密 paymentToken 且拿到的信息为 FPAN 时,请指定此字段的值为 true 用于发起 3DS 交易,以完成买家身份验证。
paymentMethod.paymentMethodMetaData.cardNo
是
请传入您获取的 paymentMethodDetails.pan 字段的值。
paymentMethod.paymentMethodMetaData.expiryMonth
是
请传入您获取的 paymentMethodDetails.expirationMonth 字段的值。
paymentMethod.paymentMethodMetaData.expiryYear
是
请传入您获取的 paymentMethodDetails.expirationYear 字段的值。
有关发起授权订阅支付请求参数的更多信息,请参阅步骤 2:创建订阅支付请求。
以下示例代码展示了如何调用 pay(单笔支付)接口:
public static void payByGooglePayServer2Server() {
  AlipayPayRequest alipayPayRequest = new AlipayPayRequest();
  alipayPayRequest.setProductCode(ProductCodeType.CASHIER_PAYMENT);

  // 替换为您的 paymentRequestId
  String paymentRequestId = UUID.randomUUID().toString();
  alipayPayRequest.setPaymentRequestId(paymentRequestId);

  // 设置订阅信息
  SubscriptionInfo subscriptionInfo = new SubscriptionInfo();
  subscriptionInfo.setSubscriptionDescription("Subscription test");
  LocalDateTime localNow = LocalDateTime.now();
  OffsetDateTime offsetDateTime = localNow.atOffset(ZoneOffset.of("+08:00"));
  String startTime = offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
  subscriptionInfo.setSubscriptionStartTime(startTime);
  subscriptionInfo.setSubscriptionNotifyUrl("https://www.yourDomain.com/subscription/notify");
  PeriodRule periodRule = new PeriodRule();
  periodRule.setPeriodType("MONTH");
  periodRule.setPeriodCount(1);
  subscriptionInfo.setPeriodRule(periodRule);
  alipayPayRequest.setSubscriptionInfo(subscriptionInfo);

  // 设置支付金额
  Amount amount = Amount.builder().currency("SGD").value("4200").build();
  alipayPayRequest.setPaymentAmount(amount);

  // settlementStrategy
  SettlementStrategy settlementStrategy = SettlementStrategy.builder()
    .settlementCurrency("SGD")
    .build();
  alipayPayRequest.setSettlementStrategy(settlementStrategy);

  // 设置支付方式- PAN_ONLY场景
  PaymentMethod paymentMethod = PaymentMethod.builder().paymentMethodType("GOOGLEPAY").build();
  alipayPayRequest.setPaymentMethod(paymentMethod);

  // 设置GooglePay相关参数 -- 商户解密
  Map<String, Object> paymentMethodMetaData = new HashMap<>();
  paymentMethodMetaData.put("cardNo", "4054695723100768");
  paymentMethodMetaData.put("cvv", "123");
  paymentMethodMetaData.put("expiryMonth", "12");
  paymentMethodMetaData.put("expiryYear", "99");
  paymentMethodMetaData.put("tokenizeMode", false);
  paymentMethodMetaData.put("is3DSAuthentication", true);
  paymentMethod.setPaymentMethodMetaData(paymentMethodMetaData);

  // 替换为您的 orderId
  String orderId = UUID.randomUUID().toString();

  // 设置买家信息
  Buyer buyer = Buyer.builder().referenceBuyerId("yourBuyerId").build();

  // 设置订单信息
  Order order = Order.builder()
    .referenceOrderId(orderId)
    .orderDescription("antom testing order")
    .orderAmount(amount)
    .buyer(buyer)
    .build();
  alipayPayRequest.setOrder(order);

  // 设置设备环境信息
  Env env = Env.builder().terminalType(TerminalType.WEB).clientIp("1.2.3.4").build();
  alipayPayRequest.setEnv(env);

  // 设置授权请款模式
  PaymentFactor paymentFactor = PaymentFactor.builder().isAuthorization(true).build();
  alipayPayRequest.setPaymentFactor(paymentFactor);

  // 替换为您的通知地址
  alipayPayRequest.setPaymentNotifyUrl("https://www.yourNotifyUrl.com");

  // 替换为您的跳转地址
  alipayPayRequest.setPaymentRedirectUrl("https://www.yourMerchantWeb.com");
  // 支付
  AlipayPayResponse alipayPayResponse = null;
  try {
    alipayPayResponse = CLIENT.execute(alipayPayRequest);
  } catch (AlipayApiException e) {
    String errorMsg = e.getMessage();
    // 处理错误情况
  }
}
以下代码显示了请求报文的示例:
{
  "env": {
    "clientIp": "1.2.3.4",
    "terminalType": "WEB"
  },
  "order": {
    "buyer": {
      "referenceBuyerId": "yourBuyerId"
    },
    "orderAmount": {
      "currency": "SGD",
      "value": "4200"
    },
    "orderDescription": "antom testing order",
    "referenceOrderId": "daa64b56-0850-4d08-a322-370ac8fa****"
  },
  "paymentAmount": {
    "currency": "SGD",
    "value": "4200"
  },
  "paymentFactor": {
    "isAuthorization": true
  },
  "paymentMethod": {
    "paymentMethodMetaData": {
      "cvv": "123",
      "is3DSAuthentication": true,
      "expiryMonth": "12",
      "expiryYear": "99",
      "cardNo": "4054695723100768",
      "tokenizeMode": false
    },
    "paymentMethodType": "GOOGLEPAY"
  },
  "paymentNotifyUrl": "https://www.yourNotifyUrl.com",
  "paymentRedirectUrl": "https://www.yourMerchantWeb.com",
  "paymentRequestId": "a1513804-d4ab-4dc8-9ec5-775e3aeb****",
  "productCode": "CASHIER_PAYMENT",
  "settlementStrategy": {
    "settlementCurrency": "SGD"
  },
  "subscriptionInfo": {
    "periodRule": {
      "periodCount": 1,
      "periodType": "MONTH"
    },
    "subscriptionDescription": "Subscription test",
    "subscriptionNotifyUrl": "https://www.yourDomain.com/subscription/notify",
    "subscriptionStartTime": "2026-03-13T15:29:13.475+08:00"
  }
}
以下代码显示了一个响应示例:
{
    "normalUrl": "https://iexpfront-sea.alipay.com/authorise3d?merchantId=1887SjzZ56b1lvObJWQTaqG4PhACjUGncnl0Sihzg8en5I%3D&ddcId=m47qH0MLK7A7yJNVdjLYJBM4I4E%2B6F%2BWD98QutUHkz0%3D&pass=lt%5E1&needDDC=Y&from=iexpcore",
    "paymentActionForm": "{"method":"POST","parameters":"{\"JWT\":\"eyJraWQiOiJDQVJESU5BTF9KV1RfYWxpcGF5IiwiY3R5IjoiQ0FSRElOQUxfSldUX2FsaXBheSIsImFsZyI6IkhTMjU2In0.eyJPcmdVbml0SWQiOiI1ZDVmMTA2MjRiNzkyYTFhZTBkN2Y3MTEiLCJSZWZlcmVuY2VJZCI6ImEzMTFmNTE4LTY2ZjQtNGQzMC1hMmFhLTI2ZWU0YmI5NjMzMSIsIlJldHVyblVybCI6Imh0dHBzOi8vb3Blbi1uYS5hbGlwYXkuY29tL2FwaS9vcGVuL3VybF9jYWxsYmFja19nZXQvY2FyZGluYWwvY2FyZGluYWwwMDcuaHRtP3NpZ25EYXRhPUdGWUhkWUl2VFBjZE9sJTJCdUl5emk3VG5RbHYwWlNaWG5jaVlOM3NQb0JCUXMlMkZLMXZhdThaVTJwR1hHUVRNVndieVFOV3V5OElMV0p6b2dIdExzbFJ0U3BhYVNUbGpsY3doQ1pRTnNaM2U3JTJGcVVMZFBUNElEYUJvQ1pkTERFTkFiS0NFd3pzQSUyQjF1UFk1dU1neE5zRmt4dSUyQkhXZVpSaldDekplRVNGVUtqMUMwNyUyRkpleGVTZmltRDBEN1dvemJKdmlud2pObjZ5bko3RGVuVTl1a2NRSXlkeFNSJTJGJTJCUWc4TTNUMGNHMFZuWkdXN2xUZ25OcExEd0ZHUlZlJTJCWlFSM2xpQTEyUkE2TjZjTmo1VTVpM0VpUk8yNHRRczVWWmJOTyUyRkFDdHZBWmxmR0hjbXdldyUyQmNBQ0doR3gyNjI0emplNmZGOGZZY1djbGJJYVNkckxJazMzWlElM0QlM0QmaW5TZXJpYWxObz0yMDI2MDMxMzg5MDMxMzQxMDAwMkoyNTQzNjY1OTAzJm91dE9yZGVyTm89MjAyNjAzMTM4OTAzMTM0MTAwMDJKMjU0MzY2NTkwMyIsImV4cCI6MTc3MzM4Nzg1NiwiaWF0IjoxNzczMzg2OTU2LCJpc3MiOiI1ZDVmZGRlOGNjZWY3NjFhZDhiODJiNjgiLCJqdGkiOiIyMDI2MDMxMzg5MDMxMzQxMDAwMkoyNTQzNjY1OTAzIn0.6ZPZv8AflJ10Nwpjj22WTXKrG6J6ldthzJiGcEHrYwg\",\"Bin\":\"405469\",\"DDCFlag\":\"Y\"}","paymentActionFormType":"RedirectActionForm","redirectUrl":"https://iexpfront-sea.alipay.com/authorise3d?merchantId=1887SjzZ56b1lvObJWQTaqG4PhACjUGncnl0Sihzg8en5I%3D&ddcId=m47qH0MLK7A7yJNVdjLYJBM4I4E%2B6F%2BWD98QutUHkz0%3D&pass=lt%5E1&needDDC=Y&from=iexpcore"}",
    "paymentAmount": {
        "currency": "SGD",
        "value": "4200"
    },
    "paymentCreateTime": "2026-03-13T00:29:15-07:00",
    "paymentId": "2026031319401080****1882J0282278120",
    "paymentRequestId": "a1513804-d4ab-4dc8-9ec5-775e3aeb****",
    "paymentResultInfo": {
        "cardBrand": "VISA",
        "cardNo": "************0768",
        "credentialTypeUsed": "PAN",
        "threeDSResult": {

        }
    },
    "paymentTime": "2026-03-13T00:29:16-07:00",
    "redirectActionForm": {
        "method": "POST",
        "parameters": "{"JWT":"eyJraWQiOiJDQVJESU5BTF9KV1RfYWxpcGF5IiwiY3R5IjoiQ0FSRElOQUxfSldUX2FsaXBheSIsImFsZyI6IkhTMjU2In0.eyJPcmdVbml0SWQiOiI1ZDVmMTA2MjRiNzkyYTFhZTBkN2Y3MTEiLCJSZWZlcmVuY2VJZCI6ImEzMTFmNTE4LTY2ZjQtNGQzMC1hMmFhLTI2ZWU0YmI5NjMzMSIsIlJldHVyblVybCI6Imh0dHBzOi8vb3Blbi1uYS5hbGlwYXkuY29tL2FwaS9vcGVuL3VybF9jYWxsYmFja19nZXQvY2FyZGluYWwvY2FyZGluYWwwMDcuaHRtP3NpZ25EYXRhPUdGWUhkWUl2VFBjZE9sJTJCdUl5emk3VG5RbHYwWlNaWG5jaVlOM3NQb0JCUXMlMkZLMXZhdThaVTJwR1hHUVRNVndieVFOV3V5OElMV0p6b2dIdExzbFJ0U3BhYVNUbGpsY3doQ1pRTnNaM2U3JTJGcVVMZFBUNElEYUJvQ1pkTERFTkFiS0NFd3pzQSUyQjF1UFk1dU1neE5zRmt4dSUyQkhXZVpSaldDekplRVNGVUtqMUMwNyUyRkpleGVTZmltRDBEN1dvemJKdmlud2pObjZ5bko3RGVuVTl1a2NRSXlkeFNSJTJGJTJCUWc4TTNUMGNHMFZuWkdXN2xUZ25OcExEd0ZHUlZlJTJCWlFSM2xpQTEyUkE2TjZjTmo1VTVpM0VpUk8yNHRRczVWWmJOTyUyRkFDdHZBWmxmR0hjbXdldyUyQmNBQ0doR3gyNjI0emplNmZGOGZZY1djbGJJYVNkckxJazMzWlElM0QlM0QmaW5TZXJpYWxObz0yMDI2MDMxMzg5MDMxMzQxMDAwMkoyNTQzNjY1OTAzJm91dE9yZGVyTm89MjAyNjAzMTM4OTAzMTM0MTAwMDJKMjU0MzY2NTkwMyIsImV4cCI6MTc3MzM4Nzg1NiwiaWF0IjoxNzczMzg2OTU2LCJpc3MiOiI1ZDVmZGRlOGNjZWY3NjFhZDhiODJiNjgiLCJqdGkiOiIyMDI2MDMxMzg5MDMxMzQxMDAwMkoyNTQzNjY1OTAzIn0.6ZPZv8AflJ10Nwpjj22WTXKrG6J6ldthzJiGcEHrYwg","Bin":"405469","DDCFlag":"Y"}",
        "redirectUrl": "https://iexpfront-sea.alipay.com/authorise3d?merchantId=1887SjzZ56b1lvObJWQTaqG4PhACjUGncnl0Sihzg8en5I%3D&ddcId=m47qH0MLK7A7yJNVdjLYJBM4I4E%2B6F%2BWD98QutUHkz0%3D&pass=lt%5E1&needDDC=Y&from=iexpcore"
    },
    "result": {
        "resultCode": "PAYMENT_IN_PROCESS",
        "resultMessage": "payment in process",
        "resultStatus": "U"
    }
}
CRYPTOGRAM_3DS
获取到的 Google Pay 报文:
{
  "paymentMethod": "CARD",
  "paymentMethodDetails": {
    "authMethod": "CRYPTOGRAM_3DS",
    "pan": "1111222233334444",
    "expirationMonth": 10,
    "expirationYear": 2020,
    "cryptogram": "AAAAAA...",
    "eciIndicator": "eci indicator"
  },

  "messageId": "some-message-id",
  "messageExpiration": "1577862000000"
}
当解密结果中的卡交易身份认证场景为CRYPTOGRAM_3DS 时(即解密后拿到的卡信息类型为 DPAN),以下是支付请求中与 Google Pay 相关的关键参数说明:
参数名称
是否必需
描述
paymentMethod.paymentMethodType
是
支付方式枚举值。Google Pay 支付场景下,您自行解密 paymentToken 且拿到的信息为 DPAN 时,请指定此字段的值为 GOOGLEPAY。
paymentMethod.paymentMethodMetaData.is3DSAuthentication
否
Google Pay 支付场景下,您自行解密 paymentToken 且拿到的信息为 DPAN 时,请指定此字段的值为 false 或不传该字段,因为买家本身以及完成了 Google Pay 的身份验证流程。
paymentMethod.paymentMethodMetaData.cardNo
是
请传入您获取的 paymentMethodDetails.pan 字段的值。
paymentMethod.paymentMethodMetaData.expiryMonth
是
请传入您获取的 paymentMethodDetails.expirationMonth 字段的值。
paymentMethod.paymentMethodMetaData.expiryYear
是
请传入您获取的 paymentMethodDetails.expirationYear 字段的值。
paymentMethod.paymentMethodMetaData.mpiData.cavv
是
请传入您获取的 paymentMethodDetails.cryptogram 字段的值。
paymentMethod.paymentMethodMetaData.mpiData.eci
否
请传入您获取的 paymentMethodDetails.eciIndicator 字段的值。
有关发起授权订阅支付请求参数的更多信息,请参阅步骤 2:创建订阅支付请求。
以下示例代码展示了如何调用 pay(单笔支付)接口:
public static void payByGooglePayServer2Server() {
  AlipayPayRequest alipayPayRequest = new AlipayPayRequest();
  alipayPayRequest.setProductCode(ProductCodeType.CASHIER_PAYMENT);

  // 替换为您的 paymentRequestId
  String paymentRequestId = UUID.randomUUID().toString();
  alipayPayRequest.setPaymentRequestId(paymentRequestId);

  // 设置订阅信息
  SubscriptionInfo subscriptionInfo = new SubscriptionInfo();
  subscriptionInfo.setSubscriptionDescription("Subscription test");
  LocalDateTime localNow = LocalDateTime.now();
  OffsetDateTime offsetDateTime = localNow.atOffset(ZoneOffset.of("+08:00"));
  String startTime = offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
  subscriptionInfo.setSubscriptionStartTime(startTime);
  subscriptionInfo.setSubscriptionNotifyUrl("https://www.yourDomain.com/subscription/notify");
  PeriodRule periodRule = new PeriodRule();
  periodRule.setPeriodType("MONTH");
  periodRule.setPeriodCount(1);
  subscriptionInfo.setPeriodRule(periodRule);
  alipayPayRequest.setSubscriptionInfo(subscriptionInfo);

  // 设置支付金额
  Amount amount = Amount.builder().currency("SGD").value("4200").build();
  alipayPayRequest.setPaymentAmount(amount);

  // settlementStrategy
  SettlementStrategy settlementStrategy = SettlementStrategy.builder()
    .settlementCurrency("SGD")
    .build();
  alipayPayRequest.setSettlementStrategy(settlementStrategy);

  // 设置支付方式- CRYPTOGRAM_3DS场景
  PaymentMethod paymentMethod = PaymentMethod.builder().paymentMethodType("GOOGLEPAY").build();
  alipayPayRequest.setPaymentMethod(paymentMethod);

  // 设置MpiData信息 -- CRYPTOGRAM_3DS场景
  Map<String, Object> paymentMethodMetaData = new HashMap<>();
  paymentMethodMetaData.put("cardNo", "4054695723100768");
  paymentMethodMetaData.put("cvv", "123");
  paymentMethodMetaData.put("expiryMonth", "12");
  paymentMethodMetaData.put("expiryYear", "99");

  MpiData mapiDate = new MpiData();
  mapiDate.setCavv("googlePay cryptogram");
  mapiDate.setEci("eci indicator");
  paymentMethodMetaData.put("mpiData", mapiDate);
  paymentMethod.setPaymentMethodMetaData(paymentMethodMetaData);

  // 替换为您的 orderId
  String orderId = UUID.randomUUID().toString();

  // 设置买家信息
  Buyer buyer = Buyer.builder().referenceBuyerId("yourBuyerId").build();

  // 设置订单信息
  Order order = Order.builder()
    .referenceOrderId(orderId)
    .orderDescription("antom testing order")
    .orderAmount(amount)
    .buyer(buyer)
    .build();
  alipayPayRequest.setOrder(order);

  // 设置设备环境信息
  Env env = Env.builder().terminalType(TerminalType.WEB).clientIp("1.2.3.4").build();
  alipayPayRequest.setEnv(env);

  // 设置授权请款模式
  PaymentFactor paymentFactor = PaymentFactor.builder().isAuthorization(true).build();
  alipayPayRequest.setPaymentFactor(paymentFactor);

  // 替换为您的通知地址
  alipayPayRequest.setPaymentNotifyUrl("https://www.yourNotifyUrl.com");

  // 替换为您的跳转地址
  alipayPayRequest.setPaymentRedirectUrl("https://www.yourMerchantWeb.com");
  // 支付
  AlipayPayResponse alipayPayResponse = null;
  try {
    alipayPayResponse = CLIENT.execute(alipayPayRequest);
  } catch (AlipayApiException e) {
    String errorMsg = e.getMessage();
    System.out.println("支付失败:" + errorMsg);
    // 处理错误情况
  }
}
以下代码显示了请求报文的示例:
{
  "env": {
    "clientIp": "1.2.3.4",
    "terminalType": "WEB"
  },
  "order": {
    "buyer": {
      "referenceBuyerId": "yourBuyerId"
    },
    "orderAmount": {
      "currency": "SGD",
      "value": "4200"
    },
    "orderDescription": "antom testing order",
    "referenceOrderId": "b2ad9478-2eec-4aee-8403-13432ca6****"
  },
  "paymentAmount": {
    "currency": "SGD",
    "value": "4200"
  },
  "paymentFactor": {
    "isAuthorization": true
  },
  "paymentMethod": {
    "paymentMethodMetaData": {
      "cvv": "123",
      "expiryMonth": "12",
      "expiryYear": "99",
      "cardNo": "4054695723100768",
      "mpiData": {
        "cavv": "googlePay cryptogram",
        "eci": "eci indicator"
      }
    },
    "paymentMethodType": "GOOGLEPAY"
  },
  "paymentNotifyUrl": "https://www.yourNotifyUrl.com",
  "paymentRedirectUrl": "https://www.yourMerchantWeb.com",
  "paymentRequestId": "383bc587-0a45-479c-8e2a-ef719c0e****",
  "productCode": "CASHIER_PAYMENT",
  "settlementStrategy": {
    "settlementCurrency": "SGD"
  },
  "subscriptionInfo": {
    "periodRule": {
      "periodCount": 1,
      "periodType": "MONTH"
    },
    "subscriptionDescription": "Subscription test",
    "subscriptionNotifyUrl": "https://www.yourDomain.com/subscription/notify",
    "subscriptionStartTime": "2026-03-13T15:47:56.201+08:00"
  }
}
以下代码显示了一个响应示例:
{
  "authExpiryTime": "2026-03-20T00:47:59-07:00",
  "paymentAmount": {
    "currency": "SGD",
    "value": "4200"
  },
  "paymentCreateTime": "2026-03-13T00:47:58-07:00",
  "paymentId": "20260313194010****001884C0282432224",
  "paymentRequestId": "383bc587-0a45-479c-8e2a-ef719c0e****",
  "paymentResultInfo": {
    "avsResultRaw": "I",
    "cardBrand": "VISA",
    "cardNo": "************0768",
    "credentialTypeUsed": "PAN",
    "cvvResultRaw": "P",
    "networkTransactionId": "20260313890313000004C984380****",
    "threeDSResult": {
      "cavv": "",
      "eci": ""
    }
  },
  "paymentTime": "2026-03-13T00:47:59-07:00",
  "result": {
    "resultCode": "SUCCESS",
    "resultMessage": "success.",
    "resultStatus": "S"
  }
}

(可选)步骤 3:跳转至 3D 验证页面
客户端

商户服务端拿到 Antom 返回的 normalUrl 后,将该地址传递给前端,由商户前端跳转至支付方式页面,详情请参见步骤 3:跳转至 3D 验证页面(normalUrl)。
注意:在 Google Pay 场景下,Antom 托管解密或您自行解密 paymentToken 且拿到的信息为 FPAN 时,返回的 normalUrl 为 3DS 认证页面。

步骤 4:授权结果通知
服务端

无论授权成功或失败,Antom 都会使用 notifyPayment(订阅)接口将支付结果发送给您,详情请参见具体步骤请参阅步骤 4:授权结果通知。

步骤 5:请款并获取请款通知
服务端

注意:
  • 只有授权支付成功才会触发请款。
  • 您需要根据请款结果来决定是否发货。
授权支付成功后,Antom 默认自动为您请款,也支持您手动发起请款。同时,Antom 会使用 notifyCapture(单笔支付)将请款结果通知发送给您,您也可以通过主动查询来获取请款结果。您需要根据请款结果来决定是否发货,具体操作请参阅请款。

步骤 6:获取订阅通知
服务端

订阅关系生效后,Antom 会为您发送以下通知:

订阅后操作

完成订阅支付后,您可对交易进行以操作:

查询订阅相关信息
服务端

订阅确认后,您可以查询以下订阅信息:

订阅试用
服务端

Antom 提供订阅试用功能,帮助买家在正式购买订阅计划前,以免费或优惠价格在限定时间内体验产品或服务。详情请参阅订阅试用文档。

终止订阅
服务端

终止订阅功能允许买家在不需要继续使用相关服务时,随时取消当前订阅。详情请参阅终止订阅文档。

取消交易 ​
服务端

对于支付成功后的订单,如买家在当天内申请取消订单或退款,您可以通过 Antom 提供的取消交易能力将订单状态取消或解冻。此外,对于尚未完成支付的订单,您也可以直接进行取消,具体的集成方案见取消交易文档。

退款 ​
服务端

若您需要了解 Antom 的退款规则及如何对成功的交易发起退款,详情请参见退款。

对账 ​
服务端

交易完成后,使用 Antom 提供的财务报告进行对账。有关如何对账和 Antom 结算规则的更多信息,请参阅对账。