使用阿里云短信服务API实现短信验证码以及短信服务通知

  • 前言
    • 一 .短信调用简要说明
    • 二 .官方不带签名原生态测试demo
    • 调用结果如下
    • 三 .以上为不带模板和签名的API调用结果 下面加入签名和模板
    • 带有签名和模板的demo
    • 调用结果及说明
    • 四 .常见的调试结果错误返回值
    • 联系方式
      • 1.微信公众号,更多成长分享
    • 2.个人网站

前言

初学者刚刚接触API的使用会遇到很多坑,自己就是如此,近期参与一个项目开发,负责的其中一项即为短信服务接口,在其中也碰到了许多问题,于是想就想写这篇文章一共分享所得。
新手上路,错误与不足之处,还望大家海涵。

一 .短信调用简要说明

短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力。

支持向国内和国际快速发送验证码、短信通知和推广短信,服务范围覆盖全球200多个国家和地区。国内短信支持三网合一专属通道,与工信部携号转网平台实时互联。电信级运维保障,实时监控自动切换,到达率高达99%。完美支撑双11期间20亿短信发送,6亿用户触达。

使用其短信服务要先申请access key短信签名短信模板,审核时间一般一到两个工作日就可以了。

然后确保账户有余额,一条通知短信0.0045元。

随后就可以调用API接口了,代码demo很容易理解,导入依赖或是下载对应编程语言的短信open-api-SDK到本地导入就完成准备工作。


然后就是测试了,导入以上的签名模板等进入demo代码就可以了。

二 .官方不带签名原生态测试demo

//阿里云SMS短信服务demo
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;
/*
pom.xml
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.0.3</version>
</dependency>
*/
public class CommonRpc {public static void main(String[] args) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<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");request.putQueryParameter("RegionId", "cn-hangzhou");request.putQueryParameter("PhoneNumbers", "13027145080");try {CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}}
}

调用结果如下


三 .以上为不带模板和签名的API调用结果 下面加入签名和模板


带有签名和模板的demo

相应区块已进行注释说明,只需要替换签名,模板,以及变量的参数值就可以使用了。变量类型需要自己在申请时自定义,以下展示为个人模板,具体情况请参照模板解决

package com.whuseat.notify_server.south.mess_service;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;/*** 阿里云短信API调用类** @author  GanAH on 2019/3/30.* @version 1.0*/
public class HttpSendSms{public void StartSendSms(){/*** 调用短信API请求** access key* regionId:短信服务区域.* accessKeyId:阿里云短信服务access keyId.* secret:access key密钥.*/DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","LTAIAbjCxxxxxxW", "B4pWsaQfjzvVxxxxxxxxOF9");IAcsClient client = new DefaultAcsClient(profile);/*** 传入参数,调用SDK*/CommonRequest request = new CommonRequest();//request.setProtocol(ProtocolType.HTTPS);request.setMethod(MethodType.POST);request.setDomain("dysmsapi.aliyuncs.com");request.setVersion("2019-03-30");request.setAction("SendSms");/*** 短信通知用户*/request.putQueryParameter("PhoneNumbers", "130xxxxx");/*** 短信签名*/request.putQueryParameter("SignName", "XXXX");/*** 短信通知模板*/request.putQueryParameter("TemplateCode", "SMS_16xxxxx");/*** 模板变量名** 用户姓名name,时段time,数值code*/request.putQueryParameter("TemplateParam", "{\"name\":\"GanAH\",\"time\":\"2019\",\"code\":\"20\"}");try{CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());}catch (ServerException e){e.printStackTrace();}catch (ClientException e){e.printStackTrace();}}public static void main(String[] args){try{HttpSendSms Test1 = new HttpSendSms();Test1.StartSendSms();QuerySendDetails Test2 = new QuerySendDetails();SendBatchSms Test3 = new SendBatchSms();Test2.ShowQuerySendDetails();Test3.StartSendBatchSms();}catch (Exception e){e.printStackTrace();}}}

调用结果及说明

  • 以上为我加入签名和模板,调整好变量后的调用结果,其中的短信:"签名场景非法"是由于我所用的示例短信签名和示例短信通知模板不对应所致,demo本身无问题。
  • 使用不匹配的示例是为了说明下面的问题:
    Code一栏为错误返回值,其说明了你的API调用错误类型,具体修改方法官方有指导,为了方便我已列出如下面所示。
  • 特别说明:加入测试的变量编辑方式如下图(最后一栏):

四 .常见的调试结果错误返回值

