springboot项目调用阿里云短信接口(包括短信上行)

本文介绍了如何在SpringBoot项目中使用阿里云短信服务,包括发送短信和接收短信回复(短信上行)的功能。首先,需要开通阿里云短信服务并获取AccessKey,创建签名和模板。发送短信的示例代码提供了调用接口的步骤。对于短信上行,阿里云提供了一个消息队列来存储回复内容,通过下载的DEMO解析队列并处理信息。文章强调了如何根据业务需求定制处理短信回复内容的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在做项目,很久没有写过博客了,最近做的一个项目中遇到了一个业务需要用到短信功能包括了发送短信和短信回复之后要收到回复内容,阿里云短信服务是一个非常好的平台,里面提供了多种短信接口可以供我们使用,但是作为一个菜鸟,我也是第一次使用阿里云的这个短信接口,研究了一些时间在这个过程中也遇到了一些问题,现在我已经解决这些问题,这里我把我遇到的问题总结一些,帮助和我一样需要调用短信接口的同学。因为我做的项目需要收到短信服务,即阿里云短信服务中的短信上行,关于这个功能阿里云文档上解释的并不是很明白,而且我查了很多博客说的也不是特别明白,这就会让像我一样第一次使用短信接口的同学很迷茫。下面我们来看下。

发送短信功能

关于发送短信这个功能,阿里云的文档写的还是很清楚的,阿里云控制台上提供了相应的SDK和DEMO,由于我学的java,这里以java为例。

首先说一下总体流程:我们想要实现调用阿里云短信接口的话,我们需要完成以下几步

在这里插入图片描述
首先我们要有一个阿里云帐号,然后开通阿里云短信服务,然后在短信服务控制台获取AccessKey,这个Key相当于一个唯一标识来确定使用者的权限的,然后创建签名和模版
短信签名类似于我们认知的签名一样,在短信内容的开头有一个签名用来标识短信来源的,这个模版就是我们短信内容呈现的样例,最后在我们的程序中配置好接口就可以使用短信服务了。

发送短信样例:

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;

