Skip to content

收银台完整流程 ​

适合商户服务端创建订单,用户在手机浏览器、微信或支付宝打开链接后,再选择可用支付方式的场景。

配置前提 ​

  1. 商户和应用已启用,具备应用私钥及可用支付通道。
  2. 至少开通一个收银台候选方式:ALI_QR、WX_NATIVE、ALI_WAP、WX_H5、ALI_JSAPI、WX_JSAPI。
  3. 平台系统配置中的网关地址、收银台站点地址可从用户网络访问,HTTPS 证书有效。默认收银台入口由支付站点地址追加 /cashier/index.html。
  4. JSAPI 渠道须提供收银台 OAuth 能力,正确配置公众号/支付宝应用身份、授权域名及渠道要求的支付目录。
  5. 通知地址可达;代理 IP 信任、队列、查单和订单过期任务已按部署文档配置。

只配置 QR_CASHIER 字典不等于存在实际支付通道。候选项在创建订单时冻结,用户确认前再次核对可用性。

第一步:服务端下单 ​

调用 统一下单,公共参数不变,wayCode 使用 QR_CASHIER:

json
{
  "mchNo": "M_DEMO",
  "appId": "APP_DEMO",
  "mchOrderNo": "CASHIER_DEMO_001",
  "wayCode": "QR_CASHIER",
  "amount": 100,
  "currency": "cny",
  "subject": "测试商品",
  "body": "收银台流程测试",
  "notifyUrl": "https://merchant.example.com/payment/notify",
  "returnUrl": "https://merchant.example.com/payment/result",
  "expiredTime": 300,
  "signType": "MD5",
  "sign": "服务端计算的真实签名"
}

开放 API 返回示意:

json
{
  "code": 0,
  "data": {
    "payOrderId": "P_DEMO",
    "mchOrderNo": "CASHIER_DEMO_001",
    "orderState": 0,
    "payDataType": "payurl",
    "payData": "https://pay.example.com/cashier/index.html#/hub/ORDER_TOKEN",
    "errCode": null,
    "errMsg": null
  },
  "sign": "仅对data计算的签名"
}

此时仅创建平台订单,尚未请求渠道支付。商户验签后分发或跳转该链接;跨设备扫码时把同一链接编码成二维码。商户端支付测试入口返回 codeUrl 供展示链接二维码,与开放 API 的 payurl 区分。

第二步:选择并确认 ​

  1. 收银台携带 token 获取 payOrderInfo 和 options。
  2. 按候选项展示支付方式;当前页面不展示商户名称和渠道标识。
  3. 用户点击确认,提交服务器返回的 optionId,不自行拼接渠道。
  4. JSAPI 需要授权时先完成对应钱包 OAuth,服务器绑定用户身份后再发起支付。
  5. 服务器锁定方式与渠道,调用实际渠道并保存展示数据。
打开环境当前限制
普通浏览器可用二维码;WX_H5、ALI_WAP 需应用及渠道开通
微信内WX_JSAPI 需授权;WX_H5、ALI_WAP 被标为不可用
支付宝内ALI_JSAPI 需授权;WX_H5 被标为不可用
任意环境QR 仍需渠道、应用与订单可用;识别环境不代表自动取得支付权限

环境由服务器根据 User-Agent 判断,仅用于交互筛选。无可用项时核对通道、产品及环境,不通过伪造环境强行支付。

第三步:展示与唤起 ​

返回类型收银台行为
codeUrl将原始内容编码为二维码
codeImgUrl展示渠道二维码图片
payurl跳转渠道链接,钱包 Scheme 可能被浏览器拦截
form按服务器提取的 HTTPS POST action 和隐藏字段提交
wxapp / aliapp交给对应 SDK / Bridge

Globetap 支付宝收银台保留原二维码,另带 launchUrl,前端使用 location.href 尝试唤起支付宝。受浏览器策略影响,自动唤起可能失败,此时仍保留二维码及手动入口。

刷新通过 presentation 恢复已有展示,不重新创建渠道订单。首次确认后绑定同一路由,未知状态不能切换方式重付。preparing / unknown 应继续查原单,暂时没有二维码不代表渠道没有受理。

第四步:确认结果 ​

收银台支付中查询会尝试刷新渠道状态;商户开放查询主要读取平台本地状态。商户以验签通知或验签查询的 state=2 为支付成功依据,并核对金额、币种与单号。

returnUrl 只用于用户体验跳转。二维码过期、SDK 退出或钱包返回页面,不等于已支付或已关闭。

重复请求与取消 ​

同商户订单号、同应用且关键业务字段一致时,可恢复原收银台链接。应用、金额、币种、标题、描述、通知地址、返回地址、附加参数不一致时拒绝重复请求,不可依此修改订单。

cancelPay 只取消尚未发起渠道支付的状态 0 订单。支付中需按关闭接口约束处理并查单,不可本地强制取消。

继续阅读 收银台接口参考 和 上线验收。

接口行为以当前 payment 实现为准。示例商户号与密钥均为虚构。