first commit

This commit is contained in:
Ray
2026-02-19 03:37:37 +08:00
commit ccfd8c79a4
2813 changed files with 453657 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
package smsmoduyun.v1;
import smsmoduyun.v1.yun.SmsSingleSender;
import smsmoduyun.v1.yun.SmsSingleSenderResult;
/**
* 发送短信
*/
public class SmsSDKDemoV1 {
public static void main(String[] args) {
try {
// 请根据实际 accesskey 和 secretkey 进行开发,以下只作为演示 sdk 使用
// 请根据实际 accesskey 和 secretkey 进行开发,以下只作为演示 sdk 使用
String accesskey = "xxx";
String secretkey = "xxxxx";
// 手机号码
String phoneNumber = "xxxxxxx";
int type = 0;
// 初始化单发
SmsSingleSender singleSender = new SmsSingleSender(accesskey, secretkey);
SmsSingleSenderResult singleSenderResult;
String rangdom = "xxxxxxxxxx"; // 你的随机数
String msg = "【xxx】680956是您的验证码2分钟内有效。请勿向任何人泄露您收到的验证码";
int a = 0;
// 普通单发,注意前面必须为【】符号包含,置于头或者尾部。
singleSenderResult = singleSender.send(type, "86", phoneNumber, msg, "", "");
System.out.println(singleSenderResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,75 @@
package smsmoduyun.v1;
import smsmoduyun.v1.yun.SmsTemplateSender;
/**
* 短信模板 添加短信模板,修改短信模板,查询短信模板
*/
public class SmsTemplateDemoV1 {
public static void main(String[] args) {
try {
// 请根据实际 accesskey 和 secretkey 进行开发,以下只作为演示 sdk 使用
String accesskey = "xxx";
String secretkey = "xxx";
// 添加短信模板
saveTemplate(accesskey, secretkey);
// 更新短信模板
// updateTemplate(accesskey,secretkey);
// 查新短信模板
findTemplate(accesskey, secretkey);
} catch (Exception e) {
e.printStackTrace();
}
}
//// 添加短信模板
public static void saveTemplate(String accesskey, String secretkey) {
try {
String url = "https://live.mordula.com/sms/v1/saveTemplate";
String content = "测试模板";
// 短信模板
SmsTemplateSender templdateSender = new SmsTemplateSender(accesskey, secretkey);
String respResult = templdateSender.saveSmsTemplate(url, content);
System.out.println(respResult);
} catch (Exception e) {
e.printStackTrace();
}
}
//// 修改短信模板
public static void updateTemplate(String accesskey, String secretkey) {
try {
String url = "https://live.mordula.com/sms/v1/updateTemplate";
String content = "测试模板2";
String templateId = "xxx";
// 短信模板
SmsTemplateSender templdateSender = new SmsTemplateSender(accesskey, secretkey);
String respResult = templdateSender.updateSmsTemplate(url, templateId, content);
System.out.println(respResult);
} catch (Exception e) {
e.printStackTrace();
}
}
//// 查询短信模板
public static void findTemplate(String accesskey, String secretkey) {
try {
String url = "https://live.mordula.com/sms/v1/findTemplate";
String templateId = "xxx";
// 短信模板
SmsTemplateSender templdateSender = new SmsTemplateSender(accesskey, secretkey);
String respResult = templdateSender.findSmsTemplate(url, templateId);
System.out.println(respResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,136 @@
package smsmoduyun.v1.yun;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Random;
//import org.json.JSONArray;
//import org.json.JSONObject;
public class SmsSenderUtil {
protected Random random = new Random();
public String stringMD5(String input) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] inputByteArray = input.getBytes();
messageDigest.update(inputByteArray);
byte[] resultByteArray = messageDigest.digest();
return byteArrayToHex(resultByteArray);
}
protected String strToHash(String str) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] inputByteArray = str.getBytes();
messageDigest.update(inputByteArray);
byte[] resultByteArray = messageDigest.digest();
return byteArrayToHex(resultByteArray);
}
public String byteArrayToHex(byte[] byteArray) {
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] resultCharArray = new char[byteArray.length * 2];
int index = 0;
for (byte b : byteArray) {
resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
resultCharArray[index++] = hexDigits[b & 0xf];
}
return new String(resultCharArray);
}
public int getRandom() {
return random.nextInt(999999) % 900000 + 100000;
}
public HttpURLConnection getPostHttpConn(String url) throws Exception {
URL object = new URL(url);
HttpURLConnection conn;
conn = (HttpURLConnection) object.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestMethod("POST");
return conn;
}
public String calculateSig(String accesskey, long random, String msg, long curTime, ArrayList<String> phoneNumbers)
throws NoSuchAlgorithmException {
String phoneNumbersString = phoneNumbers.get(0);
for (int i = 1; i < phoneNumbers.size(); i++) {
phoneNumbersString += "," + phoneNumbers.get(i);
}
return strToHash(String.format("accesskey=%s&random=%d&time=%d&mobile=%s", accesskey, random, curTime,
phoneNumbersString));
}
public String calculateSigForTempl(String accesskey, long random, long curTime, ArrayList<String> phoneNumbers)
throws NoSuchAlgorithmException {
String phoneNumbersString = phoneNumbers.get(0);
for (int i = 1; i < phoneNumbers.size(); i++) {
phoneNumbersString += "," + phoneNumbers.get(i);
}
return strToHash(String.format("accesskey=%s&random=%d&time=%d&mobile=%s", accesskey, random, curTime,
phoneNumbersString));
}
public String calculateSigForTempl(String accesskey, long random, long curTime, String phoneNumber)
throws NoSuchAlgorithmException {
ArrayList<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add(phoneNumber);
return calculateSigForTempl(accesskey, random, curTime, phoneNumbers);
}
// public JSONArray phoneNumbersToJSONArray(String nationCode, ArrayList<String> phoneNumbers) {
// JSONArray tel = new JSONArray();
// int i = 0;
// do {
// JSONObject telElement = new JSONObject();
// telElement.put("nationcode", nationCode);
// telElement.put("mobile", phoneNumbers.get(i));
// tel.put(telElement);
// } while (++i < phoneNumbers.size());
//
// return tel;
// }
//
// public JSONArray smsParamsToJSONArray(ArrayList<String> params) {
// JSONArray smsParams = new JSONArray();
// for (int i = 0; i < params.size(); i++) {
// smsParams.put(params.get(i));
// }
// return smsParams;
// }
//
// public SmsSingleSenderResult jsonToSmsSingleSenderResult(JSONObject json) {
// SmsSingleSenderResult result = new SmsSingleSenderResult();
//
// result.result = json.getInt("result");
// result.errMsg = json.getString("errmsg");
// if (0 == result.result) {
// result.ext = json.getString("ext");
// result.sid = json.getString("sid");
// result.fee = json.getInt("fee");
// }
// return result;
// }
//
// public SmsVoiceVerifyCodeSenderResult jsonToSmsSingleVoiceSenderResult(JSONObject json) {
// SmsVoiceVerifyCodeSenderResult result = new SmsVoiceVerifyCodeSenderResult();
// result.result = json.getInt("result");
// if (false == json.isNull("errmsg")) {
// result.errmsg = json.getString("errmsg");
// }
// if (0 == result.result) {
// result.ext = json.getString("ext");
// result.callid = json.getString("callid");
// }
// return result;
// }
}

View File

@@ -0,0 +1,213 @@
package smsmoduyun.v1.yun;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.util.ArrayList;
//import org.json.JSONObject;
public class SmsSingleSender {
String accesskey;
String secretkey;
// 同时支持http和https两种协议具体根据自己实际情况使用。
String url = "https://live.mordula.com/sms/v1/sendsinglesms";
// String url = "http://127.0.0.1:8080/live.kewail.com/sms/v1/sendsinglesms";
// String url =
// "http://2p8773516g.qicp.vip:16416/live.kewail.com/sms/v1/sendsinglesms";
// 30秒
private static int TIMEOUT = 30 * 1000;
SmsSenderUtil util = new SmsSenderUtil();
public SmsSingleSender(String accesskey, String secretkey) throws Exception {
this.accesskey = accesskey;
this.secretkey = secretkey;
}
/**
* 普通单发短信接口,明确指定内容,如果有多个签名,请在内容中以【】的方式添加到信息内容中,否则系统将使用默认签名
*
* @param type 短信类型0 为普通短信1 营销短信
* @param nationCode 国家码,如 86 为中国
* @param phoneNumber 不带国家码的手机号
* @param msg 信息内容,必须与申请的模板格式一致,否则将返回错误
* @param extend 扩展码,可填空
* @param ext 服务端原样返回的参数,可填空
* @return {@link}SmsSingleSenderResult
* @throws Exception
*/
public SmsSingleSenderResult send(int type, String nationCode, String phoneNumber, String msg, String extend,
String ext) throws Exception {
/*
* 请求包体 { "tel": { "nationcode": "86", "mobile": "13788888888" }, "type": 0,
* "msg": "你的验证码是1234", "sig": "fdba654e05bc0d15796713a1a1a2318c", "time":
* 1479888540, "extend": "", "ext": "" } 应答包体 { "result": 0, "errmsg": "OK",
* "ext": "", "sid": "xxxxxxx", "fee": 1 }
*/
// 校验 type 类型
if (0 != type && 1 != type) {
throw new Exception("type " + type + " error");
}
if (null == extend) {
extend = "";
}
if (null == ext) {
ext = "";
}
// 按照协议组织 post 请求包体
long random = util.getRandom();
long curTime = System.currentTimeMillis() / 1000;
// JSONObject data = new JSONObject();
//
// JSONObject tel = new JSONObject();
// tel.put("nationcode", nationCode);
// tel.put("mobile", phoneNumber);
//
// data.put("type", type);
// data.put("msg", msg);
// data.put("sig", util.strToHash(
// String.format("secretkey=%s&random=%d&time=%d&mobile=%s", secretkey, random, curTime, phoneNumber)));
// data.put("tel", tel);
// data.put("time", curTime);
// data.put("extend", extend);
// data.put("ext", ext);
//
// // 与上面的 random 必须一致
// String wholeUrl = String.format("%s?accesskey=%s&random=%d", url, accesskey, random);
// HttpURLConnection conn = util.getPostHttpConn(wholeUrl);
//
// conn.setConnectTimeout(TIMEOUT);
// conn.setReadTimeout(TIMEOUT);
//
// OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
//
// wr.write(data.toString());
// wr.flush();
// System.out.println(wholeUrl);
// System.out.println(data.toString());
//
// // 显示 POST 请求返回的内容
// StringBuilder sb = new StringBuilder();
// int httpRspCode = conn.getResponseCode();
// SmsSingleSenderResult result;
// if (httpRspCode == HttpURLConnection.HTTP_OK) {
// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
// String line = null;
// while ((line = br.readLine()) != null) {
// sb.append(line);
// }
// br.close();
// System.out.println(sb.toString());
// JSONObject json = new JSONObject(sb.toString());
// result = util.jsonToSmsSingleSenderResult(json);
// } else {
// result = new SmsSingleSenderResult();
// result.result = httpRspCode;
// result.errMsg = "http error " + httpRspCode + " " + conn.getResponseMessage();
// }
return null;
}
/**
* 指定模板单发
*
* @param nationCode 国家码,如 86 为中国
* @param phoneNumber 不带国家码的手机号
* @param templId 信息内容
* @param params 模板参数列表,如模板 {1}...{2}...{3},那么需要带三个参数
* @param sign 签名,如果填空,系统会使用默认签名
* @param extend 扩展码,可填空
* @param ext 服务端原样返回的参数,可填空
* @return {@link}SmsSingleSenderResult
* @throws Exception
*/
public SmsSingleSenderResult sendWithParam(String nationCode, String phoneNumber, int templId,
ArrayList<String> params, String sign, String extend, String ext) throws Exception {
/*
* 请求包体 { "tel": { "nationcode": "86", "mobile": "13788888888" }, "sign":
* "Kewail云", "tpl_id": 19, "params": [ "验证码", "1234", "4" ], "sig":
* "fdba654e05bc0d15796713a1a1a2318c", "time": 1479888540, "extend": "", "ext":
* "" } 应答包体 { "result": 0, "errmsg": "OK", "ext": "", "sid": "xxxxxxx", "fee":
* 1 }
*/
if (null == nationCode || 0 == nationCode.length()) {
nationCode = "86";
}
if (null == params) {
params = new ArrayList<>();
}
if (null == sign) {
sign = "";
}
if (null == extend) {
extend = "";
}
if (null == ext) {
ext = "";
}
long random = util.getRandom();
long curTime = System.currentTimeMillis() / 1000;
// JSONObject data = new JSONObject();
//
// JSONObject tel = new JSONObject();
// tel.put("nationcode", nationCode);
// tel.put("mobile", phoneNumber);
//
// data.put("tel", tel);
// data.put("sig", util.calculateSigForTempl(secretkey, random, curTime, phoneNumber));
// data.put("tpl_id", templId);
// data.put("params", util.smsParamsToJSONArray(params));
// data.put("sign", sign);
// data.put("time", curTime);
// data.put("extend", extend);
// data.put("ext", ext);
//
// String wholeUrl = String.format("%s?accesskey=%d&random=%d", url, accesskey, random);
// HttpURLConnection conn = util.getPostHttpConn(wholeUrl);
// conn.setConnectTimeout(TIMEOUT);
// conn.setReadTimeout(TIMEOUT);
// OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
// wr.write(data.toString());
// wr.flush();
//
// // 显示 POST 请求返回的内容
// StringBuilder sb = new StringBuilder();
// int httpRspCode = conn.getResponseCode();
// SmsSingleSenderResult result;
// if (httpRspCode == HttpURLConnection.HTTP_OK) {
// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
// String line = null;
// while ((line = br.readLine()) != null) {
// sb.append(line);
// }
// br.close();
// JSONObject json = new JSONObject(sb.toString());
// result = util.jsonToSmsSingleSenderResult(json);
// } else {
// result = new SmsSingleSenderResult();
// result.result = httpRspCode;
// result.errMsg = "http error " + httpRspCode + " " + conn.getResponseMessage();
// }
return null;
}
public static void main(String[] args) throws Exception {
SmsSenderUtil util = new SmsSenderUtil();
HttpURLConnection conn = util.getPostHttpConn("https://www.baidu.com");
conn.setConnectTimeout(TIMEOUT);
conn.setReadTimeout(TIMEOUT);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
wr.write("");
wr.flush();
}
}

View File

@@ -0,0 +1,17 @@
package smsmoduyun.v1.yun;
public class SmsSingleSenderResult {
/*
* { "result": 0, "errmsg": "OK", "ext": "", "sid": "xxxxxxx", "fee": 1 }
*/
public int result;
public String errMsg = "";
public String ext = "";
public String sid = "";
public int fee;
public String toString() {
return String.format("SmsSingleSenderResult\nresult %d\nerrMsg %s\next %s\nsid %s\nfee %d", result, errMsg, ext,
sid, fee);
}
}

View File

@@ -0,0 +1,155 @@
package smsmoduyun.v1.yun;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
//import org.json.JSONObject;
public class SmsTemplateSender {
String accesskey;
String secretkey;
// 同时支持http和https两种协议具体根据自己实际情况使用。
// String url = "https://live.kewail.com/sms/v1/sendsinglesms";
// String url = "http://127.0.0.1:8080/live.kewail.com/sms/v1/sendsinglesms";
SmsSenderUtil util = new SmsSenderUtil();
public SmsTemplateSender(String accesskey, String secretkey) throws Exception {
this.accesskey = accesskey;
this.secretkey = secretkey;
}
public String saveSmsTemplate(String url, String content) throws Exception {
// 按照协议组织 post 请求包体
long random = util.getRandom();
long curTime = System.currentTimeMillis() / 1000;
// JSONObject data = new JSONObject();
//
// data.put("sig", util.strToHash(String.format("secretkey=%s&random=%d&time=%d", secretkey, random, curTime)));
// data.put("content", content);
// data.put("time", curTime);
//
// // 与上面的 random 必须一致
// String wholeUrl = String.format("%s?accesskey=%s&random=%d", url, accesskey, random);
// HttpURLConnection conn = util.getPostHttpConn(wholeUrl);
//
// OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
// System.out.println(data.toString());
// wr.write(data.toString());
// wr.flush();
//
// System.out.println(data.toString());
//
// // 显示 POST 请求返回的内容
// StringBuilder sb = new StringBuilder();
// int httpRspCode = conn.getResponseCode();
// String result;
// if (httpRspCode == HttpURLConnection.HTTP_OK) {
// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
// String line = null;
// while ((line = br.readLine()) != null) {
// sb.append(line);
// }
// br.close();
// System.out.println(sb.toString());
// result = sb.toString();
// } else {
// // result = new SmsSingleSenderResult();
// result = httpRspCode + "http error " + httpRspCode + " " + conn.getResponseMessage();
// }
return null;
}
public String updateSmsTemplate(String url, String templateId, String content) throws Exception {
// 按照协议组织 post 请求包体
long random = util.getRandom();
long curTime = System.currentTimeMillis() / 1000;
// JSONObject data = new JSONObject();
//
// data.put("sig", util.strToHash(String.format("secretkey=%s&random=%d&time=%d", secretkey, random, curTime)));
// data.put("content", content);
// data.put("templateId", templateId);
// data.put("time", curTime);
//
// // 与上面的 random 必须一致
// String wholeUrl = String.format("%s?accesskey=%s&random=%d", url, accesskey, random);
// HttpURLConnection conn = util.getPostHttpConn(wholeUrl);
//
// OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
// System.out.println(data.toString());
// wr.write(data.toString());
// wr.flush();
//
// System.out.println(data.toString());
//
// // 显示 POST 请求返回的内容
// StringBuilder sb = new StringBuilder();
// int httpRspCode = conn.getResponseCode();
// String result;
// if (httpRspCode == HttpURLConnection.HTTP_OK) {
// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
// String line = null;
// while ((line = br.readLine()) != null) {
// sb.append(line);
// }
// br.close();
// System.out.println(sb.toString());
// result = sb.toString();
// } else {
// // result = new SmsSingleSenderResult();
// result = httpRspCode + "http error " + httpRspCode + " " + conn.getResponseMessage();
// }
return null;
}
public String findSmsTemplate(String url, String templateId) throws Exception {
// 按照协议组织 post 请求包体
long random = util.getRandom();
long curTime = System.currentTimeMillis() / 1000;
// JSONObject data = new JSONObject();
//
// data.put("sig", util.strToHash(String.format("secretkey=%s&random=%d&time=%d", secretkey, random, curTime)));
// data.put("templateId", templateId);
// data.put("time", curTime);
//
// // 与上面的 random 必须一致
// String wholeUrl = String.format("%s?accesskey=%s&random=%d", url, accesskey, random);
// HttpURLConnection conn = util.getPostHttpConn(wholeUrl);
//
// OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
// System.out.println(data.toString());
// wr.write(data.toString());
// wr.flush();
//
// System.out.println(data.toString());
//
// // 显示 POST 请求返回的内容
// StringBuilder sb = new StringBuilder();
// int httpRspCode = conn.getResponseCode();
// String result;
// if (httpRspCode == HttpURLConnection.HTTP_OK) {
// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
// String line = null;
// while ((line = br.readLine()) != null) {
// sb.append(line);
// }
// br.close();
// System.out.println(sb.toString());
// result = sb.toString();
// } else {
// // result = new SmsSingleSenderResult();
// result = httpRspCode + "http error " + httpRspCode + " " + conn.getResponseMessage();
// }
return null;
}
}

View File

@@ -0,0 +1,90 @@
package smsmoduyun.v1.yun;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
//import org.json.JSONObject;
public class SmsVoiceVerifyCodeSender {
String accesskey;
String secretkey;
String url = "https://live.kewail.com/sms/v1/sendvoice";
SmsSenderUtil util = new SmsSenderUtil();
public SmsVoiceVerifyCodeSender(String accesskey, String secretkey) {
this.accesskey = accesskey;
this.secretkey = secretkey;
}
/**
* 发送语音短信
*
* @param nationCode 国家码,如 86 为中国
* @param phoneNumber 不带国家码的手机号
* @param playtimes 目前只有 2
* @param fileName 上传后生成的文件地址{@link}SmsVoiceUploader
* @param ext 服务端原样返回的参数,可填空
* @return {@link}SmsVoiceVerifyCodeSenderResult
* @throws Exception
*/
public SmsVoiceVerifyCodeSenderResult send(String nationCode, String phoneNumber, String msg, int playtimes,
String ext) throws Exception {
if (null == ext) {
ext = "";
}
long random = util.getRandom();
long curTime = System.currentTimeMillis() / 1000;
// String sig = util.strToHash(secretkey, random, curTime, phoneNumber);
// 按照协议组织 post 请求包体
// JSONObject data = new JSONObject();
//
// JSONObject tel = new JSONObject();
// tel.put("nationcode", nationCode);
// tel.put("mobile", phoneNumber);
//
// data.put("tel", tel);
// data.put("msg", msg);
// data.put("playtimes", playtimes);
// data.put("sig", util.strToHash(
// String.format("secretkey=%s&random=%d&time=%d&mobile=%s", secretkey, random, curTime, phoneNumber)));
// data.put("time", curTime);
// data.put("ext", ext);
//
// // 与上面的 random 必须一致
// String wholeUrl = String.format("%s?accesskey=%s&random=%d", url, accesskey, random);
// HttpURLConnection conn = util.getPostHttpConn(wholeUrl);
//
// OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
// System.out.println(data.toString());
// wr.write(data.toString());
// wr.flush();
//
// // 显示 POST 请求返回的内容
// StringBuilder sb = new StringBuilder();
// int httpRspCode = conn.getResponseCode();
// SmsVoiceVerifyCodeSenderResult result;
// if (httpRspCode == HttpURLConnection.HTTP_OK) {
// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
// String line = null;
// while ((line = br.readLine()) != null) {
// sb.append(line);
// }
// System.out.println(sb.toString());
// br.close();
// JSONObject json = new JSONObject(sb.toString());
// result = util.jsonToSmsSingleVoiceSenderResult(json);
// } else {
// result = new SmsVoiceVerifyCodeSenderResult();
// result.result = httpRspCode;
// result.errmsg = "http error " + httpRspCode + " " + conn.getResponseMessage();
// }
return null;
}
}

View File

@@ -0,0 +1,24 @@
package smsmoduyun.v1.yun;
public class SmsVoiceVerifyCodeSenderResult {
/*
* { "result": 0, //0表示成功非0表示失败 "errmsg": "", //result非0时的具体错误信息 "ext":
* "some msg", //可选字段用户的session内容Kewail server回包中会原样返回 "callid": "xxxx"
* //标识本次发送id }
*
*/
public int result;
public String errmsg;
public String ext = "";
public String callid;
public String toString() {
if (0 == result) {
return String.format("SmsVoiceVerifyCodeSenderResult\nresult %d\nerrmsg %s\next %s\ncallid %s", result,
errmsg, ext, callid);
} else {
return String.format("SmsVoiceVerifyCodeSenderResult\nresult %d\nerrmsg %s\next %s", result, errmsg, ext);
}
}
}

View File

@@ -0,0 +1,56 @@
package smsmoduyun.v2;
import java.util.ArrayList;
import java.util.List;
import smsmoduyun.v2.yun.SmsSingleSender;
import smsmoduyun.v2.yun.SmsSingleSenderResult;
public class SmsSDKDemoV2 {
public static void main(String[] args) {
try {
// 请根据实际 accesskey 和 secretkey 进行开发,以下只作为演示 sdk 使用
// 请根据实际 accesskey 和 secretkey 进行开发,以下只作为演示 sdk 使用
String accesskey = "5fcb6fe98e860971d34a4239";
String secretkey = "64760a707a1547ce988d8bb2ba0ddd4e";
// type:0普通短信 1营销短信
int type = 0;
// 国家区号
String nationcode = "86";
// 手机号码
String phoneNumber = "16534084800";
// 短信签名ID (登录后台页面获取)
String signId = "5fcb833d8e860971d34a426f";
// 模板ID(登录后台页面获取)
String templateId = "5a9599c66fcafe461546bb04";
// 短信模板的变量值 ,将短信模板中的变量{0},{1}替换为参数中的值如果短信模板中没有变量则这个值填null
List<String> params = new ArrayList<String>();
// 模板中存在多个可变参数,可以添加对应的值。
params.add("135321");
// 自定义字段,用户可以根据自己的需要来使用
String ext = "";
// 初始化单发
SmsSingleSender singleSender ;
SmsSingleSenderResult singleSenderResult;
// 普通单发,注意前面必须为【】符号包含,置于头或者尾部。
// singleSenderResult = singleSender.send(type, nationcode, phoneNumber, signId, templateId, params, ext,
// accesskey, secretkey);
// System.out.println(singleSenderResult);
// int a = 0;
// if (singleSenderResult.errMsg == "OK") {
// a = 1;
//
// } else {
// a = 0;
// }
// System.out.println("a:" + a);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,139 @@
package smsmoduyun.v2.yun;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
//import org.json.JSONArray;
//import org.json.JSONObject;
public class SmsSenderUtil {
protected Random random = new Random();
public String stringMD5(String input) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] inputByteArray = input.getBytes();
messageDigest.update(inputByteArray);
byte[] resultByteArray = messageDigest.digest();
return byteArrayToHex(resultByteArray);
}
protected String strToHash(String str) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] inputByteArray = str.getBytes();
messageDigest.update(inputByteArray);
byte[] resultByteArray = messageDigest.digest();
return byteArrayToHex(resultByteArray);
}
public String byteArrayToHex(byte[] byteArray) {
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] resultCharArray = new char[byteArray.length * 2];
int index = 0;
for (byte b : byteArray) {
resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
resultCharArray[index++] = hexDigits[b & 0xf];
}
return new String(resultCharArray);
}
public int getRandom() {
return random.nextInt(999999) % 900000 + 100000;
}
public HttpURLConnection getPostHttpConn(String url) throws Exception {
URL object = new URL(url);
HttpURLConnection conn;
conn = (HttpURLConnection) object.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestMethod("POST");
return conn;
}
public String calculateSig(String accesskey, long random, String msg, long curTime, ArrayList<String> phoneNumbers)
throws NoSuchAlgorithmException {
String phoneNumbersString = phoneNumbers.get(0);
for (int i = 1; i < phoneNumbers.size(); i++) {
phoneNumbersString += "," + phoneNumbers.get(i);
}
return strToHash(String.format("accesskey=%s&random=%d&time=%d&mobile=%s", accesskey, random, curTime,
phoneNumbersString));
}
public String calculateSigForTempl(String accesskey, long random, long curTime, ArrayList<String> phoneNumbers)
throws NoSuchAlgorithmException {
String phoneNumbersString = phoneNumbers.get(0);
for (int i = 1; i < phoneNumbers.size(); i++) {
phoneNumbersString += "," + phoneNumbers.get(i);
}
return strToHash(String.format("accesskey=%s&random=%d&time=%d&mobile=%s", accesskey, random, curTime,
phoneNumbersString));
}
public String calculateSigForTempl(String accesskey, long random, long curTime, String phoneNumber)
throws NoSuchAlgorithmException {
ArrayList<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add(phoneNumber);
return calculateSigForTempl(accesskey, random, curTime, phoneNumbers);
}
// public JSONArray phoneNumbersToJSONArray(String nationCode, ArrayList<String> phoneNumbers) {
// JSONArray tel = new JSONArray();
// int i = 0;
// do {
// JSONObject telElement = new JSONObject();
// telElement.put("nationcode", nationCode);
// telElement.put("mobile", phoneNumbers.get(i));
// tel.put(telElement);
// } while (++i < phoneNumbers.size());
//
// return tel;
// }
//
// public JSONArray smsParamsToJSONArray(List<String> params) {
// JSONArray smsParams = new JSONArray();
// for (int i = 0; i < params.size(); i++) {
// smsParams.put(params.get(i));
// }
// return smsParams;
// }
//
// public SmsSingleSenderResult jsonToSmsSingleSenderResult(JSONObject json) {
// SmsSingleSenderResult result = new SmsSingleSenderResult();
//
// result.result = json.getInt("result");
// result.errMsg = json.getString("errmsg");
// if (0 == result.result) {
// result.ext = json.getString("ext");
// result.sid = json.getString("sid");
//
// }
// return result;
// }
//
// public SmsVoiceVerifyCodeSenderResult jsonToSmsSingleVoiceSenderResult(JSONObject json) {
// SmsVoiceVerifyCodeSenderResult result = new SmsVoiceVerifyCodeSenderResult();
// result.result = json.getInt("result");
// if (false == json.isNull("errmsg")) {
// result.errmsg = json.getString("errmsg");
// }
// if (0 == result.result) {
// result.ext = json.getString("ext");
// result.callid = json.getString("callid");
// }
// return result;
// }
//
// public static void main(String[] args) {
// System.out.println(String.format("account=%s&ts=%s&secret=%s", "ch003r", "20201027145540", "42vpr4p7cv"));
// }
}

View File

@@ -0,0 +1,104 @@
package smsmoduyun.v2.yun;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.util.List;
//import org.json.JSONObject;
public class SmsSingleSender {
// String accesskey;
// String secretkey;
// 同时支持http和https两种协议具体根据自己实际情况使用。
String url = "https://live.mordula.com/sms/v2/sendsinglesms";
// String url =
// "http://2p8773516g.qicp.vip:16416/live.kewail.com/sms/v2/sendsinglesms";
SmsSenderUtil util = new SmsSenderUtil();
//
// public SmsSingleSender(String accesskey, String secretkey) throws Exception {
// this.accesskey = accesskey;
// this.secretkey = secretkey;
// }
/**
* 指定签名和模板单发短信接口
*
* @param type 短信类型0 为普通短信1 营销短信
// * @param nationCode 国家码,如 86 为中国
* @param phoneNumber 不带国家码的手机号
* @param signId 短信签名的Id
* @param templateId 短信模板Id
* @param params ,短信的变量参数值 ,将短信模板中的变量{0},{1}替换为参数中的值如果短信模板中没有变量这这个值填null
* @param ext 服务端原样返回的参数,可填空
* @return {@link}SmsSingleSenderResult
* @throws Exception
*/
public SmsSingleSenderResult send(int type, String nationcode, String phoneNumber, String signId, String templateId,
List<String> params, String ext, String accesskey, String secretkey) throws Exception {
if (null == ext) {
ext = "";
}
// 按照协议组织 post 请求包体
long random = util.getRandom();
long curTime = System.currentTimeMillis() / 1000;
// JSONObject data = new JSONObject();
//
// JSONObject tel = new JSONObject();
// tel.put("nationcode", nationcode);
// tel.put("mobile", phoneNumber);
//
// data.put("signId", signId);
// data.put("templateId", templateId);
// data.put("type", type);
// if (params != null && params.size() > 0) {
// data.put("params", util.smsParamsToJSONArray(params));
// }
//
// data.put("sig", util.strToHash(
// String.format("secretkey=%s&random=%d&time=%d&mobile=%s", secretkey, random, curTime, phoneNumber)));
// data.put("tel", tel);
// data.put("time", curTime);
// data.put("ext", ext);
//
// // 与上面的 random 必须一致
// String wholeUrl = String.format("%s?accesskey=%s&random=%d", url, accesskey, random);
// HttpURLConnection conn = util.getPostHttpConn(wholeUrl);
//
// OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
//// System.out.println(data.toString());
// wr.write(data.toString());
// wr.flush();
//
//// System.out.println(data.toString());
//
// // 显示 POST 请求返回的内容
// StringBuilder sb = new StringBuilder();
// int httpRspCode = conn.getResponseCode();
// SmsSingleSenderResult result;
// if (httpRspCode == HttpURLConnection.HTTP_OK) {
// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
// String line = null;
// while ((line = br.readLine()) != null) {
// sb.append(line);
// }
// br.close();
//// System.out.println(sb.toString());
// JSONObject json = new JSONObject(sb.toString());
// result = util.jsonToSmsSingleSenderResult(json);
// } else {
// result = new SmsSingleSenderResult();
// result.result = httpRspCode;
// result.errMsg = "http error " + httpRspCode + " " + conn.getResponseMessage();
// }
return null;
}
}

View File

@@ -0,0 +1,60 @@
package smsmoduyun.v2.yun;
public class SmsSingleSenderResult {
/*
* { "result": 0, "errmsg": "OK", "ext": "", "sid": "xxxxxxx", "fee": 1 }
*/
public int result;
public String errMsg = "";
public String ext = "";
public String sid = "";
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
public String getExt() {
return ext;
}
public void setExt(String ext) {
this.ext = ext;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String toString() {
return String.format("SmsSingleSenderResult\nresult %d\nerrMsg %s\next %s\nsid %s\n", result, errMsg, ext, sid);
}
public static void main(String[] args) {
SmsSingleSenderResult smsSingleSenderResult = new SmsSingleSenderResult();
smsSingleSenderResult.setErrMsg("OK");
int a = 0;
if (smsSingleSenderResult.errMsg == "OK") {
a = 1;
System.out.println(a);
} else
System.out.println(a);
}
}

View File

@@ -0,0 +1,90 @@
package smsmoduyun.v2.yun;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
//import org.json.JSONObject;
public class SmsVoiceVerifyCodeSender {
String accesskey;
String secretkey;
String url = "https://live.kewail.com/sms/v1/sendvoice";
SmsSenderUtil util = new SmsSenderUtil();
public SmsVoiceVerifyCodeSender(String accesskey, String secretkey) {
this.accesskey = accesskey;
this.secretkey = secretkey;
}
/**
* 发送语音短信
*
* @param nationCode 国家码,如 86 为中国
* @param phoneNumber 不带国家码的手机号
* @param playtimes 目前只有 2
// * @param fileName 上传后生成的文件地址{@link}SmsVoiceUploader
* @param ext 服务端原样返回的参数,可填空
* @return {@link}SmsVoiceVerifyCodeSenderResult
* @throws Exception
*/
public SmsVoiceVerifyCodeSenderResult send(String nationCode, String phoneNumber, String msg, int playtimes,
String ext) throws Exception {
if (null == ext) {
ext = "";
}
long random = util.getRandom();
long curTime = System.currentTimeMillis() / 1000;
// String sig = util.strToHash(secretkey, random, curTime, phoneNumber);
// 按照协议组织 post 请求包体
// JSONObject data = new JSONObject();
//
// JSONObject tel = new JSONObject();
// tel.put("nationcode", nationCode);
// tel.put("mobile", phoneNumber);
//
// data.put("tel", tel);
// data.put("msg", msg);
// data.put("playtimes", playtimes);
// data.put("sig", util.strToHash(
// String.format("secretkey=%s&random=%d&time=%d&mobile=%s", secretkey, random, curTime, phoneNumber)));
// data.put("time", curTime);
// data.put("ext", ext);
//
// // 与上面的 random 必须一致
// String wholeUrl = String.format("%s?accesskey=%s&random=%d", url, accesskey, random);
// HttpURLConnection conn = util.getPostHttpConn(wholeUrl);
//
// OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
// System.out.println(data.toString());
// wr.write(data.toString());
// wr.flush();
//
// // 显示 POST 请求返回的内容
// StringBuilder sb = new StringBuilder();
// int httpRspCode = conn.getResponseCode();
// SmsVoiceVerifyCodeSenderResult result;
// if (httpRspCode == HttpURLConnection.HTTP_OK) {
// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
// String line = null;
// while ((line = br.readLine()) != null) {
// sb.append(line);
// }
// System.out.println(sb.toString());
// br.close();
// JSONObject json = new JSONObject(sb.toString());
// result = util.jsonToSmsSingleVoiceSenderResult(json);
// } else {
// result = new SmsVoiceVerifyCodeSenderResult();
// result.result = httpRspCode;
// result.errmsg = "http error " + httpRspCode + " " + conn.getResponseMessage();
// }
return null;
}
}

View File

@@ -0,0 +1,24 @@
package smsmoduyun.v2.yun;
public class SmsVoiceVerifyCodeSenderResult {
/*
* { "result": 0, //0表示成功非0表示失败 "errmsg": "", //result非0时的具体错误信息 "ext":
* "some msg", //可选字段用户的session内容Kewail server回包中会原样返回 "callid": "xxxx"
* //标识本次发送id }
*
*/
public int result;
public String errmsg;
public String ext = "";
public String callid;
public String toString() {
if (0 == result) {
return String.format("SmsVoiceVerifyCodeSenderResult\nresult %d\nerrmsg %s\next %s\ncallid %s", result,
errmsg, ext, callid);
} else {
return String.format("SmsVoiceVerifyCodeSenderResult\nresult %d\nerrmsg %s\next %s", result, errmsg, ext);
}
}
}