1、注册阿里云账号,并开通云短信服务

开通短信服务时免费的,但是发短信需要从点钱,短信收费可以按发送条数收费

2、充值

3、申请短信签名

4、申请短信模板

5、创建AccessKey,这是很重要,是程序调用短信api接口的凭证

可以查看接入文档

6、代码开发调用接口

(1)创建springboot gradle工程

(2)导入jar包

(jar可以去官网下载,代码官网上面也有)2个jar包,一个aliyun-java-sdk-core包,另外一个是alicom-dysms-api包。

plugins {id 'org.springframework.boot' version '2.0.4.RELEASE'id 'java'
}apply plugin: 'io.spring.dependency-management'group = 'com.aliyun'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'repositories {mavenCentral()
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'testImplementation 'org.springframework.boot:spring-boot-starter-test'compile "com.aliyun:aliyun-java-sdk-core:4.0.8","com.aliyun:aliyun-java-sdk-dysmsapi:1.1.0","com.google.code.gson:gson:2.8.4","com.alibaba:fastjson:1.2.45"}

(3)java api

(4)工程项目中添加短信发送工具类AliyunSmsUtil

代码如下:

package com.aliyun.aliyunsms.util;import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** 阿里云sms短信工具类*/
public class AliyunSmsUtil {private static final Logger logger = LoggerFactory.getLogger(AliyunSmsUtil.class);//签名(阿里平台配置)public static String signName = "阿里云";/*** AccessKey ID(阿里平台配置),*/private static String accessKeyId = "LTAID*******";/***     Access Key Secret(阿里平台配置)*/private static  String accessKeySecret = "TP7vYBU3FFXYI*******";//短信API产品名称(短信产品名固定,无需修改)public static final String SMS_PRODUCT = "Dysmsapi";//短信API产品域名(接口地址固定,无需修改)public static final String SMS_DOMAIN = "dysmsapi.aliyuncs.com";/*** 发送牧家云柜短信* @param templateCode  //必填:短信模版CODE-可在短信控制台中找到* @param mobile //必填:待发送手机号* @param templateParam 发送内容替换 key:code value: 内容* @return true-成功;false-失败*/public static boolean sendSms(String templateCode , String mobile , Map<String , String> templateParam)  {//可自助调整超时时间SendSmsResponse sendSmsResponse = null;try {sendSmsResponse = sendSms(signName ,templateCode , mobile , templateParam );} catch (ClientException e) {e.printStackTrace();logger.error("发送短信出错",e);sendSmsResponse = new SendSmsResponse();sendSmsResponse.setCode("error");sendSmsResponse.setMessage(e.toString());}//请求成功if(!"OK".equals(sendSmsResponse.getCode())) {logger.error("发送消息失败,错误代码:{},code:{}", convertCodeToMsg(sendSmsResponse) , sendSmsResponse.getCode());return false;}logger.info("发送消息成功:{}", JSON.toJSONString(sendSmsResponse));return  true;}/*** 发送短信* @param singName 必填:短信签名-可在短信控制台中找到* @param templateCode  //必填:短信模板-可在短信控制台中找到* @param mobile //必填:待发送手机号* @param templateParam 发送内容替换 key:code value: 内容* @return* @throws ClientException*/public static SendSmsResponse sendSms(String singName , String templateCode , String mobile , Map<String , String> templateParam) throws ClientException {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", SMS_PRODUCT, SMS_DOMAIN);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象-具体描述见控制台-文档部分内容SendSmsRequest request = new SendSmsRequest();request.setSignName(singName);request.setTemplateCode(templateCode);//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”request.setPhoneNumbers(mobile);String templateParamString = JSON.toJSONString(templateParam);//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为"{\"name\":\"Tom\", \"code\":\"123\"}"//友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败request.setTemplateParam(templateParamString);//request.setSmsUpExtendCode("90997");//选填-上行短信扩展码(无特殊需求用户请忽略此字段)request.setOutId("扩展字段");  //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者//请求失败这里会抛ClientException异常SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);return sendSmsResponse;}/*** 转换code为错误信息* @param sendSmsResponse* @return* OK  请求成功* isp.RAM_PERMISSION_DENY    RAM权限DENY* isv.OUT_OF_SERVICE  业务停机* isv.PRODUCT_UN_SUBSCRIPT    未开通云通信产品的阿里云客户* isv.PRODUCT_UNSUBSCRIBE 产品未开通* isv.ACCOUNT_NOT_EXISTS  账户不存在* isv.ACCOUNT_ABNORMAL    账户异常* isv.SMS_TEMPLATE_ILLEGAL    短信模板不合法* isv.SMS_SIGNATURE_ILLEGAL   短信签名不合法* isv.INVALID_PARAMETERS  参数异常* isp.SYSTEM_ERROR    系统错误* isv.MOBILE_NUMBER_ILLEGAL   非法手机号* isv.MOBILE_COUNT_OVER_LIMIT 手机号码数量超过限制* isv.TEMPLATE_MISSING_PARAMETERS 模板缺少变量* isv.BUSINESS_LIMIT_CONTROL  业务限流* isv.INVALID_JSON_PARAM  JSON参数不合法,只接受字符串值* isv.BLACK_KEY_CONTROL_LIMIT 黑名单管控* isv.PARAM_LENGTH_LIMIT  参数超出长度限制* isv.PARAM_NOT_SUPPORT_URL   不支持URL* isv.AMOUNT_NOT_ENOUGH   账户余额不足*/public static String convertCodeToMsg(SendSmsResponse sendSmsResponse) {if ("error".equals(sendSmsResponse.getCode())) {return "调用报错";}else if ("isp.RAM_PERMISSION_DENY".equals(sendSmsResponse.getCode())) {return "RAM权限DENY";}else if ("isv.OUT_OF_SERVICE".equals(sendSmsResponse.getCode())) {return "业务停机";}else if ("isv.PRODUCT_UN_SUBSCRIPT".equals(sendSmsResponse.getCode())) {return "未开通云通信产品的阿里云客户";}else if ("isv.PRODUCT_UNSUBSCRIBE".equals(sendSmsResponse.getCode())) {return "产品未开通";}else if ("isv.ACCOUNT_NOT_EXISTS".equals(sendSmsResponse.getCode())) {return "账户不存在";}else if ("isv.ACCOUNT_ABNORMAL".equals(sendSmsResponse.getCode())) {return "账户异常";}else if ("isp.SMS_TEMPLATE_ILLEGAL".equals(sendSmsResponse.getCode())) {return "短信模板不合法";}else if ("isp.SMS_SIGNATURE_ILLEGAL".equals(sendSmsResponse.getCode())) {return "短信签名不合法";}else if ("isp.INVALID_PARAMETERS".equals(sendSmsResponse.getCode())) {return "参数异常";}else if ("isp.SYSTEM_ERROR".equals(sendSmsResponse.getCode())) {return "系统错误";}else if ("isp.MOBILE_NUMBER_ILLEGAL".equals(sendSmsResponse.getCode())) {return "非法手机号";}else if ("isp.MOBILE_COUNT_OVER_LIMIT".equals(sendSmsResponse.getCode())) {return "手机号码数量超过限制";}else if ("isp.TEMPLATE_MISSING_PARAMETERS".equals(sendSmsResponse.getCode())) {return "模板缺少变量";}else if ("isp.BUSINESS_LIMIT_CONTROL".equals(sendSmsResponse.getCode())) {return "业务限流";}else if ("isp.INVALID_JSON_PARAM".equals(sendSmsResponse.getCode())) {return "JSON参数不合法,只接受字符串值";}else if ("isp.BLACK_KEY_CONTROL_LIMIT".equals(sendSmsResponse.getCode())) {return "黑名单管控";}else if ("isp.PARAM_LENGTH_LIMIT".equals(sendSmsResponse.getCode())) {return "参数超出长度限制";}else if ("isp.PARAM_NOT_SUPPORT_URL".equals(sendSmsResponse.getCode())) {return "不支持URL";}else if ("isp.AMOUNT_NOT_ENOUGH".equals(sendSmsResponse.getCode())) {return "账户余额不足";}return "未知错误";}/*** 查询短信信息详情* @param bizId 业务流水号* @return* @throws ClientException*/public static QuerySendDetailsResponse querySendDetails(String bizId) throws ClientException {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", SMS_PRODUCT, SMS_DOMAIN);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象QuerySendDetailsRequest request = new QuerySendDetailsRequest();request.setPhoneNumber("15000000000");    //必填-号码request.setBizId(bizId);   //可选-流水号SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd"); //必填-发送日期 支持30天内记录查询,格式yyyyMMddrequest.setSendDate(ft.format(new Date()));request.setPageSize(10L);  //必填-页大小request.setCurrentPage(1L); //必填-当前页码从1开始计数//hint 此处可能会抛出异常,注意catchQuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);return querySendDetailsResponse;}// 产生随机长度码public static String getNumCode(int intiCode, int endCode) {String checkCode = "";for (int i = intiCode; i < endCode; i++) {String code = (int) Math.floor(Math.random() * 10) + "";checkCode += code;}return checkCode;}public static void main(String[] args) {String loginTemplateCode = "SMS_000" ;//登录模板编码String registerTemplateCode = "SMS_0001" ;//注册模板编码String mobile = "1358154***";String number = getNumCode(0  , 4);//随机生成4位验证码//模板参数Map<String , String> templateParam = new HashMap<>();templateParam.put("code" , number);//验证码,替换阿里云短信模板中的变量boolean flag = sendSms(registerTemplateCode,mobile,templateParam);System.out.println("短信发送成功状态:" + (flag ? "成功":"失败"));}}

(5)执行main方法测试短信验证码发送

阿里云短信发送接口调试相关推荐