调用API接口会产生接口调用错误码,常见接口调用错误码显示及修改建议如下。
错误码Code —— 错误提示Message —— 原因及建议处理方式
(一) isp.RAM_PERMISSION_DENY RAM权限DENY 当提示RAM权限不足时,就需要给当前使用的AK对应子账号进行授权:AliyunDysmsFullAccess(权限名称)。具体权限授权详见:https://help.aliyun.com/document_detail/55764.html?spm=5176.product44282.6.548.bKZJL2
(二) isv.OUT_OF_SERVICE 业务停机 请先查看账户余额,若余额大于零,则请通过创建工单联系工程师处理
(三) isv.PRODUCT_UN_SUBSCRIPT 未开通云通信产品的阿里云客户 未开通云通信产品的阿里云客户(该AK所属的账号尚未开通云通信的服务,包括短信、语音、流量等服务)注:阿里云短信服务包含:1、消息服务 2、云通信短信服务 3、云市场短信接口,账号和短信接口不可混用。当出现此类提示报错需要检查当前AK是否已经开通阿里云云通信短信服务,如已开通消息服务,则参照消息服务文档调用接口。
(四) isv.PRODUCT_UNSUBSCRIBE 产品未开通 产品未订购(该AK所属的账号尚未开通当前接口的产品,如仅开通了短信服务的用户调用语音接口。),检查AK对应账号是否已开通调用接口对应的服务。短信服务开通链接:https://www.aliyun.com/product/sms
(五) isv.ACCOUNT_NOT_EXISTS 账户不存在 请确认使用的账号是否与申请的账号一致
(六) isv.ACCOUNT_ABNORMAL 账户异常 请确认使用的账号是否与申请的账号一致
(七) isv.SMS_TEMPLATE_ILLEGAL 短信模版不合法 TemplateCode参数请传入审核通过的模版ID,模版见:见:https://dysms.console.aliyun.com/dysms.htm#/template
(八) isv.SMS_SIGNATURE_ILLEGAL 短信签名不合法 SignName请传入审核通过的签名内容,签名见:https://dysms.console.aliyun.com/dysms.htm#/sign
(九) isv.INVALID_PARAMETERS 参数异常 对照文档,检查参数格式。例:短信查询接口SendDate日期格式yyyyMMdd,错误:2017-01-01正确:20170101
(十) isp.SYSTEM_ERROR isp.SYSTEM_ERROR 请重试接口调用,如仍存在此情况请创建工单反馈工程师查看
(十一) isv.MOBILE_NUMBER_ILLEGAL 非法手机号 PhoneNumbers参数请传入11位国内号段的手机号码
(十二) isv.MOBILE_COUNT_OVER_LIMIT 手机号码数量超过限制 短信接收号码,支持以英文逗号分隔的形式进行批量调用,批量上限为1000个手机号码,PhoneNumbers参数单次调用不传入过多接收号码
(十三) isv.TEMPLATE_MISSING_PARAMETERS 模版缺少变量 TemplateParam中需要以json格式字符串给使用的模版中出现的所有变量进行赋值。例:模版为:您好name,验证码{name},验证码name,验证码{code} TemplateParam={“name”:”Tom”,”code”:”123”}
(十四) isv.BUSINESS_LIMIT_CONTROL 业务限流 将短信发送频率限制在正常的业务流控范围内,默认流控:短信验证码 :使用同一个签名,对同一个手机号码发送短信验证码,支持1条/分钟,5条/小时 ,累计10条/天。
(十五) isv.INVALID_JSON_PARAM JSON参数不合法,只接受字符串值 TemplateParam入参以Json格式字符串形式传入。例:正确{“code”:”123”}
(十六) isv.BLACK_KEY_CONTROL_LIMIT 黑名单管控 黑名单管控是指变量内容含有限制发送的内容,变量不支持透传url,同时检查通过变量是否透传了一些敏感信息触发关键字
(十七) isv.PARAM_LENGTH_LIMIT 参数超出长度限制 单个变量长度限制在20字符内。
(十八) isv.PARAM_NOT_SUPPORT_URL 不支持URL 变量不支持透传url,同时检查通过变量是否透传了一些敏感信息触发关键字
(十九) isv.AMOUNT_NOT_ENOUGH 账户余额不足 转入金额不足以发送当前信息,确保余额足够发送当前短信
(二十) isv.TEMPLATE_PARAMS_ILLEGAL 模版变量里包含非法关键字 变量不支持透传url,同时检查通过变量是否透传了一些敏感信息触发关键字
(二十一) SignatureDoesNotMatch Specified signature is not matched with our calculation. Signature加密错误,如为SDK调用,则需要注意accessKeyId和accessKeySecret字符串赋值正确无误;如自行加密的Signature,则需要检查加密逻辑,对照文档:https://help.aliyun.com/document_detail/56189.html
(二十二) InvalidTimeStamp.Expired Specified time stamp or date value is expired. 时间戳错误,发出请求的时间和服务器接收到请求的时间不在15分钟内。经常出现该错误的原因是时区原因造成的,目前网关使用的时间是GMT时间
(二十三) SignatureNonceUsed Specified signature nonce was used already. 唯一随机数重复,SignatureNonce为唯一随机数,用于防止网络重放攻击。不同请求间要使用不同的随机数值。
(二十四) InvalidVersion Specified parameter Version is not valid. 版本号错误,需要确认接口的版本号,如云通信短信、语音、流量服务的Version=2017-05-25
(二十五) InvalidAction.NotFound Specified api is not found, please check your url and method 接口名错误,需要确认接口地址和接口名,如云通信短信服务短信发送:dysmsapi.aliyuncs.com,接口名Action=SendSms

联系方式

1.微信公众号,更多成长分享

2.个人网站

