短信二次接口开发demo

利用阿里云平台的短信服务进行二次接口开发,可应用场景,登陆验证码等。本文以完成一次短信验证登陆为主线。新手上路,多多指教。

发送短信的service,此段基本和阿里云的demo一致,也可以参考官方的开发文档demo
(http://download.csdn.net/download/qq_33265993/9966476 ali提供的官方sdk及demo)也可以去ali官网下载
本文代码资源
(http://download.csdn.net/download/qq_33265993/9975930)

public class MessageSendServiceImp implements MessageSendService{public  SendSmsResponse sendSms(String number,String code) {System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", BaseConfig.accessKeyId, BaseConfig.accessKeySecret);try {DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", BaseConfig.product, BaseConfig.domain);} catch (ClientException e) {e.printStackTrace();}IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象-具体描述见控制台-文档部分内容SendSmsRequest request = new SendSmsRequest();//必填:待发送手机号request.setPhoneNumbers(number);//必填:短信签名-可在短信控制台中找到request.setSignName("短信签名");//必填:短信模板-可在短信控制台中找到request.setTemplateCode("SMS_80190341");request.setTemplateParam("{ \"code\":\""+code+"\"}");//选填-上行短信扩展码(无特殊需求用户请忽略此字段)//request.setSmsUpExtendCode("90997");//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者request.setOutId("yourOutId");//hint 此处可能会抛出异常,注意catchSendSmsResponse sendSmsResponse=null;try {sendSmsResponse = acsClient.getAcsResponse(request);} catch (ServerException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClientException e) {// TODO Auto-generated catch blocke.printStackTrace();}return sendSmsResponse;}
}


基本信息配置类


public class BaseConfig {//产品名称:云通信短信API产品,开发者无需替换public static final String product = "Dysmsapi";//产品域名,开发者无需替换public static final String domain = "dysmsapi.aliyuncs.com";// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)public static final String accessKeyId = "";public static final String accessKeySecret = "";//此KEY自己设置调用的时候用的key要和这个一直不然签名会失败public static final String key="";}

信息发送的接口类
调用后会返回json,里面有各种信息
{“number”:”xxxxxxxxx”,”code”:”9028”,”nonceStr”:”502e4a16930e414107ee22b6198c578f”,”timeStamp”:”1505210614”,”sign”:”6777FC73D22724442F807F7E6F5FCB5E”,”Code”:”fail”,”message”:”签名错误”}
根据返回的结果判断是否发送成功,成功的时候Code:OK

@Controller
@RequestMapping(value = "/joymeter")
public class MessageSendControl {
@Autowired
private MessageSendService messageSendServiceImp;@RequestMapping("/messageSend")public void MessageSend(HttpServletRequest request,HttpServletResponse response) {String line = null;StringBuffer jb = new StringBuffer();BufferedReader reader = null;try {reader = request.getReader();while ((line = reader.readLine()) != null)jb.append(line);} catch (Exception e) { e.printStackTrace();}System.out.println(jb.toString());try {reader.close();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}JSONObject json =  JSONObject.fromObject(jb.toString());String number = json.getString("number");String code = json.getString("code");String sign = json.getString("sign");String nonceStr = json.getString("nonceStr");String timeStamp = json.getString("timeStamp");Map<String,Object> map = new HashMap<String,Object>();map.put("number", number);map.put("code", code);map.put("nonceStr", nonceStr);map.put("timeStamp", timeStamp);String sign2 = MerchantApiUtil.getSign(map, BaseConfig.key); if(!sign.equals(sign2)) {json.put("Code", "fail");json.put("message", "签名错误");}else {//调用发送短信的方法并返回sendSmsresponseSendSmsResponse sendSmsresponse = messageSendServiceImp.sendSms(number, code);//将返回结果封装到json发送给调用接口者处理json.put("Code", sendSmsresponse.getCode());json.put("Message", sendSmsresponse.getMessage());json.put("RequestId",sendSmsresponse.getRequestId());json.put("BizId", sendSmsresponse.getBizId());}PrintWriter writer=null;try {writer = response.getWriter();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}writer.print(json.toString());writer.flush();}
}

上述代码中用到的工具类MerchantApiUtil,是用来生成签名的,具体签名规则参考微信公共号开发的签名生成规则(照着微信的公共号开发是模式写的签名)具体实现没看明白我拷贝过来的。 签名规则:
设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

不愿意看的我会上传资源的
以上就写好了一个短信二次接口,下面有一个简单的测试接口类

public class Test1 {private  static String key="000000"; //模拟key值public static void main(String[] args) {//请求的URL地址String url="http://localhost:8080/aliduanxin/joymeter/messageSend";JSONObject json = new JSONObject();//发送给的电话号码json.put("number", "xxxxxxxxx");//要发送的验证码值json.put("code", "0000");//随机字符串,随便用什么方式生成json.put("nonceStr", MerchantApiUtil.getNonceStr());json.put("timeStamp", MerchantApiUtil.getTimeStamp());Map<String,Object> map = new HashMap<String,Object>();map.put("number", "xxxxxxx");map.put("code", "0000");//随机字符串map.put("nonceStr", json.getString("nonceStr"));//时间戳map.put("timeStamp", json.getString("timeStamp"));//生成签名String sign = MerchantApiUtil.getSign(map, key);json.put("sign", sign);String outStr = json.toString();json=  HttpUtil.httpRequest(url, "POST",outStr);System.out.println(json);}}

然后写一个简单的短信验证登陆:
登陆页面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登陆</title>
<script type="text/javascript" language="javascript" src="<%=request.getContextPath() %>/js/jquery-3.2.1.js"></script>
</head>
<script type="text/javascript">
var InterValObj; //timer变量,控制时间
var count = 10; //间隔函数,1秒执行
var curCount;//当前剩余秒数
function reloadCode(){  //向后台发送请求生成code并存入session中$.post("codeCreate.action", { time : new Date().getTime() } );curCount = count;  //读秒提示$("#btn").attr("disabled", "true");  $("#btn").val("请在" + curCount + "秒内输入验证码");  //启动定时器InterValObj = window.setInterval(SetRemainTime, 1000);
}
function SetRemainTime() {  if (curCount == 0) {                  window.clearInterval(InterValObj);// 停止计时器  $("#btn").removeAttr("disabled");// 启用按钮  $("#btn").val("重新发送验证码");
//         code = ""; // 清除验证码。如果不清除,过时间后,输入收到的验证码依然有效$.post("sessionRemove.action", { time : new Date().getTime(),codeName:'code' } ); }else {  curCount--;  $("#btn").val("请在" + curCount + "秒内输入验证码");  }
}  </script>
<body>
<form method='post' action='login.action'>  <input type="text" name="code" id="code" value=""/><input type="button" id="btn" value="点击获取验证码" onclick="reloadCode()"/><br><input type="submit" value="Login">  </form>
</body>
</html>

效果就是这样只写了验证码其他的不要了,时间可以自己改,测试的时候不愿意等注意这里请求登陆的地址要写
/test/index.action

后台处理

@Controller
@RequestMapping(value = "/test")
public class Login {//登陆验证
@RequestMapping("/login.action")
public String login(HttpServletRequest req,HttpServletRequest resp,Map<String,Object> map) {String code = req.getParameter("code");System.out.println(code);System.out.println(req.getSession().getAttribute("code"));if(code.equals(req.getSession().getAttribute("code"))) {HttpSession session = req.getSession();//登陆成功后将code从session中清除session.removeAttribute("code");System.out.println("登陆成功");return "success";}else {System.out.println("登陆失败");//返回登陆return "redirect:/test/index.action";}}
@RequestMapping("/codeCreate.action")
public void imageCodeCreate(HttpServletRequest req,HttpServletResponse resp) throws IOException {//实现短信发送接口的key值,要与configbath中一致String key = "123456789";String code = (String) ImageCodeCreate.createImageCode().get("code");String url = "http://localhost:8080/aliduanxin/joymeter/messageSend";JSONObject json = new JSONObject();json.put("number", "xxxxxxx");json.put("code", code);json.put("nonceStr", MerchantApiUtil.getNonceStr());json.put("timeStamp", MerchantApiUtil.getTimeStamp());Map<String,Object> map = new HashMap<String,Object>();map.put("number", "xxxxxxxx");map.put("code", code);//随机字符串map.put("nonceStr", json.getString("nonceStr"));//时间戳map.put("timeStamp", json.getString("timeStamp"));//生成签名String sign = MerchantApiUtil.getSign(map, key);json.put("sign", sign);String outStr = json.toString();json=  HttpUtil.httpRequest(url, "POST",outStr);System.out.println(json);
//    if(json.getString("Code").equals("OK")) {HttpSession session = req.getSession();session.setAttribute("code", code);//      }
}
/*** 清楚session中的某个属性* @param req* @param resp*/
@RequestMapping("/sessionRemove.action")
public void sessionRemove(HttpServletRequest req,HttpServletResponse resp) {String codeName = req.getParameter("codeName");req.getSession().removeAttribute(codeName);}
@RequestMapping("/index.action")
public String index() {return "login";
}
}

短信二次接口开发demo相关推荐

  1. 什么是短信平台api接口?

    自从人类诞生了手机,短信便随之而来,虽然后来有了更多的即时通信工具,如QQ和微信,个人用短信的机会已经很少了,但是对于企业公司来说,短信一直是非常方便的信息传递工具. 那些带有营销性质的企业和商家会通 ...

  2. 上海移动通信企业短信通平台接口协议

    上海移动通信 企业短信通平台接口协议 Enterprise Message Point to Point, EMPP (v 2.0) 上海移动通信有限公司 2004 年6 月 上海移动通信有限责任公司 ...

  3. 支付宝即时到账接口开发 - DEMO讲解

    支付宝即时到账接口开发 - DEMO讲解 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail? ...

  4. 短信平台API接口demo示例-Node/SMS/Send

    DEMO: SMS/Send - 短信发送 原文链接 var request = require('request'); var crypto = require('crypto'); var app ...

  5. 短信系统发送接口说明方法|网页短信平台开发搭建

    此接口为发送接口可直接通过pos直接调用 直接发送,源码短信平台搭建平台时 包含此功能,在客户端中可查看API接口文档 接口名称:自定义短信发送接口 接口方式:POST 接口返回类型:JSON 接口地 ...

  6. 短信平台API接口demo示例-Node/SMS/MultiSend

    DEMO: SMS/MultiSend - 短信一对多发送 原文链接 var request = require('request'); var crypto = require('crypto'); ...

  7. 短信平台API接口demo示例-Node/SMS/XSend

    DEMO: SMS/XSend - 短信模板发送 原文链接 var request = require('request'); var crypto = require('crypto'); var ...

  8. 短信平台API接口demo示例-Python/SMS/MultiSend

    DEMO: SMS/MultiSend - 短信一对多发送 示例代码 原文链接 非加密代码示例 import requests import jsonappid = 'appid' # SUBMAIL ...

  9. java gsm短信发送_GSM java短信二次开发出现问题

    看看是否下面这个问题导致只能发送1条,第2条就提示端口被占用 前些天在弄短信猫时出现一种情况,即只能发送一条信息,再次发送时就报端口占用错误.我用的是官方提供的代码 如下: public void d ...

最新文章

  1. Delphi 之Copyrect的使用
  2. python怎么加载图片-怎样用python加载dicom图片
  3. MATLAB实战系列(五)-模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解
  4. Python 零碎信息-基础 02
  5. matlab中的控制语句,MATLAB控制语句
  6. 最新优秀的通用Android应用架构:从建项目开始
  7. Linux的timerfd分析
  8. leetcode693:Binary Number with Alternating Bits
  9. LeetCode() Merge Intervals 还是有问题,留待,脑袋疼。
  10. java的三种流程控制语录_Java 流程控制语句
  11. 地市级地铁数据管理信息系统解决方案
  12. A轮、B轮、C轮融资、VC、PE、IPO概念解析
  13. Qt 之 模仿 QQ登陆界面——样式篇
  14. 计算机等级考试三级信息安全知识整理
  15. 华为路由器AAA配置与管理
  16. python读取xlsm文件_如何从* .xlsm中提取工作表并将其保存为Python中的* .csv?
  17. win10 关闭自动维护计划任务
  18. python写入excel文件追加写入_Python读写/追加excel文件Demo
  19. Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
  20. 免费全功能响应式模板:黑暗元素

热门文章

  1. 数字指纹,数字信封,数字签名,数字证书详解
  2. Adobe国际认证师资培训线下班于青岛黄海继续教育中心成功举行!
  3. SSM书籍借阅管理系统 计算机毕业设计源码04770
  4. 大卫谈学习4:为何你会一年经验用十年?
  5. Vista破解方法深度总结(目前共7种方法) ayconanw撰写
  6. VUNDLE安装及使用
  7. 【优化调度】基于遗传算法实现产品自动排序问题matlab代码
  8. Hadoop集群的详细介绍
  9. 工作超级实用的git命令
  10. element ui 穿梭框_改造ElementUI穿梭框