模板短信接口调用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 ...
随机推荐
- 纸上谈兵:排序算法简介及C实现
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 排序算法(Sorting Algorithm)是计算机算法的一个组成部分. 排序的 ...
- 【EF学习笔记12】----------解释查询和本地查询 区分 Enumerable 和 Queryable
简单介绍:Enumerable 和 Queryable 他们都是静态类,位于命名控件 System.Linq下,分别为IEnumerable<T>和IQueryable<T>提 ...
- Android 环境常见问题
1.启动adb时报: adb server is out of data.kill... ADB server didn't ACK *failed to start daemon* er ...
- Corba概念(GIOP、IIOP、IOR、ORB、IDL)
CORBA公用对象请求代理(调度)程序体系结构(Common Object Request Broker Architecture),缩写为 CORBA,是对象管理组织(Object Manageme ...
- hive 中窗口函数row_number,rank,dense_ran,ntile分析函数的用法
hive中一般取top n时,row_number(),rank,dense_ran()这三个函数就派上用场了, 先简单说下这三函数都是排名的,不过呢还有点细微的区别. 通过代码运行结果一看就明白了. ...
- 在linux上使用交换文件扩展交换空间
想像一种情景,当我们的Linux系统用尽交换空间时,在这种情况下,我们想要使用swap分区扩展交换空间,但在某些情况下磁盘上已经没有可用的空闲分区了,致使我们不能把它扩大. 因此,在这种情况下,我们可 ...
- {POJ}{树状数组}
总结一下树状数组的题目: {POJ}{3928}{Ping Pong} 非常好的题目,要求寻找一个数组中满足A[i]<A[k]<A[j]的个数,其中i<k<j(或者相反).很巧 ...
- Asp.Net 获取FileUpload控件的文件路径、文件名、扩展名
string fileNameNo = Path.GetFileName(FileUploadImg.PostedFile.FileName); //获取文件名和扩展名string Directory ...
- c++学习笔记——智能指针
智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一 ...
- VC++ MFC 按钮的全部样式Style
Button Styles BS_3STATE 与复选框一样本样式按钮可被单击变暗.变暗状态通常用于指示本样式的按键正处于禁用状态. BS_AUTO3STATE 与三状态的复选框一样当用户选中它本 ...