SMARTPAY

GCash二维码支付是怎么运作的?静态码、动态码与商户现场部署

店里天天有顾客问"能扫码付款吗",收银台上贴的那张码,很多中国商户自己都说不清楚它到底是什么原理——是固定的还是每单都不一样,顾客扫完为什么有时候要自己输金额、有时候不用。这篇不讲营销话术,只把 GCash二维码支付 从码里编码的内容,到静态码、动态码的技术差异,到商户怎么申请、怎么打印摆放、扫码失败了从哪几个方向排查,按实际运营和接入的顺序过一遍。

GCash二维码支付的码里到底放了什么

很多人以为二维码就是一张"图片",扫一下钱就到账,中间的逻辑是黑盒。实际上,GCash二维码支付底层遵循的是菲律宾央行推动的二维码互通标准(即 QR Ph 体系),码本身是一段按标准编码的字符串,里面至少包含商户识别信息、收款账户标识、币种字段、一个用于校验完整性的校验位,以及一个可选的交易金额字段。App 扫码后做的第一件事,就是把这串字符解析回结构化数据,确认这是一个合法的、可识别的商户收款码,再决定弹出什么样的确认界面。

这也是为什么码是否"含金额"会直接决定顾客的操作路径——金额字段有没有值,是区分静态码和动态码最本质的技术分野,而不是外观上的差别。

静态码与动态码:两套完全不同的技术逻辑

把这两种码当成"一张纸打印一次"和"每次交易现算现生成"来理解,会更接近真实情况。

维度静态码动态码
是否含金额不含,金额字段留空含,下单时写入具体金额与流水号
生成方式商户申请后一次性生成,长期复用每笔订单调用接口实时生成一张新码
有效期长期有效,商户主动注销才失效限时有效,超过窗口自动作废
顾客操作扫码后自己输入金额再确认扫码即看到金额,直接核对确认
对账颗粒度需要人工核对小票匹配金额订单号与交易一一对应,天然可自动对账
适合场景柜台零售、小档口、多品类现场收银电商订单、预约类、需精确对账的门店

如果只做小额零售,一张静态码贴柜台足够用;但凡涉及需要系统自动核销订单状态的场景(比如网店、外卖、预约排队叫号),动态码几乎是唯一合理选择,靠人工比对金额和小票迟早会出错。关于这两种码在更底层的通道选择逻辑,也可以参考 QRPH静态码与动态码的选择逻辑,两者原理是相通的。

商户怎么拿到自己的GCash收款码

目前商户拿到可用收款码基本是两条路。第一条是走 GCash 官方商户开通渠道,提交经营资质材料,审核通过后由官方后台生成商户专属静态码,这条路适合只需要一张固定码贴柜台、不涉及系统对接的小微商户,具体材料清单可以参考 GCash商户号申请流程与所需资料。

第二条路是通过已经持牌接入的支付网关,用 API 直接调用生成动态码,商户不需要自己去对接 GCash 后台的技术细节,网关把生成、验签、回调这一整套流程封装好。

判断一个网关能不能碰"帮你生成收款码、经手你的资金"这件事,第一标准从来不是页面做得好不好看,而是它有没有 BSP 颁发的 OPS 或 EMI 牌照——这决定了它是否具备合法处理商户资金的资质。没有这张牌照,再顺畅的接入体验都建立在不合规的基础上。

动态码怎么生成:一段真实的接口调用

动态码本质上是"先创建一笔待支付订单,拿到返回的码内容或码图片,再展示给顾客"。下面是一个典型的创建订单请求示例:

curl -X POST https://apix.smartpay-gateway.com/api/qr/create \
  -H "Content-Type: application/json" \
  -d '{
    "merid": "M10023456",
    "tno": "ORD2026092900123",
    "amt": "{order_amount}",
    "currency": "{ISO_CURRENCY_CODE}",
    "expire_seconds": 300,
    "notify_url": "https://yourstore.com/callback/gcash",
    "sign": "3F9A6C1E7B..."
  }'

接口返回的通常是一段可直接渲染成图片的码内容字符串(或者一个 base64 图片),前端拿到后展示给顾客扫码即可。顾客确认支付后,网关会向商户预先配置的 notify_url 发起一次异步回调,商户这一侧必须做验签,确认回调确实来自网关而不是伪造请求,再更新订单状态:

const crypto = require('crypto');

function verifyCallback(payload, signature, secretKey) {
  const raw = Object.keys(payload)
    .filter(k => k !== 'sign')
    .sort()
    .map(k => `${k}=${payload[k]}`)
    .join('&') + `&key=${secretKey}`;
  const expected = crypto.createHash('md5').update(raw).digest('hex').toUpperCase();
  return expected === signature;
}

app.post('/callback/gcash', (req, res) => {
  const { sign, ...payload } = req.body;
  if (!verifyCallback(payload, sign, process.env.GATEWAY_SECRET)) {
    return res.status(400).send('FAIL');
  }
  // 验签通过后再更新订单状态,避免被伪造回调篡改
  markOrderPaid(payload.tno);
  res.send('SUCCESS');
});

这里有个经常被忽略的细节:回调到达和顾客在 App 里点"确认支付"不是同一时刻,中间有网络延迟,商户系统一定要按订单号做幂等处理,防止网络重试导致同一笔订单被重复标记。关于回调这一段更完整的落地方案,可以看 商户回调与验签对账方案。

二维码打印与摆放:现场真正会踩的坑

