熠能支付

下级商户接入说明 — 本文档列出你需要对接的全部开放接口、签名规则与调起方式。商户系统只需对接熠能,无需直连汇付。

开放 API HMAC-SHA256 APP / H5 支付

1. 接入概览

运营创建开放商户凭证(appId) 商户标准进件 → 审核通过(READY) 商户服务端 --HMAC--> 熠能开放 API(/v1) --通道--> 汇付天下 汇付异步通知 --> 熠能 --> 商户 notifyUrl(HMAC)
  1. 向熠能获取 appId / appSecret(此时不可交易)
  2. 走标准进件:上传图 → 入驻 → 业务开通 → 实名
  3. progress.ready=true 后统一下单
  4. 接收异步通知;必要时查单 / 退款

演示商户:yn_demo_merchant / demo_secret_change_me。Swagger:/doc.html

2. 签名鉴权

所有 /v1/** 请求必须带:

Header说明
X-Yn-App-IdappId
X-Yn-Timestamp毫秒时间戳
X-Yn-Nonce随机串
X-Yn-SignHMAC-SHA256 hex

待签名字符串

{appId}
{timestamp}
{nonce}
{METHOD}
{path}
{sha256Hex(body)}

Sign = hex(hmac_sha256(appSecret, 上述字符串))。GET 无 body 时对空字节做 SHA256。path 示例:/v1/payments/create

3. 接口清单

方法路径说明
POST/v1/onboard/files图片上传
POST/v1/onboard/enterprise企业入驻
POST/v1/onboard/individual个人入驻
GET/v1/onboard/apply-status申请单状态
POST/v1/onboard/business-open业务开通
POST/v1/onboard/wechat/config微信配置
POST/v1/onboard/wechat/realname微信实名
GET/v1/onboard/wechat/realname-status微信实名状态
POST/v1/onboard/alipay/realname支付宝实名
GET/v1/onboard/alipay/realname-status支付宝实名状态
GET/v1/onboard/progress进件总进度
POST/v1/payments/create统一下单
GET/v1/payments/{outTradeNo}查单
POST/v1/payments/{outTradeNo}/close关单
POST/v1/refunds退款
GET/v1/refunds/{outRefundNo}退款查询

4. 标准进件(必走)

所有新商户必须走标准进件。先拿凭证,再按序调用:

files → enterprise/individual → apply-status → business-open → apply-status → wechat/config + realname(如需) → alipay/realname(如需) → progress.ready = true

上传影像

POST /v1/onboard/files
{ "fileType":"F01", "fileName":"license.jpg", "fileBase64":"..." }

企业入驻

POST /v1/onboard/enterprise
{
  "requestNo": "REG001",
  "payload": { "reg_name":"某某科技", "license_code":"...", "card_info":{} }
}

个人入驻用 /v1/onboard/individual。详细字段透传斗拱官方文档。GET /v1/onboard/progress 查看是否 ready

5. 统一下单

POST /v1/payments/create
{
  "outTradeNo": "M202607260001",
  "amount": 0.01,
  "subject": "测试商品",
  "channel": "WECHAT_APP",
  "clientIp": "1.2.3.4",
  "notifyUrl": "https://merchant.example.com/yineng/pay-notify",
  "extra": { "openid": "oXXXX" }
}
channel关键返回客户端
WECHAT_APPpayInfowx.requestPayment
ALIPAY_APPqrCode / jumpUrl打开支付宝
UNIONPAY_ONLINE_CASHIERunionOrderNo银联 SDK
QUICK_PAY_PAGEformHtml / payUrlWebView
MOBILE_WAPformHtml / payUrlWebView

同步成功只表示受理;支付终态以异步通知为准。

6. 查单 / 关单

GET /v1/payments/{outTradeNo} — 未终态会同步通道。

POST /v1/payments/{outTradeNo}/close — 仅微信/支付宝;已支付不可关。

7. 退款

POST /v1/refunds
{
  "outTradeNo": "M202607260001",
  "outRefundNo": "R202607260001",
  "amount": 0.01,
  "reason": "用户取消"
}

查询:GET /v1/refunds/{outRefundNo}

8. 异步通知(熠能 → 商户)

向你的 notifyUrl POST JSON,Header 同请求签名规则;验签 path 固定 /pay/notify,密钥用 notifySecret

{
  "outTradeNo": "M202607260001",
  "tradeNo": "YN...",
  "status": "SUCCESS",
  "amount": 0.01,
  "channel": "WECHAT_APP",
  "hfSeqId": "..."
}

务必:验签、幂等、快速返回 2xx;丢失时用查单兜底。

9. 错误码

code含义
0成功
40000参数错误
40100签名失败
40300商户/渠道不可用
40400不存在
40900冲突
50200通道错误
50000系统繁忙

本地 mock 模拟成功:POST /internal/mock/payments/{outTradeNo}/success