本篇文章主要是讲如何免费白嫖,自己实现手机短信验证码的功能,保证不费一分一毛.
即使你什么也不懂,只要按照我的步骤操作,也一定能够实现,这在外人看来有些神秘莫测的短信手机验证!
1.阿里云短信服务
1.1.开通阿里云短信服务
1.2.添加签名管理与模板管理
(1)添加签名管理 选择 国内消息 - 签名管理 - 添加签名 点击添加签名,进入添加页面,填入相关信息 注意:签名要写的有实际意义 点击提交,等待审核,审核通过后可以使用。 (2)添加模板管理 选择 国内消息 - 模板管理 - 添加模板 点击 添加模板,进入到添加页面,输入模板信息 点击提交,等待审核,审核通过后可以使用
1.3.编写发送短信接口
新建短信微服务
1、在service模块下创建子模块service-msm 2、创建controller和service代码 3、配置application.properties
# 服务端口
server.port=8006
# 服务名
spring.application.name=service-msm
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:
spring.datasource.username=root
spring.datasource.password=root
spring.redis.host=192.168.44.131
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
#最小空闲
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/atguigu/cmsservice/mapper/xml
4、创建启动类
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan("com.atguigu")
public class MsmApplication {
public static void main(String[] args) {
SpringApplication.run(MsmApplication.class,args);
}
}
5、在service-msm的pom中引入依赖
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
</dependency>
</dependencies>
6、编写controller,根据手机号发送短信
@RestController
@RequestMapping("/edumsm/msm")
public class MsmController {
@Autowired
private MsmService msmService;
@Autowired
private RedisTemplate<String,String> redisTemplate;
@GetMapping("send/{phone}")
public R sendMsm(@PathVariable String phone) {
String code = redisTemplate.opsForValue().get(phone);
if(!StringUtils.isEmpty(code)) {
return R.ok();
}
code = RandomUtil.getFourBitRandom();
Map<String,Object> param = new HashMap<>();
param.put("code",code);
boolean isSend = msmService.send(param,phone);
if(isSend) {
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return R.ok();
} else {
return R.error().message("短信发送失败");
}
}
}
7、编写service
@Service
public class MsmServiceImpl implements MsmService {
@Override
public boolean send(Map<String, Object> param, String phone) {
if(StringUtils.isEmpty(phone)) return false;
DefaultProfile profile =
DefaultProfile.getProfile("default", "LTAI4Fy76hybzhPUECfCt19E", "jJZ2Nk9JXt8YH94UG3ZIApy7ltRuXe");
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("SendSms");
request.putQueryParameter("PhoneNumbers",phone);
request.putQueryParameter("SignName","我的谷粒在线教育网站");
request.putQueryParameter("TemplateCode","SMS_213772127");
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));
try {
CommonResponse response = client.getCommonResponse(request);
boolean success = response.getHttpResponse().isSuccess();
return success;
}catch(Exception e) {
e.printStackTrace();
return false;
}
}
}
1.4.免费试用产品
帮助文档:https://help.aliyun.com/product/44282.html?spm=5176.10629532.0.0.38311cbeYzBm73
2.腾讯云短信服务
因为短信手机验证功能必须依靠腾讯云和阿里云来进行实现,然而两者的申请,现在阿里云已经无法实现个人申请(网络安全考虑),所以此次选择腾讯云。
2.1.注册微信公众号
首先百度搜索微信公众平台,然后进入平台后进行注册,步骤如下,上图: 1.注册 2.选择订阅号 3.选择类型 注册完成之后,会调整到管理页面,然后截图该页面,后面注册签名管理有大作用:
2.2.申请签名管理和模板管理
签名管理就是要标明该短信是由哪个公司,组织,机构,当然也可以是公众号所发出的。 所以这也是我们为什么要注册微信公众号的原因了,为的申请这个签名管理!
2.2.1签名管理 直接搜素短信功能,进入页面: 国内短信–签名管理–创建签名 然后进入下面该页面,按照下面填写:
(签名内容为公众号的名字,注意:上传的照片就是我上面提及的你注册微信公众号的管理界面,不懂官网左边也有提醒。)
然后就是静静等待,大概等一个十到二十分钟左右,就会审批通过,如下图所示: 2.2.2模板管理 模板管理就是发给手机的短信内容的模式,大体不变,只是里面的验证码发生改变而已!(用程序员的话,那就是框架) 国内短信–正文模板管理–创建正文模板 点击之后进行申请页面,短信内容可以使用模板套用,轻松简单: 最后依旧是等待审核通过,出现下面情况就说明ok!
2.3.编写代码
在线教育的短信验证模块:模块框架如下 pom.xml文件依赖如下:
<!--腾讯云短信服务-->
<dependencies>
<!--腾讯云短信服务-->
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!--json的转换工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
</dependency>
</dependencies>
application.properties(记得将redisd地址填上):
# 服务端口
server.port=8005
# 服务名
spring.application.name=service-msm
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.redis.host=
spring.redis.port=6379
spring.redis.database= 0
spring.redis.soTimeout=1800000
spring.redis.lettuce.pool.max-active=20
#spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-wait=-1ms
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
#最小空闲
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/atguigu/cmsservice/mapper/xml
工具类RandomUtils:
public class RandomUtils {
public static String getRandom() {
int newNum = (int) ((Math.random() * 9 + 1) * 100000);
return String.valueOf(newNum);
}
}
TencentUtils(此处记得将你前面配置的信息填上):
public class TencentUtils {
public static final int APPID = ;
public static final String APPKEY = "";
public static final String NATIONCODE = "86";
public static final int TEMPLATECODE = ;
public static final String SIGN = "新注册公众号";
}
Msmservice:
public interface Msmservice {
String send(String phone);
}
MsmserviceImpl:
@Service
public class MsmserviceImpl implements Msmservice {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public String send(String phoneNum) {
String code = redisTemplate.opsForValue().get(phoneNum);
if (!StringUtils.isEmpty(code)) {
return code;
}
String[] params = {RandomUtils.getRandom()};
try {
SmsSingleSender ssender = new SmsSingleSender(TencentUtils.APPID, TencentUtils.APPKEY);
SmsSingleSenderResult result = ssender.sendWithParam(TencentUtils.NATIONCODE, phoneNum,
TencentUtils.TEMPLATECODE, params, TencentUtils.SIGN, "", "");
if (result.result == 0) {
redisTemplate.opsForValue().set(phoneNum, params[0], 5, TimeUnit.MINUTES);
return params[0];
}
} catch (HTTPException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
MsmController:
@RestController
@Api(tags = "腾讯云短信验证")
@RequestMapping("/edumsm/msm")
public class MsmController {
@Autowired
private Msmservice msmservice;
@GetMapping("send/{phone}")
@ApiOperation(value = "发送验证码")
public R sendMsm(@ApiParam("用户手机号") @PathVariable String phone) {
String verCode = msmservice.send(phone);
return verCode != "" ? R.ok().data("", verCode) : R.error().message("短信发送失败");
}
}
MsmApplication:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan({"com.atguigu"})
@EnableDiscoveryClient
public class MsmApplication {
public static void main(String[] args) {
SpringApplication.run(MsmApplication.class,args);
}
}
3.第三方短信服务
可以采取第三方短信服务,不过要花一点,都懂的哈, 云市场–短信服务 可以任意选择,当然记得选择只需个人认证的。
3.1操作方法
比如点开一个: 购买之后: 短信通知: 请求示例:
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test {
public static void main(String[] args) throws IOException {
String url = "https://smssend.shumaidata.com/sms/send";
String appCode = "你自己的AppCode";
Map<String, String> params = new HashMap<>();
params.put("receive", "188****1212");
params.put("tag", "2345");
params.put("templateId", "MD8B7116BC");
String result = postForm(appCode, url, params);
System.out.println(result);
}
public static String postForm(String appCode, String url, Map<String, String> params) throws IOException {
url = url + buildRequestUrl(params);
OkHttpClient client = new OkHttpClient.Builder().build();
FormBody.Builder formbuilder = new FormBody.Builder();
Iterator<String> it = params.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
formbuilder.add(key, params.get(key));
}
FormBody body = formbuilder.build();
Request request = new Request.Builder().url(url).addHeader("Authorization", "APPCODE " + appCode).post(body).build();
Response response = client.newCall(request).execute();
System.out.println("返回状态码" + response.code() + ",message:" + response.message());
String result = response.body().string();
return result;
}
public static String buildRequestUrl(Map<String, String> params) {
StringBuilder url = new StringBuilder("?");
Iterator<String> it = params.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
url.append(key).append("=").append(params.get(key)).append("&");
}
return url.toString().substring(0, url.length() - 1);
}
}
正常返回示例:
{
"msg": "成功",
"success": true,
"code": 200,
"data": {
"taskId": "2020040211442081fffd9b",
"orderNo": "695237182989930496"
}
}
失败返回示例:
{
"msg": "templateId 无效",
"success": false,
"code": 400,
"data": {}
}
错误码定义:
|