模板短信接口调用java,pythoy版(二) 阿里大于
2016-11-06 17:23
561 查看
说明
功能:短信通知发送 + 短信发送记录查询,所有参数我没有改动,实测有效!请自行参考 + 官方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版(一) 网易云信
- asp.net mvc短信接口调用——阿里大于API开发心得
- Java调用 阿里大鱼 短信接口
- 使用阿里大于接口实现一个简单的短信验证(Java版)
- 阿里大于短信接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功
- 阿里大于短信接口
- Java接入阿里大于短信平台在项目中发送短信
- Java调用WebService接口实现发送手机短信验证码功能
- java调接口实现发送手机短信验证码功能,手机验证码,接口调用
- ASP.NET MVC阿里大于短信接口开发短信群发能
- 基于PHP的短信接口调用示例代码模板
- Java调用WebService接口实现发送手机短信验证码功能
- ASP.NET MVC阿里大于短信接口开发短信群发能
- 中国网建SMS短信接口调用(java发送和接收手机短信)
- C#和JAVA调用短信接口发短信实例
- Java调用WebService接口实现发送手机短信验证码功能
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java使用阿里大于发送短信通知和短信验证码