1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 阿里云短信发送接口直接HTTP请求调用

阿里云短信发送接口直接HTTP请求调用

时间:2020-12-02 18:37:54

相关推荐

阿里云短信发送接口直接HTTP请求调用

最新一个个性化项目,客户要求使用阿里云短信发送接口。

但是实在不想引入阿里云的SDK,就自己生成签名,拼接URL实现, 其实用他们的SDK最终也是一哥GET请求进行调用,归根接底还是HTTP请求。

import java.io.IOException;import .MalformedURLException;import .URLEncoder;import .UnknownServiceException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.TreeMap;import java.util.UUID;import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;import mons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import sun.misc.BASE64Encoder;import mnetsoft.PropertyEnum;import mnetsoft.BaseErrorCode.Base;import mnetsoft.admin.model.sys.Messagequeue;import mnetsoft.admin.model.sys.MsgApi;import mnetsoft.admin.service.sys.MsgApiService;import mnetsoft.core.SpringContext;import mnetsoft.spi.IErrorCode;import mnetsoft.spi.exception.ServiceUnavailableException;import mnetsoft.util.HttpUtil;import mnetsoft.util.SerializerUtil;/*** 阿里云短信发送实现* @author wangyijie* @date 1月10日* @version 1.0*/@Servicepublic class AliyunSendMsg extends AbstractSendSMS<Messagequeue> {private final static Logger logger = LoggerFactory.getLogger(AliyunSendMsg.class);private MsgApiService msgApiService = SpringContext.getBean("msgApiService");@Overridepublic String getName() {return "阿里云短信发送";}@Override@SuppressWarnings("unchecked")public IErrorCode doSend(Messagequeue msg) throws ServiceUnavailableException,MalformedURLException, UnknownServiceException, IOException {String accessKeyId = PropertyEnum.ALIYUN_SENDMSG_ACCESSKEYID.getValue();if (StringUtils.isBlank(accessKeyId)) {logger.error("阿里云短信发送未配置,需要在系统设置——阿里云短信发送设置中填入accessKeyId");return Base.FAIL;}String accessSecret = PropertyEnum.ALIYUN_SENDMSG_ACCESSSECRET.getValue();if (StringUtils.isBlank(accessSecret)) {logger.error("阿里云短信发送未配置,需要在系统设置——阿里云短信发送设置中填入accessSecret");return Base.FAIL;}String param = msg.getContent();//现将内容序列化成mapMap<String, String> paramMap = SerializerUtil.deserializeObj(param, Map.class);if (paramMap == null || paramMap.size() < 1) {logger.error("阿里云短信发送失败——不合法的参数!参数={}", param);return Base.FAIL;}//获取设置的短信签名String signName = paramMap.get("signName");if (StringUtils.isBlank(signName)) {logger.error("阿里云短信发送失败——参数中未设置signName!参数={}", param);return Base.FAIL;}//获取设置的短信模板IDString templateCode = paramMap.get("templateCode");if (StringUtils.isBlank(templateCode)) {logger.error("阿里云短信发送失败——参数中未设置templateCode!参数={}", param);return Base.FAIL;}//获取要发送的内容String content = paramMap.get("content");if (StringUtils.isBlank(content)) {logger.error("阿里云短信发送失败——参数中未设置要发送的内容!参数={}", param);return Base.FAIL;}//目标手机号String phone = msg.getTargetPhone();/*** 设置参数*/SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); //设置时区df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT"));Map<String, String> paras = new HashMap<String, String>();//固定参数paras.put("SignatureMethod", "HMAC-SHA1");//用于请求的防重攻击,每次请求唯一,用:java.util.UUID.randomUUID()生成paras.put("SignatureNonce", UUID.randomUUID().toString());//阿里云分配的用户唯一IDparas.put("AccessKeyId", accessKeyId);//固定值:1.0paras.put("SignatureVersion", "1.0");//格式化后的当前时间(时间与阿里云服务器时间相差15分钟会被拒绝请求)paras.put("Timestamp", df.format(new Date()));//返回参数格式(可选JSON/XML)paras.put("Format", "JSON");//API的命名,固定值paras.put("Action", "SendSms");//API的版本,固定值paras.put("Version", "-05-25");//API支持的RegionIDparas.put("RegionId", "cn-hangzhou");//短信接收号码,支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式paras.put("PhoneNumbers", phone);//短信签名(用户账号可新增签名,需审批)paras.put("SignName", signName);//短信模板变量替换JSON串,如果JSON中需要带换行符,参照标准的JSON协议。 如:{“code”:”1234”,”product”:”ytx”} {\"customer\":\"nihao\"}paras.put("TemplateParam", content);//短信模板ID(可自定义,但是需要审批)paras.put("TemplateCode", templateCode);//获取阿里云发送短信的服务器地址Integer msgApiId = getMsgapiid();MsgApi msgApi = msgApiService.queryById(msgApiId);String aliyunUrl = msgApi.getHttpurl();//参数KEY排序TreeMap<String, String> sortParas = new TreeMap<String, String>();sortParas.putAll(paras);try {//构造待签名的字符串Iterator<String> it = sortParas.keySet().iterator();StringBuilder sortQueryStringTmp = new StringBuilder();while (it.hasNext()) {String key = it.next();sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(paras.get(key)));}// 去除第一个多余的&符号String sortedQueryString = sortQueryStringTmp.substring(1);StringBuilder stringToSign = new StringBuilder();stringToSign.append("GET").append("&");stringToSign.append(specialUrlEncode("/")).append("&");stringToSign.append(specialUrlEncode(sortedQueryString));String sign = sign(accessSecret + "&", stringToSign.toString());//签名最后也要做特殊URL编码String signature = specialUrlEncode(sign);//生成最后的请求urlString url = aliyunUrl + "?Signature=" + signature + sortQueryStringTmp;String result = HttpUtil.sendGet(url);if (StringUtils.isBlank(result)) {logger.error("阿里云发送短信失败!短信接收人={}, 传入参数={},需要生成URL的参数={}", phone, param , paras);return Base.FAIL;} else {Map<String, String> resultMap = SerializerUtil.deserializeObj(result, Map.class);if (resultMap == null || resultMap.size() < 1) {logger.error("阿里云发送短信失败!短信接收人={}, 传入参数={},需要生成URL的参数={}", phone, param , paras);return Base.FAIL;} else {String code = resultMap.get("Code");if (StringUtils.isNotBlank(code) && StringUtils.equals(code, "OK")){return Base.SUCCESS;} else {logger.error("阿里云发送短信失败!短信接收人={}, 传入参数={},需要生成URL的参数={},返回错误信息={}", phone, param , paras, result);return Base.FAIL;}}}} catch (Exception e) {logger.error("阿里云发送短信程序异常!短信接收人={}, 传入参数={},需要生成URL的参数={}", phone, param , paras, e);return Base.FAIL;}}/*** 根据要求替换字符* @param value* @return* @throws Exception* @author wangyijie* @data 1月10日*/public String specialUrlEncode(String value) throws Exception {return URLEncoder.encode(value, "UTF-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~");}/*** 生成签名* @param accessSecret* @param stringToSign* @return* @throws Exception* @author wangyijie* @data 1月10日*/public String sign(String accessSecret, String stringToSign) throws Exception {Mac mac = javax.crypto.Mac.getInstance("HmacSHA1");mac.init(new SecretKeySpec(accessSecret.getBytes("UTF-8"), "HmacSHA1"));byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));return new BASE64Encoder().encode(signData);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。