Java对接云MAS发送短信验证码(HTTPS方式)

Posted 暮商

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java对接云MAS发送短信验证码(HTTPS方式)相关的知识,希望对你有一定的参考价值。

准备阶段

一.官网下载下载对接文档

http://mas.10086.cn/logi

 

 

二.登录云平台配置账户

管理–>接口管理–>新建短信接口建立自己的用户信息

 

 

三.建立好账户后导出证书(用于对接)

 

 

代码编写

代码编写

SendReq.java:

@Data
public class SendReq 
    private String ecName;     //集团客户名称
    private String apId;       //用户名
    private String secretKey;  //密码
    private String mobiles;    //手机号码逗号分隔。(如“18137282928,18137282922,18137282923”)
    private String content;    //发送短信内容
    private String sign;       //网关签名编码,必填,签名编码在中国移动集团开通帐号后分配,可以在云MAS网页端管理子系统-SMS接口管理功能中下载。
    private String addSerial;  //扩展码,根据向移动公司申请的通道填写,如果申请的精确匹配通道,则填写空字符串(""),否则添加移动公司允许的扩展码。
    private String mac;        //API输入参数签名结果,签名算法:将ecName,apId,secretKey,mobiles,content ,sign,addSerial按照顺序拼接,然后通过md5(32位小写)计算后得出的值。

SendRes:

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

SMSClient.java:

import cn.com.smart.api.util.JOSNUtil;
import cn.com.smart.api.util.MD5Util;
import cn.com.smart.common.model.SMS.SendReq;
import cn.com.smart.common.model.SMS.SendRes;
import lombok.Data;
import cn.hutool.http.HttpRequest;
import java.io.IOException;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;



@Component
@Data
public class SMSClient 
    private static String apId="smt";
    private static String secretKey="Qzsy@3011071";
    private static String ecName = "衢州市第三医院";//集团名称
    private static String sign = "knwmf0iAO";//网关签名编码 网关签名编码既第三步导出签名的编码
    private static String addSerial = "";//拓展码 填空
    public static String msg = "验证码:";
    public static String url = "https://112.35.10.201:28888/sms/submit";//请求url


    /**
     *
     * @param mobiles 手机号
     * @param code    验证码
     * @return
     * @throws IOException
     */
    public static int sendMsg(String mobiles,int code) throws IOException 


        SendReq sendReq = new SendReq();
        sendReq.setApId(apId);
        sendReq.setEcName(ecName);
        sendReq.setSecretKey(secretKey);
        sendReq.setContent(msg+code);
        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);

        String encode = Base64.encodeBase64String(reqText.getBytes());
        //此处使用hutool工具包httpRequest工具类发送https请求
        String resStr = HttpRequest.post(url)
                .header("contentType", "utf-8")
                .body(encode)
                .execute()
                .body();

        System.out.println("发送短信结果:"+resStr);

        SendRes sendRes = JOSNUtil.json2pojo(resStr, SendRes.class);

        if(sendRes.isSuccess() && !"".equals(sendRes.getMsgGroup()) && "success".equals(sendRes.getRspcod()))
            return 1;
        else
            return 0;
        


    

 

 Md5Util.java:

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;

/**
 * @author xiaoyafeng
 */
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());
    
BaseController.java:
@Slf4j
@RestController
@RequestMapping("api/auth")
public class AuthController extends BaseController
@Autowired
    private StringRedisTemplate stringRedisTemplate;

 @ApiOperation(value = "短信验证码")
    @GetMapping("/sendSMSMessage")
    public void sendSMSMessage(String phoneNum)

        Assert.isTrue(StringUtils.isNotBlank(phoneNum),"请输入手机号!");
        int result = 0;
        //随机生成6位数验证码
        int code = (int) ((Math.random() * 6 + 1) * 100000);

        try 
            result = SMSClient.sendMsg(phoneNum,code);
         catch (IOException e) 
            ResponseUtil.renderJsonResult(response, errorReply(e));
        

        //将phoneNum当做键,把验证码存入redis
        stringRedisTemplate.opsForValue().set(phoneNum,code+"");
        //设置redis的过期时间,1分钟
        stringRedisTemplate.expire(phoneNum,60,TimeUnit.SECONDS);


        if (result>0) 
            ResponseUtil.renderJsonResult(response, successReply());
        
    
//验证 @PostMapping(
"checkSMSCode") public void checkSMSCode(String phoneNum,String code) if (StringUtils.isBlank(code)) throw new BizException("验证码不能为空!"); String serverCode = stringRedisTemplate.opsForValue().get(phoneNum); // String serverCode = (String) map.get(phoneNum); //验证码为空或为空字符 if (serverCode == null || serverCode.equals("")) throw new BizException("请输入验证码!"); //验证码不匹配 if (!code.equals(serverCode)) throw new BizException("验证码错误!"); else Boolean isDelete = stringRedisTemplate.delete(phoneNum); if (isDelete) ResponseUtil.renderJsonResult(response, successReply());

 

以上是关于Java对接云MAS发送短信验证码(HTTPS方式)的主要内容,如果未能解决你的问题,请参考以下文章

个人项目需要发送验证码?无法对接运营商,试试第三方工具阿里云吧

个人项目需要发送验证码?无法对接运营商,试试第三方工具阿里云吧

JAVA实现《阿里云发送短信验证码以及短信通知》

阿里云短信服务发送短信验证码(JAVA开发此功能)

系统对接阿里云短信接口(Java开发实践)

美多商城项目之短信验证码