查看更多文章:GanAHE的小创元世纪 https:dgzc.ganahe.top

使用阿里云短信服务API实现短信验证码以及短信服务通知相关推荐

  1. ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介、使用方法之详细攻略

    ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介.使用方法之详细攻略 目录 一.百度云api 1.api之CV 二.旷视科技(face++)api 1.a ...

  2. 阿里云人脸比对API封装

    这是根据封装是根据阿里云官方给的Demo进行修改的,当时是因为编写微信小程序云函数需要使用到阿里云人脸比对接口,才对其进行封装的. 记录下来,方便下次使用. 复制下来可以直接使用. 用到的依赖如下,使 ...

  3. 互联网用户账号信息真实性认证(阿里云身份信息实名认证API接口服务)

    2021年10月份国家互联网信息办公室公布<互联网用户账号名称信息管理规定(征求意见稿)>.内容包括,互联网用户账号服务平台应当按照"后台实名.前台自愿"的原则,要求互 ...

  4. 阿里云教你掌握API的使用方法

    API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码 ...

  5. 阿里云对象存储以及api

    阿里云对象存储 简介 对象存储提供了基于分布式系统之上的对象形式的数据存储服务,并且可以通过 RESTful API 数 据读写接口及丰富的SDK接口进行数据的访问 特点 a)非结构存储 对象存储适用 ...

  6. 从阿里云容器攻防矩阵API安全生命周期,看如何构建金融安全云原生平台

    [编者按]云原生技术正在助力银行通过差异化业务进行创新,却也带来了由于研发/运维人员对新架构不熟悉所导致的基础设施风险.业务风险及数据暴露风险.如何在飞速更迭的技术环境下保持业务持续发展,同时保证业务 ...

  7. 阿里云MNS Queue Rest API操作示例

    概述 阿里云消息服务(Message Service)是一种高效.可靠.安全.便捷.可弹性扩展的分布式消息服务.MNS能够帮助应用开发者在他们应用的分布式组件上自由的传递数据.通知消息,构建松耦合系统 ...

  8. 探秘之阿里云 OSS 数据存储 API

    为什么叫探秘 使用过阿里云 OSS 存储 API 的用户和客服都知道有一个通用的环节就是 Authorization 的计算,以及请求头的一些添加规范,给用户和客服烙下了不小的 "心理阴影& ...

  9. 阿里云服务器Hadoop java api 上传文件报错 could only be written to 0 of the 1 minReplication nodes.

    问题描述 阿里云服务器命令行使用命令可以上传文件,但HDFS java API上传失败,上传后只有文件名没有数据 报错: could only be written to 0 of the 1 min ...

  10. 阿里云总裁胡晓明:未来和合作伙伴一起_服务1000万家企业

    点击有惊喜 这几天,杭州的云栖大会刷了很多人的朋友圈. 阿里云总裁胡晓明(阿里人喜欢叫他孙权)在云栖大会上说,云计算已成为中国互联网的基础设施,阿里云是全世界增速最快的云计算公司,未来要和合作伙伴一起 ...

最新文章

  1. apache 模块编译选项
  2. Amazing ASP.NET Core 2.0
  3. C语言中 怎样区分八进制 十进制 二进制?
  4. 第十二届蓝桥杯省赛JavaC组【第二场】真题——详细答案对照(完整版)
  5. 对可操作对象的占用状态、锁定状态、解锁状态的一些方案
  6. 小白学数据分析------日活跃人数分析
  7. 使用jRebel在IntelliJ IDEA 中进行 Java 热部署
  8. JS_console对象中的一些常用方法
  9. python空行拼接字符串_在python中的每一个空行插入一个新的行字符串
  10. 2020 年 GitHub 上那些优秀 Android 开源库,这里是 Top10! | 原力计划
  11. java 拖放文字_Java实现拖放效果
  12. 质量名人简介——朱兰(Joseph H.Juran)(转载)
  13. php html页面显示乱码怎么解决方法,html网页乱码原因以及解决办法
  14. 硬盘GPT和MBR分区表转换方法
  15. NOJ1060接苹果——DP
  16. 基于Apriori算法的高职大学生就业能力的研究
  17. dhtml gantt所有配置_dhtmlx-gantt相关配置
  18. Android 圆形头像实现
  19. python对缩进太敏感...a_a
  20. Vue指令之列表渲染

热门文章

  1. NFC天线匹配调试简介1
  2. 百度贴吧爬虫:理解网页的加载过程
  3. 编写应用程序,从命令行传入两个整型数作为除数和被除数。要求程序中捕获NumberFormatException 异常和ArithmeticException 异常,而且无论在哪种情况下,“总是被执行”
  4. python turtle 长方形_Python turtle 画五星红旗
  5. signature=2de078bcab8d9bebbe2dbc92c930a7ec,Storage device assisted data de-duplication
  6. JavaServlet+jsp基础使用
  7. vue-router之addRoutes(动态路由/权限路由)使用分析
  8. Vue实现权限管理的方法
  9. Chocolatey:Windows软件包管理系统_安装及使用指南
  10. Caused by: java.lang.NoClassDefFoundError: org/apache/curator/shaded/com/google/common/collect/Maps