  1. 阿里云短信发送接口直接HTTP请求调用

    最新一个个性化项目,客户要求使用阿里云短信发送接口. 但是实在不想引入阿里云的SDK,就自己生成签名,拼接URL实现,  其实用他们的SDK最终也是一哥GET请求进行调用,归根接底还是HTTP请求. ...

  2. PHP阿里云短信发送文件(带签名)

    <?php namespace app\admin\controller;/*** 阿里云短信发送接口*/ class Alisms {public $accesskeyid = "& ...

  3. PHP 实现 阿里云 短信发送 功能步骤

    1.创建签名 (记住签名名称,后面代码配置中需要),2小时以内会审核通过. 2.创建模板 (记住模板CODE ,后面代码配置中需要) 3. 生成AccessKey ID 和 Access Key Se ...

  4. Java阿里云短信发送工具类

    短信服务API介绍 阿里云短信发送:调用SendSms发送短信_短信服务-阿里云帮助中心 <!--springboot项目阿里云发送短信--> <dependency>< ...

  5. C/C++开发,阿里云短信服务接口的c++实现

    目录 一.阿里云短信服务接口 二.逻辑代码实现 三.编译测试效果 一.阿里云短信服务接口 最近在调用阿里云短信服务接口发现并没有c++的资料,网上查询发现也是零星描述,由于自身项目基础累积了C++的太 ...

  6. PHP 之阿里云短信发送

    一.阿里云短信发送函数封装 function aliyun_sms($mobile,$id,$data){// 引入阿里云短信类require_once $_SERVER['DOCUMENT_ROOT ...

  7. 阿里云短信服务接口返回: 只能向已回复授权信息的手机号发送

    项目场景: 在进入阿里云短信服务时,调用 OpenAPI-发送短信接口 , 返回异常情况及其解决. 问题描述 在进入阿里云短信服务时, 调用测试签名和测试短信模板后, 返回只能向已回复授权信息的手机号 ...

  8. 阿里云短信发送触发天级流量及解决办法

    前言 今天小项目里引入了阿里云短信.调试过程中,突然不发短信了.发现接口返回信息,触发天级流量限制.以下是原因和解决办法. 原因 短信发送有默认的频率限制 限制如下: 短信验证码 :使用同一个签名,对 ...

  9. 最新阿里云短信服务接口类【亲测成功】

    阿里大于 最新的阿里云短信接口,适用于阿里大于搬家以后的情况. 之前一直用阿里大于的短信接口,最近上项目时发现阿里大于悄悄地搬家到了阿里云!阿里云的SDK文件繁多,看得一头雾水!下面代码是最新的可适用 ...

最新文章

  1. 解题报告:SP2713 GSS4 - Can you answer these queries IV(GSS线段树八部曲之四)
  2. spark无法与服务器建立稳定连接,无法在Spark中将从站连接到主站
  3. [转]Python 命令行参数和getopt模块详解
  4. 现代密码学应用的范例-PGP
  5. oracle行列转换总结
  6. 【题意+分析】1043 Is It a Binary Search Tree (25 分)
  7. 计算机教室要配备空调吗,教室里不安装空调吗?如何正确安装空调?
  8. python 循环添加array_python常用的基本语句介绍
  9. android_Media
  10. 优化 Go 中的 map 并发存取
  11. android系统各种版本所占市场比例
  12. 离散小波变换wavedec matlab,MATLAB小波变换指令及其功能介绍(超级有用)
  13. Java 对上传文件后缀格式的校验
  14. 数据存储服务(存储服务器搭建细谈)
  15. 国科大英语Unit4
  16. 大数据与区块链的爱恨情仇,一场技术界相爱相杀的爱恋!
  17. adf的主要功能之一是_ADF 入门第一步系列
  18. 圣思园——Java SE Lesson 5
  19. 消息中间件合集:MQ(ActiveMQ/RabbitMQ/RocketMQ)+Kafka+笔记
  20. Roson的Qt之旅 #129 QNetworkProxyFactory(网络代理工厂)

热门文章

  1. wps怎么导入xml文件_《WPS表格怎么导入XML数据?》 如何将excel导入wps表格数据
  2. 关于刀具类的RFID资产管理解决方案-RFID固定资产管理-新导智能
  3. 哪些成员函数不能被继承
  4. 我为什么学计算机作文700,我的电脑作文700字
  5. Auto Tune Vocal EQ均衡器永久版发布
  6. leetcode刷题错误笔记(树之前)
  7. 为什么我打的jar包没有注解?
  8. 字幕说--自媒体人必备的在线语音合成及同步字幕生成工具
  9. 背景大小比率css,css – 如何计算背景大小百分比?
  10. 【Xilinx】如何自动格式化Verilog代码