zoukankan      html  css  js  c++  java
  • 模板短信接口调用java,pythoy版(二) 阿里大于

    说明

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

    请自行参考 + 官方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文档--短信发送记录查询

  • 相关阅读:
    [HIHO1223]不等式(离散化,枚举)
    [NYIST15]括号匹配(二)(区间dp)
    [HIHO1328]逃离迷宫(bfs,位压)
    [Topcoder]AvoidRoads(dp,hash)
    [POJ1159]Palindrome(dp,滚动数组)
    [Topcoder]ZigZag(dp)
    [NYIST32]组合数(状压,枚举,暴力)
    [NYIST737]石子合并(一)(区间dp)
    [HIHO1322]树结构判定(并查集)
    [HIHO1143]骨牌覆盖问题·一(矩阵快速幂,递推)
  • 原文地址:https://www.cnblogs.com/oucbl/p/6035744.html
Copyright © 2011-2022 走看看