说明

功能:短信通知发送 + 短信发送记录查询,所有参数我没有改动,实测有效!

请自行参考 + 官方API!

短信模板示例:尊敬的${name},您的快递已在飞奔的路上,将在今天${time}送达您的手里,请留意查收。

感觉:区分个人版和企业版(我使用的个人版)详见;可以任意充值,不过短信签名在短信头我不喜欢。

1. python版

# -*- encoding: utf8 -*-
'''
Created on 2016年11月05日
@author: baoluo
'''
import os,sys
import time
import urllib
import urllib2
import cookielib
import hmac
import hashlib
import logging reload(sys)
sys.setdefaultencoding( 'utf-8' ) appKey = "23512886"
secret = "521f4eb699273ca21a3ff1ed1d6757ef" ## app安全码
signHmac = "hmac" ## 加密方式
signMd5 = "md5" ## 加密方式
apiSendMethod = "alibaba.aliqin.fc.sms.num.send" ## 短信发送
apiQueryMethod = "alibaba.aliqin.fc.sms.num.query" ## 短信发送记录查询
signName = "ouc保罗" ## 短信签名
smsTemplateCode = "SMS_25150196" ## 短信模板ID ##################################################
mobiles = "15610050530" ## 传入多个号码,以英文逗号分隔
######变量长度超过限制15个字符内#########
s1 = "保罗" ## 模板变量1
s2 = "time" ## 模板变量2
##################################################
#短信模板参数,字符串类型
smsParams = "{\"name\":\"" + s1 + "\",\"time\":\"" + s2 + "\"}"
#print smsParams
serverUrl = " http://gw.api.taobao.com/router/rest" ## 正式环境 class MsgByAlidayu(object):
"""docstring for MsgByAlidayu"""
"""阿里大于 短信通知模板:
• 短信发送字数含"签名+模板内容+变量内容",短信字数<=70个字。""" def __init__(self):
super(MsgByAlidayu, self).__init__()
self.params = {} ## 提交的所有参数
sys.stdout.flush()
self.cookie = cookielib.CookieJar()
self.handler = urllib2.HTTPCookieProcessor(self.cookie)
self.opener = urllib2.build_opener(self.handler)
self.addHeaders("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
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 getTimestamp(self):
## 格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8
return time.strftime('%Y-%m-%d %H:%M:%S') def test(self):
print self.getTimestamp()
gs = GenerateSign({})
print gs.md5Sign()
print gs.hmacSign()
print gs.hmacSign1() def sendMsg(self):
## 请求参数
self.params.setdefault("app_key", appKey)
self.params.setdefault("format", "json")
self.params.setdefault("method", apiSendMethod)
self.params.setdefault("sign_method", signHmac)
self.params.setdefault("timestamp", self.getTimestamp())
self.params.setdefault("v", "2.0")
self.params.setdefault("rec_num", mobiles)
self.params.setdefault("sms_free_sign_name", signName)
self.params.setdefault("sms_param", str(smsParams))
self.params.setdefault("sms_template_code", smsTemplateCode)
self.params.setdefault("sms_type", "normal")
## 提交参数的hmac或md5的签名
sign = GenerateSign(self.params).hmacSign()
print 'sign: ',sign
## 公共请求参数
self.params.setdefault("sign", sign) postData = urllib.urlencode(self.params)
#print postData
print self.params try:
req = self.doPost(serverUrl, postData)
print req.getcode()
if 200 == req.getcode():
res = req.read()
print res
else:
print req.getcode() except Exception, e:
print logging.exception(e) def queryMsg(self):
## 请求参数
params ={}
queryMobiles = "15610050530"
queryDate = "20161106"
params.setdefault("app_key", appKey)
params.setdefault("format", "json")
params.setdefault("method", apiQueryMethod)
params.setdefault("sign_method", signHmac)
params.setdefault("timestamp", self.getTimestamp())
params.setdefault("v", "2.0")
params.setdefault("rec_num", queryMobiles)
params.setdefault("query_date", queryDate)
params.setdefault("current_page", "1")
params.setdefault("page_size", "50")
## 提交参数的hmac或md5的签名
sign = GenerateSign(params).hmacSign()
#print 'signQuery: ',sign
## 公共请求参数
params.setdefault("sign", sign) postData = urllib.urlencode(params)
print postData
#print params
#print urllib.quote(str(self.params).decode('gbk').encode('utf-8'))
try:
req = self.doPost(serverUrl, postData)
print req.getcode()
if 200 == req.getcode():
res = req.read()
print res
else:
print req.getcode() except Exception, e:
print logging.exception(e) class GenerateSign(object):
"""docstring for GenerateSign
secret:签名需要的密钥(创建应用系统分配的)
parameters: 字典类型,{key:value,...}(支持字典和string两种)
"""
def __init__(self, parameters):
super(GenerateSign, self).__init__()
self.parameters = parameters def md5Sign(self):
parameters = self.parameters
# 如果parameters 是字典类的话
if hasattr(parameters, "items"):
keys = parameters.keys()
keys.sort() parameters = "%s%s%s" % (secret,
str().join('%s%s' % (key, parameters[key]) for key in keys),
secret)
sign = hashlib.md5(parameters).hexdigest().upper()
return sign def hmacSign(self):
parameters = self.parameters
# 如果parameters 是字典类的话
if hasattr(parameters, "items"):
# 第一步:检查参数是否已经排序
keys = parameters.keys()
keys.sort()
# 第二步:把所有参数名和参数值串在一起
parameters = str().join('%s%s' % (key, parameters[key]) for key in keys) # 第三步:使用HMAC加密并把二进制转化为大写的十六进制
myhmac = hmac.new(secret)
myhmac.update(parameters)
# 第四步:把二进制转化为大写的十六进制
sign = myhmac.hexdigest().upper()
return sign def hmacSign1(self):
params = self.parameters
# 第一步:检查参数是否已经排序
ps = sorted(params.iteritems(),key = lambda asd:asd[0], reverse = False)
#print 'ps',ps
# 第二步:把所有参数名和参数值串在一起
strParams = ''
for p in ps:
strParams += (p[0] + p[1])
#print type(p) ,p[0], p[1]
#print 'strParams:',strParams
# 第三步:使用HMAC加密
myhmac = hmac.new(secret)
myhmac.update(strParams)
# 第四步:把二进制转化为大写的十六进制
return myhmac.hexdigest().upper() def test(self):
generate_sign = GenerateSign(secret,{})
print generate_sign.hmacSign()
print generate_sign.hmacSign1() if __name__ == '__main__':
alidayu = MsgByAlidayu()
#alidayu.sendMsg()
#alidayu.queryMsg()
alidayu.test()

2. java版

需要使用官方的2个jar包,点击下载


import java.io.IOException;
import java.security.GeneralSecurityException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map; import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import com.taobao.api.ApiException;
import com.taobao.api.Constants;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.internal.util.StringUtils;
import com.taobao.api.request.AlibabaAliqinFcSmsNumQueryRequest;
import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest;
import com.taobao.api.response.AlibabaAliqinFcSmsNumQueryResponse;
import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse; public class alidayuMSGSign
{
static String appKey = "23512886";
static String appSecret = "521f4eb699273ca21a3ff1ed1d6757ef"; //app安全码
static String signHmac = "hmac"; //加密方式
static String signMd5 = "md5"; //加密方式
static String sign = null; // 全部参数的hmac或md5的校验码
static String mobiles = "15610050530"; //传入多个号码,以英文逗号分隔
static String apiSendMethod = "alibaba.aliqin.fc.sms.num.send"; // 短信发送
static String apiQueryMethod = "alibaba.aliqin.fc.sms.num.query"; //短信发送记录查询
static String signName = "ouc保罗"; //短信签名
static String smsTemplateCode = "SMS_25150196"; //短信模板ID
static String serverUrl = " http://gw.api.taobao.com/router/rest"; //正式环境 //短信模板参数,字符串类型
static String smsParams = "{\"name\":\""
+ "保罗"
+ "\",\"time\":\""
+ "time"
+ "\"}"; public static void main(String[] args) throws IOException, ApiException
{ Map<String, String> params = new HashMap<>();
params.put("app_key", appKey);
params.put("format", "json");//format:响应格式。默认为xml格式,可选值:xml,json。
params.put("method", apiSendMethod);//API接口名称。
params.put("rec_num", mobiles);
params.put("sign_method", signHmac); //签名的摘要算法,可选值为:hmac,md5。
params.put("timestamp", getTimeStamp());//时间戳,格式为yyyy-MM-dd HH:mm:ss
params.put("v", "2.0"); //API协议版本,可选值:2.0。
params.put("sms_free_sign_name", signName);
params.put("sms_param", smsParams);
params.put("sms_template_code", smsTemplateCode);
params.put("sms_type", "normal"); sign = signTopRequest(params, appSecret, signHmac);
System.out.println(sign); TaobaoClient client = new DefaultTaobaoClient(serverUrl, appKey, appSecret);
AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
req.setSmsType("normal");
req.setSmsFreeSignName(signName);
System.out.println(smsParams);
req.setSmsParamString(smsParams);
req.setRecNum(mobiles);
req.setSmsTemplateCode(smsTemplateCode);
AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req);
System.out.println(rsp.getBody()); AlibabaAliqinFcSmsNumQueryRequest reqQ = new AlibabaAliqinFcSmsNumQueryRequest();
reqQ.setRecNum("15610050530");
reqQ.setQueryDate("20161102");
reqQ.setCurrentPage(1L);
reqQ.setPageSize(50L);
AlibabaAliqinFcSmsNumQueryResponse rspQ = client.execute(reqQ);
System.out.println("20161102" + rspQ.getBody());
reqQ.setQueryDate("20161106");
rspQ = client.execute(reqQ);
System.out.println("20161106"+rspQ.getBody());
} public static String getTimeStamp()
{
//时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2015-01-01 12:00:00。
//淘宝API服务端允许客户端请求最大时间误差为10分钟。
long curTime = new Date().getTime();
//定义日期的中文输出格式,并输出日期
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
return df.format(curTime).toString();
} public static String signTopRequest(Map<String, String> params, String secret, String signMethod) throws IOException
{
// 第一步:检查参数是否已经排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys); // 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
if (Constants.SIGN_METHOD_MD5.equals(signMethod))
{
query.append(secret);
}
for (String key : keys)
{
String value = params.get(key);
if (StringUtils.areNotEmpty(key, value))
{
query.append(key).append(value);
}
} // 第三步:使用MD5/HMAC加密
byte[] bytes;
if (Constants.SIGN_METHOD_HMAC.equals(signMethod))
{
bytes = encryptHMAC(query.toString(), secret);
} else
{
query.append(secret);
bytes = encryptMD5(query.toString());
} // 第四步:把二进制转化为大写的十六进制
return byte2hex(bytes);
} public static byte[] encryptHMAC(String data, String secret) throws IOException
{
byte[] bytes = null;
try
{
SecretKey secretKey = new SecretKeySpec(secret.getBytes(Constants.CHARSET_UTF8), "HmacMD5");
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
bytes = mac.doFinal(data.getBytes(Constants.CHARSET_UTF8));
} catch (GeneralSecurityException gse)
{
throw new IOException(gse.toString());
}
return bytes;
} public static byte[] encryptMD5(String data) throws IOException
{
return encryptMD5(data.getBytes(Constants.CHARSET_UTF8).toString());
} public static String byte2hex(byte[] bytes)
{
StringBuilder sign = new StringBuilder();
for (int i = 0; i < bytes.length; i++)
{
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1)
{
sign.append("0");
}
sign.append(hex.toUpperCase());
}
return sign.toString();
}
}

