mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 20:28:44 +08:00 
			
		
		
		
	Merge branch 'develop' of https://gitee.com/scholarli/ruoyi-vue-pro_1 into develop
# Conflicts: # yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/http/HttpUtils.java # yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java # yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/SmsClientTests.java
This commit is contained in:
		@@ -49,4 +49,12 @@ public class SmsCallbackController {
 | 
			
		||||
        return success(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
    @PostMapping("/qiniu")
 | 
			
		||||
    @PermitAll
 | 
			
		||||
    @Operation(summary = "七牛云短信的回调", description = "参见 https://developer.qiniu.com/sms/5910/message-push 文档")
 | 
			
		||||
    public CommonResult<Boolean> receiveQiniuSmsStatus(@RequestBody String requestBody) throws Throwable {
 | 
			
		||||
        smsSendService.receiveSmsStatus(SmsChannelEnum.QINIU.getCode(), requestBody);
 | 
			
		||||
        return success(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,157 @@
 | 
			
		||||
package cn.iocoder.yudao.module.system.framework.sms.core.client.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollStreamUtil;
 | 
			
		||||
import cn.hutool.core.collection.ListUtil;
 | 
			
		||||
import cn.hutool.core.date.DateUtil;
 | 
			
		||||
import cn.hutool.core.date.LocalDateTimeUtil;
 | 
			
		||||
import cn.hutool.core.lang.Assert;
 | 
			
		||||
import cn.hutool.core.util.ObjUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.crypto.SecureUtil;
 | 
			
		||||
import cn.hutool.crypto.digest.HmacAlgorithm;
 | 
			
		||||
import cn.hutool.json.JSONObject;
 | 
			
		||||
import cn.hutool.json.JSONUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.core.KeyValue;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsSendRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.property.SmsChannelProperties;
 | 
			
		||||
import com.google.common.annotations.VisibleForTesting;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 七牛云短信客户端的实现类
 | 
			
		||||
 *
 | 
			
		||||
 * @author scholar
 | 
			
		||||
 * @since 2024/08/26 15:35
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class QiniuSmsClient extends AbstractSmsClient {
 | 
			
		||||
 | 
			
		||||
    private static final String HOST = "sms.qiniuapi.com";
 | 
			
		||||
 | 
			
		||||
    private static final String PATH = "/v1/message/single";
 | 
			
		||||
 | 
			
		||||
    private static final String TEMPLATE_PATH  = "/v1/template";
 | 
			
		||||
 | 
			
		||||
    public QiniuSmsClient(SmsChannelProperties properties) {
 | 
			
		||||
        super(properties);
 | 
			
		||||
        Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空");
 | 
			
		||||
        Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void doInit() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public SmsSendRespDTO sendSms(Long sendLogId, String mobile, String apiTemplateId,
 | 
			
		||||
                                  List<KeyValue<String, Object>> templateParams) throws Throwable {
 | 
			
		||||
        // 1. 执行请求
 | 
			
		||||
        // 参考链接 https://developer.qiniu.com/sms/5824/through-the-api-send-text-messages
 | 
			
		||||
        LinkedHashMap<String, Object> body = new LinkedHashMap<>();
 | 
			
		||||
        body.put("template_id", apiTemplateId);
 | 
			
		||||
        body.put("mobile", mobile);
 | 
			
		||||
        body.put("parameters", CollStreamUtil.toMap(templateParams, KeyValue::getKey, KeyValue::getValue));
 | 
			
		||||
        body.put("seq", Long.toString(sendLogId));
 | 
			
		||||
 | 
			
		||||
        JSONObject response = request("POST", body, PATH);
 | 
			
		||||
        // 2. 解析请求
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(response.getStr("error"))){//短信请求失败
 | 
			
		||||
            return new SmsSendRespDTO().setSuccess(false)
 | 
			
		||||
                    .setApiCode(response.getStr("error"))
 | 
			
		||||
                    .setApiRequestId(response.getStr("request_id"))
 | 
			
		||||
                    .setApiMsg(response.getStr("message"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return new SmsSendRespDTO().setSuccess(response.containsKey("message_id"))
 | 
			
		||||
                .setSerialNo(response.getStr("message_id"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 请求七牛云短信
 | 
			
		||||
     *
 | 
			
		||||
     * @see <a href="https://developer.qiniu.com/sms/5842/sms-api-authentication"</>
 | 
			
		||||
     * @param httpMethod http请求方法
 | 
			
		||||
     * @param body http请求消息体
 | 
			
		||||
     * @param path URL path
 | 
			
		||||
     * @return 请求结果
 | 
			
		||||
     */
 | 
			
		||||
    private JSONObject request(String httpMethod, LinkedHashMap<String, Object> body, String path) {
 | 
			
		||||
        String signDate = DateUtil.date().setTimeZone(TimeZone.getTimeZone("UTC")).toString("yyyyMMdd'T'HHmmss'Z'");
 | 
			
		||||
        //请求头
 | 
			
		||||
        Map<String, String> header = new HashMap<>(4);
 | 
			
		||||
        header.put("HOST", HOST);
 | 
			
		||||
        header.put("Authorization", getSignature(httpMethod, HOST, path, body != null ? JSONUtil.toJsonStr(body) : "", signDate));
 | 
			
		||||
        header.put("Content-Type", "application/json");
 | 
			
		||||
        header.put("X-Qiniu-Date", signDate);
 | 
			
		||||
 | 
			
		||||
        String responseBody ="";
 | 
			
		||||
        if (Objects.equals(httpMethod, "POST")){// POST 发送短消息用POST请求
 | 
			
		||||
            responseBody = HttpUtils.post("https://" + HOST + path, header, JSONUtil.toJsonStr(body));
 | 
			
		||||
        }else { // GET 查询template状态用GET请求
 | 
			
		||||
            responseBody = HttpUtils.get("https://" + HOST + path, header);
 | 
			
		||||
        }
 | 
			
		||||
        return JSONUtil.parseObj(responseBody);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getSignature(String method, String host, String path, String body, String signDate) {
 | 
			
		||||
        StringBuilder dataToSign = new StringBuilder();
 | 
			
		||||
        dataToSign.append(method.toUpperCase()).append(" ").append(path);
 | 
			
		||||
        dataToSign.append("\nHost: ").append(host);
 | 
			
		||||
        dataToSign.append("\n").append("Content-Type").append(": ").append("application/json");
 | 
			
		||||
        dataToSign.append("\n").append("X-Qiniu-Date").append(": ").append(signDate);
 | 
			
		||||
        dataToSign.append("\n\n");
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(body)) {
 | 
			
		||||
            dataToSign.append(body);
 | 
			
		||||
        }
 | 
			
		||||
        String encodedSignature = SecureUtil.hmac(HmacAlgorithm.HmacSHA1, properties.getApiSecret()).digestBase64(dataToSign.toString(), true);
 | 
			
		||||
 | 
			
		||||
        return "Qiniu " + properties.getApiKey() + ":" + encodedSignature;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<SmsReceiveRespDTO> parseSmsReceiveStatus(String text) {
 | 
			
		||||
        JSONObject status = JSONUtil.parseObj(text);
 | 
			
		||||
        // 字段参考 https://developer.qiniu.com/sms/5910/message-push
 | 
			
		||||
        return ListUtil.of(new SmsReceiveRespDTO()
 | 
			
		||||
                .setSuccess("DELIVRD".equals(status.getJSONArray("items").getJSONObject(0).getStr("status"))) // 是否接收成功
 | 
			
		||||
                .setErrorMsg(status.getJSONArray("items").getJSONObject(0).getStr("status"))
 | 
			
		||||
                .setMobile(status.getJSONArray("items").getJSONObject(0).getStr("mobile")) // 手机号
 | 
			
		||||
                .setReceiveTime(LocalDateTimeUtil.of(status.getJSONArray("items").getJSONObject(0).getLong("delivrd_at")*1000L))
 | 
			
		||||
                .setSerialNo(status.getJSONArray("items").getJSONObject(0).getStr("message_id")) // 发送序列号
 | 
			
		||||
                .setLogId(Long.valueOf(status.getJSONArray("items").getJSONObject(0).getStr("seq")))); // logId
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable {
 | 
			
		||||
        // 1. 执行请求
 | 
			
		||||
        // 参考链接 https://developer.qiniu.com/sms/5969/query-a-single-template
 | 
			
		||||
        JSONObject response = request("GET", null, TEMPLATE_PATH + "/" + apiTemplateId);
 | 
			
		||||
        // 2.1 请求失败
 | 
			
		||||
        if (ObjUtil.notEqual(response.getStr("audit_status"), "passed")) {
 | 
			
		||||
            log.error("[getSmsTemplate][模版编号({}) 响应不正确({})]", apiTemplateId, response);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 2.2 请求成功
 | 
			
		||||
        return new SmsTemplateRespDTO()
 | 
			
		||||
                .setId(response.getStr("id"))
 | 
			
		||||
                .setContent(response.getStr("template"))
 | 
			
		||||
                .setAuditStatus(convertSmsTemplateAuditStatus(response.getStr("audit_status")))
 | 
			
		||||
                .setAuditReason(response.getStr("reject_reason"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @VisibleForTesting
 | 
			
		||||
    Integer convertSmsTemplateAuditStatus(String templateStatus) {
 | 
			
		||||
        return switch (templateStatus) {
 | 
			
		||||
            case "passed" -> SmsTemplateAuditStatusEnum.SUCCESS.getStatus();
 | 
			
		||||
            case "reviewing" -> SmsTemplateAuditStatusEnum.CHECKING.getStatus();
 | 
			
		||||
            case "rejected" -> SmsTemplateAuditStatusEnum.FAIL.getStatus();
 | 
			
		||||
            case null, default ->
 | 
			
		||||
                    throw new IllegalArgumentException(String.format("未知审核状态(%str)", templateStatus));
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -18,6 +18,7 @@ public enum SmsChannelEnum {
 | 
			
		||||
    ALIYUN("ALIYUN", "阿里云"),
 | 
			
		||||
    TENCENT("TENCENT", "腾讯云"),
 | 
			
		||||
    HUAWEI("HUAWEI", "华为云"),
 | 
			
		||||
    QINIU("QINIU", "七牛云"),
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -34,3 +35,4 @@ public enum SmsChannelEnum {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,135 @@
 | 
			
		||||
package cn.iocoder.yudao.module.system.framework.sms.core.client.impl;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.common.core.KeyValue;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
 | 
			
		||||
import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsSendRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.system.framework.sms.core.property.SmsChannelProperties;
 | 
			
		||||
import com.google.common.collect.Lists;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
import org.mockito.MockedStatic;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.*;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.*;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyString;
 | 
			
		||||
import static org.mockito.Mockito.mockStatic;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link QiniuSmsClient} 的单元测试
 | 
			
		||||
 *
 | 
			
		||||
 * @author scholar
 | 
			
		||||
 */
 | 
			
		||||
public class QiniuSmsClientTest extends BaseMockitoUnitTest {
 | 
			
		||||
    private final SmsChannelProperties properties = new SmsChannelProperties()
 | 
			
		||||
            .setApiKey(randomString())// 随机一个 apiKey,避免构建报错
 | 
			
		||||
            .setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错
 | 
			
		||||
            .setSignature("芋道源码");
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private QiniuSmsClient smsClient = new QiniuSmsClient(properties);
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testDoInit() {
 | 
			
		||||
        // 调用
 | 
			
		||||
        smsClient.doInit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testDoSendSms_success() throws Throwable {
 | 
			
		||||
        try (MockedStatic<HttpUtils> httpUtilsMockedStatic = mockStatic(HttpUtils.class)) {
 | 
			
		||||
            // 准备参数
 | 
			
		||||
            Long sendLogId = randomLongId();
 | 
			
		||||
            String mobile = randomString();
 | 
			
		||||
            String apiTemplateId = randomString() + " " + randomString();
 | 
			
		||||
            List<KeyValue<String, Object>> templateParams = Lists.newArrayList(
 | 
			
		||||
                    new KeyValue<>("1", 1234), new KeyValue<>("2", "login"));
 | 
			
		||||
            // mock 方法
 | 
			
		||||
            httpUtilsMockedStatic.when(() -> HttpUtils.post(anyString(), anyMap(), anyString()))
 | 
			
		||||
                    .thenReturn("{\"message_id\":\"17245678901\"}");
 | 
			
		||||
            // 调用
 | 
			
		||||
            SmsSendRespDTO result = smsClient.sendSms(sendLogId, mobile,
 | 
			
		||||
                    apiTemplateId, templateParams);
 | 
			
		||||
            // 断言
 | 
			
		||||
            assertTrue(result.getSuccess());
 | 
			
		||||
            assertEquals("17245678901", result.getSerialNo());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testDoSendSms_fail() throws Throwable {
 | 
			
		||||
        try (MockedStatic<HttpUtils> httpUtilsMockedStatic = mockStatic(HttpUtils.class)) {
 | 
			
		||||
            // 准备参数
 | 
			
		||||
            Long sendLogId = randomLongId();
 | 
			
		||||
            String mobile = randomString();
 | 
			
		||||
            String apiTemplateId = randomString() + " " + randomString();
 | 
			
		||||
            List<KeyValue<String, Object>> templateParams = Lists.newArrayList(
 | 
			
		||||
                    new KeyValue<>("1", 1234), new KeyValue<>("2", "login"));
 | 
			
		||||
            // mock 方法
 | 
			
		||||
            httpUtilsMockedStatic.when(() -> HttpUtils.post(anyString(), anyMap(), anyString()))
 | 
			
		||||
                    .thenReturn("{\"error\":\"BadToken\",\"message\":\"Your authorization token is invalid\",\"request_id\":\"etziWcJFo1C8Ne8X\"}");
 | 
			
		||||
            // 调用
 | 
			
		||||
            SmsSendRespDTO result = smsClient.sendSms(sendLogId, mobile,
 | 
			
		||||
                    apiTemplateId, templateParams);
 | 
			
		||||
            // 断言
 | 
			
		||||
            assertFalse(result.getSuccess());
 | 
			
		||||
            assertEquals("BadToken", result.getApiCode());
 | 
			
		||||
            assertEquals("Your authorization token is invalid", result.getApiMsg());
 | 
			
		||||
            assertEquals("etziWcJFo1C8Ne8X", result.getApiRequestId());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetSmsTemplate() throws Throwable {
 | 
			
		||||
        try (MockedStatic<HttpUtils> httpUtilsMockedStatic = mockStatic(HttpUtils.class)) {
 | 
			
		||||
            // 准备参数
 | 
			
		||||
            String apiTemplateId = randomString();
 | 
			
		||||
            // mock 方法
 | 
			
		||||
            httpUtilsMockedStatic.when(() -> HttpUtils.get(anyString(), anyMap()))
 | 
			
		||||
                    .thenReturn("{\"audit_status\":\"passed\",\"created_at\":1724231187,\"description\":\"\",\"disable_broadcast\":false,\"disable_broadcast_reason\":\"\",\"disable_reason\":\"\",\"disabled\":false,\"id\":\"1826184073773596672\",\"is_oversea\":false,\"name\":\"dd\",\"parameters\":[\"code\"],\"reject_reason\":\"\",\"signature_id\":\"1826099896017498112\",\"signature_text\":\"yudao\",\"template\":\"您的验证码为:${code}\",\"type\":\"verification\",\"uid\":1383022432,\"updated_at\":1724288561,\"variable_count\":0}");
 | 
			
		||||
            // 调用
 | 
			
		||||
            SmsTemplateRespDTO result = smsClient.getSmsTemplate(apiTemplateId);
 | 
			
		||||
            // 断言
 | 
			
		||||
            assertEquals("1826184073773596672", result.getId());
 | 
			
		||||
            assertEquals("您的验证码为:${code}", result.getContent());
 | 
			
		||||
            assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getAuditStatus());
 | 
			
		||||
            assertEquals("", result.getAuditReason());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testParseSmsReceiveStatus() {
 | 
			
		||||
        // 准备参数
 | 
			
		||||
        String text = "{\"items\":[{\"mobile\":\"18881234567\",\"message_id\":\"10135515063508004167\",\"status\":\"DELIVRD\",\"delivrd_at\":1724591666,\"error\":\"DELIVRD\",\"seq\":\"123\"}]}";
 | 
			
		||||
        // 调用
 | 
			
		||||
        List<SmsReceiveRespDTO> statuses = smsClient.parseSmsReceiveStatus(text);
 | 
			
		||||
        // 断言
 | 
			
		||||
        assertEquals(1, statuses.size());
 | 
			
		||||
        assertTrue(statuses.getFirst().getSuccess());
 | 
			
		||||
        assertEquals("DELIVRD", statuses.getFirst().getErrorMsg());
 | 
			
		||||
        assertEquals(LocalDateTime.of(2024, 8, 25, 21, 14, 26), statuses.getFirst().getReceiveTime());
 | 
			
		||||
        assertEquals("18881234567", statuses.getFirst().getMobile());
 | 
			
		||||
        assertEquals("10135515063508004167", statuses.getFirst().getSerialNo());
 | 
			
		||||
        assertEquals(123, statuses.getFirst().getLogId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testConvertSmsTemplateAuditStatus() {
 | 
			
		||||
        assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(),
 | 
			
		||||
                smsClient.convertSmsTemplateAuditStatus("passed"));
 | 
			
		||||
        assertEquals(SmsTemplateAuditStatusEnum.CHECKING.getStatus(),
 | 
			
		||||
                smsClient.convertSmsTemplateAuditStatus("reviewing"));
 | 
			
		||||
        assertEquals(SmsTemplateAuditStatusEnum.FAIL.getStatus(),
 | 
			
		||||
                smsClient.convertSmsTemplateAuditStatus("rejected"));
 | 
			
		||||
        assertThrows(IllegalArgumentException.class, () -> smsClient.convertSmsTemplateAuditStatus("unknown"),
 | 
			
		||||
                "未知审核状态(3)");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -112,5 +112,39 @@ public class SmsClientTests {
 | 
			
		||||
        System.out.println(smsSendRespDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // ========== 七牛云 ==========
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @Disabled
 | 
			
		||||
    public void testQiniuSmsClient_sendSms() throws Throwable {
 | 
			
		||||
        SmsChannelProperties properties = new SmsChannelProperties()
 | 
			
		||||
                .setApiKey("SMS_QINIU_ACCESS_KEY")
 | 
			
		||||
                .setApiSecret("SMS_QINIU_SECRET_KEY");
 | 
			
		||||
        QiniuSmsClient client = new QiniuSmsClient(properties);
 | 
			
		||||
        // 准备参数
 | 
			
		||||
        Long sendLogId = System.currentTimeMillis();
 | 
			
		||||
        String mobile = "17321315478";
 | 
			
		||||
        String apiTemplateId = "3644cdab863546a3b718d488659a99ef";
 | 
			
		||||
        List<KeyValue<String, Object>> templateParams = List.of(new KeyValue<>("code", "1122"));
 | 
			
		||||
        // 调用
 | 
			
		||||
        SmsSendRespDTO smsSendRespDTO = client.sendSms(sendLogId, mobile, apiTemplateId, templateParams);
 | 
			
		||||
        // 打印结果
 | 
			
		||||
        System.out.println(smsSendRespDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @Disabled
 | 
			
		||||
    public void testQiniuSmsClient_getSmsTemplate() throws Throwable {
 | 
			
		||||
        SmsChannelProperties properties = new SmsChannelProperties()
 | 
			
		||||
                .setApiKey("SMS_QINIU_ACCESS_KEY")
 | 
			
		||||
                .setApiSecret("SMS_QINIU_SECRET_KEY");
 | 
			
		||||
        QiniuSmsClient client = new QiniuSmsClient(properties);
 | 
			
		||||
        // 准备参数
 | 
			
		||||
        String apiTemplateId = "3644cdab863546a3b718d488659a99ef";
 | 
			
		||||
        // 调用
 | 
			
		||||
        SmsTemplateRespDTO template = client.getSmsTemplate(apiTemplateId);
 | 
			
		||||
        // 打印结果
 | 
			
		||||
        System.out.println(template);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user