java实现发送手机验证码功能

152 阅读4分钟

1. 进入秒嘀科技(www.miaodiyun.com/),注册一个账号

2. 注册好之后,点击 用户中心 -> 账户管理,就会进入如下界面 (顺便提一下,新注册的用户,平台会免费赠送你10元,足够大家学习和使用了,所以不用担心需要充钱)  你需要做的就是获取你自己的 ACCOUNT SID 和 AUTH TOKEN

 

3. 点击 用户中心 -> 认证,进行企业认证,企业的资质证件就是企业的营业执照,网上百度一张带有红色的公章就行,公司电话填写自己的就行,最后点击提交

 

4. 需要在秒嘀上新建一个发送手机验证码的模板,点击 配置管理 -> 验证码短信模板,就会进入如下界面

 

5. 点击“新建模板”按钮, 填写好模板名称、短信签名 和 短信内容(短信内容可以选择 验证码通知短信模板 或者 自己编写短信内容),点击“提交审核”按钮即可,界面如下

 

6. 然后等待 短信验证码模板 审核通过即可,点击 配置管理 -> 验证码短信模板,查看 短信验证码 是否审核通过

 

7. 接下来就是代码了,把我圈住的地方改成自己的就行,其他的不用动,tamp值 一定要与自己创建短信模板的短信内容保持一致

 

8. java短信发送验证码

   导入阿里巴巴fastjson.jar包:   

                 方式一:下载fastjson.jar包导入工程就行      链接:pan.baidu.com/s/1RH4-x82G…    

                方式二:maven工程直接把     下面这段代码复制到  pom.xml 中就行   


 
 

   
   

    
    

   
   

   
   

    
    
 
     
     <dependency>                                                                               
    
    

   
   

   
   

    
    

   
   

   
   

    
    
     
     
     <groupId>com.alibaba
     
     </groupId>                                                        
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
          
     
     <artifactId>fastjson
     
     </artifactId>
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
          
     
     <version>1.2.47
     
     </version>
    
    

   
   

   
   

    
    

   
   

   
   

    
    
 
     
     </dependency>   
    
    

   
   

 
 

  源码如下 :                                                 


 
 

   
   

    
    

   
   

   
   

    
    

     
     package com.group.util;
    
    

   
   

   
   

    
    

   
   

   
   

    
    
 
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     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;
    
    

   
   

   
   

    
    

   
   

   
   

    
    
 
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     /**
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
      * 
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
      * @Title:GetMessageCode
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
      * @Description:发送验证码
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
      * @author:ヅ零碎de記憶ぷ
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
      * @Date 2018年7月4日 下午9:27:04
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
      */
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     public 
     
     class GetMessageCode {
    
    

   
   

   
   

    
    

   
   

   
   

    
    
	
     
     private 
     
     static 
     
     final String QUERY_PATH = 
     
     "https://api.miaodiyun.com/20150822/industrySMS/sendSMS";
    
    

   
   

   
   

    
    

   
   

   
   

    
    
	
     
     private 
     
     static 
     
     final String ACCOUNT_SID = 
     
     "";
    
    

   
   

   
   

    
    

   
   

   
   

    
    
	
     
     private 
     
     static 
     
     final String AUTH_TOKEN = 
     
     "";
    
    

   
   

   
   

    
    

   
   

   
   

    
    
 
    
    

   
   

   
   

    
    

   
   

   
   

    
    
	
     
     // 根据相应的手机号发送验证码
    
    

   
   

   
   

    
    

   
   

   
   

    
    
	
     
     public static String getCode(String phone) {
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     		String rod = smsCode();
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     		String timestamp = getTimestamp();
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     		String sig = getMD5(ACCOUNT_SID, AUTH_TOKEN, timestamp);
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     		String tamp = 
     
     "【联途旅游】尊敬的用户,您好,您的验证码为:" + rod + 
     
     ",若非本人操作,请忽略此短信。";
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     		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.setReadTimeout(
     
     10000);
     
     // 设置参数读取时间
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     			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) {
    
    

   
   

   
   

    
    

   
   

   
   

    
    
			
     
     // TODO Auto-generated catch block
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     			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) {
    
    

   
   

   
   

    
    

   
   

   
   

    
    
		
     
     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;
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     	}
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     }
    
    

   
   

   
   

    
    

   
   

   
   

    
    
 
    
    

   
   


 
 

 

9. 测试发送手机短信验证码 源码如下   (手机号码换成你想要发送到指定手机的手机号码即可)


 
 

   
   

    
    

   
   

   
   

    
    

     
     package com.message.test;
    
    

   
   

   
   

    
    

   
   

   
   

    
    
 
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     public 
     
     class Test {
    
    

   
   

   
   

    
    

   
   

   
   

    
    
 
    
    

   
   

   
   

    
    

   
   

   
   

    
    
	
     
     public static void main(String[] args) {
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     		String phone = 
     
     "12345678910";
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     		GetMessageCode.getCode(phone);
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     	}
    
    

   
   

   
   

    
    

   
   

   
   

    
    
 
    
    

   
   

   
   

    
    

   
   

   
   

    
    

     
     }
    
    

   
   

 
 

 

 10. 常见的问题

      (1)返回错误码 00104 “相同的应用当天给同一手机号发送短信的条数小于等于n” 如何处理?

        答:此错误是同一手机号短信发送请求频率限制,请求失败也算次;
验证码短信下发次数限制为:1分钟2次、1小时4次、24小时内10次;
通知类短信下发次数限制为:24小时内20次;
营销类短信下发次数限制为:24小时内20次。
验证码短信24小时下发10次,不能修改
通知类短信有需要可调整下发次数
该类配置的修改需要在后台中修改设置,客户端不能设置
如果在测试时候遇到请求限制,可联系客服添加白名单

 

     (2)返回错误码 00134 "没有和内容匹配的模板” 如何处理?

        答:请检查是否在官网建立模板,smscontent=【短信签名】+内容,发送内容要与模板匹配。       

 

     (3)返回错误码 0005 "timestamp已过期” 如何处理? 

       答:把获取时间戳 getTimestamp()方法中的 return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());换成return System.currentTimeMillis()+""; 即可。