一.登录官网,下载http接入文档

官网地址为:云mas业务平台

二.创建http短信接口

登录中国移动云mas平台,新建短信接口:

新建短信接口(简称SMS接口),是为集团客户创建可以使用接口发送短信的用户。该用户只能通过指定协议(CMPP2.0、CMPP2.0s、CMPP3.0、SDK、HTTP)连接网关,连接网关成功后,该用户可以通过接口进行发送短信。

业务流程:

用户名:若指定为协议,则用户名不可重名,必须唯一;若指定为sdk,则用户名可重名。限制6位字符

用户密码:6-20位字符组成。

IP地址:是接入用户的IP地址,用来鉴权用户的,这个IP地址暂时没有使用

所属分组:所属分组记录当前用户所在组织架构。

生效|失效日期:非必填字段,不填为永久有效

协议:五种选择方式,CMPP2.0、CMPP2.0s、CMPP3.0、SDK、HTTP。选择SDK、HTTP时,不需要对用户名重名做全局校验;选择CMPP2.0、CMPP2.0s、CMPP3.0协议时,需要对用户名是否重名做校验。
回执状态: SMS接口用户是否接收回执,若选择开通则在发送成功时,会发送回执状态报告
SDK状态:只对当前SDK用户可用。开启代表当前SDK用户可用,关闭代表SDK用户不可用。
安全认证:IP白名单认证,暂未生效。

三.java开发工具类

1.根据文档编写对应实体类

SendReq.java:

/**集团客户名称*/
private String ecName;
/**用户名*/
private String apId;
/**密码*/
private String secretKey;
/**手机号码逗号分隔。(如“1813728****,1813728****,1813728****”)*/
private String mobiles;
/**发送短信内容*/
private String content;
/**网关签名编码,必填,签名编码在中国移动集团开通帐号后分配,可以在云MAS网页端管理子系统-SMS接口管理功能中下载。*/
private String sign;
/**扩展码,根据向移动公司申请的通道填写,如果申请的精确匹配通道,则填写空字符串(""),否则添加移动公司允许的扩展码。*/
private String addSerial;
/**按文档要求加密后的mac*/
private String mac;
// 省略get set方法

SendRes.java:

/**响应状态码*/
private String rspcod;
/**消息批次号,由云MAS平台生成,用于验证短信提交报告和状态报告的一致性(取值msgGroup)注:如果数据验证不通过msgGroup为空*/
private String msgGroup;
/**数据校验结果*/
private boolean success;
// 省略get set方法

2.短信发送工具类

