邮件发送通知
业务场景
通知CP服务端,在游戏内给指定角色发送无附件的邮件
注意事项
接口需要注意验签,防止恶意请求
接口地址
地址由CP提供
接口说明
- 协议:HTTPS
- 方式:POST
- ContentType:application/json;charset=utf-8
- 请求报文:
字段 | 类型 | 必需 | 参与签名 | 说明 |
---|---|---|---|---|
gameId | long | 是 | 是 | SDK的项目ID(并非出包的appId) |
serverId | string | 是 | 是 | 游戏区服ID |
roleId | string | 是 | 是 | 游戏角色ID |
appointMessage | object | 否 | 不一定 | 指定消息 |
mailMessageList | object[] | 否 | 否 | 邮件列表 |
timestamp | long | 是 | 是 | 毫秒时间戳 |
sign | string | 是 | 否 | 签名 |
appointMessage 和 mailMessageList 的结构体
字段 | 类型 | 必需 | 说明 |
---|---|---|---|
mailTitle | string | 是 | 邮件标题 |
mailContent | string | 是 | 邮件内容 |
sender | string | 是 | 邮件发送者 |
language | string | 是 | 语言代码 |
- 响应报文:
字段 | 类型 | 必需 | 说明 |
---|---|---|---|
code | int | 是 | 响应状态码, 0代表成功 |
msg | string | 否 | 响应描述 |
请求示例
{
"gameId": 21573,
"serverId": "40107",
"roleId": "2700033751",
"appointMessage": {
"mailTitle": "title",
"language": "en",
"sender": "sender",
"mailContent": "content"
},
"mailMessageList": [{
"mailTitle": "title",
"language": "en",
"sender": "sender",
"mailContent": "content"
}, {
"mailTitle": "メールタイトル",
"language": "ja",
"sender": "メール送信者",
"mailContent": "メールの内容"
}],
"timestamp": 1750125341047,
"sign": "0d817e03ab22e1e6c883fd8ab6aa966f"
}
响应示例
{
"code": 0,
"msg": "成功"
}
签名规则
- 参数名区分大小写,按 ASCII 码从小到大排序(字典序)
- 只有值为 null 和 参数名不参与签名 的键值对,才不参与签名
- 使用 URL 键值对的格式,拼接成待签名字符串,签名 key 在最后拼接,再进行MD5计算
- 将生成的签名与入参 sign 值作校验,验签忽略大小写
调试示例
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONObject;
import com.google.common.collect.Maps;
import java.util.Map;
import java.util.TreeMap;
public class SignExample {
public static String getMd5Sign(Map<String, Object> params, String appKey) {
TreeMap<String, Object> sortedParams = new TreeMap(params);
StringBuilder builder = new StringBuilder(512);
sortedParams.forEach((k, v) -> {
if (v != null) {
builder.append(k).append("=").append(v).append("&");
}
});
builder.append("key=").append(appKey);
System.out.println(builder.toString());
return SecureUtil.md5(builder.toString());
}
public static void main(String[] args) {
JSONObject mail = new JSONObject();
mail.putOpt("mailTitle", "title");
mail.putOpt("mailContent", "content");
mail.putOpt("sender", "sender");
mail.putOpt("language", "en");
Map<String, Object> params = Maps.newLinkedHashMap();
params.put("gameId", 21573L);
params.put("serverId", "40107");
params.put("roleId", "2700033751");
params.put("appointMessage", mail);
params.put("timestamp", 1750125341047L);
String appKey = "AaBbCcDdEeFfGgHh";
System.out.println(String.format("邮件签名:%s", getMd5Sign(params, appKey)));
}
}
响应状态码
状态码 | 说明 |
---|---|
0 | 成功 |
1000 | 未知错误 |
1001 | 验签失败 |
1002 | 参数缺失 |
10001 | 当前无法发邮件,需要重推 |
10002 | 邮件重复推送 |
10003 | 角色不存在 |
附录
语言 | ISO-639-1代码 |
---|---|
南非荷兰语 | af |
阿尔巴尼亚语 | sq |
阿姆哈拉语 | am |
阿拉伯语 | ar |
亚美尼亚语 | hy |
阿塞拜疆语 | az |
巴斯克语 | eu |
白俄罗斯语 | be |
孟加拉语 | bn |
波斯尼亚语 | bs |
保加利亚语 | bg |
加泰罗尼亚语 | ca |
宿务语 | ceb |
中文(简体) | zh-cn 或 zh |
中文(繁体) | zh-tw |
科西嘉语 | co |
克罗地亚语 | hr |
捷克语 | cs |
丹麦语 | da |
荷兰语 | nl |
英语 | en |
世界语 | eo |
爱沙尼亚语 | et |
芬兰语 | fi |
法语 | fr |
弗里斯兰语 | fy |
加利西亚语 | gl |
格鲁吉亚语 | ka |
德语 | de |
希腊语 | el |
古吉拉特语 | gu |
海地克里奥尔语 | ht |
豪萨语 | ha |
夏威夷语 | haw |
希伯来语 | he 或 iw |
印地语 | hi |
苗语 | hmn |
匈牙利语 | hu |
冰岛语 | is |
伊博语 | ig |
印度尼西亚语 | id |
爱尔兰语 | ga |
意大利语 | it |
日语 | ja |
爪哇语 | jv |
卡纳达语 | kn |
哈萨克语 | kk |
高棉语 | km |
卢旺达语 | rw |
韩语 | ko |
库尔德语 | ku |
吉尔吉斯语 | ky |
老挝语 | lo |
拉丁文 | la |
拉脱维亚语 | lv |
立陶宛语 | lt |
卢森堡语 | lb |
马其顿语 | mk |
马尔加什语 | mg |
马来语 | ms |
马拉雅拉姆文 | ml |
马耳他语 | mt |
毛利语 | mi |
马拉地语 | mr |
蒙古文 | mn |
缅甸语 | my |
尼泊尔语 | ne |
挪威语 | no |
尼杨扎语(齐切瓦语) | ny |
奥里亚语(奥里亚) | or |
普什图语 | ps |
波斯语 | fa |
波兰语 | pl |
葡萄牙语(葡萄牙、巴西) | pt |
旁遮普语 | pa |
罗马尼亚语 | ro |
俄语 | ru |
萨摩亚语 | sm |
苏格兰盖尔语 | gd |
塞尔维亚语 | sr |
塞索托语 | st |
修纳语 | sn |
信德语 | sd |
僧伽罗语 | si |
斯洛伐克语 | sk |
斯洛文尼亚语 | sl |
索马里语 | so |
西班牙语 | es |
巽他语 | su |
斯瓦希里语 | sw |
瑞典语 | sv |
塔加路语(菲律宾语) | tl |
塔吉克语 | tg |
泰米尔语 | ta |
鞑靼语 | tt |
泰卢固语 | te |
泰文 | th |
土耳其语 | tr |
土库曼语 | tk |
乌克兰语 | uk |
乌尔都语 | ur |
维吾尔语 | ug |
乌兹别克语 | uz |
越南语 | vi |
威尔士语 | cy |
班图语 | xh |
意第绪语 | yi |
约鲁巴语 | yo |
祖鲁语 | zu |