主题
收银台完整流程
适合商户服务端创建订单,用户在手机浏览器、微信或支付宝打开链接后,再选择可用支付方式的场景。
配置前提
- 商户和应用已启用,具备应用私钥及可用支付通道。
- 至少开通一个收银台候选方式:ALI_QR、WX_NATIVE、ALI_WAP、WX_H5、ALI_JSAPI、WX_JSAPI。
- 平台系统配置中的网关地址、收银台站点地址可从用户网络访问,HTTPS 证书有效。默认收银台入口由支付站点地址追加
/cashier/index.html。 - JSAPI 渠道须提供收银台 OAuth 能力,正确配置公众号/支付宝应用身份、授权域名及渠道要求的支付目录。
- 通知地址可达;代理 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 区分。
第二步:选择并确认
- 收银台携带 token 获取 payOrderInfo 和 options。
- 按候选项展示支付方式;当前页面不展示商户名称和渠道标识。
- 用户点击确认,提交服务器返回的 optionId,不自行拼接渠道。
- JSAPI 需要授权时先完成对应钱包 OAuth,服务器绑定用户身份后再发起支付。
- 服务器锁定方式与渠道,调用实际渠道并保存展示数据。
| 打开环境 | 当前限制 |
|---|---|
| 普通浏览器 | 可用二维码;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 订单。支付中需按关闭接口约束处理并查单,不可本地强制取消。