package demo.krt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Calendar;import org.apache.commons.codec.binary.Base64;import com.alibaba.fastjson.JSON;/*** @version 1.0* @Author: lyp* @Date: 2021/2/27 15:09*/
public class SMSUtils {/**账号*/private static String apId = "";/**密码*/private static String secretKey = "";/**集团名称*/private static String ecName = "";/**网关签名编码*/private static String sign = "";/**拓展码(可以为空)*/private static String addSerial = "";/**url*/private static String url = "http://112.35.1.155:1992/sms/norsubmit";/*** 多用户发送短信信息** @param mobiles 手机号码逗号分隔* @param content 短信内容* @return 返回1表示成功,0表示失败* @throws IOException*/public static boolean sendMsg(String mobiles, String content) throws IOException {SendReq sendReq = new SendReq();sendReq.setApId(apId);sendReq.setEcName(ecName);sendReq.setSecretKey(secretKey);sendReq.setContent(content);sendReq.setMobiles(mobiles);sendReq.setAddSerial(addSerial);sendReq.setSign(sign);StringBuffer stringBuffer = new StringBuffer();stringBuffer.append(sendReq.getEcName());stringBuffer.append(sendReq.getApId());stringBuffer.append(sendReq.getSecretKey());stringBuffer.append(sendReq.getMobiles());stringBuffer.append(sendReq.getContent());stringBuffer.append(sendReq.getSign());stringBuffer.append(sendReq.getAddSerial());sendReq.setMac(Md5Util.MD5(stringBuffer.toString()).toLowerCase());String reqText = JSON.toJSONString(sendReq);// BASE64编码String encode = Base64.encodeBase64String(reqText.getBytes("UTF-8"));System.out.println(encode);String resStr = sendPost(url, encode);System.out.println("发送短信结果:" + resStr);SendRes sendRes = JSON.parseObject(resStr, SendRes.class);if (sendRes.isSuccess() && !"".equals(sendRes.getMsgGroup()) && "success".equals(sendRes.getRspcod())) {return true;} else {return false;}}/*** main方法测试发送短信,返回1表示成功,0表示失败** @param args* @throws IOException*/public static void main(String[] args) throws IOException {String msg = "这是发送短信的内容!";sendMsg("186****7603", msg);}/*** 向指定 URL 发送POST方法的请求** @param url   发送请求的 URL* @param param 请求参数* @return 所代表远程资源的响应结果*/private static String sendPost(String url, String param) {OutputStreamWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);URLConnection conn = realUrl.openConnection();conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("contentType", "utf-8");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");conn.setDoOutput(true);conn.setDoInput(true);out = new OutputStreamWriter(conn.getOutputStream());out.write(param);out.flush();in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += "\n" + line;}} catch (Exception e) {e.printStackTrace();} finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result;}}

3.md5加密工具类(32位)

package demo.krt;import java.security.MessageDigest;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;/*** @version 1.0* @Author: lyp* @Date: 2021/2/27 15:11*/
public class Md5Util {static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};/*** 生成MD5码** @param plainText 要加密的字符串* @return md5值*/public final static String MD5(String plainText) {try {byte[] strTemp = plainText.getBytes("UTF-8");MessageDigest mdTemp = MessageDigest.getInstance("MD5");mdTemp.update(strTemp);byte[] md = mdTemp.digest();int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {return null;}}/*** 生成MD5码** @param plainText 要加密的字符串* @return md5值*/public final static String MD5(byte[] plainText) {try {byte[] strTemp = plainText;MessageDigest mdTemp = MessageDigest.getInstance("MD5");mdTemp.update(strTemp);byte[] md = mdTemp.digest();int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {return null;}}/*** 先进行HmacSHA1转码再进行Base64编码** @param data 要SHA1的串* @param key  秘钥* @return* @throws Exception*/public static String HmacSHA1ToBase64(String data, String key) throws Exception {SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");Mac mac = Mac.getInstance("HmacSHA1");mac.init(signingKey);byte[] rawHmac = mac.doFinal(data.getBytes());return Base64.encodeBase64String(rawHmac);}/*** 校验MD5码** @param text 要校验的字符串* @param md5  md5值* @return 校验结果*/public static boolean valid(String text, String md5) {return md5.equals(MD5(text)) || md5.equals(MD5(text).toUpperCase());}/*** @param params* @return*/public static String MD5(String... params) {StringBuilder sb = new StringBuilder();for (String param : params) {sb.append(param);}return MD5(sb.toString());}}

四.注意(有坑)

apId和secretKey一般不会搞错,

但是集团名称ecName一定要写对,否则就会提示{“msgGroup”:”“,”rspcod”:”InvalidUsrOrPwd”,”success”:false},无效的用户名和密码,

还有一个就是mac字段sendReq.setMac(Md5Util.MD5(stringBuffer.toString()).toLowerCase());

MD5加密过后一定要把它变成小写.toLowerCase(),否则也会出错。

MD5加密过程中一定要注意字符编码,不同的字符编码加密后结果可能不一,例:

Smsa.1867603测试短信发送UsL
760f8998451f7f94d4ac1344094*****

Smsa.1867603测试短信发送UsL
41b48561faf3411b407110f9445*****

看起来完全一样,加密后结果却不一样,导致mac校验失败

加密前指定字符编码:

byte[] strTemp = plainText.getBytes(“UTF-8”);

五.其他问题排查请查阅官方文档

中国移动云mas短信对接(http)相关推荐

  1. 中国移动云mas短信对接(webservice)

    额,我也不知道弄撒类,移动短信和我这么有缘,对接完http的后来又说因为种种原因不能用,又要重新对接过webservice版本的,没办法,谁叫咱是打工人呢,话不多说,直接开整 一.登录官网,下载web ...

  2. Java+Demo对接中国移动 云MAS短信发送(http协议详解,新测成功!)

