1. 接口定位
SDK 接入
适合大部分商户。商户嵌入 SDK 页面/组件,SDK 负责商品展示、下单参数收集和部分体验封装。测试联调请登录商户后台操作。
面向:商户前端 + 商户后台配置
OpenAPI 接入
适合有自研后端能力的商户或系统级合作方。使用 AppId/AppSecret/HMAC 签名调用商品、余额、下单、查单接口。
面向:商户服务端/合作方系统
结论:这些接口是“对授权商户开放的外部能力”,但不是给普通 C 端用户裸调。C 端用户在商户页面付款,商户确认收款后再通过 SDK/OpenAPI 通知平台履约。联调测试统一放在商户后台,避免公开文档暴露测试工具。
2. 完整业务流程
资金安全 当前测试环境已经采用冻结/确认/解冻机制,不再直接扣款后再履约。
价格体系与调价规则
平台采用三层价格治理,商户端展示和下单金额必须以平台后端快照为准,不能相信前端裸传金额。
三层价格
- 服务成本价:平台向权益供应商采购/结算的底价,仅平台内部可见。
- 平台基准结算价:平台给商户的默认结算价,必须大于等于服务成本价,是平台毛利底线。
- 商户零售价:商户展示给用户并向用户收款的价格,必须大于等于商户结算价。
价格安全底线
- 平台基准结算价 >= 服务成本价。
- 商户结算价 >= 平台基准结算价。
- 用户支付价/商户零售价 >= 商户结算价。
- 发现倒挂、空价格、过期报价时,平台会拒单或回退到安全建议价。
价格模式
| 模式 | 适用场景 | 下单要求 |
|---|---|---|
| 固定价 fixed | 话费、会员、洗车、洁牙、标准权益券等 | 按后台授权价格下单,前端金额仅展示,后端重算。 |
| 动态锁价 quote | 餐饮、商超、酒店、景区、电影、票务等价格波动或SKU组合类 | 先由平台后端查询真实商品并生成 quoteId,再用 quoteId 创建订单;quoteId短期有效。 |
| 实时/H5价 h5 | 打车、外跳H5、展码付、第三方收银等实时场景 | 用户在实时页面完成选品/支付,平台按回调和订单快照核验。 |
商户调价边界
- 商户可在平台授权范围内设置零售价、建议价、最低价、最高价。
- 低于结算价的零售价不允许保存;已存在历史倒挂数据会被治理脚本拉回安全价。
- 动态价产品不允许商户自行填写最终履约价,必须使用 quoteId 或平台实时价格快照。
- 建议零售价默认按平台基准结算价加合理毛利生成,后续可按商户等级、行业、城市、活动配置差异化规则。
3. SDK 接入路径
4. OpenAPI 接入路径
OpenAPI 给技术型商户/合作方后端使用。所有核心接口需要签名。
| 接口 | 方法 | 用途 |
|---|---|---|
/openapi/v1/product/list | GET | 查询授权商品 |
/openapi/v1/balance/query | GET | 查询商户余额/冻结/消费 |
/openapi/v1/order/query | GET | 查询订单 |
/openapi/v1/order/create | POST | 传统 OpenAPI 下单 |
/openapi/v1/sdk/order-create | POST | SDK 模式创建本地待支付订单 |
/openapi/v1/sdk/order-pay | POST | 商户确认收款后支付确认/履约 |
签名规则
METHOD + "\n" + URI_PATH + "\n" + timestamp + "\n" + nonce + "\n" + body sign = Base64URL(HMAC-SHA256(上述原文, app_secret)) 去掉 =
注意:URI 只签 path,不包含 query;timestamp 是秒级;GET body 为空但 nonce 后仍保留换行。
4.1 统一产品接口与智能路由
对外原则:下游客户只接中国道标准产品接口,不按服务通道分别适配。电影票、票务、快递、打车、生活服务 H5 等同一业务产品保持统一请求字段、统一响应字段、统一订单状态、统一错误码和统一回调通知。
后台路由:中国道根据商户授权、产品配置、服务通道可用性、成本价、城市/资源覆盖、接口健康状态、履约成功率和风控策略,在后台自动选择最合适的服务通道。下游文档不暴露服务方私有字段为必接字段,下游客户无需感知具体服务方。
| 标准产品 | 标准入口 | 后台路由能力 | 对外口径 |
|---|---|---|---|
| 电影票 | 中国道电影票标准接口 | 支持多服务通道路由 | 城市、影院、影片、场次、座位、报价、下单、查单字段保持统一;服务方差异由后台适配。 |
| 票务 | 中国道票务标准接口 | 支持当前及后续服务通道扩展 | 城市、航司/车次/票务资源、预订、查单、退款字段保持统一。 |
| 快递 | 中国道快递标准接口 | 支持当前及后续服务通道扩展 | 寄件、收件、重量、保价、价格、下单、轨迹字段保持统一。 |
| 打车 | 中国道打车标准接口 | 支持当前及后续服务通道扩展 | 起点、终点、车型、估价、下单、结算、查单字段保持统一。 |
| 生活服务 H5 | 中国道生活服务 H5 标准入口 | 支持多类生活服务通道路由 | 中国道校验商户授权后返回服务访问地址;客户只处理统一的跳转、订单、支付和回调结果。 |
内部系统可保留服务方名称用于成本、路由、运维和排障;开放平台、SDK 文档和商户接入文档统一使用“标准产品接口 / 服务通道 / 服务访问地址”等中性口径。
4.2 H5 产品入口接口
适用场景:生活服务、权益服务、到店服务、商超、生鲜、票务等已有成熟服务页面的 H5 类产品。
核心模式:下游客户请求中国道标准 H5 入口;中国道校验商户授权、用户参数和产品配置;后台选择服务通道并完成签名;中国道返回服务访问地址 h5Url/url 给下游。客户只需要跳转用户访问,并接收中国道统一订单状态和异步通知。
服务端 OpenAPI 入口(推荐系统对接)
适合客户服务端直接获取单个 H5 访问地址,不依赖浏览器 Origin;必须使用 OpenAPI App 签名。
POST /openapi/v1/h5/entry
Content-Type: application/json
app_id: app_xxx
timestamp: 1783510000
nonce: random16
sign: HMAC_SHA256_BASE64URL
{
"typeCode": "Weg",
"interfaceTypeCode": "weg_interface",
"deliveryMode": "h5_page",
"userId": "merchant-user-001",
"phone": "13800138000",
"outRequestNo": "REQ202607080001"
}签名明文:METHOD + "
" + URI_PATH + "
" + timestamp + "
" + nonce + "
" + body;签名路径为 /openapi/v1/h5/entry,不要带 /prod-api。
H5 订单查询
用户进入 H5 后,商户可按请求号或订单号查询是否已创建中国道订单。
POST /openapi/v1/h5/query
Content-Type: application/json
app_id: app_xxx
timestamp: 1783510000
nonce: random16
sign: HMAC_SHA256_BASE64URL
{
"outRequestNo": "REQ202607080001"
}orderCreated=false 表示用户尚未在 H5 内完成下单回调,属于正常状态。
POST /openapi/v1/h5/payment/notify,标准请求提交中国道 orderNo 和实际支付金额 amount。普通 H5 无需传 quoteId;仅当特殊锁价订单在建单时已经生成并保存该字段,才原样回传。/h5/entry、/h5/query 不返回 quoteId,下游不得自行生成或猜测。中国道校验 AppID 绑定商户、订单归属、IP 白名单、金额、订单已有锁价信息和幂等状态后,按订单冻结配置处理资金并触发服务通道履约。同一 app_id + orderNo 重复通知不会重复扣款或重复履约。公网地址为 https://lukeydao.com/prod-api/openapi/v1/h5/payment/notify,签名路径不带 /prod-api。完整参数、签名及异步通知验签见 H5 商用详细文档。当前可申请的 H5 产品编码
| 产品 | typeCode | interfaceTypeCode | 说明 |
|---|---|---|---|
| 打车 H5 | Taxi | taxi_interface | H5 服务访问入口 |
| 叮咚买菜 H5 | MarketDD | ding_dong_interface | H5 服务访问入口 |
| 图书 H5 | Book | book_v2_interface | H5 服务访问入口 |
| 话费充值 H5 | PrepaidRefill | directcharge_interface | H5 服务访问入口 |
| 水电燃 H5 | Weg | weg_interface | H5 服务访问入口 |
| 美团外卖 H5 | MeituanWaimai | mt_waimai_interface | H5 服务访问入口 |
| 美团团购 H5 | MeituanTuan | mt_canyin_interface | H5 服务访问入口 |
| 小象超市 H5 | FreshMart | mt_maicai_interface | H5 服务访问入口 |
| 电影票 H5 | MovieThree | movie_three_interface | H5 服务访问入口 |
| 飞机票 H5 | AirTicketH5 | domestic_air_tickets_h5_interface | H5 服务访问入口 |
| 火车票 H5 | TrainH5 | train_h5_interface | H5 服务访问入口 |
| 京东 H5 | MarketJDH5 | jd_mall_h5_interface | H5 服务访问入口 |
| 酒店 H5 | HotelH5 | hotel_h5_interface | H5 服务访问入口 |
/h5/entry 返回地址不等于订单已创建或支付已完成。订单创建、支付确认、异步通知、退款/售后需按各产品业务链路单独验收。/h5/entry 只返回服务访问地址,不代表已经创建中国道本地订单。用户在 H5 页面内下单后,上游会通过 createUrl 回调中国道创建 WAIT_PAY 订单;后续支付成功再按产品类型触发 payNotify 或 payCallback。4.3 服务通道接入状态
新增服务能力统一进入中国道后台服务通道路由池。对下游仍按中国道标准产品接口输出,不要求客户直接适配任何服务方私有字段。
| 标准产品 | 通道形态 | 状态 | 说明 |
|---|---|---|---|
| 电影票 | API 标准产品 | ready | 已接入城市、影院、影片、场次、座位、订单参数映射,归入电影票标准能力。 |
| 票务 | API 标准产品 | ready | 按中国道票务标准字段输出。 |
| 快递 | API 标准产品 | ready | 按中国道快递标准字段输出。 |
| 企业打车 | H5 / API 标准产品 | ready | 按中国道打车标准字段输出。 |
| 开放能力总入口 | 内部调试能力 | testing | 仅用于内部接入验证;状态变更动作禁止通过公开查询入口直接触发。 |
5. 客户常用入口
以下仅保留商户接入必须使用的正式入口。
6. 回调与订单状态
订单状态
WAIT_PAY 待商户确认收款 → PAID 已确认 → PROCESSING 履约处理中 → SUCCESS 成功 / CLOSED 失败关闭 / REFUNDED 已退款。
回调要求
商户按 orderNo 做幂等。平台可能因网络失败重试通知,同一订单重复通知不得重复发货/重复退款。
{
"orderNo":"SDK202605201812405703",
"status":"SUCCESS",
"merchantId":1,
"payAmount":"105.00",
"event":"ORDER_SUCCESS"
}7. 异步通知与商户退款责任
平台订单状态变化后,会向商户配置的 notifyUrl 发起异步通知。商户必须按 orderNo + event 做幂等;重复通知只更新状态,不得重复发货或重复退款。
事件口径
| event | 含义 | 商户处理 |
|---|---|---|
ORDER_SUCCESS | 平台履约成功 | 标记订单成功,按业务发放权益/展示成功结果。 |
ORDER_FAIL | 平台履约失败或履约失败,订单关闭 | 标记失败/关闭;若用户已在商户侧支付,商户需按原支付渠道退款给用户。 |
ORDER_REFUND | 退款结果通知 | 仅当 refundStatus=SUCCESS 且 refundAmount>0 时,才可视为退款完成。 |
ADMIN_RETRY | 后台人工重推 | 用于补发通知留痕;业务语义以 payload 中订单状态和履约状态为准。 |
失败退款规则
orderStatus=CLOSED只表示订单关闭,不等于退款成功。upstreamStatus=FAILED表示上游履约失败;平台会回退/解冻商户在平台侧预存款。- 用户支付发生在商户侧时,平台无法替商户原路退用户款;商户收到需退款失败通知后,应自行按原支付渠道退款。
- 商户不得只凭
closed自动退款;必须结合event、upstreamStatus、支付是否已成功、退款字段判断。
通知报文示例
{
"event":"ORDER_FAIL",
"orderNo":"SDK202606131806064067",
"merchantId":37,
"typeCode":"DirectchargeNew",
"orderStatus":"CLOSED",
"payAmount":50,
"userPayAmount":50,
"merchantSettleAmount":50,
"upstreamStatus":"FAILED",
"upstreamErrorMsg":"接口未授权(错误码:...)",
"timestamp":1781416601000
}商户接口返回 SUCCESS 或 HTTP 2xx 仅表示“已接收通知”,不代表用户侧退款完成。
餐饮/券类 quoteId 报价锁价
餐饮、咖啡、兑换券等 SKU 价格不能由前端裸传金额。商户端应先让平台后端重查真实菜单并生成短期 quoteId,再用 quoteId 创建订单。
正式流程
- 查询真实门店和菜单 SKU。
- 调用
POST /openapi/v1/sdk/food/quote?merchantId=3生成报价快照。 - 订单创建只提交
quoteId,不要提交前端计算金额。 - 后端按 Redis 价格快照写入订单金额,保障 quote/order/DB 一致。
星巴克正式服验收样例
商品:双杯美式咖啡
productId:sbk_135533136191685166
价格:43.20
测试订单:TEST202605202018285095
验收:quote = order = DB = 43.20
报价接口
POST /prod-api/openapi/v1/sdk/food/quote?merchantId=3
Content-Type: application/json
{
"merchantId": 3,
"shopType": "XBK",
"shopId": "ff6f2064-8bf7-4f4a-9c83-4bf201714971",
"productId": "sbk_135533136191685166",
"quantity": 1
}下单接口
POST /prod-api/openapi/v1/sdk/order-create?merchantId=3
Content-Type: application/json
{
"merchantId": 3,
"typeCode": "Food",
"testMode": true,
"quoteId": "foodq_xxx",
"phoneNumber": "18100348861"
}安全要求:正式餐饮/券类下单必须使用 quoteId;quoteId 5分钟有效,后续应增加一次性消费、防重放和 SKU 级成本校验。
7. 安全与正式上线
- SDK:必须配置商户域名白名单,避免任意站点盗用 merchantId。
- OpenAPI:必须使用 AppId/AppSecret/HMAC 签名,建议配置 IP 白名单。
- 价格:动态价格/券类/餐饮类必须使用平台后端价格快照
quoteId,不能相信前端裸传金额。 - 资金:正式环境只允许冻结/确认/解冻闭环,不允许回到直接扣款模式。
- 上线:正式环境同步前必须备份代码、JAR、关键表,并重新跑价格/商户/补偿检查。