public class CommonRpc {
    public static void main(String[] args) {
        DefaultProfile profile = DefaultProfile.getProfile("phoneNumbers", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        //request.setProtocol(ProtocolType.HTTPS);
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");

        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

这是阿里云短信服务给出的用来发短信的样例demo。我们只要把phoneNumbers,accessKeyId和accessSecret换成我们自己的然后调用这个方法就可以实现发送短信了。

接收短信回复(短信上行)

关于获取短信内容我个人的理解是:阿里云有一个消息队列用来储存我们短信的回复内容,我们用一个方法带着指定的参数去获取相应的回复

发送短信官网都有样例,自己看也可以看明白,这里我们主要看一下这个接收短信回复内容的方法。
在阿里云文档上也有相关的短信上行demo,但是像我一样第一次接触这个的同学找这个demo就比较费劲,主要是这个demo自己看确实有点不好理解。

短信上行阿里云网址 https://help.aliyun.com/document_detail/101646.html?spm=a2c4g.11186623.6.623.4aff3202SWN3zk
我们可以从这个网址下载相应的demo
在这里插入图片描述
这个demo下载下来之后有些jar包可能会报错,他把那些jar包都放到lib文件夹里了,我们
引一下就可以了。右键lib点击Add as library
在这里插入图片描述

我们看一下demo

package com.alicom.mns.sample;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import com.alicom.mns.tools.DefaultAlicomMessagePuller;
import com.alicom.mns.tools.MessageListener;
import com.aliyun.mns.model.Message;
import com.google.gson.Gson;

/**
 * 只能用于接收云通信的消息,不能用于接收其他业务的消息
 * 短信上行消息接收demo
 */

public class ReceiveDemo {

	private static Log logger=LogFactory.getLog(ReceiveDemo.class);
	
	static class MyMessageListener implements MessageListener{
		private Gson gson=new Gson();

		@Override
		public boolean dealMessage(Message message) {

			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			//消息的几个关键值
			System.out.println("message receiver time from mns:" + format.format(new Date()));
			System.out.println("message handle: " + message.getReceiptHandle());
            System.out.println("message body: " + message.getMessageBodyAsString());
            System.out.println("message id: " + message.getMessageId());
            System.out.println("message dequeue count:" + message.getDequeueCount());
            System.out.println("Thread:" + Thread.currentThread().getName());
            try{
            	Map<String,Object> contentMap=gson.fromJson(message.getMessageBodyAsString(), HashMap.class);

				//TODO 根据文档中具体的消息格式进行消息体的解析
                String arg = (String) contentMap.get("arg");

                //TODO 这里开始编写您的业务代码

            }catch(com.google.gson.JsonSyntaxException e){
            	logger.error("error_json_format:"+message.getMessageBodyAsString(),e);
				//理论上不会出现格式错误的情况,所以遇见格式错误的消息,只能先delete,否则重新推送也会一直报错
				return true;
            } catch (Throwable e) {
				//您自己的代码部分导致的异常,应该return false,这样消息不会被delete掉,而会根据策略进行重推
				return false;
			}

			//消息处理成功,返回true, SDK将调用MNS的delete方法将消息从队列中删除掉
			return true;
		}

	}

	public static void main(String[] args) throws Exception, ParseException {

		DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();

		//设置异步线程池大小及任务队列的大小,还有无数据线程休眠时间
		puller.setConsumeMinThreadSize(6);
		puller.setConsumeMaxThreadSize(16);
		puller.setThreadQueueSize(200);
		puller.setPullMsgThreadSize(1);
		//和服务端联调问题时开启,平时无需开启,消耗性能
		puller.openDebugLog(false);

		//TODO 此处需要替换成开发者自己的AK信息
		String accessKeyId="accessKeyId";
		String accessKeySecret="accessKeySecret";

		/*
		* TODO 将messageType和queueName替换成您需要的消息类型名称和对应的队列名称
		*云通信产品下所有的回执消息类型:
		*1:短信回执:SmsReport,
		*2:短息上行:SmsUp
		*3:语音呼叫:VoiceReport
		*4:流量直冲:FlowReport
		*/
		String messageType="messageType";//此处应该替换成相应产品的消息类型
		String queueName="queueName";//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName,格式类似Alicom-Queue-xxxxxx-SmsReport
		puller.startReceiveMsg(accessKeyId,accessKeySecret, messageType, queueName, new MyMessageListener());
    }
}

这个东西我是第一次接触,我当时看到这时感觉挺懵的,其实仔细看的话也不是特别难理解。
我们先来看一下这个代码,这个代码包含了一个处理信息的方法和一个获取信息的主方法,我们只要把代码中相应的东西换成自己的就可以使用了。
1.我们要把这个accessKeyId和accessKeySecret换成我们自己的。
在这里插入图片描述
2.然后再把messageType换成我们这里需要用的短信上行(SmsUp),queueName这是MNS消息队列的名称,我们可以在阿里云短信服务控制台找到
在这里插入图片描述
队列名称:
在这里插入图片描述
简单理解这个demo就是,启动了一个线程池,当收到发送出去的短信的回复时就会创建一个线程去阿里云消息队列上找到这条短信的回复内容然后叫给信息处理方法处理。我们可以根据自己业务需求来使用这个服务。比如我的一个业务需求是要求确定每一条短信的回复内容是什么,然后根据这个内容去处理相关业务。

这是我的代码

@PostConstruct
    public void init(){
        logger.info("接收上行短信start");
        DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();

        //设置异步线程池大小及任务队列的大小,还有无数据线程休眠时间
        puller.setConsumeMinThreadSize(6);
        puller.setConsumeMaxThreadSize(16);
        puller.setThreadQueueSize(200);
        puller.setPullMsgThreadSize(1);
        //和服务端联调问题时开启,平时无需开启,消耗性能
        puller.openDebugLog(false);

        /*
         * TODO 将messageType和queueName替换成您需要的消息类型名称和对应的队列名称
         *云通信产品下所有的回执消息类型:
         *1:短信回执:SmsReport,
         *2:短息上行:SmsUp
         *3:语音呼叫:VoiceReport
         *4:流量直冲:FlowReport
         */
        String messageType = smsProerties.getMessageType();//此处应该替换成相应产品的消息类型
        String queueName = smsProerties.getQueueName();//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName,格式类似Alicom-Queue-xxxxxx-SmsReport
        try {
            puller.startReceiveMsg(smsProerties.getAccessKeyId(), smsProerties.getAccessSecret(), messageType, queueName, new MyMessageListener());
        } catch (ClientException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

给这个获取信息的方法加上一个PostConstruct注解,在项目启动时就开启线程池,每收到一条回复就处理一条。

最后说明一下,我们获取到的信息回复内容以这个demo为例会交给dealMessage方法处理,也就是说,我们要把我们需要回复内容的业务逻辑写在这个方法里。我们可以把这个方法封装成一个工具类来使用。
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值