参阅官网:

API文档--短信发送

API文档--短信发送记录查询

模板短信接口调用java,pythoy版(二) 阿里大于的更多相关文章

  1. 模板短信接口调用java,pythoy版(一) 网易云信

    说明 短信服务平台有很多,我只是个人需求,首次使用,算是测试用的,故选个网易(大公司). 稳定性:我只测试了15条短信... 不过前3条短信5分钟左右的延时,后面就比较快.... 我只是需要发短信,等 ...

  2. java短信接口调用

    java短信接口调用 之前一直在一个传统的单位上班好多听容易的技术都没接触过,即使有时候想搞一搞类似于支付宝支付,短信接口调用,微信公众号,小程序之类等功能,一直有心无力终于跳槽了,估计是氛围的原因吧 ...

  3. 阿里短信接口使用(JAVA版)

    近期项目需要使用短信接口,对比下选择了阿里的短信接口 以下为开发笔记: maven pom.xml中引入: <dependency> <groupId>com.aliyun&l ...

  4. PJzhang:exiftool图片信息提取工具和短信接口调用工具TBomb

    猫宁!!! 作者:Phil Harvey 这是图片信息提取工具的地址: https://sno.phy.queensu.ca/~phil/exiftool/ 网站隶属于Sudbury 中微子天文台,从 ...

  5. asp.net mvc短信接口调用——阿里大于API开发心得

    互联网上有许多公司提供短信接口服务,诸如网易云信.阿里大于等等.我在自己项目里需要使用到短信服务起到通知作用,实际开发周期三天,完成配置.开发和使用,总的说,阿里大于提供的接口易于开发,非常的方便,短 ...

  6. 短信接口调用以及ajax发送短信接口实现以及前端样式

    我们短信api用的是云信使平台提供的非免费短信服务:官网提供的demo有两种,分别是function加其调用.class文件加其调用. 在这里我们用class文件加调用: 首先,ThinkPHP里面自 ...

  7. zabbix短信接口调用

    #!/bin/bash TIME=`date +%Y-%m-%d` KEY="UJK9rk50HD8du8JE8h87RUor0KERo5jk" username="za ...

  8. 中国网建SMS短信接口调用(java发送和接收手机短信)

    1.先注册账号,一定要填写好签名格式.不填会返回-51错误.   代码信息接口详细==>http://sms.webchinese.cn/api.shtml   . 2.测试代码 package ...

  9. Aliyun发送短信接口调用方法

    aliyun新版发送短信讲的不是很清晰,初次使用一堆dll不知道用哪个,以.net为例 申请SignName与Template_code请先申请,一般两个小时能通过 一.https://help.al ...