    一.登录官网,下载http接入文档(随着官网不断更新,可参考官网的文档) 官网地址为:云mas业务平台 进入云MAS管理平台,找到 管理-接口管理 的列表页. (必读:本文对接方式是 java引用ja ...

  3. java实现移动云mas短信对接

    1.登录自己的云mas账号进入接口管理,申请一个sdk的接口并启用 2.项目中引入移动提供的jar包,注(该拆分包可能与项目jar有冲突,可以自行去掉) 3.编写对接代码,如下 package cli ...

  4. 中国移动云mas短信http协议对接

    我最开始拿到文档也是懵的,想着百度能不能查到,竟然被我查到了,我是按照这篇文章进行编码的.地址:https://www.freesion.com/article/95321371904/,这篇文章已经 ...

  5. 中国移动云MAS平台发送普通短信

    使用中国移动云MAS平台发送普通短信 步骤 1.输入用户名和密码登录中国移动云MAS业务平台. 下载用户操作手册 和 HTTP接口文档 深入了解云MAS 2.在中国移动云MAS业务平台的主页面,点击[ ...

  6. python项目对接腾讯云发送短信

    python项目对接腾讯云发送短信 先安装需要的包 pip install tencentcloud-sdk-python # -*- coding: utf-8 -*- # pip install ...

  7. 中国移动Mas短信平台开发增值服务的一些心得

    Mas短信开发增值服务平台建设 中国移动MAS机的知识本人不是很熟悉,只知道如何使用它和.net开发链接起来做短信发布,下面是我在网上看到的一些介绍: 移动代理服务器 Mobile Agent Ser ...

  8. Java 对接 阿里云 的短信服务完成短信的发送与查询

    一.开通阿里云短信服务,为开发时需要用到的信息做准备 1.注册或者使用自己的支付宝账号登录阿里云官网 2.搜索并找到短信服务,进行开通(开通是不要钱的,发送短信的时候才需要钱) 3.注册自己的短信签名 ...

  9. 对接阿里云平台短信接口

    现在做的小程序,需要给客户手机发送短信验证码,用的是阿里云的短信平台 首先要搞好短信模板,签名之类的,这个就相当于发送的短信主体内容,其中验证码部分是我们自己定义的,这个要审核通过了才行 然后在下图, ...

最新文章

  1. linux chcon命令 修改对象(文件)的安全上下文
  2. boost::histogram::detail::accumulator_traits用法的测试程序
  3. mysql数据备份与恢复_MySQL数据备份与恢复
  4. 从P560小型机B181201B故障代码识别手把手详解
  5. C++中如何判断文件是否存在
  6. excel 第六次人口普查_excel 第六次人口普查_第六次全国人口普查表短表
  7. 点云应用于电力行业助力输配电安全距离检测分析以及精细化巡检
  8. Cocos2d-x制作《单机斗地主》源码解剖5:玩家的出牌
  9. Excel / WPS 下拉选择数据
  10. 自己搭建微信小程序服务器,微信小程序搭建自己的Https服务器
  11. FortiClient VPN连接至98%时报错:Unable to establish the VPN connection.(E=98,T-981011001,M99,R10)
  12. 轮回 第二章 冷傲天
  13. Hypothesis Test Overview
  14. 用Python破解摩斯密码
  15. 通用的综合大数据数据可视化展示html页面源码
  16. left join的基本用法以及on与where的区别
  17. 蓝魔法师——树形DP
  18. 【Three.js入门】纹理加载进度、环境贴图、经纬线映射贴图与高动态范围成像HDR
  19. python versions compatibility_有人通过Macports在Snow Leopard中安装了python26...
  20. config类和config助手函数

热门文章

  1. 50岁的程序员该何去何从
  2. frida hook svc调用
  3. python好学吗-非科班出身自学Python好学吗?
  4. 【将门创投】图像搜索的前世今生,让你买买买停不下来的淘宝是如何做到所拍即所得的?...
  5. 正点原子开发板STM32F407ZG-基于AD7606进行八路数据采集
  6. android cad插件下载,CAD看图大师下载
  7. 2013年MBA、MPA、MPAcc入学考试英语辅导教材
  8. macOS下快速复制文件或文件夹路径
  9. 记录有关移动短信知识
  10. Linux中的虚拟机图形界面安装步骤,批量完成虚拟机硬件配置