华为云短信接入实现示例

1)构建Springboot项目

  1. 添加依赖
bash 复制代码
<dependency>
     <groupId>com.huawei.apigateway</groupId>
     <artifactId>java-sdk-core</artifactId>
     <version>3.2.4</version>
</dependency>
  1. 配置文件
java 复制代码
huaweiyun:
  sms:
    url: https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1
    appKey: V******************0
    appSecret: X*******************v
    sender: 8***********9
  1. 配置类
java 复制代码
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * @author admin
 */
@Component
public class SmsConstant implements InitializingBean {

    @Value("${huaweiyun.sms.url}")
    public String smsUrl;
    @Value("${huaweiyun.sms.appKey}")
    public String appKey;
    @Value("${huaweiyun.sms.appSecret}")
    public String appSecret;
    @Value("${huaweiyun.sms.sender}")
    public String smsSender;

    public static String APP_KEY;
    public static String APP_SECRET;
    public static String SMS_URL;
    public static String SMS_SENDER;

    @Override
    public void afterPropertiesSet(){
        APP_KEY = appKey;
        APP_SECRET = appSecret;
        SMS_URL = smsUrl;
        SMS_SENDER = smsSender;
    }

    /*
     * 为了解决base64加密 密钥太长报错问题
     */
    static {
        try {
            Class<?> clazz = Class.forName("javax.crypto.JceSecurity");
            Field nameField = clazz.getDeclaredField("isRestricted");

            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(nameField, nameField.getModifiers() & ~Modifier.FINAL);

            nameField.setAccessible(true);
            nameField.set(null, Boolean.FALSE);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

5)使用枚举类定义短信模板

java 复制代码
@AllArgsConstructor
@Getter
public enum MsgTempEnum {

    SMS_VERIFY(1, "短信认证","SMS_VERIFY"),

    FIRE_PUSH_SMS(2, "短信推送","PUSH_SMS"),
    ;

    private final int id;

    private final String name;

    private final String code;

}

6)短信工具类

java 复制代码
import cn.hutool.core.util.ObjUtil;
import cn.hutool.json.JSONUtil;
import com.cloud.apigateway.sdk.utils.Client;
import com.cloud.apigateway.sdk.utils.Request;
import com.zxzx.firecloud.module.base.model.entity.Message;
import com.zxzx.firecloud.module.base.model.entity.TempSms;
import com.zxzx.firecloud.module.base.service.IMessageService;
import com.zxzx.firecloud.module.base.service.ITempSmsService;
import com.zxzx.firecloud.module.uc.model.entity.User;
import com.zxzx.firecloud.module.uc.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author admin
 */
@Slf4j
@Component
public class SendSms {

    public static final String UTF_8 = "UTF-8";

    @Autowired
    private IMessageService messageService;
    @Autowired
    private ITempSmsService tempSmsService;
    @Autowired
    private IUserService userService;

    public List<SmsResultDetail> sendSms(MsgTempEnum msgTempEnum, String receiver, String param) {
        return sendSms(msgTempEnum, Collections.singletonList(receiver), Collections.singletonList(param));
    }

    public List<SmsResultDetail> sendSms(MsgTempEnum msgTempEnum, List<String> receiverList, String param) {
        return sendSms(msgTempEnum, receiverList, Collections.singletonList(param));
    }

    public List<SmsResultDetail> sendSms(MsgTempEnum msgTempEnum, String receiver, List<String> paramList) {
        return sendSms(msgTempEnum, Collections.singletonList(receiver), paramList);
    }