随机推荐

  1. nullcon HackIM 2016 -- Crypto Question 3

    After entring the luxurious condomium,you get the feel that you are in home of a yester Star. the ex ...

  2. 全面的Seo面试题

      一.选择题(每题2分,2分×10=20分) 1.白帽SEO诞生日是: A .1997年9月15日 :B .2004年12月13日:C.2005年3月26日:D.2009年6月1日 2.一个做女性服 ...

  3. Aspen 安装

    按原安装后破解不成功后: 从下载文件夹中,找到 AspenONEV8.\Patch\-STRGXI2.zip,里面有个 STRGXI2.dll,将该文 件复制到: C:\Program Files(x ...

  4. spark job, stage ,task介绍。

    1. spark 如何执行程序? 首先看下spark 的部署图: 节点类型有: 1. master 节点: 常驻master进程,负责管理全部worker节点. 2. worker 节点: 常驻wor ...

  5. C#获取本机公网IP

    /// <summary> /// 获取本机公网IP /// </summary> /// <returns></returns> public sta ...

  6. selenium第一课(selenium+java+testNG+maven)

    selenium介绍和环境搭建 一.简单介绍 1.selenium:Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包 ...

  7. hihocoder SAM基础概念

    后缀自动机一·基本概念 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称 ...

  8. 在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib

    为什么要CMake,这里我陈述自己的想法,作为一个刚使用opencv库的小白来说,有以下大概三点内容 1.由于在学习图像处理滤波器中,需要用到各种边缘保护滤波器(EPS)算法,但是这些算法在OpenC ...

  9. iOS8 定位补充

    iOS 8定位补充 iOS 8定位需要修改2个地方 1.info.plist文件中添加NSLocationAlwaysUsageDescription:描述信息 从iOS 8开始,用户定位分两种情况 ...

  10. VS2010+C#+在新建类或接口时在文件开头自动生成作者和日期等备注

    今天在公司项目准备开始,为达到项目的规范管理,要求每个文件的标准日期,作者等信息,搜集了百度的资料,新建文件时效果如下: 其实原理很简单,只要修改VS,IDE文件下的类(或接口)模版代码 文件路径:C ...