技术接入做对了,现场摆放做错了照样天天有顾客扫不出来。几个实操上容易忽视的点:

  • 材质要防水防刮:热敏纸打印的码放柜台上,油渍、水渍沾上去几天就花了,识别率明显下降,建议覆膜或用亚克力座固定。
  • 尺寸不能图省事印太小:码的最小模块要留足边距(静默区),边距不够或整体缩得太小,顾客手机摄像头在光线不好的环境下很难一次识别成功。
  • 避免反光角度:柜台常见的强光灯直射亚克力座或塑封膜表面,会在码上形成高光,建议实测不同时间段的光线角度再定摆放位置。
  • 多个收银位不要共用同一张静态码:看起来省事,但所有收银台流水混在一张码下面,后续对账根本分不清是哪个台收的,建议每个收银位单独申请一张,或者干脆全部切到动态码按订单区分。
  • 折痕会直接挡住码的定位角:码的三个角上有定位图案,一旦被折痕、订书钉或标签纸盖住,大概率直接扫不出来,备用码建议单独存放平整。

顾客扫码支付的完整流程,以及商户这一侧能看到什么

从顾客打开 App 到商户确认收款,大致是这样一条链路:打开 GCash App 的扫一扫功能,摄像头识别码并解析出商户与金额信息;如果是动态码,App 会直接展示金额和商户名称等待顾客核对;顾客用密码或生物识别确认支付;交易发起后,GCash 侧完成扣款,几乎同一时间通过网关把交易结果推送到商户配置的回调地址;商户系统收到并验签通过后,才把订单状态更新为"已支付",库存、发货、叫号等后续流程才能继续往下走。整条链路里,商户真正能主动介入、也最容易出错的环节,就是最后这一步的验签和状态更新,前面几步基本都在 GCash 与网关之间完成。

常见扫码失败的原因排查

顾客反馈"扫不出来"或"扫了但没反应",与其猜,不如按现象对照排查方向:

现象可能原因排查方向
摄像头对着码一直识别不出来码磨损、反光、打印尺寸过小更换新码、调整摆放角度与灯光
扫码后提示商户信息异常静态码已被后台注销,或商户号状态变化登录商户后台核实商户号当前状态
扫码后显示的金额不对动态码已过期但顾客仍在用旧截图,或订单金额被中途修改未同步确认码的生成时间与有效期窗口,重新生成
确认支付后一直转圈没结果网络波动、顾客账户触发风控限额拦截让顾客检查网络,必要时换稳定网络重试
提示"该商户暂不可用"商户号审核状态或合规状态发生变化联系网关或官方渠道核实账户状态

大部分"扫码失败"投诉,排查到最后其实不是技术故障,而是码本身物理状态(磨损、反光、尺寸)或者有效期窗口的问题,先看这两类再往系统层面查,效率会高很多。

不管走静态码还是动态码,商户判断一个接入方案是否可持续,还是要回到同一个问题:经手资金的这一方是否持有 BSP 的 OPS 或 EMI 牌照。这不是锦上添花的资质说明,而是决定商户资金链路合规与否的分界线。

静态码和动态码,到底怎么选

不用纠结哪个"更好",看业务形态就够了:单一柜台、品类简单、不需要系统自动核销的,静态码省事;涉及电商订单、多收银位并行、需要按订单自动对账的,动态码是必选项,而且往往需要同时保留一张静态码作为系统故障时的应急备用方案。两者也不冲突,不少门店是主用动态码、柜台角落留一张静态码兜底,这也是相对稳妥的现场配置方式。想再看一眼动态码在唤醒交互体验上和传统跳转通道的差别,可以参考 GCash QR唤醒支付与原生直连的区别,以及 QRPH与GCash扫码体验的实测差异。

GCash二维码支付需要额外购买硬件吗?

不需要。静态码打印出来贴柜台即可;动态码通过接口生成码内容后,用任意能显示图片的屏幕或打印机展示都可以,不依赖专用扫码枪或收银硬件。

静态码会不会过期,要多久换一次?

静态码本身不像动态码那样有短时效性,只要商户账户状态正常、没有主动注销,可以持续使用。但建议定期检查磨损情况,物理损坏比"过期"更常见。

一个门店能不能同时挂静态码和动态码?

可以,而且是比较常见的搭配方式——日常收银走动态码方便自动对账,静态码作为系统临时故障或网络中断时的备用收款手段。

顾客扫码付款后,钱是直接进商户账户吗?

资金路径取决于商户接入的方式:走官方商户通道的,直接进商户的 GCash 商户钱包;走网关 API 接入的,先进入网关侧的商户账户体系,再按约定的结算周期转入商户绑定的收款账户。

二维码被顾客拍照传出去,账户会有风险吗?

静态码本身只包含商户收款信息,不含密码等敏感凭证,被拍照传播不会直接导致资金被盗刷;但如果是动态码,一旦订单已过期,旧截图理论上也无法再次使用,这也是动态码在安全性上优于静态码的原因之一。

动态码一定要商户自己开发系统才能用吗?

不一定。多数持牌网关会提供现成的收银台页面或小程序,商户只需要接入下单接口,不需要从零搭建生成码和展示码的前端。

GCash二维码支付和QRPH是不是一回事?

两者关系是"标准"与"品牌实现"的关系:QRPH 是菲律宾央行推动的二维码互通标准,GCash 的收款码是遵循这套标准的具体实现之一。理解 QRPH 标准本身的静态动态逻辑,对理解 GCash 这一层同样适用。

多个收银台能不能共用一张二维码?

技术上可以扫,但强烈不建议共用静态码——所有流水混在一张码下面,后续按收银位拆分对账几乎无法做到,建议每个收银位单独一张码,或统一切换到按订单区分的动态码。

如果你的门店或平台正在评估从静态码切到动态码、或者需要一套现成的 GCash二维码支付 接口方案,可以直接找我们的技术团队聊现有系统怎么对接:Telegram 咨询 @LouisSMARTPAY,或邮件 [email protected],我们会先看你现在的收银流程再给接入建议。

相关推荐