我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Java第三方实现发送短信功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Java第三方实现发送短信功能

一、介绍

在项目开发中,短信发送功能在很多地方都用得到,例如:通知短信、验证码、营销短信、推广短信等等,近期阿里云等云服务商的短信服务针对个人用户不友好(需求企业资质),现在给大家介绍一款的产品:乐讯通,针对个人用户较为友好,可以很便捷的进行开发测试。

乐讯通官网:http://yun.loktong.com/

二、使用步骤

1. 平台注册

使用手机号注册即可。

注意:注册成功后,默认密码就是手机号。
可在 “系统管理”->"密码管理"中进行密码的修改 。

2. 短信签名和短信模板

平时比较常见的验证码短信格式为:【码赛客1024】:注册验证码为312562,请勿泄露给他人。
前面括号中的就是短信签名,后边部分就是短信模板,因此可以分析出格式为:【短信签名】:短信模板。

2.1 设置签名
文字短信 -> 短信设置 -> 签名管理 -> 添加新的签名

2.2 设置模板
文字短信 -> 短信设置 -> 签名管理 -> 添加新的模板

模板设置需要注意的是,模板中使用{}作为占位符,例如:
【短信签名】:注册验证码为{s6},请勿泄露给他人。
其中的{s6}会被替换为验证码,而6指的是字符最大长度,超过则无法发送。

3. 基于官方API文档实现短信发送

3.1 官方demo

API文档 -> 开发引导 -> 代码示例 -> Java ,代码如下

package com.ljs;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Console;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.MalformedParameterizedTypeException;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import javax.lang.model.element.VariableElement;
import javax.management.monitor.MonitorSettingException;
import javax.print.attribute.standard.DateTimeAtCompleted;

import org.junit.Test;

public class MyTest {
    public static void main(String[] args) throws ParseException {
    	//时间戳
        long timestamp = System.currentTimeMillis();
        System.out.println(timestamp);
        //url
        String url = "http://www.lokapi.cn/smsUTF8.aspx"; 
        //签名,在发送时使用md5加密
        String beforSign = "action=sendtemplate&username=18586975869&password="+getMD5String("18586975869")+"&token=389c1a49&timestamp="+timestamp;
        //参数串
        String postData = "action=sendtemplate&username=18586975869&password="+getMD5String("18586975869")+"&token=389c1a49&templateid=CF2D56FC&param=18586975869|666666&rece=json&timestamp="+timestamp+"&sign="+getMD5String(beforSign);
        //调用其提供的发送短信方法
        String result = sendPost(url,postData); 
        System.out.println(result);
    }  
    //发送短信的方法
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*
    public static String createSign(TreeMap<String, String> tm, String key) {
        StringBuffer buf = new StringBuffer(key);
        for (Map.Entry<String, String> en : tm.entrySet()) {
            String name = en.getKey();
            String value = en.getValue();
            if (!"sign".equals(name) && !"param".equals(name) && value != null && value.length() > 0 && !"null".equals(value)) {
                buf.append(name).append('=').append(value).append('&');
            }
        }
        String _buf = buf.toString();
        return _buf.substring(0, _buf.length() - 1);
    }

    
     public static String encodeBase64File(String path) throws Exception {
          File file = new File(path);;
          FileInputStream inputFile = new FileInputStream(file);
          byte[] buffer = new byte[(int) file.length()];
          inputFile.read(buffer);
          inputFile.close();
          //return new BASE64Encoder().encode(buffer);
		  return "";
     }
}

3.2 文字短信-模板发送

1.请求地址,UTF8编码请求地址:http://www.lokapi.cn/smsUTF8.aspx
2.请求协议:http
3.请求方式:采用post方式提交请求
4.请求报文:action=sendtemplate&username=zhangsan&password=E10ADC3949BA59ABBE56E057F20F883E&token=894gbhy&templateid=638fgths&param=手机号1|参数1|参数2@手机号2|参数1|参数2&rece=json&timestamp=636949832321055780&sign=96E79218965EB72C92A54
5.参数说明

参数名称 是否必须 描述示例
action操作类型(固定值)action=sendtemplate
username账户名username=zhangsan
password账户密码,密码必须MD5加密并且取32位大写password=E10ADC3949BA59ABBE56E057F20F883E
token产品总览页面对应产品的Tokentoken=894gbhy
templateid 模板管理报备的模板IDtemplateid=638fgths
param 发送参数,可发送一个或多个手机号,建议单次提交最多5000个号码17712345678|张三|2541@13825254141|李四|2536
dstime设置要发送短信的时间,精确到秒(yyyy-MM-dd HH:mm:ss)2017-01-05 16:23:23
rece 否 返回类型json、xml,默认(json)rece=json
timestamp 时间戳,13位时间戳,单位(毫秒)timestamp=636949832321055780
sign签名校验sign=96E79218965EB72C92A54

