public class HuaWeiYunSmsSendUtil {
private static Logger logger = (Logger) LoggerFactory.getLogger(HuaWeiYunSmsSendUtil.class);
private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";
private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";
public static void sendMsg(HuaWeiYunSmsConfig smsConfig) {
smsConfig.setAppKey(ProConfig.HwyunShortMessage.HW_APPKEY);
smsConfig.setAppSecret(ProConfig.HwyunShortMessage.HW_APPSECRECT);
smsConfig.setUrl(ProConfig.HwyunShortMessage.HW_URL);
System.out.println("smsConfig:"+smsConfig);
String body = buildRequestBody(smsConfig.getSender(), smsConfig.getToPhoneNumber(), smsConfig.getTemplateId(), smsConfig.getTemplateParam(), smsConfig.getStatusCallBack(), smsConfig.getSignature());
if (null == body || body.isEmpty()) {
System.out.println("body is null.");
return;
}
String wsseHeader = buildWsseHeader(smsConfig.getAppKey(), smsConfig.getAppSecret());
if (null == wsseHeader || wsseHeader.isEmpty()) {
System.out.println("wsse header is null.");
return;
}
try {
CloseableHttpClient client = HttpClients.custom()
.setSSLContext(new SSLContextBuilder().loadTrustMaterial(null,
(x509CertChain, authType) -> true).build())
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.build();
HttpResponse response = client.execute(RequestBuilder.create("POST")
.setUri(smsConfig.getUrl())
.addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded")
.addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE)
.addHeader("X-WSSE", wsseHeader)
.setEntity(new StringEntity(body)).build());
System.out.println(response.toString());
System.out.println(EntityUtils.toString(response.getEntity()));
}catch(Exception e) {
logger.error("[发送消息接口调用错误");
}
}
public static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, String statusCallbackUrl, String signature) {
if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty()
|| templateId.isEmpty()) {
System.out.println("buildRequestBody(): sender, receiver or templateId is null.");
return null;
}
List<NameValuePair> keyValues = new ArrayList<NameValuePair>();
keyValues.add(new BasicNameValuePair("from", sender));
keyValues.add(new BasicNameValuePair("to", receiver));
keyValues.add(new BasicNameValuePair("templateId", templateId));
if (null != templateParas && !templateParas.isEmpty()) {
keyValues.add(new BasicNameValuePair("templateParas", templateParas));
}
if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) {
keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl));
}
if (null != signature && !signature.isEmpty()) {
keyValues.add(new BasicNameValuePair("signature", signature));
}
return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8"));
}
public static String buildWsseHeader(String appKey, String appSecret) {
if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) {
System.out.println("buildWsseHeader(): appKey or appSecret is null.");
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
String time = sdf.format(new Date());
String nonce = UUID.randomUUID().toString().replace("-", "");
byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret);
String hexDigest = Hex.encodeHexString(passwordDigest);
String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes());
return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
}
static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return;
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return;
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
}
@Data
public class HuaWeiYunSmsConfig {
private String url;
private String appKey;
private String appSecret ;
private String sender ;
private String templateId ;
private String signature;
private String statusCallBack;
private String templateParam ;
private String toPhoneNumber;
}