模板短信接口调用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文档--短信发送记录查询

转载于:https://www.cnblogs.com/oucbl/p/6035744.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值