.../shop/#/?tenant=Txxxx&ticket=...对外H5链接 v0.7
把可装修的福利商城整页嵌进你们现有入口。服务端换票免登;书面约定后可走你们自己的收银台。不是开放API;「只要闪购、不要商城」也不是本文。
怎么选
| 场景 | 用哪份文档 |
|---|---|
| 嵌整座可装修商城(员工免登进 DIY 首页) | 本文 |
| 商城里再挂闪购 / 影票 / 券码 / 六六猴,或换票后直达其中已开通的入口 | 本文(同一套 embed 换票;直达须书面开通) |
| 只要闪购、淘票票或好食期券码其中一个落地页,不要整座商城 | H5 接入说明(品牌页),密钥与本文不同 |
| 自己做商品列表、下单、售后页面 | 开放API(自建商城) |
entryUrl。不要自己拼长期链接。商城域名、密钥、是否开通直达,以开通书面为准;不要把本文示例当正式地址打开。用户看到什么
员工从你们的福利入口点进来后,默认进入本机构专属商城首页(分类网格、banner、推荐;已开通的品牌图标)。货来自中台统一供给。首页默认由我方运营按开通单装修;若给你们开了商城后台账号,也可自行改本机构首页。
- 你们的页面整页跳转(或 App webview)打开换票返回的
entryUrl - 免登成功:换票未传
target(或约定进商城)则逛 DIY 首页,不必再注册 - 若书面开通了直达,换票可带
target,免登后进入对应品牌页(闪购/影票等仍走现网协议,不是换票接口本身) - 站内商品加购、下单;未走直达时,也可从首页已露出的品牌图标再进去
- 站内单付款:默认走我们的收银台;书面约定「租户收银台」时整页跳你们收银页,付完由你们服务端通知我们入账
location.href 或 App 内 webview。如何植入
完整商城域名、tenant 编号由运营书面下发。形态如下(参数必须写在 hash 后面,不要写到 # 前面):
https://{商城域名}/shop/#/?tenant={租户编号}&ticket={一次性票}直达品牌时,返回的 entryUrl 可能还带 &target=TB_SHANGOU 等。
.../shop/?tenant=Txxxx#/请只打开换票接口返回的 entryUrl,不要自己拼。ticket 约 3 分钟、只能打开一次;打开即作废。不要把长期身份写进可转发的链接。
免登换票(一期交付)
在用户已登录你们系统、即将跳转前,由你们服务端调用换票接口(浏览器不要持有 embed_secret)。
该接口在商城域名上,不是开放API 的 /open/api/v1。embed_app_key / embed_app_secret 与开放API 的 AppKey 不是同一套。
请求
| 字段 | 位置 | 说明 |
|---|---|---|
X-App-Key | Header | embed_app_key |
X-Timestamp | Header | Unix 秒 |
X-Sign | Header | 见下方签名 |
phone | Body | 必填,大陆 11 位手机号,用于识别用户 |
name | Body | 可选 |
employeeNo | Body | 可选工号。不参与登录,仅便于客服检索(写入用户备注) |
returnUrl | Body | 可选,支付完成回你们页面;域名须事先报备白名单 |
target | Body | 可选落地,取值大写。取值与是否参与签名见下表。 |
target 取值
| 值 | 落地与签名 |
|---|---|
| (不传) | 商城首页;不参与签名 |
MALL | 同样进首页,但 target=MALL 要参与签名(和「不传」不是同一段原文,对接时请写死一种) |
TB_SHANGOU | 淘宝闪购(须书面开通,否则换票失败) |
FILM | 影票(须书面开通) |
VOUCHER | 券码(须书面开通) |
VIPSAVE | 六六猴(须书面开通) |
签名
- 取 JSON 顶层非空标量(不含 sign、不含空字符串)+ Header 约定的
timestamp、app_key - 按 key 字母序拼接
k=v,用&连接 - 末尾追加
&app_secret={embed_app_secret} - 对该字符串做 UTF-8 HMAC-SHA256(密钥为 embed_app_secret),结果小写 hex,放入
X-Sign X-Timestamp与服务器相差超过 300 秒会拒绝
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 编码;验签用解码后的字段值。
| 参数 | 必填 | 说明 |
|---|---|---|
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支付入账
| 字段 | 位置 | 说明 |
|---|---|---|
X-App-Key / X-Timestamp / X-Sign | Header | 与换票相同 |
outTradeNo | Body | 跳转时同一单号 |
amountFen | Body | 必须与落库实付分全等,否则拒绝 |
status | Body | 仅 SUCCESS 入账 |
payTradeNo | Body | 建议,你们的支付流水 |
payTime | Body | 可选,Unix 秒 |
{
"outTradeNo": "orderxxxxxxxx",
"amountFen": "561",
"status": "SUCCESS",
"payTradeNo": "你们的流水号",
"payTime": "1728000000"
}
参与签名:Body 非空标量 + app_key + timestamp。
支付查询(对账用;改单只认 notify)
Header 同上。签名字段:outTradeNo + app_key + timestamp。返回 UNPAID / PAID / CANCELLED,以及 amountFen、payTradeNo、paidTime。
退款结果通知
售后是否同意、退多少由我们后台决定。我们会先 POST 你们书面登记的退款地址(带我方签发的 refundNo),你们退完再打本接口。没有我方 refundNo 的通知会被拒绝。
| 字段 | 位置 | 说明 |
|---|---|---|
| 签名头 | Header | 同支付 notify |
outTradeNo | Body | 须与退款单一致 |
refundNo | Body | 须是我们签发过的号 |
refundAmountFen | Body | 须与退款单金额全等 |
status | Body | SUCCESS 入账;FAILED 记失败,订单保持退款中 |
refundTradeNo | Body | 建议,你们的退款流水 |
reason | Body | 可选。失败原因;有值才参与签名 |
SUCCESS / FAILED 重复通知仍回 200。FAILED 不把已成功的单改回去;我们可能用同一个 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 | 租户编码 |
occurredAt | Unix 秒 |
payTradeNo | 有则带 |
deliveryName / deliveryId | 发货时带快递公司、运单号 |
refundNo / refundAmountFen | 退款相关状态才带 |
| 何时推 | status |
|---|---|
| 支付入账成功 | PAID |
| 用户取消或超时关单 | CANCELLED |
| 发货成功 | SHIPPED |
| 用户确认收货 | COMPLETED |
| 你们退款接口收下(code=200) | REFUNDING |
| 你们 refund/notify 为 SUCCESS | REFUNDED |
开通与验收
联系开通工单里的对接运营。请准备:机构名称、联系人、中台租户编号(没有则新建)、测试手机号、跳回域名(若需要 returnUrl)、希望首页出现的品类/品牌(闪购等需另开资质)。
开通嵌入前:走我方收银台须积分或支付宝至少一种可用;走租户收银台则登记你们的 HTTPS 收银地址(退款 / 状态回调测试环境允许 http)。
- 运营开通托管商城、装修与供给,书面下发商城域名、tenant、embed 密钥;直达品牌以开通单勾选为准
- 只嵌商城:换票不要传
target(或按你们约定固定传MALL,两种签名不同,须写死一种),用测试手机号打开entryUrl,确认免登进 DIY 首页 - 要在首页露出闪购等:须开通对应入口且装修里已有该图标;未开通的图标不会出现在嵌入首页
- 要换票直达某品牌:须开通单已包含该
target后再联调;不要对未开通项自行验收 - 我方收银台:走通一笔站内测试单;若传了 returnUrl,确认支付成功后回到你们页面且带
orderNo - 租户收银台:跳转链验签通过 → 服务端 notify 入账 → 只开 returnUrl 不能改单 → 后台同意退款后能收到 refundNo 并回 SUCCESS
- 验收通过前不要把链接发给全部员工
文档版本 v0.7,2026-09-29。换票免登、可选 target、租户收银台(跳转验签、支付/退款通知与查询、退款申请与订单状态)。商城域名与密钥以书面为准;某家的收银/退款 URL 不写在本文。