在医疗、金融等行业系统中,短信验证码已成为身份核验的标配功能。最近在对接某医学教育平台的短信系统时,我完整实现了基于中国移动MAS平台的HTTP短信接口。这套方案不仅支持普通短信发送,还能通过模板ID发送格式化内容,特别适合需要固定文案的业务场景。
选择HTTP协议对接MAS平台主要基于三点考虑:
核心依赖库包括:
实际开发中发现,移动MAS接口要求所有参数必须经过Base64编码传输,且需要计算MD5校验码(MAC)作为防篡改机制。这种设计虽然增加了些微开发成本,但显著提升了接口安全性。
移动MAS的认证流程包含三个关键要素:
以普通短信接口为例,MAC的计算逻辑如下:
java复制StringBuffer mac = new StringBuffer();
mac.append(ecName).append(apId).append(secretKey)
.append(mobiles).append(content).append(sign);
String encode = DigestUtils.md5DigestAsHex(mac.toString().getBytes());
核心参数说明:
| 参数名 | 示例值 | 作用 |
|---|---|---|
| ecName | 医学科技教育发展中心 | 企业备案名称 |
| apId | lck***01 | 接入账号 |
| mobiles | 13800138000 | 接收号码(多个用逗号分隔) |
| content | 您的验证码是1234 | 短信内容 |
| sign | JA***2naoi | 签名编号 |
完整调用流程:
关键代码片段:
java复制String url = "http://112.35.1.155:1992/sms/norsubmit";
String response = HttpRequest.post(url)
.body(base64Payload)
.contentType("application/json")
.timeout(5000)
.execute()
.body();
模板短信的优势在于:
实现要点:
示例模板配置:
code复制模板ID:acc89f4b5bfd4a02a1fb4f3a0d4d8177
模板内容:您正在登录系统,验证码为{1},5分钟内有效
参数传递方式:
java复制String[] params = {"6789"}; // 对应模板中的{1}
smsSubmitDTO.setParams(JSON.toJSONString(params));
密钥管理:
properties复制# application.properties
mas.apid=lckj02
mas.secret=${KMS_DECRYPT_KEY}
请求防重放:
内容过滤:
连接池配置:
java复制// Hutool全局配置
HttpRequest.setGlobalTimeout(3000);
PooledHttpClient httpClient = new PooledHttpClient();
httpClient.setMaxConnections(100);
异步发送模式:
java复制CompletableFuture.runAsync(() -> {
SmsUtil.httpSmsTemplate(mobile, code);
}, threadPool);
失败重试机制:
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| -1 | 参数错误 | 检查MAC计算逻辑 |
| -6 | 账号不存在 | 核对ApID和ECName |
| -10 | 余额不足 | 联系客户经理充值 |
| -11 | 流量控制 | 降低发送频率 |
日志记录要点:
java复制logger.info("Request MAC: " + macStr);
logger.info("Base64 Payload: " + base64Payload);
logger.info("Raw Response: " + response);
使用TCPDump抓包:
bash复制tcpdump -i eth0 -w mas.pcap port 1992
模拟测试工具:
java复制// 使用Mock Server测试异常场景
@Test
public void testTimeout() {
String mockUrl = "http://localhost:8089/mock/mas";
// 设置500ms延迟
mockServer.whenRequestTo(mockUrl).respondWithDelay(500);
}
医嘱提醒短信:
code复制尊敬的{1}患者,请于{2}服用{3},每次{4}粒
检验报告通知:
批量发送接口:
消息队列集成:
java复制@KafkaListener(topics = "sms-task")
public void handleSmsTask(SmsRecord record) {
smsService.sendBatch(record);
}
这套实现方案在某三甲医院系统稳定运行两年多,日均发送量约3000条。最关键的经验是:一定要在MAC计算环节做好参数顺序校验,我们曾因调整参数顺序导致全线短信发送失败。现在团队内部维护着详细的接口文档,每个新成员都要通过测试用例才能提交短信相关代码