在之前的小程序项目中,争对用户信息的有效性问题(比如手机号是否真实),我使用了微信小程序自带的获取手机号的功能,获取到用户的手机号,因为微信绑定的手机号一定经过微信的严格验证,能够确保手机号真实。但是根据客户的需求,需要实现使用短信验证码登入的功能,那么没办法,客户是上帝,我只能去实现它。
前言
对于获取微信绑定的手机号来确保小程序用户的真实性,可以看我这篇文章,我写的很详细。
接下来讲解如何实现短信验证码来校验用户的有效性。
本文主要讲解实现微信小程序获取手机短信验证码的后端部分,希望能帮到大家
实现过程如下
- 腾讯云中创建短信签名、创建短信正文模板,人工审核
- 使用Java SDK调用短信发送API接口
- 短信发送成功
(因为客户要求使用腾讯云服务器,所以我这里用腾讯云为例)
第一步:创建短信签名、创建短信正文模板
首先理解一下相关概念:
短信签名
短信签名是位于短信正文前【】中的署名,用于标识公司或业务,例如【腾讯科技】。申请时企业用户需要上传资质证明,个人用户需要上传个人身份证明。短信签名需要审核通过后才可使用。
签名示例:
认证企业为:深圳市腾讯计算机系统有限公司,可以申请与企业名相关的签名
【腾讯科技】
,也可以申请公司旗下的产品名称相关的签名【微信】
、【腾讯云】
等。
简而言之,如果短信内容为:
【腾讯科技】您的QQ登录验证码是1234,5分钟内有效。
那么,短信签名就是——腾讯科技。这样看懂了吧?
短信模板
短信模板即具体发送的短信正文内容,短信模板支持验证码模板、通知类短信模板和营销短信模板。短信内容可以通过模板参数实现个性化定制。
如果短信内容为:
腾讯科技需要发送短信验证码:【腾讯科技】您的QQ登录验证码是1234,2分钟内有效。
那么,短信模板就是:您的QQ登录验证码是{1},{2}分钟内有效。
模板参数中{1},{2}是变量,且按序排列,他们的值可以在实际下发时通过设置模板参数的值来自定义。
为了避免开发者滥发短信,所以短信签名、短信模板需要腾讯云进行人工审核,具体操作如下:
打开腾讯云官网,进入右上角控制台,进入短信界面,然后创建签名。
然后同样的方法,创建短信模板
接着就是人工审核,大概10分钟左右就够了。
第二步:使用Java SDK调用短信发送API接口
所谓使用SDK,也就是说,腾讯已经给你写好发送短信的API接口,连调用API接口的模板都给你写好了,你只要拿来用就可以。
SDK下载地址(Github):https://github.com/TencentCloud/tencentcloud-sdk-java
当然这个SDK里面所有功能都实现了,比如发送短信,群发短信,拉取回执状态,统计短信发送数据,包括国内的,境外的,全都有。但是功能多,导包的时间也长,而我们只需要发送国内短信即可,所以我自己把他精简了一下,因为我这里只需要发送短信的功能。
我这里以IDEA为例,打开IDEA,新建一个MAVEN项目
勾上Create from archetype
选择org.apache.maven.archetypes:maven-archetype-webapp
添加属性
name:archetypeCatalog,value:internal
为什么要这么做?是因为系统默认从Maven获取依赖,但是很慢,我们可以选择从本地导入,这样基本不需要时间,达到快速创建项目的效果。
创建完Maven项目,只需要修改两个文件
1.pom.xml
1. <?xml version="1.0" encoding="UTF-8"?> 2. <project xmlns="http://maven.apache.org/POM/4.0.0" 3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5. <modelVersion>4.0.0</modelVersion> 6. 7. <groupId>org.example</groupId> 8. <artifactId>yanzhengma</artifactId> 9. <version>1.0-SNAPSHOT</version> 10. 11. <properties> 12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 13. <maven.compiler.encoding>UTF-8</maven.compiler.encoding> 14. <java.version>11</java.version> 15. <maven.compiler.source>11</maven.compiler.source> 16. <maven.compiler.target>11</maven.compiler.target> 17. </properties> 18. 19. <dependencies> 20. <dependency> 21. <groupId>com.github.qcloudsms</groupId> 22. <artifactId>qcloudsms</artifactId> 23. <version>1.0.6</version> 24. </dependency> 25. </dependencies> 26. </project>
2.随意包下的Main函数
1. import com.github.qcloudsms.SmsSingleSender; 2. import com.github.qcloudsms.SmsSingleSenderResult; 3. import com.github.qcloudsms.httpclient.HTTPException; 4. import org.json.JSONException; 5. import java.io.IOException; 6. public class Main { 7. public static void main(String[] args) { 8. // 短信应用 SDK AppID 9. int appid = 1400xxxx84; // SDK AppID 以1400开头 10. // 短信应用 SDK AppKey 11. String appkey = "d4e5bxxxxxxxxxx02c907501b4ee8645"; 12. // 需要发送短信的手机号码 13. String[] phoneNumbers = {"178xxxxxx85"}; 14. // 短信模板 ID,需要在短信应用中申请 15. int templateId = 60xxx8; // NOTE: 这里的模板 ID`7839`只是示例,真实的模板 ID 需要在短信控制台中申请 16. // 签名 17. String smsSign = "XXXX"; // NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台申请 18. try { 19. String[] params = {"5678","5"}; 20. SmsSingleSender ssender = new SmsSingleSender(appid, appkey); 21. SmsSingleSenderResult result = ssender.sendWithParam("86", phoneNumbers[0], 22. templateId, params, smsSign, "", ""); 23. System.out.println(result); 24. } catch (HTTPException e) { 25. // HTTP 响应码错误 26. e.printStackTrace(); 27. } catch (JSONException e) { 28. // JSON 解析错误 29. e.printStackTrace(); 30. } catch (IOException e) { 31. // 网络 IO 错误 32. e.printStackTrace(); 33. } 34. } 35. }
还有要这四个jar包
我们就像Java运行Hello World那样,运行一下主函数,短信就发出来了
接下来来解析一下代码:
1.短信账号,密匙
1. int appid = 1400xxxx84; 2. String appkey = "d4e5bxxxxxxxxxx02c907501b4ee8645";
类似微信小程序,appid是账号,appkey是密匙,我们在腾讯云控制台获取。
点进去可以查看appkey。
2.需要发送的手机号
String[] phoneNumbers = {"178xxxxxx85"};
3.短信模板ID
int templateId = 60xxx8;
在第一步的 国内短信 —— 签名管理 中 查看ID。
4.签名
String smsSign = "XXXX";
同短信模板,你申请的是什么签名,这里就写什么,比如“腾讯科技”
5.填入参数
String[] params = {"5678","5"};
在第一步中,介绍了短信模板的概念
短信模板就是:您的QQ登录验证码是{1},{2}分钟内有效。
其中这个{1},类似SQL中的预编译,这里有几个参数,这个params数组就几个元素。
短信发出去就是——您的QQ登录验证码是5678,5分钟内有效。
以上数据全部替换后,执行Main主函数就可以,短信就发出来了
这就是微信小程序中,实现短信验证码登入的后端操作,时间有限,我只是简单写了一下,还有更多功能,我会在后续继续深入研究。