# 自定义消息API

## 自定义API

消息开放接口，白标对接说明

### 适用场景

* 对于MultiMarket不支持的发送通道（邮件、短信），白标可以自己对接发送通道，并提供对外接口，与MultiMarket进行对接，MultiMarket平台将会按照此文档规范调用此接口；
* MultiMarket提供一套接口对接API，白标需要按此规范提供接口，api规范详见下文。
* 然后在白标管理后台页面（短信账号、邮箱账号页面），新增时选择“自定义”，并配置接口url、公钥（鉴权用）。

### 公私钥规则

非对称加密算法RSA算法,密钥长度1024。

示例：&#x20;

{% code title="" overflow="wrap" %}

```javascript
公钥：MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCa7PS812qm7RMiONbErVCl7fjNtb1gYgQOsaxVOmp/wa0EH8W8QZ3VrtzwF9FbPe9crtES5RHUkV4LNaApk+WDnF6dQ217UnC+S2wb30S7rPMtHBi7DeyRfOqZkDGbsonTM0WW/WMM2eHNBbF4rfAKImzFe2ZkAl2GMHzHXc4aVQIDAQAB

私钥：
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJrs9LzXaqbtEyI41sStUKXt+M21 vWBiBA6xrFU6an/BrQQfxbxBndWu3PAX0Vs971yu0RLlEdSRXgs1oCmT5YOcXp1DbXtScL5LbBvf RLus8y0cGLsN7JF86pmQMZuyidMzRZb9YwzZ4c0FsXit8AoibMV7ZmQCXYYwfMddzhpVAgMBAAEC gYAo3sP9oXKQUNCQYaA+yF4TOAE/+2bXK2RYoASPg1afF2/WO6+FZ2YE/hlo+U+Qm3ku4StkqauX gTXnDSGQdmTAdxh9YO3Aj81qn6VK6tlGkzWcKfcO+NqNyp3AwfF9aSackBi/rLH8GNNQZtoNBy8z Q6KBD2sQQRITuMu7hi4VwQJBANoY3Fi9rIgs3t4JifVMtyZC6Fpi9bEoCLEizZchwTr24P4mcbni 4uV9O0mI9OaqI9nAlet0KVhRaoMxi/ES2nECQQC12ZhxVzHe+wfCyyx/fPMXSr7cwmM1F3lk5IRa /hCXpVc9ncd/n12TNS7lJwVhqc+tBhWP6i3PSEH0hiyp0QglAkEAh/WNj4iWgMGwIazCovezCRgW rxoX3dt+J6bxkTCKvA5hTi57IQ1usu9xwTKusQkJllp3WzOr/pGqm6SMf7loEQJAbf6dJ8lfIAnl atzsIH0aqPcMNYna6i01v2I98LAGp0NaXqnGFxr1ReqAYBlXNvi45mZsum0iomOJiXdzIpCOhQJA AoXt2DlMSrXGIM0j/j56jUKOH0DNsadGned6SORnBiPjGr38eZwTxAIkxsoaPXS+9XJcQ5neWkwc 46caWU1H1Q==
```

{% endcode %}

### API规范

* 我方的调用方式为http post
* 参数使用json格式。
* 需要对参数进行鉴权

以下具体说明短信、邮件的参数，以及鉴权方式。

***

* 邮件参数

{% code title="" overflow="wrap" %}

```json
{
    "pushType":"whatapp",
    "pushId":"whatapp user id",
    "toUser":"18321956010@163.com",
    "trace":"aaaaaaaaaabbbbbbbbbb11111",
    "sign":"Zni/VixZVrxAt2GzIgRetSFub4Kk1C7JQsURlbXDJmHllv4Vr1SfJC66dnk0OPdylf4qlT9UQle+pAcbNKEBjMHkgeucaAG82syPNi18StNTWx+DNPvl1VvUGGJQQw6I7QClaEIefccyXUDqW78+gEIq8i5VNm/eop0bBoPu8Ao=",
    "title":"验证码",
    "content":"【XXXX】您好，您的验证码是847999。",
    "timestamp":1651118320014
}
```

{% endcode %}

参数说明

| 参数        | 类型     | 是否必填项 | 描述            |
| --------- | ------ | ----- | ------------- |
| pushType  | String | 非必填   | 信息推送渠道类型      |
| pushId    | String | 非必填   | 信息推送账号ID      |
| toUser    | String | 必填    | 邮件接收人         |
| trace     | String | 必填    | 全局链路唯一标志      |
| sign      | String | 必填    | 签名            |
| title     | String | 必填    | 标题            |
| content   | String | 必填    | 内容            |
| timestamp | long   | 必填    | 请求发送时间,时间戳，毫秒 |

* 短信参数

{% code title="" overflow="wrap" %}

```json
{
    "pushType":"whatapp",
    "pushId":"whatapp user id",
    "toUser":"18321956010",
    "trace":"aaaaaaaaaabbbbbbbbbb11111",
"sign":"Zni/VixZVrxAt2GzIgRetSFub4Kk1C7JQsURlbXDJmHllv4Vr1SfJC66dnk0OPdylf4qlT9UQle+pAcbNKEBjMHkgeucaAG82syPNi18StNTWx+DNPvl1VvUGGJQQw6I7QClaEIefccyXUDqW78+gEIq8i5VNm/eop0bBoPu8Ao=",
    "content":"【XXXX】您好，您的验证码是847999。",
    "timestamp":1651118320014
}
```

{% endcode %}

参数说明

| 参数        | 类型     | 是否必填项 | 描述            |
| --------- | ------ | ----- | ------------- |
| pushType  | String | 非必填   | 信息推送渠道类型      |
| pushId    | String | 非必填   | 信息推送账号ID      |
| toUser    | String | 必填    | 短信接收人         |
| trace     | String | 必填    | 全局链路唯一标志      |
| sign      | String | 必填    | 签名            |
| content   | String | 必填    | 内容            |
| timestamp | long   | 必填    | 请求发送时间,时间戳，毫秒 |

* 鉴权

1. 对请求参数sign解密，得到结果记为signContent： 1）从请求参数中获取sign字段的值，记为data； 2）使用自己的私钥，记为privateKey; 3) 对data、privateKey进行base64解码：Base64.decodeBase64(data)、Base64.decodeBase64(privateKey)； 4）使用上步base64解码后的两个数据，进行RSA解密，得到字节数组，转为String，记为signContent;
2. 根据请求参数，获取加密原文，记为signContentSource 1）邮件的加密原文：signContentSource=toUser\@timestamp\@trace; 1）短信的加密原文：signContentSource=toUser\@timestamp\@trace;
3. 将加密原文（signContentSource）、解密结果（signContent）进行比较：相等则鉴权通过。

成功响应数据

```json
{
    "msg":"success",
    "code":"200"
}
```
