说明:
1.该案例是实际开发中运用用于用户注册发送验证码和实际场景中商品价格变动,订单下发发送短信通知
2.java项目中需要的jar
需要的jar包:
fastjson-1.1.24.jar
taobao-sdk-java-auto_1455552377940-20160908.jar
maven环境中需要的jar:
com.ganshane.specs
taobao-sdk-java-auto-20160607
1.0.0
该版本是我自己从阿里大于官网下载的jar然后安装到本地仓库中,具体操作请点击:
http://blog.csdn.net/u014079773/article/details/60773287
在阿里云仓库(http://maven.aliyun.com/nexus/#welcome)中发现版本是2012,经本人测试,该版本太低导致调用接口缺少方法,故建议使用官网最新版本jar。
3.测试工程结构:
短信通知模板常量类:
package com.qianjiang.util.sms;
/**
* @class:SMSConstants
* @descript:java 使用阿里大于短信通知验证码模板常量类
* 参考:https://api.alidayu.com/docs/api.htm?apiId=25450
* @date:2017年3月7日 上午10:53:12
* @author sang
*/
public class SMSConstants {
//公共参数:正式环境请求地址http格式
public static String URL="http://gw.api.taobao.com/router/rest";
//公共参数:正式环境请求地址https格式
//public static String URL2 = "https://eco.taobao.com/router/rest";
//TOP分配给应用的AppKey,即阿里大于账户创建的应用
public static String APP_KEY="23669622";
//公共参数:签名的摘要算法,可选值为:hmac,md5。
public static String SIGN_METHOD_MD5="md5";
//公共参数:签名的摘要算法,可选值为:hmac,md5。
public static String SIGN_METHOD_HMAC="hmac";
//请求参数:短信签名,传入的短信签名必须是在阿里大于“管理中心-短信签名管理”中的可用签名
public static String SMS_SIGN="千匠";
//请求参数:公共回传参数
public static String EXTEND="123456";
//请求参数:短信类型,传入值请填写normal
public static String SMS_TYPE="normal";
//请求参数:短信模板ID,传入的模板必须是在阿里大于“管理中心-短信模板管理”中的可用模板。示例:SMS_585014
public static String SMS_TEMPLATE_CODE="SMS_53300064";
//请求参数:签名的App Secret值
public static String SECRET = "77c99b227ff054dc44fab8b9d41f975a";
//返回信息编码为utf-8
public static String CHARSET_UTF8="utf-8";
//短信通知模板类型:1验证码类2通知类
//千匠用户注册发送短信验证码
public static final String SMS_MODEL_TYPE1="1";
//千匠用户下发订单发送订单通知
public static final String SMS_MODEL_TYPE2="2";
//千匠用户商品价格变动通知1
public static final String SMS_MODEL_TYPE21="21";
//千匠用户商品价格变动通知2
public static final String SMS_MODEL_TYPE211="211";
//千匠用户商品到货通知1
public static final String SMS_MODEL_TYPE212="212";
//千匠用户商品到货通知2
public static final String SMS_MODEL_TYPE213="213";
}
短信通知模板变量类:
package com.qianjiang.util.sms;
/**
* @class:SmsParam
* @descript:java 使用阿里大于短信通知验证码模板变量
* 短信模板变量,传参规则{"key":"value"},key的名称须和申请模板中的变量名一致,多个变量之间以逗号隔开。
* 示例:针对模板“验证码${code},您正在进行${product}身份验证,打死不要告诉别人哦!”,
* 传参时需传入{"code":"1234","product":"alidayu"}
* 备注:
* 模板变量首先要选择是验证码类型还是通知类型,然后添加模板如:
* 例如添加验证码模板:点击配置管理--验证码--配置短信模板,变量为模板内容中的自定义变量
* 例如添加短信通知模板:点击配置管理--短信通知--配置短信模板,变量为模板中的自定义变量
* @date:2017年3月7日 下午2:43:41
* @author sang
*/
public class SmsParam {
//短信模板变量:模板内容中的变量${product}
private String product;
//短信模板变量:模板内容中的变量${number},手机验证码
private String number;
//短信模板变量:模板内容中的变量${ordernumber},订单号
private String ordernumber;
//短信模板变量:模板内容中的变量${disname},关注商品地区
private String disname;
//短信模板变量:模板内容中的变量${goodsinfoname},货品名称
private String goodsinfoname;
//短信模板变量:模板内容中的变量${ofollowprice},关注商品收藏的价格
private String ofollowprice;
//短信模板变量:模板内容中的变量${nfollowprice},降低以后的新价格
private String nfollowprice;
//短信模板变量:模板内容中的变量${bsetname},站点名称
private String bsetname;
public SmsParam() {
super();
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getProduct() {
return product;
}
public void setProduct(String product) {
this.product = product;
}
public String getOrdernumber() {
return ordernumber;
}
public void setOrdernumber(String ordernumber) {
this.ordernumber = ordernumber;
}
public String getDisname() {
return disname;
}
public void setDisname(String disname) {
this.disname = disname;
}
public String getGoodsinfoname() {
return goodsinfoname;
}
public void setGoodsinfoname(String goodsinfoname) {
this.goodsinfoname = goodsinfoname;
}
public String getOfollowprice() {
return ofollowprice;
}
public void setOfollowprice(String ofollowprice) {
this.ofollowprice = ofollowprice;
}
public String getNfollowprice() {
return nfollowprice;
}
public void setNfollowprice(String nfollowprice) {
this.nfollowprice = nfollowprice;
}
public String getBsetname() {
return bsetname;
}
public void setBsetname(String bsetname) {
this.bsetname = bsetname;
}
}
package com.qianjiang.util.sms;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest;
import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse;
/**
* @class:SmsUtil
* @descript:java 使用阿里大于短信通知工具类
* @date:2017年3月7日 下午2:47:38
* @author sang
*/
public class SmsUtil {
//请求地址
private static String URL = SMSConstants.URL;
//TOP分配给应用的AppKey
private static String APP_KEY = SMSConstants.APP_KEY;
//短信签名AppKey对应的secret值
private static String SECRET = SMSConstants.SECRET;
//短信类型,传入值请填写normal
private static String SMS_TYPE = SMSConstants.SMS_TYPE;
//阿里大于账户配置的短信签名
private static String SMS_SIGN = SMSConstants.SMS_SIGN;
//阿里大于账户配置的短信模板ID
private static String SMS_TEMPLATE_CODE = SMSConstants.SMS_TEMPLATE_CODE;
/**
* @param phone 必填参数,手机号码
* @return
* @throws Exception
*/
public String sendMsgCode(String phone) throws Exception {
//随机生成6位数字作为验证码
String code = getCode();
//System.out.println("验证码code:"+code);
//获得第三方阿里云短信通知接口
TaobaoClient client = new DefaultTaobaoClient(URL, APP_KEY, SECRET);
//获得短信通知请求头
AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
//短信通知类型
req.setSmsType(SMS_TYPE);
//短信通知签名
req.setSmsFreeSignName(SMS_SIGN);
//短信接收号码:传入号码为11位手机号码不能加0或+86,最多传入200个号码,多个号码以逗号分隔
req.setRecNum(phone);
//短信通知参数json格式
SmsParam smsParamVo = new SmsParam();
smsParamVo.setNumber(code);
smsParamVo.setProduct(SMS_SIGN);
String smsParam = JSONObject.toJSONString(smsParamVo);
System.out.println("短信通知参数smsParam:"+smsParam);
//短信模板变量,传参规则{"key":"value"},key的名字须和申请模板中的变量名一致,多个变量之间以逗号隔开
req.setSmsParamString(smsParam);
//短信模板ID
req.setSmsTemplateCode(SMS_TEMPLATE_CODE);
AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req);
JSONObject json = JSON.parseObject(rsp.getBody());
String jsonStr = json.getString("alibaba_aliqin_fc_sms_num_send_response");
if (jsonStr!=null&&!jsonStr.isEmpty() ) {
json = JSON.parseObject(jsonStr);
String result = json.getString("result");
if (result!=null && !result.isEmpty()) {
json = JSON.parseObject(result);
System.out.println("json:"+json);
String errorCode = json.getString("err_code");
if ("0".equals(errorCode)) {
//发送成功
return code;
} else {
//发送失败
return null;
}
}
}
//发送失败
return null;
}
/**
*
* @param phone 用户手机号码
* @param smsUrl oss请求url
* @param smsAppKey oss应用App key
* @param smsSerect oss应用Serect
* @param smsSign oss应用名
* @param smsModelType oss模板类型1表示验证码类2表示通知类型
* @param smsModelId oss模板id
* @param code 验证码或者订单号
* @return
* @throws Exception
*/
public boolean sendMsgCode(String phone,String smsUrl,String smsAppKey,String smsSerect,String smsSign,String smsModelType,String smsModelId,JSONObject modelParam) throws Exception {
//获得第三方阿里云短信通知接口
TaobaoClient client = new DefaultTaobaoClient(smsUrl, smsAppKey, smsSerect);
//获得短信通知请求头
AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
//短信通知类型
req.setSmsType(SMS_TYPE);
//短信通知签名
req.setSmsFreeSignName(smsSign);
//短信接收号码:传入号码为11位手机号码不能加0或+86,最多传入200个号码,多个号码以逗号分隔
req.setRecNum(phone);
//短信通知参数json格式
SmsParam smsParamVo = new SmsParam();
if("1".equals(smsModelType)){
//短信验证码中的变量${number}
smsParamVo.setNumber(modelParam.getString("code"));
}else if("2".equals(smsModelType)){
//短信通知中订单号变量${ordernumber}
smsParamVo.setOrdernumber(modelParam.getString("code"));
}else if("21".equals(smsModelType)){
smsParamVo.setDisname(modelParam.getString("disname"));
smsParamVo.setGoodsinfoname(modelParam.getString("goodsinfoname"));
smsParamVo.setOfollowprice(modelParam.getString("ofollowprice"));
smsParamVo.setNfollowprice(modelParam.getString("nfollowprice"));
}else if("211".equals(smsModelType)){
smsParamVo.setBsetname(modelParam.getString("bsetname"));
smsParamVo.setGoodsinfoname(modelParam.getString("goodsinfoname"));
}else if("212".equals(smsModelType)){
smsParamVo.setGoodsinfoname(modelParam.getString("goodsinfoname"));
}else if("213".equals(smsModelType)){
}
smsParamVo.setProduct(smsSign);
String smsParam = JSONObject.toJSONString(smsParamVo);
//System.out.println("短信通知参数smsParam:"+smsParam);
//短信模板变量,传参规则{"key":"value"},key的名字须和申请模板中的变量名一致,多个变量之间以逗号隔开
//案例:req.setSmsParamString("{\"code\":\"1234\",\"product\":\"alidayu\"}");
req.setSmsParamString(smsParam);
//短信模板ID
req.setSmsTemplateCode(smsModelId);
AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req);
JSONObject json = JSON.parseObject(rsp.getBody());
String jsonStr = json.getString("alibaba_aliqin_fc_sms_num_send_response");
if (jsonStr!=null&&!jsonStr.isEmpty() ) {
json = JSON.parseObject(jsonStr);
String result = json.getString("result");
if (result!=null && !result.isEmpty()) {
json = JSON.parseObject(result);
//System.out.println("json:"+json);
String errorCode = json.getString("err_code");
if ("0".equals(errorCode)) {
//发送成功
return true;
} else {
//发送失败
return false;
}
}
}
//发送失败
return false;
}
/**
* 随机生成6位数字作为验证码
* @return
*/
public static String getCode(){
int code=(int)(Math.random()*9000+100000);
return code + "";
}
//测试
public static void main(String[] args) {
try {
String phone="183****6512";
String smsUrl="http://gw.api.taobao.com/router/rest";
String smsAppKey="23669622";
String smsSerect="77c99b227ff054dc44fab8b9d41f975a";
String smsSign="千匠";
//模板类型:1验证码类2通知类
String smsModelType="213";
String smsModelId="SMS_57315117";
JSONObject modelParam=new JSONObject();
//modelParam.put("disname", "华东");
//modelParam.put("goodsinfoname", "联想拯救者R720");
//modelParam.put("ofollowprice", "6200.99");
//modelParam.put("nfollowprice", "6199.00");
//modelParam.put("bsetname", "千米网站");
SmsUtil m = new SmsUtil();
boolean result=m.sendMsgCode(phone, smsUrl, smsAppKey, smsSerect, smsSign, smsModelType, smsModelId, modelParam);
System.out.println(result);
System.out.println("发送成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("发送失败");
}
}
}
备注:短信发送模板变量必须与你申请的模板变量一致。以上案例中模板变量均是本人阿里云账号申请的模板变量。如下图所示:
测试控制台信息:手机收到的短信:
短信通知具体参数说明请参考:https://api.alidayu.com/docs/api.htm?apiId=25450