param参数详细说明

发送一个手机号模板为【手机号1|参数1|参数2】
发送多个手机号模板为【手机号1|参数1|参数2@手机号2|参数3|参数4@…】
第一列必须为手机号,参数1,参数2对应短信模板里的参数顺序,英文竖线隔开, 比如短信模板为【签名】您好,{s6},您的验证码是:{s6},参数1就对应您好后边的{s6},参数2对应验证码是后边的{s6}, 多个手机号以@隔开。

若模板内没有参数则只输入手机号即可。

sign参数详细说明

签名由参数action,username,password,token,timestamp进行MD5加密组成
比如这些值拼接后为action=sendtemplate&username=zhangsan&password=E10ADC3949BA59ABBE56E057F20F883E&token=588aaaaa&timestamp=636949832321055780,那么就MD5加密这个参数字符串得到结果后作为sign的值sign=96E79218965EB72C92A54

基于官方java代码和参数说明,替换自己的值,即可实现发送。

6.返回结果

//成功返回
{
    "returnstatus":"success",
    "code":"0",
    "taskID":[
        {
            "tel_17712345678":"15913494519502337"
        }
    ]
}
//失败返回
{
    "returnstatus":"error",
    "code":"-51",
    "remark":"访问超时!"
}

三、封装发送短信工具类

1.添加 fastjson 的依赖,用于把返回结果转为对象,方便处理。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.75</version>
</dependency>

2.工具类如下

public class SendSMSUtil {
    
    public static MsgResult sendMsgPost(String account,String password,String token,String templateid,String phone,String code){
        //时间戳
        long timestamp = System.currentTimeMillis();
        //System.out.println(timestamp);
        //url
        String url = "http://www.lokapi.cn/smsUTF8.aspx";
        //签名
        String beforSign = "action=sendtemplate&username="+account+"&password="+getMD5String(password)+"&token="+token+"&timestamp="+timestamp;
        //参数串
        String postData = "action=sendtemplate&username="+account+"&password="+getMD5String(password)+"&token="+token+"&templateid="+templateid+"&param="+phone+"|"+code+"&rece=json&timestamp="+timestamp+"&sign="+getMD5String(beforSign);
        //发送请求
        String result = sendPost(url,postData);
        //将json结果转为对象,方便判断
        MsgResult msgResult = JSON.parseObject(result, MsgResult.class);
        return msgResult;
    }
    //原本的发送方法
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        } finally{  //使用finally块来关闭输出流、输入流
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }

    //用来计算MD5的函数
    public static String getMD5String(String rawString){
        String[] hexArray = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
        try{
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(rawString.getBytes());
            byte[] rawBit = md.digest();
            String outputMD5 = " ";
            for(int i = 0; i<16; i++){
                outputMD5 = outputMD5+hexArray[rawBit[i]>>>4& 0x0f];
                outputMD5 = outputMD5+hexArray[rawBit[i]& 0x0f];
            }
            return outputMD5.trim();
        }catch(Exception e){
            System.out.println("计算MD5值发生错误");
            e.printStackTrace();
        }
        return null;
    }
}

用于接收返回值的对象

public class MsgResult{
    //返回描述
    private String returnstatus;
    //返回状态码
    private Integer code;
    //错误消息
    private String remark;

    public String getReturnstatus() {
        return returnstatus;
    }

    public void setReturnstatus(String returnstatus) {
        this.returnstatus = returnstatus;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "MsgResult{" +
                "returnstatus='" + returnstatus + '\'' +
                ", code=" + code +
                ", remark='" + remark + '\'' +
                '}';
    }
}

3.调用测试

public class SendSMSTest {
    public static void main(String[] args) throws ParseException {
    	//使用工具类发送短信,返回封装的对象
        MsgResult msgResult = SendSMSUtil.sendMsgPost("平台账号","平台密码","token","短信模板id","接受方手机号","验证码");
        //进行判断
        if("success".equals(msgResult.getReturnstatus()) && msgResult.getCode()==0){
            System.out.println("发送成功");
        }else{
            System.out.println("发送失败,原因是:"+msgResult.getRemark());
        }
    }
}

