嗨森逛服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hai-server/hai-cweb/src/main/java/com/cweb/controller/SendSmsController.java

133 lines
5.1 KiB

package com.cweb.controller;
import com.alibaba.fastjson.JSONObject;
import com.hai.common.Base64Util;
import com.hai.common.security.VerifyCode;
import com.hai.common.security.VerifyCodeStorage;
import com.hai.common.utils.DateUtil;
import com.hai.common.utils.HttpsUtils;
import com.hai.common.utils.RedisUtil;
import com.hai.common.utils.ResponseMsgUtil;
import com.hai.model.MtSmsMessageModel;
import com.hai.model.ResponseData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.http.HttpHeaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
@Controller
@Api(value = "华为云短信发送")
@RequestMapping(value = "/sendSms")
public class SendSmsController {
private static final String[] HEX_DIGITS = {"0" ,"1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
private static Logger log = LoggerFactory.getLogger(CmsContentController.class);
//无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值
private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";
//无需修改,用于格式化鉴权头域,给"Authorization"参数赋值
private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";
@Resource
private RedisUtil redisUtil;
@RequestMapping(value = "/sendSmsCode", method = RequestMethod.GET)
@ApiOperation(value = "发送短信验证码")
@ResponseBody
public ResponseData sendSmsCode(@RequestParam(value = "phone", required = true) String phone) {
try {
// ip:port根据实际情况填写
String url = "https://139.9.32.119:18312/common/sms/sendTemplateMessage";
String smsTemplateId = "SMS_21092300061";
Map<String, String> templateParas = new HashMap<String, String>();
String account = "760887"; //实际账号
String password = "Z.o'&mO%7_?5M,Br"; //实际密码
VerifyCode verifyCode = VerifyCodeStorage.getDate(phone);
String smsCode;
if (verifyCode != null){
smsCode = verifyCode.getObject();
}else{
// 生成随机6位验证码
smsCode = String.valueOf(new Random().nextInt(899999) + 100000);
}
templateParas.put("code" , smsCode);
Map<String, Object> map = new HashMap<String, Object>();
List<MtSmsMessageModel> requestLists = new ArrayList<MtSmsMessageModel>();
MtSmsMessageModel mtSmsMessage = new MtSmsMessageModel();
List<String> mobiles = new ArrayList<String>();
mobiles.add(phone);
mtSmsMessage.setMobiles(mobiles);
mtSmsMessage.setTemplateId(smsTemplateId);
mtSmsMessage.setTemplateParas(templateParas);
requestLists.add(mtSmsMessage);
map.put("account" , account);
map.put("password" , password);
map.put("requestLists" , requestLists);
Map<String,Object> header = new LinkedHashMap<>();
header.put(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE);
JSONObject object = HttpsUtils.doPostSendSms(url, map);
String code = object.getString("code");
if (code.equals("000000")) {
redisUtil.set("SMS_"+phone,smsCode, 60*10);
return ResponseMsgUtil.success("发送成功");
}
return ResponseMsgUtil.success(object);
} catch (Exception e) {
log.error("CmsContentController --> sendSmsCode() error!", e);
return ResponseMsgUtil.exception(e);
}
}
public String encodeBySHA256(String str) {
try{
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.reset();
messageDigest.update(str.getBytes("UTF-8"));
return getFormattedText(messageDigest.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
throw new RuntimeException(e);
}
return "";
}
private String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j=0;j<len;j++){
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
}