集成 Google Pay 支付
通过 Google Pay 服务,买家可以使用存储在其 Google Pay 账户中的信用卡或借记卡进行支付。借助 Antom Checkout Page,您无需额外集成 Google Pay 的 SDK,Checkout Page 将会为您加载 Google Pay 服务,并可将 Google Pay 配置为极速支付方式。
用户体验
集成准备
在您开始集成前,请阅读集成指南及接口概述文档,了解服务端接口的集成步骤及调用接口的注意事项,并确保已完成以下预配置:
- 已获得 client ID。
- 已完成密钥配置。
- 已完成异步通知接收地址的配置。
- 集成服务端 SDK 资源包,并完成接口库安装及请求示例初始化。具体操作请参阅服务端 SDK。
集成步骤
请按照以下步骤开始集成:
- 创建支付会话
- 跳转至 Antom Checkout Page
- 获取授权支付结果
- 请款
步骤 1:创建支付会话
买家在商品详情或者购物车页面点击支付时可以选择 Antom 提供的支付方式。若需配置支付方式,请参见指定支付方式。当买家进行支付时,您需要收集关键信息,如支付请求 ID、订单信息、支付重定向链接和支付结果通知链接。您需要调用 createPaymentSession(单笔支付)接口并传入以下参数,创建支付会话后跳转至 Antom Checkout Page。
类型 | 字段 | 是否必需 | 描述 |
基础参数 | productCode | 是 | 此场景下该字段的值固定为 CASHIER_PAYMENT。 |
productScene | 是 | 此场景下该字段的值固定为 CHECKOUT_PAYMENT。 | |
paymentRequestId | 是 | 商户为识别支付请求而分配的专属 ID。 | |
| paymentAmount | 是 | 商户请求以订单币种收取的支付金额。 | |
paymentRedirectUrl | 是 | 支付完成后买家被重定向到的商户页面链接。 | |
| paymentNotifyUrl | 否 | 支付结果通知地址,可通过接口指定或在 Antom Dashboard 上设置固定值。 | |
| settlementStrategy | 否 | 支付请求的结算策略。如果您签署了多个结算币种,需在接口中指定 settlementCurrency。 | |
locale | 否 | 商户指定的 Antom Checkout Page 展示语言。如果该字段为空或设置为自动,则将使用浏览器的默认语言设置,通常为英文。 | |
paymentFactor.captureMode | 否 | 请款模式。有效值为:
| |
订单参数 | order.goods | 否 | 订单中的商品信息。若您在接口中使用该参数传入商品信息,则必须指定以下参数:
|
order.orderAmount | 是 | 商户侧向买家提供服务或商品的订单金额。此参数用于买家的消费记录或支付结果页面展示。其包含以下参数:
| |
order.referenceOrderId | 是 | 商户端订单号。 | |
order.orderDescription | 是 | 商户端订单描述。 | |
order.buyer | 是 | 商户端买家信息。至少需要提供以下三者其中一个信息:
| |
设置 Google Pay 的相关参数 | availablePaymentMethod.paymentMethodMetaData.googlePayConfiguration | 否 | 在 Checkout Page 场景下,该参数建议使用缺省值。
|
| availablePaymentMethod.paymentMethodTypeList.expressCheckout | 否 | 您可以通过设置该参数的值为 |
以上参数是创建支付会话的基本参数,完整参数和特定支付方式的额外要求请参考 createPaymentSession(单笔支付)。
以下代码展示了如何调用 createPaymentSession(单笔支付) 接口:
public static void createPaymentSession() {
AlipayPaymentSessionRequest alipayPaymentSessionRequest = new AlipayPaymentSessionRequest();
alipayPaymentSessionRequest.setProductCode(ProductCodeType.CASHIER_PAYMENT);
alipayPaymentSessionRequest.setProductScene(ProductSceneConstants.CHECKOUT_PAYMENT);
// 替换为您的 paymentRequestId
String paymentRequestId = UUID.randomUUID().toString();
alipayPaymentSessionRequest.setPaymentRequestId(paymentRequestId);
// 替换为您的 orderId
String orderId = UUID.randomUUID().toString();
// 设置买家信息
Buyer buyer = Buyer.builder().referenceBuyerId("yourBuyerId").build();
// 转换金额单位(实际应用中,金额应在您的服务器端计算)
// 详情请参考:<a href="https://docs.antom.com/ac/ref_zh-cn/cc">金额的使用规则</a>
Amount goodAmount = Amount.builder().currency("SGD").value("3000").build();
// 设置商品信息
// 注意必须传入 goods.referenceGoodsId、good.referenceGoodsId、goods.goodsName
Goods goods = Goods.builder().goodsBrand("Antom Brand").goodsCategory("outdoor goods/bag").goodsName("Classic Woman Bag").goodsQuantity("2")
.goodsSkuName("Black").goodsImageUrl("https://mdn.alipayobjects.com/portal_pdqp4x/afts/file/A*H8M9RrxlArAAAAAAAAAAAAAAAQAAAQ")
.goodsUnitAmount(goodAmount).goodsUrl("https://yourGoodsUrl").referenceGoodsId("yourGoodsId").build();
// 设置金额
// amount.value 需等于 goodsAmount.value * goods.goodsQuantity
// 支付方式支持的币种请参考<a href="https://docs.antom.com/ac/pm/supported_pm">支持的支付方式</a>
Amount amount = Amount.builder().currency("SGD").value("6000").build();
alipayPaymentSessionRequest.setPaymentAmount(amount);
// 设置订单信息
// 注意必须传入 order.orderAmount、order.referenceOrderId、order.orderDescription
Order order = Order.builder().referenceOrderId(orderId)
.orderDescription("antom ckp testing order").orderAmount(amount).buyer(buyer).goods(Stream.of(goods).collect(Collectors.toList())).build();
alipayPaymentSessionRequest.setOrder(order);
// 替换为您的通知地址
// 或者在 Antom Dashboard 配置: <a href="https://dashboard.antom.com/global-payments/developers/iNotify">通知地址</a>
alipayPaymentSessionRequest.setPaymentNotifyUrl("http://www.yourNotifyUrl.com/payment/receiveNotify");
// 替换为您的跳转地址
alipayPaymentSessionRequest.setPaymentRedirectUrl(
"http://localhost:8080/index.html?paymentRequestId=" + paymentRequestId);
AlipayPaymentSessionResponse alipayPaymentSessionResponse;
try {
System.out.println(JSON.toJSONString(alipayPaymentSessionRequest));
alipayPaymentSessionResponse = CLIENT.execute(alipayPaymentSessionRequest);
} catch (AlipayApiException e) {
String errorMsg = e.getMessage();
// 处理错误情况
}
}以下代码展示了一个请求报文的示例:
{
"order": {
"buyer": {
"referenceBuyerId": "yourBuyerId"
},
"goods": [
{
"goodsBrand": "Antom Brand",
"goodsCategory": "outdoor goods/bag",
"goodsImageUrl": "https://mdn.alipayobjects.com/portal_pdqp4x/afts/file/A*H8M9RrxlArAAAAAAAAAAAAAAAQAAAQ",
"goodsName": "Classic Woman Bag",
"goodsQuantity": "1",
"goodsSkuName": "Black",
"goodsUnitAmount": {
"currency": "SGD",
"value": "6000"
},
"goodsUrl": "https://yourGoodsUrl",
"referenceGoodsId": "yourGoodsId"
}
],
"orderAmount": {
"currency": "SGD",
"value": "6000"
},
"orderDescription": "antom ckp testing order",
"referenceOrderId": "c3df9b82-ff67-424b-880b-06c3615b46ea"
},
"paymentAmount": {
"currency": "SGD",
"value": "6000"
},
"availablePaymentMethod": {
"paymentMethodTypeList": [
{
"paymentMethodType": "GOOGLEPAY",
"expressCheckout": false,
"paymentMethodOrder": 1
}
]
},
"paymentNotifyUrl": "http://www.yourNotifyUrl.com/payment/receiveNotify",
"paymentRedirectUrl": "http://localhost:8080/index.html?paymentRequestId=597795b7-c812-4132-bd7d-c55914eefdcb",
"paymentRequestId": "597795b7-c812-4132-bd7d-c55914eefdcb",
"productCode": "CASHIER_PAYMENT",
"productScene": "CHECKOUT_PAYMENT"
}以下代码展示了一个响应的示例,其中包含以下参数:
- paymentSessionData:将返回给前端的支付会话数据。
- paymentSessionExpiryTime:支付会话的过期时间。
- normalUrl: Checkout Page 的跳转链接。
{
"normalUrl": "https://checkout.antom.com/checkout-page/pages/payment/index.html?sessionData=1iwX2rH5kXnUGT5372d0kHD7PwcgPmRSMgAsvKs8hqRkqobbtWbep59PU2eO5w72h%2B%2XXXX",
"paymentSessionData": "1iwX2rH5kXnUGT5372d0kHD7PwcgPmRSMgAsvKs8hqRkqobbtWbep59PU2eO5w72h+/c278B+P+nDVNzrQySQQ==&&SG&&188&&eyJleHRlbmRJbmZvIjoie1wiT1BFTl9NVUxUSXXXX",
"paymentSessionExpiryTime": "2025-03-19T16:21:06+08:00",
"paymentSessionId": "1iwX2rH5kXnUGT5372d0kHD7PwcgPmRSMgAsvKs8hqSln4WiVZXXXX",
"result": {
"resultCode": "SUCCESS",
"resultMessage": "success.",
"resultStatus": "S"
}
}下表展示了请求报文中 result.resultStatus 字段可能返回的值,请您根据指引进行处理:
| result.resultStatus | 信息 | 下一步操作 |
S | 表示支付会话创建成功。 | 获取 Antom Checkout Page 链接(normalUrl) 并返回给商户前端。具体操作步骤请参阅步骤 2。 |
U | 表示由于未知原因支付会话创建失败。 | 请更换 paymentRequestId 重新调用接口以解决问题。如果问题未解决,请联系 Antom 技术支持。 |
F | 表示支付会话创建失败。 | 请检查并验证当前接口所需的请求字段(包括头部字段和正文字段)是否正确传递并有效。 |
注意:如果您未收到响应报文,可能是网络超时所致。请更换 paymentRequestId 重新调用接口以解决问题。
步骤 2:跳转至 Antom Checkout Page
商户服务端获取 normalUrl 后,将该 normalUrl 传递给前端,由商户前端跳转至 Antom Checkout Page 页面。
获取 normalUrl 后,您需要在浏览器将页面重定向至 Antom Checkout Page 页面,或在新标签页打开。
if (serverResponse.normalUrl != null) {
window.open(serverResponse.normalUrl, '_blank');
}下图为跳转的 Antom Checkout Page 渲染页面:

步骤 3:获取授权支付结果
在买家完成授权支付或授权超时后, Antom 会通过服务器交互将相应的结果发送给您,您可以通过以下方法之一获取授权支付结果:
- 接收来自 Antom 的异步通知
- 主动查询支付结果
接收异步通知
1. 设置接收通知的 webhook URL
完成支付或支付失败时,Antom 会向您设置的 webhook URL 发送异步通知,您可以选择以下两种方法中的一种来设置接收通知的 webhook URL(若两者都设置,则以接口请求中指定的 URL 优先):
- 若您的每个订单都有单独的通知 URL,建议您在每笔请求中设置 webhook URL。您可以通过 createPaymentSession(单笔支付)接口请求的 paymentNotifyUrl 参数传入该笔订单的异步通知接收 URL。
- 若您的所有订单有统一的通知 URL,您可以在 Antom Dashboard > 开发者 > 通知地址 中设置 webhook URL。具体操作请参阅通知地址。
以下是异步通知请求体的代码示例:
{
"actualPaymentAmount": {
"currency": "HKD",
"value": "4100"
},
"authExpiryTime": "2026-05-15T23:32:30-07:00",
"cardInfo": {
"avsResultRaw": "0",
"cardBrand": "MASTERCARD",
"cardCategory": "CONSUMER",
"cardNo": "****************",
"credentialTypeUsed": "PAN",
"cvvResultRaw": "",
"expiryMonth": "*",
"expiryYear": "**",
"funding": "CREDIT",
"issuingCountry": "HK",
"networkTransactionId": "0509MCW******",
"paymentMethodRegion": "GLOBAL",
"threeDSResult": {
"cavv": "ABpkeUUsZcGvAHC72UQRGg******",
"challengeCancel": "",
"challenged": false,
"eci": "",
"threeDSOffered": false,
"threeDStransactionStatusReason": ""
}
},
"notifyType": "PAYMENT_RESULT",
"paymentAmount": {
"currency": "HKD",
"value": "4100"
},
"paymentCreateTime": "2026-05-08T23:32:25-07:00",
"paymentId": "20260509194010800100188260263******",
"paymentMethodType": "GOOGLEPAY",
"paymentRequestId": "20260509143211987010000******",
"paymentResultInfo": {
"avsResultRaw": "0",
"cardBrand": "MASTERCARD",
"cardCategory": "CONSUMER",
"cardNo": "****************",
"credentialTypeUsed": "PAN",
"cvvResultRaw": "",
"expiryMonth": "*",
"expiryYear": "**",
"funding": "CREDIT",
"issuingCountry": "HK",
"networkTransactionId": "0509MCW******",
"paymentMethodRegion": "GLOBAL",
"threeDSResult": {
"cavv": "ABpkeUUsZcGvAHC72UQRGg******",
"challengeCancel": "",
"challenged": false,
"eci": "",
"threeDSOffered": false,
"threeDStransactionStatusReason": ""
}
},
"paymentTime": "2026-05-08T23:32:30-07:00",
"result": {
"resultCode": "SUCCESS",
"resultMessage": "success.",
"resultStatus": "S"
}
}下表展示了支付结果的异步通知中 result.resultStatus 参数可能返回的值,请您根据指引进行处理:
result.resultStatus | 信息 | 后续操作 |
| 授权成功。 | 可以发起请款。 |
| 授权失败。 | 建议更换 paymentRequestId 重新发起支付。 |
2. 异步通知验签
当您收到 Antom 的异步通知,您需要按照返回收到确认信息的格式返回响应,但无需做加签处理。
您需要按照以下方法对 Antom 发送的支付通知进行验签:
/**
* receive notify
*
* @param request request
* @param notifyBody notify body
* @return Result
*/
@PostMapping("/receiveNotify")
@ResponseBody
public Result receiveNotify(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");
}
// 反序列化通知主体
JSONObject jsonObject = JSON.parseObject(notifyBody);
String notifyType = (String)jsonObject.get("notifyType");
if("PAYMENT_RESULT".equals(notifyType)){
AlipayPayResultNotify paymentNotify = jsonObject.toJavaObject(AlipayPayResultNotify.class);
if (paymentNotify != null && "SUCCESS".equals(paymentNotify.getResult().getResultCode())) {
// 处理您自己的业务逻辑
// 例如:支付信息与买家之间的关系保存在数据库中。
System.out.println("receive payment notify: " + JSON.toJSONString(paymentNotify));
return Result.builder().resultCode("SUCCESS").resultMessage("success.").resultStatus(ResultStatusType.S).build();
}
}else if("CAPTURE_RESULT".equals(notifyType)){
AlipayCaptureResultNotify captureNotify = jsonObject.toJavaObject(AlipayCaptureResultNotify.class);
if (captureNotify != null && "SUCCESS".equals(captureNotify.getResult().getResultCode())) {
// 处理您自己的业务逻辑
System.out.println("receive capture notify: " + JSON.toJSONString(captureNotify));
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();
}无论订单是否支付成功,每个通知请求均需按以下固定格式响应。否则,Antom 会重新发送异步通知。
{
"result": {
"resultCode": "SUCCESS",
"resultStatus": "S",
"resultMessage": "success"
}
}常见问题
问:何时会发送通知?
答:不同场景异步通知的发送时间不同。
- 如果支付成功,Antom 通常会在 3 到 5 秒内发送异步通知。对于某些支付方式,如现金支付,通知可能会稍有延迟。
- 如果买家未提交支付,在支付会话超时时, Antom 不会发送异步通知。
- 如果买家提交了支付但最终支付未完成:
- 最后一次提交支付的支付单关单时,若支付会话仍在有效期,Antom 会在支付会话过期时发送异步通知。
- 最后一次提交支付的支付单关单时,若支付会话已过期,Antom 会在最后一次支付单关单时发送异步通知。
注意:支付会话默认有效期为 1 小时,不同支付方式关闭订单所需时间会有所不同,通常默认为 14 分钟。
问:异步通知会被重新发送吗?
答:是的,对于以下情况,异步通知会在 24 小时内自动重新发送:
- 由于网络原因未收到异步通知。
- 您收到来自 Antom 的异步通知后,没有按照处理通知的示例代码格式对通知做出响应。
通知至多重发 8 次或直至收到正确响应终止发送。发送间隔如下:0 分钟,2 分钟,10 分钟,10 分钟,1 小时,2 小时,6 小时,15 小时。
问:在通知中需要使用哪些关键参数?
答:通知中存在以下关键参数:
- result:代表订单的支付结果。
- paymentRequestId:商户生成的支付请求号,用于查询、撤销、对账。
- paymentId:Antom 生成的支付单号,用于退款、对账。
- paymentAmount:如有金额核对的需求,可以消费这个字段。
- paymentMethodType:表示买家使用的支付方式。
问:有两个异步通知类型,应该用哪一个作为发货的依据?
答:当您收到 notifyType 为
PAYMENT_RESULT类型的通知时,需要优先判断 paymentMethodType 是否为CARD,若不为CARD,则可根据该通知结果选择是否发货。如果为CARD,需要等待CAPTURE_RESULT类型通知,再决策是否发货。
主动查询结果
除了通过异步通知获取授权支付结果,您还可以调用 inquiryPayment 接口,使用支付会话中的 paymentRequestId 查询来授权支付状态。
以下为调用 inquiryPayment 接口的代码示例:
public static void inquiryPayment() {
AlipayPayQueryRequest alipayPayQueryRequest = new AlipayPayQueryRequest();
// 替换您的 paymentRequestId
alipayPayQueryRequest.setPaymentRequestId("yourPaymentRequestId");
AlipayPayQueryResponse alipayPayQueryResponse = null;
try {
alipayPayQueryResponse = CLIENT.execute(alipayPayQueryRequest);
} catch (AlipayApiException e) {
String errorMsg = e.getMessage();
// 处理错误情况
}
}以下代码展示了一个响应报文的示例:
{
"actualPaymentAmount": {
"currency": "HKD",
"value": "5300"
},
"authExpiryTime": "2026-05-15T03:26:01-07:00",
"cardInfo": {
"cardBrand": "MASTERCARD",
"cardCategory": "CONSUMER",
"funding": "CREDIT",
"issuingCountry": "HK"
},
"paymentAmount": {
"currency": "HKD",
"value": "5300"
},
"paymentId": "20260508194010800100188690262******",
"paymentMethodType": "GOOGLEPAY",
"paymentRedirectUrl": "https://u.alipay.cn/_2MYEg9VBNiGHgOVk8kY4L",
"paymentRequestId": "20260508182444438010000******",
"paymentResultCode": "SUCCESS",
"paymentResultInfo": {
"avsResultRaw": "0",
"cardBrand": "MASTERCARD",
"cardCategory": "CONSUMER",
"cardNo": "****************",
"credentialTypeUsed": "PAN",
"cvvResultRaw": "",
"expiryMonth": "*",
"expiryYear": "**",
"funding": "CREDIT",
"issuingCountry": "HK",
"networkTransactionId": "0508MPLBVOIB5",
"paymentMethodRegion": "GLOBAL",
"threeDSResult": {
"cavv": "",
"challengeCancel": "",
"challenged": false,
"eci": "",
"threeDSOffered": false,
"threeDStransactionStatusReason": ""
}
},
"paymentResultMessage": "success.",
"paymentStatus": "SUCCESS",
"paymentTime": "2026-05-08T03:26:01-07:00",
"transactions": [
{
"transactionAmount": {
"currency": "HKD",
"value": "5300"
},
"transactionId": "20260508194010807000188690265******",
"transactionRequestId": "20260508182444438010000******",
"transactionResult": {
"resultCode": "SUCCESS",
"resultMessage": "success",
"resultStatus": "S"
},
"transactionStatus": "SUCCESS",
"transactionTime": "2026-05-08T03:26:05-07:00",
"transactionType": "CAPTURE"
}
],
"result": {
"resultCode": "SUCCESS",
"resultMessage": "success.",
"resultStatus": "S"
}
}请根据响应中 paymentStatus 参数的值进行处理,具体返回值请参阅接口文档。
注意:在查询交易时,如果买家没有提交订单,就会一致报错
ORDER_NOT_EXIST,提交订单以后才不会报错。
步骤 4:请款
支付成功后,Antom 默认自动为您请款,同时支持您手动发起请款。请款后,您可以通过异步通知或主动查询来获取请款结果,您需要根据请款结果来决定是否发货。具体操作请参阅请款。
支付后操作
完成支付后,您可对交易进行以下支付后的操作:
退款
若您需要了解 Antom 的退款规则及如何对成功的交易发起退款,详情请参见退款。
争议
若买家选择使用卡支付方式,会涉及到争议相关的集成,详情请参见争议实施方案。
对账
交易完成后,使用 Antom 提供的财务报告进行对账。有关如何对账和 Antom 结算规则的更多信息,请参阅对账。
更多内容
指定支付方式
您可以在 Antom Dashboard 的 支付 > 收银台设置 > 支付方式 中配置指定支付方式,也可以通过 createPaymentSession(单笔支付)接口传入参数,指定在 Checkout Page 上展示的支付方式、支付方式列表的排序,以及极速支付方式的展示,具体步骤请参阅指定支付方式。
注意:如果您通过接口传入参数来指定支付方式,则优先取接口传值。