乐于分享
好东西不私藏

GrabPay:超级App驱动的东南亚支付之王,覆盖超1亿用户,年交易笔数突破10亿

GrabPay:超级App驱动的东南亚支付之王,覆盖超1亿用户,年交易笔数突破10亿

GrabPay是东南亚超级App Grab内置的数字钱包与支付解决方案,自2016年正式上线以来,已从最初的打车支付工具,逐步成长为服务区域数百万商户和数千万消费者的综合性支付平台。GrabPay不仅服务于Grab生态内的出行、外卖、快递等多元化场景,也已开放为第三方电商网站和线下实体商户提供独立收单服务,成为出海东南亚的商家不可或缺的本土化支付选项。

核心优势一:Grab超级App生态 + 庞大用户基数,天然流量入口与信任背书

GrabPay最显著的优势在于其背后强大的Grab超级App生态。作为东南亚领先的一站式生活服务平台,Grab涵盖出行、外卖、快递、金融服务等多个高频场景。依托这一生态,GrabPay累计用户已超过1亿,年交易笔数超过10亿笔,在新加坡,约75%的用户日常会使用GrabPay进行支付,在马来西亚和新加坡的用户覆盖率均超过60%。在马来西亚,随着当地电子支付渗透率突破67%,GrabPay已在该国积累超过1700万用户。2026年5月,Grab与万事达卡合作发行预付卡,以服务东南亚超过6.4亿人口中大量未被传统银行覆盖的用户群体,进一步提升GrabPay的普惠覆盖面。

核心优势二:企业级API接口 + 全链路支付集成,技术规范对标全球标准

GrabPay向商户开放了功能完善的企业级支付接口,其中以一次性支付API为核心。商户可通过该API,让消费者直接使用GrabPay余额完成支付,消费者只需在支付环节输入Grab注册的手机号及短信验证码即可完成交易,大幅降低用户的操作门槛。整个支付流程覆盖认证、支付发起、支付授权、支付完成、通知回调及退款等完整环节,商户在技术团队协助下完成沙箱环境测试后即可正式上线,Grab官方还提供了6种主流编程语言的SDK(PHP、Node.js、.NET、Java、Python、Go),可显著降低集成开发成本。

在安全合规方面,GrabPay要求商户全程采用OAuth 2.0协议和HMAC签名机制进行接口授权,并强制使用TLSv1.2及以上协议保障数据传输安全。官方安全规范还建议商户使用AWS KMS等密钥管理服务存储凭证,禁止任何明文硬编码,且所有凭证和后端接口调用严禁在前端侧处理。在测试和正式环境切换时,商户分别获得对应的生产测试API凭证和正式API凭证,确保开发环境与生产环境严格隔离,这对于在中国市场的出海企业来说是重大利好——在满足国际PCI和GDPR合规要求的同时,真正做到了安全性和易用性的平衡。

核心优势三:多场景支付解决方案 + 灵活的结算安排,覆盖线上线下全渠道

GrabPay构建了覆盖线上线下的全方位支付产品矩阵,满足商户不同业务场景的需求。在线上场景中,消费者可在Shoppe、Lazada、Tokopedia等主流电商平台上使用GrabPay完成结账;在线下,商户可通过QR码、SmartPOS收单和Grab推出的Tap to Pay感应支付功能,直接以智能手机接收非接触式信用卡或QR码付款。2025年11月,Grab与StraitsX达成合作,支持部分商户以新加坡元即时收款到账,显著提升跨境商家的资金周转效率。

在结算安排方面,商家可在GrabMerchant门户中下载每日结算报告,资金按日汇总批次处理,结算通常可在数个工作日内到账。新加坡市场的结算约为T+3,马来西亚市场则约为T+11,商户可根据目标市场选择最适合的结算方案。商户激活费用和每笔交易的服务费采用商务咨询制,建议直接联系Grab官方获取专属报价方案。

核心优势四:GrabFin品牌战略升级,从支付走向金融基础设施