    public List<SmsResultDetail> sendSms(MsgTempEnum msgTempEnum, List<String> receiverList, List<String> paramList) {
        try {
            TempSms tempSms = tempSmsService.getTempSmsByBusiness(msgTempEnum.getCode());
            String templateId = tempSms.getTemplateId();
            if (ObjUtil.isEmpty(receiverList) || ObjUtil.isEmpty(templateId)) {
                log.error("receiverList or templateId is null");
                return new ArrayList<>();
            }
            String templateParas = "[\"" + StringUtils.join(paramList, "\",\"") + "\"]";
            String receiver = StringUtils.join(receiverList, ",");
            List<SmsResultDetail> responseList = new ArrayList<>();
            try {
                Request request = new Request();
                String body = buildRequestBody(SmsConstant.SMS_SENDER, receiver, templateId, templateParas);
                request.setKey(SmsConstant.APP_KEY);
                request.setSecret(SmsConstant.APP_SECRET);
                request.setUrl(SmsConstant.SMS_URL);
                request.setMethod("POST");
                request.addHeader("Content-Type", "application/x-www-form-urlencoded");
                request.setBody(body);
                HttpRequestBase signedRequest = Client.sign(request, "SDK-HMAC-SHA256");
                HttpResponse response = HttpClientSingleton.getInstance().execute(signedRequest);
                log.info("Print the status line of the response: {}", response.getStatusLine().toString());
                responseList = getResultDetailList(response.getEntity());
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
            for (SmsResultDetail resultDetail : responseList) {
                Message message = new Message();
                message.setMessageType("SMS");
                message.setMessageContent(MessageFormat.format(tempSms.getTemplateDesc(), paramList.toArray()));
                message.setTitle(tempSms.getName());
                message.setReceiver(resultDetail.getOriginTo());
                message.setCallMessage(resultDetail.toString());
                message.setBusiness(msgTempEnum.getCode());
                message.setStatus(2);
                if ("000000".equals(resultDetail.getStatus())) {
                    message.setStatus(1);
                }
                messageService.save(message);
            }
            return responseList;
        } catch (Exception e) {
            log.error("短信推送失败:{}", e);
            return new ArrayList<>();
        }
    }

    private static List<SmsResultDetail> getResultDetailList(HttpEntity resEntity) throws IOException {
        if (resEntity == null) {
            return new ArrayList<>();
        }
        String res = EntityUtils.toString(resEntity, "UTF-8");
        log.info("Processing Body with name: {} and value: {}", System.getProperty("line.separator"), res);
        SmsResult bean = JSONUtil.toBean(res, SmsResult.class);
        if (bean == null || !"000000".equals(bean.getCode())) {
            return new ArrayList<>();
        }
        List<SmsResultDetail> successList = new ArrayList<>();
        if (ObjUtil.isNotEmpty(bean.getResult())) {
            successList = bean.getResult();
        }
        return successList;
    }

    static String buildRequestBody(String sender, String receiver, String templateId, String templateParas) throws UnsupportedEncodingException {
        StringBuilder body = new StringBuilder();
        appendToBody(body, "from=", sender);
        appendToBody(body, "&to=", receiver);
        appendToBody(body, "&templateId=", templateId);
        appendToBody(body, "&templateParas=", templateParas);
        return body.toString();
    }

    private static void appendToBody(StringBuilder body, String key, String val) throws UnsupportedEncodingException {
        if (ObjUtil.isNotEmpty(val)) {
            body.append(key).append(URLEncoder.encode(val, UTF_8));
        }
    }
}
相关推荐
码农小河662 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
风若飞5 小时前
Spring Ai 入门遇到问题1
java·后端·spring
Nuanyt5 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
黑马程序员毕设5 小时前
基于 Java 的餐饮点餐系统设计与应用报告
java·开发语言
SL_staff6 小时前
从文档工具到知识中枢:基于JVS数字底座构建企业级统一内容管理平台的技术实践
java·开源·全栈
SL_staff6 小时前
从‘连得上’到‘管得好’:JVS-IOT双引擎驱动设备运维闭环
java·物联网·产品
w_zero_one8 小时前
递归算法(一)
java·开发语言·算法
SL_staff8 小时前
私有化低代码不是减配版开发:JVS双模式建模如何重建IT交付信任
java·低代码·spring cloud
墨着染霜华9 小时前
Redocly 生成 OpenAPI 接口文档踩坑实录|Node 版本兼容 + 接口地址错误问题解决
java
文丑颜不良啊9 小时前
LeetCode1881~1990题目解析
java·leetcode