中商云开放平台 API 文档
首页
中商云购开放平台
首页
中商云购开放平台
  1. 说明
  • 欢迎 👏
  • 说明
    • 接入须知
    • 安全须知
    • 签名生成
    • 库和SDK
  • 开放能力
    • 电影票
    • 大牌点餐
    • 收银台
  • 错误码
    • 业务状态码
  • 数据模型
    • brand
      • 瑞幸
        • RuixingGoodsCar
      • 麦当劳
        • ShopBrandData
        • McDonaldsGoodsCar
        • McDonaldsComboItem
      • DeliveryAddressData
    • movie
      • MovieData
      • CinemaData
      • 演员信息
      • 其他演职人员信息
      • 导演信息
      • 剧照
      • 预告片
      • 影片场次集合
      • SeatsResp
      • OrderData
      • MovieTicketData
首页
中商云购开放平台
首页
中商云购开放平台
  1. 说明

签名生成

商户可以按照下述步骤生成请求的签名,平台会在收到请求后进行签名的验证。如果签名验证不通过,将会拒绝处理请求,并返回相应的业务状态码。

准备#

1、通过商户后台获取 appid 和 mchid。
2、生成 RSA 密钥对,将公钥填写至商户后台,用于平台验签;私钥需妥善保管,用于本地请求签名。
使用 OpenSSL 生成 RSA 密钥对:
生成一个 2048 位 RSA 私钥,保存在 private.pem 文件中。
从 private.pem 中提取对应的 公钥,保存在 public.pem 文件中

构造签名串#

签名串一共有 5 行,每一行为一个参数。行尾以 \n(换行符,ASCII 编码值为 0x0A)结束,最后一行也要加 \n。如果参数本身以 \n 结束,也需要附加一个 \n。
POST\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n
我们以「电影票API > 获取品牌院线」接口为例:
第一步,使用固定的签名路径(不变),无查询参数,直接参与签名。
/serve
第二步,获取发起请求时的系统当前时间戳(秒),即自格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒起至现在的总秒数,作为请求时间戳。平台会拒绝处理很久之前发起的请求,请商户保持自身系统的时间准确。
1745546578
第三步,生成一个 32 位随机字符串。
593BEC0C930BF1AFEB40B4A08C8FB242
第四步,确定请求报文主体(request body)。
{
    "service": "brand",                // 参见接入须知 > service 列表
    "endpoint": "/api/data/cities",    // 对应接口文档里去掉域名的接口路径
    "params": {                        // 对应接口文档中的 Body 参数
        "cityCode": '110000'
    }
}
第五步,按照前述规则,构造的请求签名串为:
POST\n
/serve\n
1745546578\n
593BEC0C930BF1AFEB40B4A08C8FB242\n
{"service":"brand","endpoint":"\/api\/data\/cities","params":{"cityCode":"110000"}}\n

加密签名串#

下面以 PHP 加密过程为例:
加密后示例:
QCwHvoBM9TJ2wokF8hhaoS34P0nkJpYMisBUizpOj5q/77I6+KFPVvFUCaaUiu+KFctisJFU1DfJdCHrLpJIx9CirX5ku3L9TMGihFcEG8MGoh2dwDvunH8JgJOVV9ClSkpXqjad4flSuYMoxPOZqPHr+ktOLZ3pPzs12BMqmbZVNIe+oOezTZsQ8xxxxRgOJzwU/AbouZSl2xto7DcYCjvNSnw7BkuzBFgTfxVXB3+R7e+1SpdeJajuCKGKvYMVTe7slS5j/4LQ4vcr1QqOPhpoemsOV92tPhgQ0iGw3GKpLIEOoDAwy2+ojzP5XERh

拼接签名信息#

签名信息的拼接格式如下:
mchid=商户ID,appid=APPID,nonce=第三步生成的随机字符串,timestamp=第二步生成的时间戳,sign=加密签名串

设置 HTTP 头#

本文档 API 通过 HTTP Authorization 头来传递签名。 Authorization 由认证类型和签名信息两个部分组成,目前 认证类型 仅支持 ZSY-RSA2048-SHA256
Authorization 头的示例如下:(注意,示例因为排版可能存在换行,实际数据应在一行)
Authorization: "ZSY-RSA2048-SHA256 mchid=01960ba3-367f-xxxx-a604-3e4d386dce4a,appid=10000,nonce=593BEC0C930BF1AFEB40B4A08C8FB242,timestamp=1745546578,sign=QCwHvoBM9TJ2wokF8hhaoS34P0nkJpYMisBUizpOj5q/77I6+KFPVvFUCaaUiu+KFctisJFU1DfJdCHrLpJIx9CirX5ku3L9TMGihFcEG8MGoh2dwDvunH8JgJOVV9ClSkpXqjad4flSuYMoxPOZqPHr+ktOLZ3pPzs12BMqmbZVNIe+oOezTZsQ8xxxxRgOJzwU/AbouZSl2xto7DcYCjvNSnw7BkuzBFgTfxVXB3+R7e+1SpdeJajuCKGKvYMVTe7slS5j/4LQ4vcr1QqOPhpoemsOV92tPhgQ0iGw3GKpLIEOoDAwy2+ojzP5XERh"
最终我们可以组一个包含了签名的 HTTP 请求了。
$ curl https://dev-api.open.xinleshan.cn/serve -H "Content-Type: application/json" -H 'Authorization: ZSY-RSA2048-SHA256 mchid=01960ba3-367f-xxxx-a604-3e4d386dce4a,appid=10000,nonce=593BEC0C930BF1AFEB40B4A08C8FB242,timestamp=1554208460,sign=QCwHvoBM9TJ2wokF8hhaoS34P0nkJpYMisBUizpOj5q/77I6+KFPVvFUCaaUiu+KFctisJFU1DfJdCHrLpJIx9CirX5ku3L9TMGihFcEG8MGoh2dwDvunH8JgJOVV9ClSkpXqjad4flSuYMoxPOZqPHr+ktOLZ3pPzs12BMqmbZVNIe+oOezTZsQ8xxxxRgOJzwU/AbouZSl2xto7DcYCjvNSnw7BkuzBFgTfxVXB3+R7e+1SpdeJajuCKGKvYMVTe7slS5j/4LQ4vcr1QqOPhpoemsOV92tPhgQ0iGw3GKpLIEOoDAwy2+ojzP5XERh' -X POST -d '{"service":"brand","endpoint":"\/api\/data\/cities","params":{"cityCode":"110000"}}'
修改于 2025-04-26 03:51:36
上一页
安全须知
下一页
库和SDK
Built with