2026年2月,Grab Financial Group正式推出统一金融品牌GrabFin,将原本分散的数字支付、保险、借贷与财富管理服务整合为单一入口,用户可在Grab App内一站式获取支付、投资和保险等金融服务。GrabFin品牌率先在新加坡和马来西亚上线,后续逐步推广至其他东南亚市场。在2026年第一季度,Grab的贷款总额同比大幅增长130%至14.38亿美元,反映出GrabFin在信贷扩展方面的强劲增长势头。

与此同时,Grab Finance利用FICO平台在短短八个月内于六个国家部署了22个信贷决策工作流,将用户获得信贷资格的比率提升了近50%,并于2026年获得FICO金融普惠决策奖。Grab还通过控股印尼Superbank及收购美国投资平台Stash等行动,持续强化其在数字银行和财富管理领域的布局。对于商户而言,GrabFin生态的持续完善意味着接入GrabPay不仅仅是获得一个电子钱包的收款能力,更是接入一整套逐步完善的东南亚数字金融基础设施。

商户接入简介

商户如需接入GrabPay,首先须联系集成经理配置测试账号并获取测试URL和API凭证,随后依据官方文档逐一实现支付全流程并在生产环境下完成测试,最后提供正式上线所需URL以获取对应的正式API凭证,整个接入周期会因目标市场和商户规模有所差异。GrabPay在东南亚主流网关选择中因卓越的本地用户覆盖和高频生态流量而被广泛视为出海商户的理想补充选项。商户可根据自身业务场景,灵活选择通过独立网关直接对接GrabPay,或经由连连支付、PingPong等第三方服务商完成对接。

对接文档地址

https://developer.grab.com/docs/payment-otc/api/v2#tag/otc-api

支付调用流程

Maven依赖

