javaweb调用第三方短信接口

本文介绍了如何在JavaWeb应用中调用第三方短信接口进行短信验证。首先,需要获取第三方平台的账号和密钥,并在项目中添加相关jar包依赖。接着,创建工具类用于发送请求,并通过Servlet作为中转处理请求。最后,提供了简单的jsp示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是个存在一个bug(自己去发现哈哈,不安全)的短信验证接口,调用第三方的平台,原理就是你这边随机生成一个六位字符串,字符串放到人家的平台上,让人家帮你通过短信的方式发送到指定的人的手机号上,开始。

1.前期准备

(1)jar包 我用的是maven管理jar包,所以这里放上依赖的代码

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20160810</version>
</dependency>

两个包 用来解析json用的 用到了ajax

(2)第三方平台的账号申请,这里我使用的首次申请就送200条的秒嘀(给你们推荐)

申请后会在个人控制中心看到自己的密钥之类的东西(

ACCOUNT_SID  
AUTH_TOKEN

这两个东西是需要保存的

2.工具类(向第三方发送请求的方法)

GetMessageCode.java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.json.JSONObject;

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=new JSONObject(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;
   }
}

3.一个servlet做中转

我顺便放上jsp的demo

control:

public void resetSend(String tel,HttpServletRequest request, HttpServletResponse response)
      throws IOException {

   //根据获取到的手机号发送验证码
   String code = GetMessageCode.getCode(tel);
   response.getWriter().print(code);

}

jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
<link href="css/style.css" rel="stylesheet" type="text/css" media="all"/>
<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet" href="<%=request.getContextPath() %>/bootstrap/css/bootstrap.min.css" /> 
<script type="text/javascript" src="<%=request.getContextPath()%>/bootstrap/js/jQuery.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/bootstrap/js/bootstrap.min.js"></script>
</head>
<script type="text/javascript">
    var InterValObj; //timer变量,控制时间
    var count = 30; //间隔函数,1秒执行
    var curCount;//当前剩余秒数
    function sendMessage(){curCount = count;
        $("#btn").attr("disabled", "true");
        $("#btn").val(curCount + "秒后可重新发送");
        InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次请求后台发送验证码 TODO
    }
    //timer处理函数
    function SetRemainTime() {
        if (curCount == 0) {
            window.clearInterval(InterValObj);//停止计时器
            $("#btn").removeAttr("disabled");//启用按钮
            $("#btn").val("重新发送验证码");
        }
        else {
            curCount--;
            $("#btn").val(curCount + "秒后可重新发送");
        }
    }
</script>
<body>
       <div class="container">
           <div  id="login">
           <form class="form-horizontal" role="form">
               <div class="form-group">
                   <label class="col-sm-2 control-label">手机号</label>
                   <div class="col-sm-5">
                       <input type="text" class="form-control" id="phone" name="phone" placeholder="请输入您的手机号"  required autofocus>
                       
                   </div>
               </div>
               <div class="form-group">
                   <label class="col-sm-2 control-label">验证码</label>
                   <div class="col-sm-3">
                       <input type="code" class="form-control" id="code" name="code" placeholder="验证码" required>
                       <input class="btn btn-default" id="btn" name="btn" value="发送验证码" οnclick="sendMessage()" />
                   </div>
               </div>
               <div class="form-group">
                   <div class="col-sm-offset-2 col-sm-10">
                       <button type="button" class="btn btn-info" id="lo">登陆</button>
                   </div>
               </div>
           </form>
       </div>
       </div>
</body>
<script type="text/javascript">

    var sms="";
    $("#btn").click(function(){
        var phone=$("#phone").val();
        if(phone!="")
        {
            $.ajax({
                url:"sendSMS",
                type:"post",
                data:{"phone":phone},
                success:function(result){
                    sms=result;
                }
            });
        }else{
             alert("请输入手机号");
            return false;
        }

    });
    $("#lo").click(function(){
        var code=$("#code").val();
        if(code==""){
            alert("请输入验证码");
        }else{
            if(sms==code){
                window.location.href="success.jsp";
            }else{
                alert("验证码错误");

            };
        };

    });
</script>




</html>
jsp页面的这些js我觉的你们应该能看到,毕竟我这样垃圾的都可以看懂55555555 尴尬
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值