我这里使用的旦米(http://www.danmi.com/)你们用阿里的就去看看其他博客
1.首先注册一个旦米的账号,第一次注册会免费的送你10元。足够你去测试用,不用担心自己去充钱。
2.注册好了登录进去,必须要公司认证,认证通过之后才能使用。可以自己去网上搜一些企业的营业执照。但是一定要有效的才有用。这个我自己也是搞了大半天才弄好。
3.认证通过之后,找到验证码通知里面的API配置 获取你自己的 ACCOUNT SID 和 AUTH TOKEN
4.在短信通知里的模板管理里面配置你短信模板,审核通过之后就可以使用了,就可以拿到自己的模板id
5.这些准备好之后,就可以写代码了
5.1 我使用的是maven,直接在pom.xml直接导入依赖就可以了
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId><version>1.2.47</version></dependency>
注意
ACCOUNT_SID 和 AUTH_TOKEN 放你自己的 ,还有param,和templateid 用你自己的
验证码通知类的内容不要直接用smsContent字段值来进行请求,传参的时候要用param字段值和templateid字段值来进行请求;如果有变量就带param字段,没有就不带,param字段值指的是您在用户中心建的模板里边带的短信变量,多个变量用英文逗号隔开;templateid就是在用户中心建的模板生成的模板id;如果只用smsContent字段值来进行请求,系统会默认匹配到会销子账号里边去(会销是要过人工审核的)
private static final String QUERY_PATH = "https://openapi.danmi.com/distributor/sendSMS";private static final String ACCOUNT_SID = "4dabce68d9e16a8****";private static final String AUTH_TOKEN = "80b2b2a32e0139b6ef4b***7";
demo
package com.example.demo.controller;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;import com.alibaba.fastjson.JSONObject;/*** @Description:发送验证码* @author:* @Date*/
public class UserLController {private static final String QUERY_PATH = "https://openapi.danmi.com/distributor/sendSMS";private static final String ACCOUNT_SID = "4dabce68d9e16a8****";private static final String AUTH_TOKEN = "80b2b2a32e0139b6ef4b***7";// 根据相应的手机号发送验证码public static String getCode(String phone) {//获取验证码String rod = smsCode();//获取时间戳long timestamp = getTimestamp();//获取sing签名String sig = getMD5(ACCOUNT_SID, AUTH_TOKEN, timestamp);//短信模板String tamp = "【杭州华佳】亲爱的用户,您好,您的验证码为" + rod + ",2分钟内有效,若非本人操作请忽略。";OutputStreamWriter out = null;BufferedReader br = null;StringBuilder result = new StringBuilder();try {URL url = new URL(QUERY_PATH);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");connection.setDoInput(true);// 设置是否允许数据写入connection.setDoOutput(true);// 设置是否允许参数数据输出connection.setConnectTimeout(5000);// 设置链接响应时间connection.setReadTimeout(20000);// 设置参数读取时间connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");// 提交请求out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");Integer smsType = 100000;String templateid = "****";String param = URLEncoder.encode(rod,"UTF-8");String args = getQueryArgs(ACCOUNT_SID, param,phone, timestamp, sig, "JSON",smsType,templateid);out.write(args);out.flush();// 读取返回参数br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));String temp = "";while ((temp = br.readLine()) != null) {result.append(temp);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}JSONObject json = JSONObject.parseObject(result.toString());String respCode = json.getString("respCode");String defaultRespCode = "00000";if (defaultRespCode.equals(respCode)) {return rod;} else {return defaultRespCode;}}// 定义一个请求参数拼接方法public static String getQueryArgs(String accountSid, String param, String to, Long timestamp, String sig,String respDataType, Integer smsType, String templateid) {return "accountSid=" + accountSid + "¶m=" + param + "&to=" + to + "&"+"timestamp=" + timestamp+ "&sig=" + sig + "&respDataType=" + respDataType + "&smsType=" + smsType + "&templateid=" + templateid;}// 获取时间戳public static long getTimestamp() {//用这个要报错,要用北京时间的时间戳 // return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());long timestamp = System.currentTimeMillis();return timestamp;}// sing签名public static String getMD5(String sid, String token, Long timestamp) {StringBuilder result = new StringBuilder();String source = sid + token + timestamp;// 获取某个类的实例try {MessageDigest digest = MessageDigest.getInstance("MD5");// 要进行加密的东西byte[] bytes = digest.digest(source.getBytes());for (byte b : bytes) {String hex = Integer.toHexString(b & 0xff);if (hex.length() == 1) {result.append("0" + hex);} else {result.append(hex);}}} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}return result.toString();}// 创建验证码public static String smsCode() {String random = (int) ((Math.random() * 9 + 1) * 100000) + "";return random;}
}
5.2测试
package com.example.demo;import com.example.demo.controller.UserLController;import java.net.URLEncoder;public class Test {public static void main(String[] args) {String phone = "187847******";UserLController.getCode(phone);System.out.println(UserLController.getCode(phone));}}
``