<dependencies>    <!-- HTTP 请求 -->    <dependency>        <groupId>org.apache.httpcomponents.client5</groupId>        <artifactId>httpclient5</artifactId>        <version>5.2.1</version>    </dependency>    <!-- JSON -->    <dependency>        <groupId>com.fasterxml.jackson.core</groupId>        <artifactId>jackson-databind</artifactId>        <version>2.15.2</version>    </dependency>    <!-- Base64 + 加密 -->    <dependency>        <groupId>commons-codec</groupId>        <artifactId>commons-codec</artifactId>        <version>1.15</version>    </dependency></dependencies>
import java.util.List;import java.util.Map;/** * GrabPay charge/init 接口请求实体 */public class GrabPayChargeInitRequest {    private String partnerGroupTxID;    private String partnerTxID;    private int amount;    private String currency;    private String description;    private String merchantID;    private List<String> hidePaymentMethods;    private MetaInfo metaInfo;    private List<Item> items;    private ShippingDetails shippingDetails;    // 内部类:metaInfo    public static class MetaInfo {        private String brandName;        private Map<String, Object> location;        private Map<String, Object> device;        private Map<String, Object> subMerchant;        private Map<String, Object> partnerUserInfo;        private String echo;// getter setter        public String getBrandName() {return brandName;}        public void setBrandName(String brandName) {this.brandName = brandName;}        public Map<String, Object> getLocation() {return location;}        public void setLocation(Map<String, Object> location) {this.location = location;}        public Map<String, Object> getDevice() {return device;}        public void setDevice(Map<String, Object> device) {this.device = device;}        public Map<String, Object> getSubMerchant() {return subMerchant;}        public void setSubMerchant(Map<String, Object> subMerchant) {this.subMerchant = subMerchant;}        public Map<String, Object> getPartnerUserInfo() {return partnerUserInfo;}        public void setPartnerUserInfo(Map<String, Object> partnerUserInfo) {this.partnerUserInfo = partnerUserInfo;}        public String getEcho() {return echo;}        public void setEcho(String echo) {this.echo = echo;}    }    // 内部类:items    public static class Item {}    // 内部类:shippingDetails    public static class ShippingDetails {        private String firstName;        private String lastName;        private String address;        private String city;        private String postalCode;        private String phone;        private String email;        private String countryCode;// getter setter        public String getFirstName() {return firstName;}        public void setFirstName(String firstName) {this.firstName = firstName;}        public String getLastName() {return lastName;}        public void setLastName(String lastName) {this.lastName = lastName;}        public String getAddress() {return address;}        public void setAddress(String address) {this.address = address;}        public String getCity() {return city;}        public void setCity(String city) {this.city = city;}        public String getPostalCode() {return postalCode;}        public void setPostalCode(String postalCode) {this.postalCode = postalCode;}        public String getPhone() {return phone;}        public void setPhone(String phone) {this.phone = phone;}        public String getEmail() {return email;}        public void setEmail(String email);        public String getCountryCode() {return countryCode;}        public void setCountryCode(String countryCode) {this.countryCode = countryCode;}    }    // getter & setter    public String getPartnerGroupTxID() {return partnerGroupTxID;}    public void setPartnerGroupTxID(String partnerGroupTxID) {this.partnerGroupTxID = partnerGroupTxID;}    public String getPartnerTxID() {return partnerTxID;}    public void setPartnerTxID(String partnerTxID) {this.partnerTxID = partnerTxID;}    public int getAmount() {return amount;}    public void setAmount(int amount) {this.amount = amount;}    public String getCurrency() {return currency;}    public void setCurrency(String currency) {this.currency = currency;}    public String getDescription() {return description;}    public void setDescription(String description) {this.description = description;}    public String getMerchantID() {return merchantID;}    public void setMerchantID(String merchantID) {this.merchantID = merchantID;}    public List<String> getHidePaymentMethods() {return hidePaymentMethods;}    public void setHidePaymentMethods(List<String> hidePaymentMethods) {this.hidePaymentMethods = hidePaymentMethods;}    public MetaInfo getMetaInfo() {return metaInfo;}    public void setMetaInfo(MetaInfo metaInfo) {this.metaInfo = metaInfo;}    public List<Item> getItems() {return items;}    public void setItems(List<Item> items) {this.items = items;}    public ShippingDetails getShippingDetails() {return shippingDetails;}    public void setShippingDetails(ShippingDetails shippingDetails) {this.shippingDetails = shippingDetails;}}
import com.fasterxml.jackson.databind.ObjectMapper;import org.apache.commons.codec.binary.Base64;import java.util.HashMap;import java.util.Map;public class GrabPayJwtUtil {    private static final ObjectMapper objectMapper = new ObjectMapper();    /**     * 生成 GrabPay required 的 JWT 格式 request 字段     * 格式:header.payload.     * 算法:none     */    public static String generateRequest(String txId) throws Exception {        // Header: {"alg": "none"}        Map<String, Object> header = new HashMap<>();        header.put("alg", "none");        // Payload: {"claims":{"transaction":{"txID":"你的txID"}}}        Map<String, Object> transaction = new HashMap<>();        transaction.put("txID", txId);        Map<String, Object> claims = new HashMap<>();        claims.put("transaction", transaction);        Map<String, Object> payload = new HashMap<>();        payload.put("claims", claims);        // Base64Url 编码        String headerEnc = Base64.encodeBase64URLSafeString(                objectMapper.writeValueAsBytes(header)        );        String payloadEnc = Base64.encodeBase64URLSafeString(                objectMapper.writeValueAsBytes(payload)        );        // 拼接:header.payload.        return headerEnc + "." + payloadEnc + ".";    }}

支付下单接口

import com.fasterxml.jackson.databind.ObjectMapper;import org.apache.hc.client5.http.fluent.Request;import org.apache.hc.core5.http.ContentType;import java.nio.charset.StandardCharsets;public class GrabPayHttpUtil {    public static final String API_URL = "https://partner-api.grab.com/grabpay/partner/v2/charge/init";    /**     * 调用 GrabPay 创建支付     */    public static String createCharge(Object request, String token) throws Exception {        ObjectMapper mapper = new ObjectMapper();        String json = mapper.writeValueAsString(request);        return Request.post(API_URL)                .addHeader("Authorization", "Bearer " + token) // 接口需要token                .bodyString(json, ContentType.APPLICATION_JSON)                .execute()                .returnContent()                .asString(StandardCharsets.UTF_8);    }}
import java.util.Collections;import java.util.HashMap;import java.util.UUID;public class GrabPayDemo {    public static void main(String[] args) {        try {            // ==================== 1. 配置 ====================            String merchantId = "44e46f25-7787-44ce-b785-cf9f9b95601e";            String accessToken = "你的grabpay token";            // 生成唯一订单号            String partnerGroupTxID = UUID.randomUUID().toString().replace("-", "").toUpperCase();            String partnerTxID = UUID.randomUUID().toString().replace("-", "").toUpperCase();            // ==================== 2. 构建请求 ====================            GrabPayChargeInitRequest request = new GrabPayChargeInitRequest();            request.setPartnerGroupTxID(partnerGroupTxID);            request.setPartnerTxID(partnerTxID);            request.setAmount(534);            request.setCurrency("SGD");            request.setDescription("One-time charge");            request.setMerchantID(merchantId);            request.setHidePaymentMethods(Collections.singletonList("INSTALMENT"));            // metaInfo            GrabPayChargeInitRequest.MetaInfo metaInfo = new GrabPayChargeInitRequest.MetaInfo();            metaInfo.setBrandName("This is my brand name");            metaInfo.setLocation(new HashMap<>());            metaInfo.setDevice(new HashMap<>());            metaInfo.setSubMerchant(new HashMap<>());            metaInfo.setPartnerUserInfo(new HashMap<>());            metaInfo.setEcho("test");            request.setMetaInfo(metaInfo);            // items            request.setItems(Collections.singletonList(new GrabPayChargeInitRequest.Item()));            // shippingDetails            GrabPayChargeInitRequest.ShippingDetails shipping = new GrabPayChargeInitRequest.ShippingDetails();            shipping.setFirstName("string");            shipping.setLastName("string");            shipping.setAddress("string");            shipping.setCity("string");            shipping.setPostalCode("string");            shipping.setPhone("string");            shipping.setEmail("string");            shipping.setCountryCode("string");            request.setShippingDetails(shipping);            // ==================== 3. 发送请求 ====================            String response = GrabPayHttpUtil.createCharge(request, accessToken);            System.out.println("GrabPay 支付创建响应:");            System.out.println(response);        } catch (Exception e) {            e.printStackTrace();        }    }}

响应示例

{  "partnerTxID": "1308CE9FB9C04051BB224486DE639150",  "request": "eyJhbGciOiAibm9uZSJ9..."}

支付查询接口

https://partner-api.grab.com/grabpay/partner/v2/one-time-charge/{partnerTxID}/status
{"txID": "1308CE9FB9C04051BB224486DE639150","oAuthCode": "string","paymentMethod": "GPWALLET","status": "success","txStatus": "success","reason": "currency_mismatch"}

Webhook通知

{  "txType": "Init",  "txStatus": "success",  "partnerID": "DC163C5D-9571489AAFBA38DB4CC69064",  "partnerTxID": "1308CE9FB9C04051BB224486DE639150",  "txID": "1308CE9FB9C04051BB224486DE639150",  "origTxID": "1308CE9FB9C04051BB224486DE639150",  "amount": 534,  "currency": "SGD",  "status": "success",  "createdAt": 1652422281,  "completedAt": 1652422281,  "payload": {    "partnerGroupTxID": "38A7887C2FA34D0AA61CD12FC34E472C",    "newStatus": "success",    "reason": "currency_mismatch",    "paymentMethod": "GPWALLET",    "rewardsMeta": {      "offerCode": "string",      "offerName": "string",      "offerDiscount": 0    },    "echo": "string"  },  "": "string"}

📌 长按扫码关注,不错过每一篇深度干货不间断更新 | 实用指南 | 你的专属成长加速器

相关学习资料