邮件发送通知

业务场景

通知CP服务端,在游戏内给指定角色发送无附件的邮件

注意事项

接口需要注意验签,防止恶意请求

接口地址

地址由CP提供

接口说明

  1. 协议:HTTPS
  2. 方式:POST
  3. ContentType:application/json;charset=utf-8
  4. 请求报文:
字段类型必需参与签名说明
gameIdlongSDK的项目ID(并非出包的appId)
serverIdstring游戏区服ID
roleIdstring游戏角色ID
appointMessageobject不一定指定消息
mailMessageListobject[]邮件列表
timestamplong毫秒时间戳
signstring签名

appointMessage 和 mailMessageList 的结构体

字段类型必需说明
mailTitlestring邮件标题
mailContentstring邮件内容
senderstring邮件发送者
languagestring语言代码
  1. 响应报文:
字段类型必需说明
codeint响应状态码, 0代表成功
msgstring响应描述

请求示例

{
	"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": "成功"
}

签名规则

  1. 参数名区分大小写,按 ASCII 码从小到大排序(字典序)
  2. 只有值为 null 和 参数名不参与签名 的键值对,才不参与签名
  3. 使用 URL 键值对的格式,拼接成待签名字符串,签名 key 在最后拼接,再进行MD5计算
  4. 将生成的签名与入参 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