到此这篇关于使用Java第三方实现发送短信功能的文章就介绍到这了,更多相关Java实现发短信内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Java第三方实现发送短信功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Java第三方实现发送短信功能

这篇文章主要介绍了使用Java第三方实现发送短信功能,在一些开发中,经常需要有给用户发送短信接收验证码的功能,那么在Java中该如何实现呢,今天我们就一起来看一看
2023-03-24

怎么使用Java第三方实现发送短信功能

本文小编为大家详细介绍“怎么使用Java第三方实现发送短信功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Java第三方实现发送短信功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、介绍在项目开发
2023-07-05

java怎么实现发送短信功能

1、在阿里云短信服务中添加签名2、在阿里云短信服务中添加模板3、创建属于自己的AccessKey ID和Access Key Secret4、需要下载两个jar包aliyun-java-sdk-core-3.3.1.jaraliyun-java-sdk-dys
java怎么实现发送短信功能
2019-10-31

Android实现短信发送功能

本文实例实现了两个模拟器之间短信的发送功能,分享给大家供大家参考,具体实现内容如下 1.编辑String.xml文件内容为:
2022-06-06

Android使用第三方服务器Bmob实现发送短信验证码

调用Bmob第三方服务器实现短信验证的功能,大致思路如下: 随机产生6位数字,然后调用Bmob的请求短发函数发送者六位数到服务器,然后服务器给指定手机发送这6位验证码,然后感觉用户输入的数字进行判断,如果输入的和发送的相等,则验证成功。 第
2022-06-06

Java如何实现发送短信验证码功能

小编给大家分享一下Java如何实现发送短信验证码功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一个发送短信验证码的功能,使用的是信易通的短信平台接口,然后在J
2023-05-30

怎么用java+maven实现发送短信验证码功能

这篇文章主要介绍“怎么用java+maven实现发送短信验证码功能”,在日常操作中,相信很多人在怎么用java+maven实现发送短信验证码功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用java+m
2023-06-02

使用阿里云数据库实现短信发送功能

本文将介绍如何使用阿里云数据库来实现短信发送功能。阿里云数据库是一个强大而易用的云数据库服务,可以提供稳定、安全的数据存储和访问。我们将使用阿里云数据库的API来实现短信发送功能。首先,我们需要在阿里云上创建一个数据库实例。在阿里云控制台中,找到“数据库”服务,点击“创建实例”,选择合适的实例规格,然后填写实例名
使用阿里云数据库实现短信发送功能
2023-11-10

Android实现发送短信功能实例详解

本文实例分析了Android实现发送短信功能的方法。分享给大家供大家参考,具体如下: 短信和打电话一样,都是android手机的基本功能,下面以实例说明android如何实现发送短信的功能。 程序如下所示:import java.util.
2022-06-06

Android实现短信加密功能(发送加密短信、解密本地短信)

短信加密此类功能由于新手学习的需求量较小,所以在网上很少有一些简单的demo供新手参考。小编做到此处也是花了比较多的时间自我构思,具体的过程也是不过多描述了,讲一下demo的内容。 demo功能: 1、可以发送短信并且加密(通过改变st
2022-06-06

Android使用Intent发送短信的实现方法

本文实例讲述了Android使用Intent发送短信的实现方法。分享给大家供大家参考,具体如下: 在一个Activity中使用Intent发送短信package com.zhuguangwei; import android.app.Act
2022-06-06

Android第三方消息推送功能怎么实现

要实现Android第三方消息推送功能,可以使用以下步骤:注册一个第三方消息推送平台,例如Firebase Cloud Messaging (FCM)、JPush、推送宝等,获得一个唯一的应用标识和密钥。在Android应用的build.g
2023-10-25

使用python爬虫怎么实现一个发送短信验证码功能

本篇文章为大家展示了使用python爬虫怎么实现一个发送短信验证码功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。内联代码片。import timedef get_time() : " 获取当前
2023-06-06

Springboot实现阿里云通信短信服务有关短信验证码的发送功能

前言短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。现在市面上的短信服务平台有很多。大家在选择的时候未免会有些不好抉择。本人建议选择短信服务商应遵循以下几点: 服务商知名度高,业务
2023-05-31

Android实现发送短信验证码倒计时功能示例

一、简介: 开发中在用户注册或找回密码之类的功能,经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的。 效果图:二、实现步骤: 1、一个关键类:CountDownTimer(Android系统自带的
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录