| | |
| | | //package com.xinquan.auth.util; |
| | | package com.xinquan.auth.util; |
| | | |
| | | import com.cloud.apigateway.sdk.utils.Client; |
| | | import com.cloud.apigateway.sdk.utils.Request; |
| | | import org.apache.http.Header; |
| | | import org.apache.http.HttpEntity; |
| | | import org.apache.http.HttpResponse; |
| | | import org.apache.http.client.methods.HttpRequestBase; |
| | | import org.apache.http.conn.ssl.NoopHostnameVerifier; |
| | | import org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
| | | import org.apache.http.impl.client.CloseableHttpClient; |
| | | import org.apache.http.impl.client.HttpClients; |
| | | import org.apache.http.ssl.SSLContextBuilder; |
| | | import org.apache.http.util.EntityUtils; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.net.ssl.SSLContext; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.net.URLEncoder; |
| | | import java.util.Arrays; |
| | | |
| | | @Component |
| | | public class HWSendSms { |
| | | private static final Logger LOGGER = LoggerFactory.getLogger(HWSendSms.class); |
| | | |
| | | public static final String UTF_8 = "UTF-8"; |
| | | |
| | | private static CloseableHttpClient client = null; |
| | | |
| | | public static void main(String[] args) throws Exception { |
| | | // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 |
| | | } |
| | | |
| | | public void sendSms(String code,String receiver) throws Exception { |
| | | client = createIgnoreSSLHttpClient(); |
| | | //必填,请参考"开发准备"获取如下数据,替换为实际值 |
| | | // String url = "https://smsapi.ap-southeast-1.myhuaweicloud.com:443/sms/batchSendSms/v1"; //APP接入地址+接口访问URI |
| | | // // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; |
| | | // String appKey = "c8RWg3gg************3Y7x1Ile"; //Application Key |
| | | // String appSecret = "q4Ii87Bh************80SfD7Al"; //Application Secret |
| | | // String sender = "csms12345678"; //中国大陆短信签名通道号或全球短信通道号 |
| | | // String templateId = "8ff55eac1d0b478ab3c06c3c6a492300"; //模板ID |
| | | // |
| | | //import com.cloud.apigateway.sdk.utils.Client; |
| | | //import com.cloud.apigateway.sdk.utils.Request; |
| | | //import org.apache.http.Header; |
| | | //import org.apache.http.HttpEntity; |
| | | //import org.apache.http.HttpResponse; |
| | | //import org.apache.http.client.methods.HttpRequestBase; |
| | | //import org.apache.http.conn.ssl.NoopHostnameVerifier; |
| | | //import org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
| | | //import org.apache.http.impl.client.CloseableHttpClient; |
| | | //import org.apache.http.impl.client.HttpClients; |
| | | //import org.apache.http.ssl.SSLContextBuilder; |
| | | //import org.apache.http.util.EntityUtils; |
| | | //import org.slf4j.Logger; |
| | | //import org.slf4j.LoggerFactory; |
| | | //import org.springframework.beans.factory.annotation.Value; |
| | | //import org.springframework.stereotype.Component; |
| | | // //条件必填,中国大陆短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 |
| | | // //全球短信不用关注该参数 |
| | | // String signature = "华为云短信测试"; //签名名称 |
| | | // |
| | | //import javax.net.ssl.SSLContext; |
| | | //import java.io.UnsupportedEncodingException; |
| | | //import java.net.URLEncoder; |
| | | //import java.util.Arrays; |
| | | // //必填,全局号码格式(包含国家码),示例:+86151****6789,多个号码之间用英文逗号分隔 |
| | | // String receiver = "+86151****6789,+86152****7890"; //短信接收人号码 |
| | | // |
| | | //@Component |
| | | //public class HWSendSms { |
| | | // |
| | | // |
| | | // private static final Logger LOGGER = LoggerFactory.getLogger(HWSendSms.class); |
| | | // |
| | | // public static final String UTF_8 = "UTF-8"; |
| | | // |
| | | // private static CloseableHttpClient client = null; |
| | | // |
| | | // public static void main(String[] args) throws Exception { |
| | | // // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 |
| | | //// client = createIgnoreSSLHttpClient(); |
| | | //// sendSms(); |
| | | // } |
| | | // |
| | | // public void sendSms(String code,String receiver) throws Exception { |
| | | // client = createIgnoreSSLHttpClient(); |
| | | // //必填,请参考"开发准备"获取如下数据,替换为实际值 |
| | | //// String url = "https://smsapi.ap-southeast-1.myhuaweicloud.com:443/sms/batchSendSms/v1"; //APP接入地址+接口访问URI |
| | | //// // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; |
| | | //// String appKey = "c8RWg3gg************3Y7x1Ile"; //Application Key |
| | | //// String appSecret = "q4Ii87Bh************80SfD7Al"; //Application Secret |
| | | //// String sender = "csms12345678"; //中国大陆短信签名通道号或全球短信通道号 |
| | | //// String templateId = "8ff55eac1d0b478ab3c06c3c6a492300"; //模板ID |
| | | //// |
| | | //// //条件必填,中国大陆短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 |
| | | //// //全球短信不用关注该参数 |
| | | //// String signature = "华为云短信测试"; //签名名称 |
| | | //// |
| | | //// //必填,全局号码格式(包含国家码),示例:+86151****6789,多个号码之间用英文逗号分隔 |
| | | //// String receiver = "+86151****6789,+86152****7890"; //短信接收人号码 |
| | | //// |
| | | //// //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 |
| | | // String statusCallBack = ""; |
| | | // |
| | | // /** |
| | | // * 选填,使用无变量模板时请赋空值 String templateParas = ""; |
| | | // * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,templateParas可填写为"[\"111111\"]" |
| | | // * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_20}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" |
| | | // * 查看更多模板规范和变量规范:产品介绍>短信模板须知和短信变量须知 |
| | | // */ |
| | | // String templateParas = "[\""+code+"\"]"; //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 |
| | | // |
| | | // //请求Body,不携带签名名称时,signature请填null |
| | | // String body = buildRequestBody("8824110423893", receiver, "767ad27dce184a32a4b4863517fbd301", templateParas, statusCallBack, "心泉智慧"); |
| | | // if (null == body || body.isEmpty()) { |
| | | // LOGGER.warn("body is null."); |
| | | // return; |
| | | // } |
| | | // |
| | | // Request request = new Request(); |
| | | // request.setKey("dFbKS778KG0jvQrQ672b9RaOktfV"); |
| | | // request.setSecret("3QsteXCIY3KRfgXf5zXyi6f3cHBj"); |
| | | // request.setMethod("POST"); |
| | | // request.setUrl("https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1"); |
| | | // request.addHeader("Content-Type", "application/x-www-form-urlencoded"); |
| | | // request.setBody(body); |
| | | // LOGGER.info("Print the body: {}", body); |
| | | // try { |
| | | // HttpRequestBase signedRequest = Client.sign(request, "SDK-HMAC-SHA256"); |
| | | // LOGGER.info("Print the authorization: {}", Arrays.toString(signedRequest.getHeaders("Authorization"))); |
| | | // Header[] requestAllHeaders = signedRequest.getAllHeaders(); |
| | | // for (Header h : requestAllHeaders) { |
| | | // LOGGER.info("req Header with name: {} and value: {}", h.getName(), h.getValue()); |
| | | // } |
| | | // |
| | | // HttpResponse response = client.execute(signedRequest); |
| | | // |
| | | // LOGGER.info("Print the status line of the response: {}", response.getStatusLine().toString()); |
| | | // Header[] resHeaders = response.getAllHeaders(); |
| | | // for (Header h : resHeaders) { |
| | | // LOGGER.info("Processing Header with name: {} and value: {}", h.getName(), h.getValue()); |
| | | // } |
| | | // HttpEntity resEntity = response.getEntity(); |
| | | // if (resEntity != null) { |
| | | // LOGGER.info("Processing Body with name: {} and value: {}", |
| | | // System.getProperty("line.separator"), |
| | | // EntityUtils.toString(resEntity, "UTF-8")); |
| | | // } |
| | | // } catch (Exception e) { |
| | | // LOGGER.info(e.getMessage(), e); |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // |
| | | // public CloseableHttpClient createIgnoreSSLHttpClient() throws Exception { |
| | | // SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (x509CertChain, authType) -> true).build(); |
| | | // return HttpClients.custom().setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)).build(); |
| | | // } |
| | | // |
| | | // static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, |
| | | // String statusCallBack, String signature) throws UnsupportedEncodingException { |
| | | // 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; |
| | | // } |
| | | // |
| | | // StringBuilder body = new StringBuilder(); |
| | | // appendToBody(body, "from=", sender); |
| | | // appendToBody(body, "&to=", receiver); |
| | | // appendToBody(body, "&templateId=", templateId); |
| | | // appendToBody(body, "&templateParas=", templateParas); |
| | | // appendToBody(body, "&statusCallback=", statusCallBack); |
| | | // appendToBody(body, "&signature=", signature); |
| | | // return body.toString(); |
| | | // } |
| | | // |
| | | // private static void appendToBody(StringBuilder body, String key, String val) throws UnsupportedEncodingException { |
| | | // if (null != val && !val.isEmpty()) { |
| | | // LOGGER.info("Print appendToBody: {}:{}", key, val); |
| | | // body.append(key).append(URLEncoder.encode(val, UTF_8)); |
| | | // } |
| | | // } |
| | | //} |
| | | // //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 |
| | | String statusCallBack = ""; |
| | | |
| | | /** |
| | | * 选填,使用无变量模板时请赋空值 String templateParas = ""; |
| | | * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,templateParas可填写为"[\"111111\"]" |
| | | * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_20}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" |
| | | * 查看更多模板规范和变量规范:产品介绍>短信模板须知和短信变量须知 |
| | | */ |
| | | String templateParas = "[\""+code+"\"]"; //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 |
| | | |
| | | //请求Body,不携带签名名称时,signature请填null |
| | | String body = buildRequestBody("8823121426646", receiver, "767ad27dce184a32a4b4863517fbd301", |
| | | templateParas, statusCallBack, "心泉智慧"); |
| | | if (null == body || body.isEmpty()) { |
| | | LOGGER.warn("body is null."); |
| | | return; |
| | | } |
| | | |
| | | Request request = new Request(); |
| | | request.setKey("dFbKS778KG0jvQrQ672b9RaOktfV"); |
| | | request.setSecret("3QsteXCIY3KRfgXf5zXyi6f3cHBj"); |
| | | request.setMethod("POST"); |
| | | request.setUrl("https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1"); |
| | | request.addHeader("Content-Type", "application/x-www-form-urlencoded"); |
| | | request.setBody(body); |
| | | LOGGER.info("Print the body: {}", body); |
| | | try { |
| | | HttpRequestBase signedRequest = Client.sign(request, "SDK-HMAC-SHA256"); |
| | | LOGGER.info("Print the authorization: {}", Arrays.toString(signedRequest.getHeaders("Authorization"))); |
| | | Header[] requestAllHeaders = signedRequest.getAllHeaders(); |
| | | for (Header h : requestAllHeaders) { |
| | | LOGGER.info("req Header with name: {} and value: {}", h.getName(), h.getValue()); |
| | | } |
| | | |
| | | HttpResponse response = client.execute(signedRequest); |
| | | |
| | | LOGGER.info("Print the status line of the response: {}", response.getStatusLine().toString()); |
| | | Header[] resHeaders = response.getAllHeaders(); |
| | | for (Header h : resHeaders) { |
| | | LOGGER.info("Processing Header with name: {} and value: {}", h.getName(), h.getValue()); |
| | | } |
| | | HttpEntity resEntity = response.getEntity(); |
| | | if (resEntity != null) { |
| | | LOGGER.info("Processing Body with name: {} and value: {}", |
| | | System.getProperty("line.separator"), |
| | | EntityUtils.toString(resEntity, "UTF-8")); |
| | | } |
| | | } catch (Exception e) { |
| | | LOGGER.info(e.getMessage(), e); |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | public CloseableHttpClient createIgnoreSSLHttpClient() throws Exception { |
| | | SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (x509CertChain, authType) -> true).build(); |
| | | return HttpClients.custom().setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)).build(); |
| | | } |
| | | |
| | | static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, |
| | | String statusCallBack, String signature) throws UnsupportedEncodingException { |
| | | 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; |
| | | } |
| | | |
| | | StringBuilder body = new StringBuilder(); |
| | | appendToBody(body, "from=", sender); |
| | | appendToBody(body, "&to=", receiver); |
| | | appendToBody(body, "&templateId=", templateId); |
| | | appendToBody(body, "&templateParas=", templateParas); |
| | | appendToBody(body, "&statusCallback=", statusCallBack); |
| | | appendToBody(body, "&signature=", signature); |
| | | return body.toString(); |
| | | } |
| | | |
| | | private static void appendToBody(StringBuilder body, String key, String val) throws UnsupportedEncodingException { |
| | | if (null != val && !val.isEmpty()) { |
| | | LOGGER.info("Print appendToBody: {}:{}", key, val); |
| | | body.append(key).append(URLEncoder.encode(val, UTF_8)); |
| | | } |
| | | } |
| | | } |