java实现短信验证码发送
由于我们使用第三方平台进行验证码的发送,所以首先,我们要在一个平台进行注册。
在这里我选择是秒嘀科技,因为新人注册会赠送十元,足够测试使用了。
注册完成后,我们需要获取自己对应的ACCOUNT SID 和 AUTH TOKEN;
点击用户中心,认证,来进行企业认证(这一步是最费劲的,我认证了两天 TAT ,需要的营业执照可以百度,图片质量需要自己斟酌)。
之后在配置管理中新建一个模板,然后提交审核就好,(只要符合要求,基本都能过),可以返回查看是否通过。
准备工作完成,便可以开始代码的测试了,由于本人还是大学生新人,只能使用小的动态Web项目进行测试。新建项目,引入需要的jar包:fastjson.jar,我才用的版本是1.2.47版本。将jar包放入lib文件夹下,就可以开始我们的代码了。
- src目录下新建文件夹,存放我们写的代码
- 新建GetMessageCode.class,代码如下
package test; //各种引入的包 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Date; import com.alibaba.fastjson.JSONObject; public class GetMessageCode { /** * 发送验证码 */ private static final String QUERY_PATH = "https://api.miaodiyun.com/20150822/industrySMS/sendSMS";//固定的,它api中固定的端口,照着写就行。 private static final String ACCOUNT_SID = "自己获取到的ACCOUNT_SID "; private static final String AUTH_TOKEN = "自己获取到的AUTH_TOKEN "; //根据相应的手机号发送验证码 public static String getCode(String phone){ //以下代码是为了获取其他方法返回的参数 String rod = smsCode();//获取随机验证码 String timestamp = getTimestamp();//获取时间戳 String sig = getMD5(ACCOUNT_SID,AUTH_TOKEN,timestamp);//获取签名 String tamp = "【xxxx】登录验证码:"+rod+",xxxxxxxxx";//必须与模板一致,否则会报错 OutputStreamWriter out = null; BufferedReader br = null; StringBuilder result = new StringBuilder(); try{ URL url = new URL(QUERY_PATH); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoInput(true);//设置是否允许数据写入 connection.setDoOutput(true);//设置是否允许参数数据输出 connection.setConnectTimeout(5000);//设置链接响应时间 connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); //提交请求 out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); String args = getQueryArgs(ACCOUNT_SID,tamp,phone,timestamp,sig,"JSON"); out.write(args); out.flush(); //读取返回参数 br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); String temp = ""; while ((temp=br.readLine())!=null){ result.append(temp); } }catch(Exception e){ e.printStackTrace(); } JSONObject json = JSONObject.parseObject(result.toString()); String respCode = json.getString("respCode"); String defaultRespCode = "00000"; if(defaultRespCode.equals(respCode)){ return rod; }else{ return defaultRespCode; } } // 定义一个请求参数拼接方法 public static String getQueryArgs(String accountSid, String smsContent, String to, String timestamp, String sig, String respDataType) { // TODO Auto-generated method stub return "accountSid=" + accountSid + "&smsContent=" + smsContent + "&to=" + to + "&"+"timestamp=" + timestamp + "&sig=" + sig + "&respDataType=" + respDataType; } //获取时间戳 public static String getTimestamp() { return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); } // sing签名 public static String getMD5(String sid, String token, String timestamp) { StringBuilder result = new StringBuilder(); String source = sid + token + timestamp; // 获取某个类的实例 try { MessageDigest digest = MessageDigest.getInstance("MD5"); // 要进行加密的东西 byte[] bytes = digest.digest(source.getBytes()); for (byte b : bytes) { String hex = Integer.toHexString(b & 0xff); if (hex.length() == 1) { result.append("0" + hex); } else { result.append(hex); } } } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result.toString(); } // 创建验证码 public static String smsCode() { String random = (int) ((Math.random() * 9 + 1) * 100000) + ""; return random; } }
现在代码就算写完了,我们需要在同包下新建测试类进行测试。
package test; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String phone = "测试的手机号"; GetMessageCode.getCode(phone); } }
以上便是java实现发送短信验证码的代码,如果想查看或使用验证码的话,只需在调用方法的时候把smsCode当做返回结果返回就好。
可能发生的错误原因:
- 没连接网络
- 企业认证未通过
- 配置文件配错了
新人第一次发帖,请多多包涵....
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?