对外H5链接

怎么选

场景用哪份文档
嵌整座可装修商城(员工免登进 DIY 首页)本文
商城里再挂闪购 / 影票 / 券码 / 六六猴,或换票后直达其中已开通的入口本文(同一套 embed 换票;直达须书面开通)
只要闪购、淘票票或好食期券码其中一个落地页,不要整座商城H5 接入说明(品牌页),密钥与本文不同
自己做商品列表、下单、售后页面开放API(自建商城)
i
本期必接:换票接口。 员工已在你们系统登录后,由你们服务端调换票,再打开返回的 entryUrl。不要自己拼长期链接。商城域名、密钥、是否开通直达,以开通书面为准;不要把本文示例当正式地址打开。

用户看到什么

员工从你们的福利入口点进来后,默认进入本机构专属商城首页(分类网格、banner、推荐;已开通的品牌图标)。货来自中台统一供给。首页默认由我方运营按开通单装修;若给你们开了商城后台账号,也可自行改本机构首页。

  1. 你们的页面整页跳转(或 App webview)打开换票返回的 entryUrl
  2. 免登成功:换票未传 target(或约定进商城)则逛 DIY 首页,不必再注册
  3. 若书面开通了直达,换票可带 target,免登后进入对应品牌页(闪购/影票等仍走现网协议,不是换票接口本身)
  4. 站内商品加购、下单;未走直达时,也可从首页已露出的品牌图标再进去
  5. 站内单付款:默认走我们的收银台;书面约定「租户收银台」时整页跳你们收银页,付完由你们服务端通知我们入账
i
不要用 iframe 套整座商城。支付、登录态在套框里容易失败。入口请用 location.href 或 App 内 webview。

如何植入

