模板短信接口调用java,pythoy版(一) 网易云信
说明
短信服务平台有很多,我只是个人需求,首次使用,算是测试用的,故选个网易(大公司)。
稳定性:我只测试了15条短信... 不过前3条短信5分钟左右的延时,后面就比较快....
我只是需要发短信,等我去充值时候发现.....最少订单4w条(2000元).....就当学习吧,我也用不起啊!
安全原理:通过3个参数进行SHA1哈希计算,得到一个需要提交的参数;
而安全码(appSecret)不需要提交,这样假设数据被截获也不能被修改,否则将不能被校验。
python版
# -*- coding: utf8 -*-
'''
Created on 2016年11月03日
@author: baoluo
'''
import sys
import urllib
import urllib2
import cookielib
import hashlib
import logging
from time import time
class SendMsgTest(object):
"""网易云信 短信模板:
• 短信由三部分构成:签名+内容+变量
• 短信模板示例:尊敬的%s ,您的余额不足%s元,请及时缴费。"""
def __init__(self):
super(SendMsgTest, self).__init__()
sys.stdout.flush()
self.cookie = cookielib.CookieJar()
self.handler = urllib2.HTTPCookieProcessor(self.cookie)
self.opener = urllib2.build_opener(self.handler)
urllib2.install_opener(self.opener)
def addHeaders(self, name, value):
self.opener.addheaders.append((name, value))
def doPost(self, url, payload = None):
req = urllib2.Request(url, data = payload)
req = self.opener.open(req)
return req
def checkSum(self,appSecret,nonce,curTime):
# SHA1(AppSecret + Nonce + CurTime),三个参数拼接的字符串,
# 进行SHA1哈希计算,转化成16进制字符(String,小写)
return hashlib.sha1(appSecret + nonce + curTime).hexdigest()
def send(self):
appSecret = '368d4609c9d9'
nonce = 'baoluo' #随机数(最大长度128个字符)
curTime = str(int(time()))
self.addHeaders("AppKey", "1b9ef90f26b655da4d93293d2aa65c5e");
self.addHeaders("CheckSum", self.checkSum(appSecret,nonce,curTime));
self.addHeaders("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
self.addHeaders("CurTime", curTime);
self.addHeaders("Nonce", nonce);
templateid = '3029349' #模板ID
mobiles = "[\"15610050530\"]"
params = "[\"保罗\",\"7.7\"]"
values = {'templateid' : templateid, 'mobiles' : mobiles, 'params' : params }
postData = urllib.urlencode(values)
print postData
postUrl = 'https://api.netease.im/sms/sendtemplate.action'
try:
req = self.doPost(postUrl, postData)
if 200 == req.getcode():
res = req.read()
print res
#成功返回{"code":200,"msg":"sendid","obj":8}
#主要的返回码200、315、403、413、414、500
#详情:http://dev.netease.im/docs?doc=server&#code状态表
else:
print req.getcode()
except Exception, e:
print logging.exception(e)
if __name__ == '__main__':
sendTest = SendMsgTest()
sendTest.send()
java版
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.Date;
public class TestYunxin
{
public static void main(String[] args) throws Exception
{
System.out.println(sendMsg());
}
/**
* 发送POST方法的请求
*
* @return 所代表远程资源的响应结果
*/
public static String sendMsg()
{
String appKey = "1b9ef90f26b655da4d93293d2aa65c5e";
String appSecret = "368d4609c9d9";
String nonce = "baoluo"; // 随机数(最大长度128个字符)
String curTime = String.valueOf((new Date()).getTime() / 1000L); // 当前UTC时间戳
System.out.println("curTime: " + curTime);
String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce, curTime);
System.out.println("checkSum: " + checkSum);
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try
{
String url = "https://api.netease.im/sms/sendtemplate.action";
String encStr1 = URLEncoder.encode("保罗", "utf-8");
String encStr2 = URLEncoder.encode("name", "utf-8"); // url编码;防止不识别中文
String params = "templateid=3029349&mobiles=[\"15610050530\"]"
+ "¶ms=" + "[\"" + encStr1 + "\",\""+ encStr2 + "\"]";
System.out.println("params" + params);
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("AppKey", appKey);
conn.setRequestProperty("CheckSum", checkSum);
conn.setRequestProperty("CurTime", curTime);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
conn.setRequestProperty("Nonce", nonce);
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(params);
// 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 请求出现异常!\n" + e);
e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally
{
try
{
if (out != null)
{
out.close();
}
if (in != null)
{
in.close();
}
} catch (IOException ex)
{
ex.printStackTrace();
}
}
return result;
}
}
class CheckSumBuilder
{
// 计算并获取CheckSum
public static String getCheckSum(String appSecret, String nonce, String curTime)
{
return encode("sha1", appSecret + nonce + curTime);
}
// 计算并获取md5值
public static String getMD5(String requestBody)
{
return encode("md5", requestBody);
}
private static String encode(String algorithm, String value)
{
if (value == null)
{
return null;
}
try
{
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
messageDigest.update(value.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e)
{
throw new RuntimeException(e);
}
}
private static String getFormattedText(byte[] bytes)
{
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
for (int j = 0; j < len; j++)
{
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
private static final char[] HEX_DIGITS =
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
}
参阅官网:
网易云信短信接口指南
网易云信Server Http API接口文档南
模板短信接口调用java,pythoy版(一) 网易云信的更多相关文章
- 模板短信接口调用java,pythoy版(二) 阿里大于
说明 功能:短信通知发送 + 短信发送记录查询,所有参数我没有改动,实测有效! 请自行参考 + 官方API! 短信模板示例:尊敬的${name},您的快递已在飞奔的路上,将在今天${time}送达您的 ...
- java短信接口调用
java短信接口调用 之前一直在一个传统的单位上班好多听容易的技术都没接触过,即使有时候想搞一搞类似于支付宝支付,短信接口调用,微信公众号,小程序之类等功能,一直有心无力终于跳槽了,估计是氛围的原因吧 ...
- PJzhang:exiftool图片信息提取工具和短信接口调用工具TBomb
猫宁!!! 作者:Phil Harvey 这是图片信息提取工具的地址: https://sno.phy.queensu.ca/~phil/exiftool/ 网站隶属于Sudbury 中微子天文台,从 ...
- 阿里短信接口使用(JAVA版)
近期项目需要使用短信接口,对比下选择了阿里的短信接口 以下为开发笔记: maven pom.xml中引入: <dependency> <groupId>com.aliyun&l ...
- asp.net mvc短信接口调用——阿里大于API开发心得
互联网上有许多公司提供短信接口服务,诸如网易云信.阿里大于等等.我在自己项目里需要使用到短信服务起到通知作用,实际开发周期三天,完成配置.开发和使用,总的说,阿里大于提供的接口易于开发,非常的方便,短 ...
- 短信接口调用以及ajax发送短信接口实现以及前端样式
我们短信api用的是云信使平台提供的非免费短信服务:官网提供的demo有两种,分别是function加其调用.class文件加其调用. 在这里我们用class文件加调用: 首先,ThinkPHP里面自 ...
- zabbix短信接口调用
#!/bin/bash TIME=`date +%Y-%m-%d` KEY="UJK9rk50HD8du8JE8h87RUor0KERo5jk" username="za ...
- 中国网建SMS短信接口调用(java发送和接收手机短信)
1.先注册账号,一定要填写好签名格式.不填会返回-51错误. 代码信息接口详细==>http://sms.webchinese.cn/api.shtml . 2.测试代码 package ...
- Aliyun发送短信接口调用方法
aliyun新版发送短信讲的不是很清晰,初次使用一堆dll不知道用哪个,以.net为例 申请SignName与Template_code请先申请,一般两个小时能通过 一.https://help.al ...
随机推荐
- DATAGUARD 在线重建备库
环境: OS: CentOS 6.5 X64 DB: oracle 10.2.0.5 故障:之前由于错误激活备库主写导致主备日志同步,重建备库 1.关闭备库,删除数据文件及控制文件,redo文件 rm ...
- linux下的磁盘和文件系统管理
一.硬盘分区知识 1.分区类型 硬盘分区一共有3种:主分区.扩展分区和逻辑分区.扩展分区只不过是逻辑分区的“容器”,实际上只有主分区和逻辑分区进行数据存储.在一块硬盘上最多只能有4个主分区,可以另外建 ...
- oracle连接的三个配置文件(转)
Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器 ORACLE当中 ...
- python之I/O多路复用
python IO多路复用 一.多路复用概念: 监听多个描述符(文件描述符(windows下暂不支持).网络描述符)的状态,如果描述符状态改变 则会被内核修改标志位,进而被进程获取进而进行 ...
- JS settimeout 使用笔记
无参数使用方法: setTimeout(function_name,delay_time); 基本使用方法是逗号前是函数名字,不能带有 xxxx(),不然不执行: 但是很多函数都要带参数的,以下是解决 ...
- iptables-qos-tcpcopy-tc-tcpdump
QOS: https://www.chiphell.com/thread-427876-1-1.html iptables指南: http://man.chinaunix.net/network/ip ...
- Inside The C++ Object Model - 03
object Lessons 1.C++中布局以及存取时间上的的额外负担是由virtual引起的:virtual function.virtual base class.或是由于多继承引起的. 2.C ...
- 相同的问题又出现了,struts2取不出数值
debug里面是有数值的,不知道是不是又是表示错了.全部改成了小写也无济于事.正在想法解决中... 问题解决了,因为自己的不仔细,问题还是出在了action的set,get方法里,不是大小写没注意,改 ...
- WPF的图片操作效果(一):RenderTransform
一.RenderTransform类的成员: 1.TranslateTransform 平移效果 2.RotateTransform 旋转效果 3.ScaleTransform 缩放效果 ...
- ios block和函数的区别
block是封装了一段代码的OC对象,可以被设为Property, 在调用block的地方block都会被替换成相应的代码,相当于内联函数. 函数可以使代码更加整洁易读,使用block会使代码可读性变 ...