最近在因为业务需求要发送短信 做个记录!
我这里采用的是restTemplate 的方式 发送的https的请求。
一.restTemplate 发送https 请求
public class SMSUtil {
private static final Logger logger = LoggerFactory.getLogger(SMSUtil.class);
public static final String EC_NAME = "企业名称";
public static final String AP_ID = "接口id";
public static final String TEMPLATE_ID = "模板id";
public static final String MAS_SIGN = "签名编码";
public static final String SECRET_KEY = "模板密码";
// 移动云mas 的请求url 路径 https 和htpp的不一致 要注意
public static final String URL = "https://112.35.10.201:28888/sms/tmpsubmit";
@Data
//创建一个实体类 用于存放报文
public static class SendRequest {
String ecName;
String apId;
String templateId;
String mobiles;
String params;
String sign;
String addSerial;
String mac; //需要MD5加密
}
//这里就是发送的具体代码 模板短信的参数 必须要加上 [] 中括号 你也可以用更高级的方式
public static void sendText(String mobiles, String params) {
if (params != null) {
params = "[" + params + "]";
} else {
params = "[]";
logger.error("验证码为空,请及时处理:{}"+params);
}
SendRequest sendRequest = new SendRequest();
String addSerial = "";
sendRequest.setEcName(EC_NAME);
sendRequest.setApId(AP_ID);
sendRequest.setTemplateId(TEMPLATE_ID);
sendRequest.setMobiles(mobiles);
sendRequest.setParams(params);
sendRequest.setSign(MAS_SIGN);
sendRequest.setAddSerial(addSerial);
String mac = DigestUtils.md5Hex(EC_NAME + AP_ID + SECRET_KEY + TEMPLATE_ID + mobiles + params + MAS_SIGN + addSerial);
sendRequest.setMac(mac);
RestTemplate restTemplate = null;
try {
// 需要写一个配置类 用于忽略ssl证书 配置类的代码贴在了下面
restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
logger.info("忽略SSL证书异常:{}"+e.getMessage());
logger.info("忽略SSL证书异常:{}"+e.getMessage());
} catch (KeyManagementException e) {
e.printStackTrace();
logger.info("忽略SSL证书异常:{}"+e.getMessage());
} catch (KeyStoreException e) {
e.printStackTrace();
logger.info("忽略SSL证书异常:{}"+e.getMessage());
}
String reqText = JSON.toJSONString(sendRequest);
String encode = null;
try {
encode = Base64.encodeBase64String(reqText.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
logger.info("base64编码异常:{}"+e.getMessage());
}
System.out.println(encode);
String resStr = restTemplate.postForObject(URL, encode, String.class);
}
}
二. restTemplate 的配置类 用于忽略ssl证书
//restTemplate的配置类 用于忽略ssl证书
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(15000);
factory.setReadTimeout(5000);
return factory;
}
public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory()throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException{
TrustStrategy trustStrategy = (x509Certificates, s) -> true;
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null,trustStrategy).build();
SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext,new NoopHostnameVerifier());
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
CloseableHttpClient httpClient = httpClientBuilder.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setHttpClient(httpClient);
return factory;
}
}
三.普通短信大概一致 只是一些参数和url的变化 这里就不赘述了
因为现在我基本上都是用的restTemplate 发送的方式 网上搜了一圈 基本没搜到 用移动云mas发送https 请求时用的restTemplate 所以这里贴一下 。
如果对你有帮助 麻烦点个赞吧 🤭