前言:短信验证码对于大家来说并不陌生,它是一种有效的验证码系统,通过发送验证码到手机让使用者能够安全登陆。不论是网络购物还是大型网站,都能够提供手机短信验证码的功能,越来越多的人们都开始使用手机购物和手机登陆APP,短信验证码的使用也越来越多,它可以大大提高使用的准确性和最大的保证购物的安全性。不知你的项目是否有这短信验证码需求,今天就让我给大家介绍下如何接入短信验证码服务
对于选择第三方服务商,一定先考虑自身的使用背景和条件。购买之前,一定要货比三家,看看实际的到达率、开发成本、服务质量、响应速度、通道质量、稳定性等。不管别人怎么说,自己先测试下,多测试几家,不要动不动就跪了发不出去。这里提供参考的平台有:云之讯 、创蓝235、阿里云、容联云通讯、腾讯云。
常见的接口对接有API接口和SDK接口,一般都是用API接口。
SDK接口:SDK短信应用接口,是针对系统集成商和企业软件定制,为其系统的提供移动商务的应用方案,提供包括C++、VB、ASP、delphi、JAVA.NET等多种主流开发语言及 Windows、Linux、Unix 等运行环境的短信通讯开发组件,可以让开发者迅速开发并使用的SDK接口。
API接口: API接口的实现使用了WebService的方式,用户通过调用WebService的指定接口函数以达到发送短信的目的,这样也是快速接入的一种方法,并且提供主流开发语言的DEMO,方便开发者快速接入。
这里以阿里云平台的短信服务为例给大家讲解下:
1.前提
对于这几点,大家自行登录阿里云解决,有问题欢迎留言提问。
2.接口对接
API调用
简介
短信服务API提供短信发送、发送状态查询、短信批量发送等能力,在短信服务控制台上添加签名、模板并通过审核之后,可以调用短信服务API完成短信发送等操作。
常用的API接口
SendSms
短信发送接口,支持在一次请求中向多个不同的手机号码发送同样内容的短信。
注意:
发送短信会根据发送量计费
在一次请求中,最多可以向1000个手机号码发送同样内容的短信。
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
PhoneNumbers | String | 是 | 接收短信的手机号码。格式:国内短信:11位手机号码。国际/港澳台消息:国际区号+号码支持对多个手机号码发送短信,手机号码之间以英文逗号(,)分隔。 |
SignName | String | 是 | 短信签名名称。请在控制台签名管理页面签名名称一列查看。 |
TemplateCode | String | 是 | 短信模板ID。请在控制台模板管理页面模板CODE一列查看。 |
AccessKeyId | String | 否 | 主账号AccessKey的ID。 |
Action | String | 否 | 系统规定参数。取值:SendSms。 |
OutId | String | 否 | 外部流水扩展字段。 |
SmsUpExtendCode | String | 否 | 上行短信扩展码,无特殊需要此字段的用户请忽略此字段。 |
TemplateParam | String | 否 | 短信模板变量对应的实际值,JSON格式。 |
返回参数
名称 | 类型 | 描述 |
---|---|---|
BizId | String | 发送回执ID,可根据该ID在接口QuerySendDetails中查询具体的发送状态。 |
Code | String | 请求状态码。返回OK代表请求成功。其他错误码请看下面错误码列表 |
Message | String | 状态码的描述。 |
RequestId | String | 请求ID。 |
错误码列表
Code | 描述 |
---|---|
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 | 账户余额不足 |
当前支持通过以下方式调用短信服务API
实例:
首先下载SDK工具包:
SDK工具包中一共包含了2个类库,一个aliyun-java-sdk-core包,另外一个是alicom-dysms-api包【下载地址】
如果是maven管理的项目可以在pom.xml文件下添加
com.aliyun
aliyun-java-sdk-core
4.0.6
com.aliyun
aliyun-java-sdk-dysmsapi
1.1.0
编写信息调用工具类(AliyunMessageUtil):
public class AliyunMessageUtil {
private static final String product = "Dysmsapi";
//产品域名,开发者无需替换
private static final String domain = "dysmsapi.aliyuncs.com";
// 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
private static final String accessKeyId = "*******";
private static final String accessKeySecret = "******";
public static SendSmsResponse sendSms(Map paramMap) throws com.aliyuncs.exceptions.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", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(paramMap.get("phoneNumber"));
//必填:短信签名-可在短信控制台中找到
request.setSignName(paramMap.get("msgSign"));
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(paramMap.get("templateCode"));
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(paramMap.get("jsonContent"));
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode(paramMap.get("extendCode"));
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
// request.setOutId(paramMap.get("outId"));
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
}
测试
public class Test{
public static void main(String args[]){
// sendMsg("你的号码","验证码");
}
public static void sendMsg( String phoneNumber,String randomNum) {
String jsonContent = "{\"code\":\"" + randomNum + "\"}";
Map paramMap = new HashMap<>();
paramMap.put("phoneNumber", phoneNumber);
paramMap.put("msgSign", "****");
paramMap.put("templateCode", "SMS_129660018");
paramMap.put("jsonContent", jsonContent);
SendSmsResponse sendSmsResponse = null;
try {
sendSmsResponse = AliyunMessageUtil.sendSms(paramMap);
} catch (ClientException e) {
e.printStackTrace();
throw new AppRunTimeException(AppErrorCodeEnum.MESSAGE_ERROE);
}
if (!(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK"))) {
if (sendSmsResponse.getCode() == null) {
throw new AppRunTimeException(AppErrorCodeEnum.MESSAGE_ERROE);
}
if (!sendSmsResponse.getCode().equals("OK")) {
throw new AppRunTimeException(AppErrorCodeEnum.MESSAGE_ERROE);
}
}
}
}
以上是为大家提供的短信验证码的接入的个人思考和案例,希望能帮到大家。如果有任何问题请留言提问。