package test const TestMd = `# **蓝色兄弟营销开放API V3**\n\n## 接入流程\n\n1. **注册开发应用账号**:联系平台商务或技术支持,提交接入申请。\n2. **获取应用接入信息**:创建应用成功后,可获取应用 ID、应用私钥配置要求、平台公钥及业务加密 Key。\n3. **阅读接口文档**:仔细阅读本文档中的接口说明,确认请求加密、签名、响应解密方式。\n4. **联调测试**:在正式使用前,完成单发、查询、作废、批量、异常场景验证。\n\n### 环境配置\n\n测试环境地址:https://gateway.dev.cdlsxd.cn\n\n正式环境地址:https://market.api.86698.cn\n\n### 测试参数\n\n# 客户应用id\napp\\_id: \"xxx\"\n# 应用客户私钥,用于请求签名\nprivate\\_key: \"xxx\"\n# 应用平台公钥,用于平台响应或回调验签\npublic\\_key: \"xxx\"\n# 业务参数加密key\nkey: \"xxxx\"\n# 活动编号\nactivity\\_no: \"xxxx\"\n# 签名类型\nsign\\_type: \"RSA\"\n\n## 概述\n\n### v1 接入说明\n\nv1 版本统一采用 ciphertext 传输业务报文,默认接入方式与现有开放 API 保持一致。\n\n### 业务参数\n\n将业务参数去掉“零”值的参数再由小到大按照字母排序再转成json字符串得到plaintext\n再使用应用key将plaintext字符串加密[aes(ECB模式)/sm4(CBC模式)]得到加密业务参数ciphertext\n\n### 签名规则\n\n拼接签名字符串:分配给开发者的应用ID + 发送请求的时间 + 加密业务参数\n使用私钥将拼接待签名字符串生成签名字符串\n\n### 回调验签\n\n获取header头里面的签名信息\n获取body里面的业务参数data\n将业务参数data去掉“零”值的参数再由小到大按照字母排序再转成json字符串得到plaintext\n再使用应用key将plaintext字符串加密[aes/sm4]得到加密得到ciphertext\n拼接签名字符串:分配给开发者的应用ID + 发送请求的时间 + ciphertext\n使用应用公钥验签\n\n备注:相关业务参数加密规则,验签demo等请联系平台技术人员\n\n### 请求模式\n\nv1 统一采用 Header 鉴权模式:\n\n* Header 传:Appid、Timestamp、Sign\n* Body 传:ciphertext\n\n### 响应说明\n\nv1 统一采用严格密文响应模式,业务响应数据通过 ciphertext 返回。\n\n### 时间戳规则\n\n时间格式:yyyy-MM-dd HH:mm:ss\n请求时间与服务端时间误差不能超过 3 分钟\n\n### SDK\n\n开发者可参考以下 SDK:\n\n// Go\nhttps://gitee.com/chengdu\\_blue\\_brothers/ymt-openapi-go-sdk.git\n// Java\nhttps://codeup.aliyun.com/lsxd/marketing/ymt-openapi-java-sdk.git\n\n### 公共 Header 请求参数\n\n| | | | |\n| --- | --- | --- | --- |\n| **字段名称** | **类型** | **描述** | **示例值** |\n| Appid | string | 分配给开发者的应用 ID | 123456 |\n| Timestamp | string | 发送请求的时间,格式 yyyy-MM-dd HH:mm:ss | 2026-06-22 15:30:00 |\n| Sign | string | 请求签名串 | 详见 SDK 示例 |\n| Content-Type | string | 请求数据格式 | application/json |\n\n#### 公共 Header 请求参数示例\n\n{\n \"Sign\": [\"签名字符串\"],\n \"Appid\": [\"应用ID\"],\n \"Timestamp\": [\"请求时间\"],\n \"Content-Type\": [\"application/json\"]\n}\n\n### 公共请求参数\n\n| | | | |\n| --- | --- | --- | --- |\n| **字段名称** | **类型** | **描述** | **示例值** |\n| ciphertext | string | 请求业务参数加密串 | 详见 SDK 示例 |\n\n#### 公共请求参数示例\n\n{\n \"ciphertext\": \"加密后的业务报文\"\n}\n\n### 公共响应参数\n\n| | | |\n| --- | --- | --- |\n| **字段名称** | **类型** | **描述** |\n| code | int32 | 200 成功 |\n| message | string | 请求描述 |\n| reason | string | 错误原因,错误时返回 |\n| data.ciphertext | string | 业务响应加密串 |\n\n### 公共错误码\n\n| | | | |\n| --- | --- | --- | --- |\n| **code状态码** | **reason** | **错误原因** | **解决** |\n| 500 | PANIC/其它 | 系统错误 | 联系平台处理 |\n| 400 | INVALID\\_PAYLOAD | 请求外壳格式错误 | 请检查请求 JSON 结构 |\n| 400 | MISSING\\_PARAM | 缺少必要参数 | 请检查 app\\_id、timestamp、sign、ciphertext |\n| 400 | INVALID\\_TIMESTAMP | 时间格式错误 | 请检查时间格式 |\n| 400 | DECRYPT\\_FAILED | 业务参数解密失败 | 请检查加密方式与密钥 |\n| 401 | APP\\_NOT\\_FOUND | 应用不存在 | 请检查应用 ID |\n| 401 | INVALID\\_SIGNATURE | 签名错误 | 请检查签名串与私钥 |\n| 401 | EXPIRED\\_TIMESTAMP | 请求已过期 | 请检查客户端时间 |\n| 429 | DUPLICATE\\_REQUEST | 重复请求,请稍后重试 | 请避免短时间内重复提交同一业务号 |\n\n### 业务错误码[汇总]\n\n备注:若出现其它未知状态码,请联系平台技术人员。\n\n| | | | |\n| --- | --- | --- | --- |\n| **code状态码** | **reason** | **错误原因** | **解决** |\n| 401 | ACTIVITY\\_NOT\\_AUTH | 活动未授权 | 请检查活动授权状态 |\n| 401 | MERCHANT\\_NOT\\_EXIST | 客户不存在 | 请检查客户是否存在 |\n| 401 | MERCHANT\\_NOT\\_AUTH | 客户冻结 | 请检查客户授权状态 |\n| 401 | MERCHANT\\_APP\\_INCOMPLETE | 客户应用配置未完善 | 请检查客户应用配置 |\n| 401 | MERCHANT\\_APP\\_NOT\\_AUTH | 应用不存在或未授权 | 请检查客户应用授权状态 |\n| 403 | ACTIVITY\\_EXPIRE | 活动已结束 | 请检查活动是否有效 |\n| 403 | ACTIVITY\\_OUT\\_OF\\_STOCK | 活动剩余量不足 | 请检查活动库存 |\n| 404 | ACTIVITY\\_NOT\\_EXIST | 活动不存在 | 请检查活动编号 |\n| 404 | MERCHANT\\_ORDER\\_NOT\\_EXIST | 订单不存在 | 请检查交易号或外部业务号 |\n| 404 | KEY\\_NOT\\_EXIST | key码不存在 | 请检查订单信息 |\n| 400 | PARAM\\_FAIL | 参数错误 | 请检查业务参数 |\n| 400 | PARAM\\_DECRYPT\\_FAIL | 明文参数格式错误 | 请检查密文解密后的业务报文 |\n\n### 获取券码\n\n* 请求方式:POST\n* Content-Type:application/json\n* 请求路由:/openapi/v1/key/order\n\n#### 业务请求参数\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| **字段名称** | **类型** | **描述** | 是否必填 | **示例值** |\n| out\\_biz\\_no | string | 外部业务号,幂等 | M | 123456 |\n| activity\\_no | string | 活动编号 | M | ACT20260622001 |\n| account | string | 账号,按活动类型透传 | N | 18666666666 |\n| notify\\_url | string | 回调通知地址 | N | https://notify.example.com/openapi |\n\n#### 业务响应参数(解密后)\n\n| | | | |\n| --- | --- | --- | --- |\n| **字段名称** | **类型** | 是否必填 | **描述** |\n| out\\_biz\\_no | string | M | 外部业务号 |\n| trade\\_no | string | M | 交易号 |\n| key | string | N | 卡密 |\n| url | string | N | 链接型活动返回短链接,key/url 不会同时为空 |\n| valid\\_begin\\_time | string | N | 生效时间 |\n| valid\\_end\\_time | string | N | 失效时间 |\n| usable\\_num | uint32 | M | 可用次数 |\n| usage\\_num | uint32 | M | 已使用次数 |\n| status | uint32 | M | 状态:1 正常,2 已核销,3 已作废 |\n| settlement\\_price | float | N | 结算价 |\n| account | string | N | 上报账号 |\n\n#### 请求示例\n\n明文业务参数:\n\n{\n \"out\\_biz\\_no\": \"order\\_001\",\n \"activity\\_no\": \"ACT20260622001\",\n \"account\": \"18666666666\",\n \"notify\\_url\": \"https://notify.example.com/openapi\"\n}\n\n请求体示例:\n\n{\n \"ciphertext\": \"加密后的业务报文\"\n}\n\n#### 响应示例\n\n异常\n\n{\n \"code\": 401,\n \"message\": \"Signature verification failed\",\n \"reason\": \"INVALID\\_SIGNATURE\"\n}\n\n成功\n\n{\n \"code\": 200,\n \"data\": {\n \"ciphertext\": \"加密后的响应报文\"\n },\n \"message\": \"成功\"\n}\n\n解密后示例\n\n{\n \"out\\_biz\\_no\": \"order\\_001\",\n \"trade\\_no\": \"7251449503000383488\",\n \"key\": \"aZKdU9BymzR6qGRzJM\",\n \"url\": \"\",\n \"valid\\_begin\\_time\": \"2026-06-22 15:30:00\",\n \"valid\\_end\\_time\": \"2026-12-31 23:59:59\",\n \"usable\\_num\": 1,\n \"usage\\_num\": 0,\n \"status\": 1,\n \"settlement\\_price\": 9.9,\n \"account\": \"18666666666\"\n}\n\n### 券码查询\n\n* 请求方式:POST\n* Content-Type:application/json\n* 请求路由:/openapi/v1/key/query\n\n#### 业务请求参数\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| **字段名称** | **类型** | **描述** | 是否必填 | **示例值** |\n| out\\_biz\\_no | string | 外部业务号,与 trade\\_no 二选一 | N | order\\_001 |\n| trade\\_no | string | 交易号,与 out\\_biz\\_no 二选一 | N | 7251449503000383488 |\n\n#### 业务响应参数\n\n与“获取券码”响应参数一致。\n\n#### 响应示例\n\n{\n \"code\": 200,\n \"data\": {\n \"out\\_biz\\_no\": \"order\\_001\",\n \"trade\\_no\": \"7251449503000383488\",\n \"key\": \"aZKdU9BymzR6qGRzJM\",\n \"url\": \"\",\n \"valid\\_begin\\_time\": \"2026-06-22 15:30:00\",\n \"valid\\_end\\_time\": \"2026-12-31 23:59:59\",\n \"usable\\_num\": 1,\n \"usage\\_num\": 0,\n \"status\": 1,\n \"settlement\\_price\": 9.9,\n \"account\": \"18666666666\",\n \"ciphertext\": \"\"\n },\n \"message\": \"成功\"\n}\n\n### 券码作废\n\n* 请求方式:POST\n* Content-Type:application/json\n* 请求路由:/openapi/v1/key/discard\n\n#### 业务请求参数\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| **字段名称** | **类型** | **描述** | 是否必填 | **示例值** |\n| out\\_biz\\_no | string | 外部业务号,与 trade\\_no 二选一 | N | order\\_001 |\n| trade\\_no | string | 交易号,与 out\\_biz\\_no 二选一 | N | 7251449503000383488 |\n\n#### 业务响应参数\n\n| | | | |\n| --- | --- | --- | --- |\n| **字段名称** | **类型** | 是否必填 | **描述** |\n| out\\_biz\\_no | string | M | 外部业务号 |\n| trade\\_no | string | M | 交易号 |\n| status | uint32 | M | 3 表示已作废 |\n\n#### 响应示例\n\n{\n \"code\": 200,\n \"data\": {\n \"out\\_biz\\_no\": \"order\\_001\",\n \"trade\\_no\": \"7251449503000383488\",\n \"status\": 3,\n \"ciphertext\": \"\"\n },\n \"message\": \"成功\"\n}\n\n### 批量发卡\n\n* 请求方式:POST\n* Content-Type:application/json\n* 请求路由:/openapi/v1/key/batch\\_order\n\n#### 业务请求参数\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| **字段名称** | **类型** | **描述** | 是否必填 | **示例值** |\n| out\\_biz\\_no | string | 外部业务号,幂等 | M | batch\\_001 |\n| activity\\_no | string | 活动编号 | M | ACT20260622001 |\n| number | int32 | 发卡数量 | M | 100 |\n| notify\\_url | string | 回调通知地址 | N | https://notify.example.com/openapi |\n\n#### 业务响应参数\n\n| | | | |\n| --- | --- | --- | --- |\n| **字段名称** | **类型** | 是否必填 | **描述** |\n| out\\_biz\\_no | string | M | 外部业务号 |\n| trade\\_no | string | M | 交易号 |\n| status | string | M | 任务状态,初始返回 processing |\n\n#### 响应示例\n\n{\n \"code\": 200,\n \"data\": {\n \"ciphertext\": \"加密后的响应报文\"\n },\n \"message\": \"成功\"\n}\n\n解密后示例:\n\n{\n \"out\\_biz\\_no\": \"batch\\_001\",\n \"trade\\_no\": \"7251449503000383499\",\n \"status\": \"processing\"\n}\n\n### 批量查询\n\n* 请求方式:POST\n* Content-Type:application/json\n* 请求路由:/openapi/v1/key/batch\\_query\n\n#### 业务请求参数\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| **字段名称** | **类型** | **描述** | 是否必填 | **示例值** |\n| out\\_biz\\_no | string | 外部业务号,与 trade\\_no 二选一 | N | batch\\_001 |\n| trade\\_no | string | 交易号,与 out\\_biz\\_no 二选一 | N | 7251449503000383499 |\n\n#### 业务响应参数\n\n| | | | |\n| --- | --- | --- | --- |\n| **字段名称** | **类型** | 是否必填 | **描述** |\n| out\\_biz\\_no | string | M | 外部业务号 |\n| trade\\_no | string | M | 交易号 |\n| status | string | M | processing / success / failed |\n| download\\_url | string | N | 批量任务成功后返回下载地址 |\n| zip\\_password | string | N | 批量任务成功后返回压缩包密码 |\n\n#### 响应示例\n\n{\n \"code\": 200,\n \"data\": {\n \"ciphertext\": \"加密后的响应报文\"\n },\n \"message\": \"成功\"\n}\n\n解密后示例:\n\n{\n \"out\\_biz\\_no\": \"batch\\_001\",\n \"trade\\_no\": \"7251449503000383499\",\n \"status\": \"success\",\n \"download\\_url\": \"https://oss.example.com/openapi\\\\_7251449503000383499.zip\",\n \"zip\\_password\": \"123456\"\n}\n\n### 高级能力说明\n\n如客户有特殊签名套件、加密套件适配需求,可通过商户应用 GatewayConfig 做高级配置。\n\n默认接入无需关注该项;如需启用,请联系平台技术人员对接。\n\n### 联调建议\n\n1. 先验证单发、查询、作废三个基础接口。\n2. 再验证批量发卡与批量查询。\n3. 重点验证响应密文解密结果是否正确。\n4. 批量发卡需验证 processing -> success/failed 状态流转。\n5. 批量成功后需验证 download\\_url、zip\\_password 是否可用。`