无关风月
2025-04-03 b01f752252eaadd1fa31eda6a9ad43146660b721
xinquan-auth/src/main/java/com/xinquan/auth/util/HWSendSms.java
@@ -1,140 +1,137 @@
//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("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-south-1.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));
        }
    }
}