完整商城域名、tenant 编号由运营书面下发。形态如下(参数必须写在 hash 后面,不要写到 # 前面):

示例·勿打开https://{商城域名}/shop/#/?tenant={租户编号}&ticket={一次性票}

直达品牌时,返回的 entryUrl 可能还带 &target=TB_SHANGOU 等。

正确
.../shop/#/?tenant=Txxxx&ticket=...
错误
.../shop/?tenant=Txxxx#/

请只打开换票接口返回的 entryUrl,不要自己拼。ticket 约 3 分钟、只能打开一次;打开即作废。不要把长期身份写进可转发的链接。

免登换票(一期交付)

在用户已登录你们系统、即将跳转前,由你们服务端调用换票接口(浏览器不要持有 embed_secret)。

该接口在商城域名上,不是开放API 的 /open/api/v1。embed_app_key / embed_app_secret 与开放API 的 AppKey 不是同一套。

请求

POSThttps://{商城域名}/api/front/open-h5/ticket
字段位置说明
X-App-KeyHeaderembed_app_key
X-TimestampHeaderUnix 秒
X-SignHeader见下方签名
phoneBody必填,大陆 11 位手机号,用于识别用户
nameBody可选
employeeNoBody可选工号。不参与登录,仅便于客服检索(写入用户备注)
returnUrlBody可选,支付完成回你们页面;域名须事先报备白名单
targetBody可选落地,取值大写。取值与是否参与签名见下表。

target 取值

值落地与签名
(不传)商城首页;不参与签名
MALL同样进首页,但 target=MALL 要参与签名(和「不传」不是同一段原文,对接时请写死一种)
TB_SHANGOU淘宝闪购(须书面开通,否则换票失败)
FILM影票(须书面开通)
VOUCHER券码(须书面开通)
VIPSAVE六六猴(须书面开通)
i
直达范围以开通单为准,不要按本文自行验收未开通的品牌。这与品牌落地页 H5 不是同一套密钥。

签名

  1. 取 JSON 顶层非空标量(不含 sign、不含空字符串)+ Header 约定的 timestamp、app_key
  2. 按 key 字母序拼接 k=v,用 & 连接
  3. 末尾追加 &app_secret={embed_app_secret}
  4. 对该字符串做 UTF-8 HMAC-SHA256(密钥为 embed_app_secret),结果小写 hex,放入 X-Sign
  5. X-Timestamp 与服务器相差超过 300 秒会拒绝
!
签名按字段值算,不按 JSON 原文排版。空字段不要参与。不传 target 与传 "MALL" 的签名原文不同。HTTP 请求里不要放 Secret;Header 只需 App-Key / Timestamp / Sign。

响应

{
  "code": 200,
  "data": {
    "ticket": "...",
    "expireAt": "2026-09-14T18:00:00",
    "entryUrl": "https://{商城域名}/shop/#/?tenant=Txxxx&ticket=...",
    "target": "MALL"
  }
}

以 code === 200 且 data.entryUrl 有值为成功。message 可能是 success、空或没有该字段,不要用它判断成败。expireAt 是商城服务器本地时间,无时区后缀。

前端只打开返回的 entryUrl。ticket 约 3 分钟、一次性;用户打开后即作废,不要把同一张票转发给第二个人,也不要在打开后再把这张 ticket 拿去对照。

收银台

模式谁收款说明
我方收银台(默认)我们积分、支付宝等,以开通确认为准。不要默认能在 webview 里用微信。
租户收银台你们须书面约定。下单后整页跳你们收银页;仅你们服务端 POST 入账接口后订单才变已付。浏览器打开 returnUrl 不算已付。

换票时若传了 returnUrl(域名须事先写入白名单),站内商城订单支付成功后会跳回该地址,并附带查询参数 orderNo。未传则留在商城支付结果页。闪购 / 影票等外链品牌不走本节,仍走现网各自链路。

以下仅「租户收银台」。密钥与换票同一套 embed_app_key / embed_app_secret(HMAC-SHA256,禁止 MD5,不要用开放API 的 AppKey)。金额一律整数分;时间戳 Unix 秒,允许 ±300 秒。

跳转收银(我们 → 你们页面)

待付单生成后整页跳你们书面登记的收银地址(已有 query 用 & 追加)。全部 query 做 URL 编码;验签用解码后的字段值。

GET{你们的 payUrl}?type=qyd&outTradeNo=...&amountFen=...&notifyUrl=...&returnUrl=...&expire=...&timestamp=...&appKey=...&tenant=...&subject=...&sign=...
参数必填说明
type按你们页面若开通时地址已带,我们原样保留。不参与我方签名。
outTradeNo是商城订单号
amountFen是实付整数分。不要改、不要当元
notifyUrl是付完由你们服务端 POST 的入账地址(见下)
returnUrl是把用户浏览器带回去的页面,只展示不改单
expire是过期 Unix 秒。超时后再 notify 会拒绝
timestamp是Unix 秒,参与签名
appKey是embed_app_key。签名原文的 key 必须写成 app_key
tenant是租户编码
subject否有值才参与签名
sign是与换票同一套 HMAC
!
参与签名:amountFen app_key expire notifyUrl outTradeNo returnUrl subject? tenant timestamp。query 里叫 appKey,拼签名时 key 用 app_key。用户再次点「去支付」会换新的 timestamp / sign,单号不变;未付单请认最新一跳。

你们调我们(支付 / 退款)

匿名、不依赖用户登录。Header 与换票相同。SaaS 多租户同一域名时请再带 X-Tenant: {租户编码}。

Body 为 application/json。金额字段传整数分的十进制字符串(如 "561"),不要传元。成功响应:

{ "code": 200, "message": "success" }

以 code === 200 为准。非 200 或网络失败:按单号幂等重试(建议 1s / 5s / 30s,最多 8 次)。已成功再通知仍回 200。常见拒绝:签名错误、金额不符、订单已过期或已取消、退款单不存在。

!
超过 expire 或订单已取消后再付:入账会被拒。请在你们账上把钱退给用户,不要打下面的退款通知(那时还没有我方 refundNo)。
路径通式把 {商城域名} 换成书面下发的商城 Host,不要填 admin。
测试示例(以书面为准):https://th5.qianyuandou.cn/api/front/open-h5/pay/notify

支付入账

POSThttps://{商城域名}/api/front/open-h5/pay/notify
字段位置说明
X-App-Key / X-Timestamp / X-SignHeader与换票相同
outTradeNoBody跳转时同一单号
amountFenBody必须与落库实付分全等,否则拒绝
statusBody仅 SUCCESS 入账
payTradeNoBody建议,你们的支付流水
payTimeBody可选,Unix 秒
{
  "outTradeNo": "orderxxxxxxxx",
  "amountFen": "561",
  "status": "SUCCESS",
  "payTradeNo": "你们的流水号",
  "payTime": "1728000000"
}

参与签名:Body 非空标量 + app_key + timestamp。

支付查询(对账用;改单只认 notify)

GEThttps://{商城域名}/api/front/open-h5/pay/query?outTradeNo={outTradeNo}

Header 同上。签名字段:outTradeNo + app_key + timestamp。返回 UNPAID / PAID / CANCELLED,以及 amountFen、payTradeNo、paidTime。

退款结果通知

售后是否同意、退多少由我们后台决定。我们会先 POST 你们书面登记的退款地址(带我方签发的 refundNo),你们退完再打本接口。没有我方 refundNo 的通知会被拒绝。

POSThttps://{商城域名}/api/front/open-h5/pay/refund/notify
字段位置说明
签名头Header同支付 notify
outTradeNoBody须与退款单一致
refundNoBody须是我们签发过的号
refundAmountFenBody须与退款单金额全等
statusBodySUCCESS 入账;FAILED 记失败,订单保持退款中
refundTradeNoBody建议,你们的退款流水
reasonBody可选。失败原因;有值才参与签名

SUCCESS / FAILED 重复通知仍回 200。FAILED 不把已成功的单改回去;我们可能用同一个 refundNo 再申请一次。

退款查询

GEThttps://{商城域名}/api/front/open-h5/pay/refund/query?refundNo={refundNo}

签名字段:refundNo + app_key + timestamp。返回 SENT / SUCCESS / FAILED。

我们调你们(退款申请 / 订单状态)

地址以开通书面为准。Header 同样是 X-App-Key / X-Timestamp / X-Sign,请按 HMAC 收,不要走登录态。我们认 HTTP 200,且 body 为空,或 JSON 无 code、或 code 为 200 / 0,且 success 不为 false。明确失败码(例如需登录)当失败并重试。

用户在商城申请售后时不会打你们。要等我们后台同意后才 POST 退款地址。拒绝售后不打。

退款申请 Body(非空字段都参与签名):

字段必填说明
outTradeNo是支付时的商城订单号
refundNo是形如 RF{outTradeNo}_{n}。同一号=同一笔,重试请回 200,不要重复出款
refundAmountFen是本次退款,整数分。支持部分退;累计不超过实付
notifyUrl是退完后 POST 的地址,即上面的 refund/notify
tenant是租户编码
payTradeNo有则带支付入账时你们回过的流水
reason否售后原因,仅展示

code===200 只表示收下,已退款必须再打 refund/notify。超时或非 200 我们会用同一 refundNo 重试。

订单状态为异步通知,失败只重试,不改我们的单。Body 非空字段参与签名:

字段说明
outTradeNo商城订单号
status见下表
tenant租户编码
occurredAtUnix 秒
payTradeNo有则带
deliveryName / deliveryId发货时带快递公司、运单号
refundNo / refundAmountFen退款相关状态才带
何时推status
支付入账成功PAID
用户取消或超时关单CANCELLED
发货成功SHIPPED
用户确认收货COMPLETED
你们退款接口收下(code=200)REFUNDING
你们 refund/notify 为 SUCCESSREFUNDED

开通与验收

联系开通工单里的对接运营。请准备:机构名称、联系人、中台租户编号(没有则新建)、测试手机号、跳回域名(若需要 returnUrl)、希望首页出现的品类/品牌(闪购等需另开资质)。

开通嵌入前:走我方收银台须积分或支付宝至少一种可用;走租户收银台则登记你们的 HTTPS 收银地址(退款 / 状态回调测试环境允许 http)。

  1. 运营开通托管商城、装修与供给,书面下发商城域名、tenant、embed 密钥;直达品牌以开通单勾选为准
  2. 只嵌商城:换票不要传 target(或按你们约定固定传 MALL,两种签名不同,须写死一种),用测试手机号打开 entryUrl,确认免登进 DIY 首页
  3. 要在首页露出闪购等:须开通对应入口且装修里已有该图标;未开通的图标不会出现在嵌入首页
  4. 要换票直达某品牌:须开通单已包含该 target 后再联调;不要对未开通项自行验收
  5. 我方收银台:走通一笔站内测试单;若传了 returnUrl,确认支付成功后回到你们页面且带 orderNo
  6. 租户收银台:跳转链验签通过 → 服务端 notify 入账 → 只开 returnUrl 不能改单 → 后台同意退款后能收到 refundNo 并回 SUCCESS
  7. 验收通过前不要把链接发给全部员工

文档版本 v0.7,2026-09-29。换票免登、可选 target、租户收银台(跳转验签、支付/退款通知与查询、退款申请与订单状态)。商城域名与密钥以书面为准;某家的收银/退款 URL 不写在本文。