腾讯云短信
前提条件
在使用 SDK 前,您需要准备以下信息:
(1)获取 SDKAppID 和 AppKey
云短信应用 SDKAppID 和 AppKey 可在 短信控制台 的应用信息里获取。如您尚未添加应用,请登录 短信控制台 添加应用。
(2)申请签名并确认审核通过
一个完整的短信由短信签名和短信正文内容两部分组成,短信签名需申请和审核,签名可在 短信控制台 的相应服务模块【内容配置】中进行申请,详细申请操作请参见 创建签名。发送国际/港澳台短信时,允许不携带签名。
(3)申请模板并确认审核通过
短信正文内容模板需申请和审核,模板可在 短信控制台 的相应服务模块【内容配置】中进行申请,详细申请操作请参见 创建正文模板。
配置 SDK
qcloudsms_java 可以采用多种方式进行安装,我们提供以下三种方法供用户使用:
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
示例代码
// 短信应用 SDK AppID
int appid = 1400009099; // SDK AppID 以1400开头
// 短信应用 SDK AppKey
String appkey = "9ff91d87c2cd7cd0ea762f141975d1df37481d48700d70ac37470aefc60f9bad";
// 需要发送短信的手机号码
String[] phoneNumbers = {"21212313123", "12345678902", "12345678903"};
// 短信模板 ID,需要在短信应用中申请
int templateId = 7839; // NOTE: 这里的模板 ID`7839`只是示例,真实的模板 ID 需要在短信控制台中申请
// 签名
String smsSign = "腾讯云"; // NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台申请
指定模板 ID 单发短信
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import org.json.JSONException;
import java.io.IOException;
try {
String[] params = {"5678"};
SmsSingleSender ssender = new SmsSingleSender(appid, appkey);
SmsSingleSenderResult result = ssender.sendWithParam("86", phoneNumbers[0],
templateId, params, smsSign, "", "");
System.out.println(result);
} catch (HTTPException e) {
// HTTP 响应码错误
e.printStackTrace();
} catch (JSONException e) {
// JSON 解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络 IO 错误
e.printStackTrace();
}
指定模板 ID 群发短信
import com.github.qcloudsms.SmsMultiSender;
import com.github.qcloudsms.SmsMultiSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import org.json.JSONException;
import java.io.IOException;
try {
String[] params = {"5678"};
SmsMultiSender msender = new SmsMultiSender(appid, appkey);
SmsMultiSenderResult result = msender.sendWithParam("86", phoneNumbers,
templateId, params, smsSign, "", "");
System.out.println(result);
} catch (HTTPException e) {
// HTTP 响应码错误
e.printStackTrace();
} catch (JSONException e) {
// JSON 解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络 IO 错误
e.printStackTrace();
}
拉取短信回执以及回复
import com.github.qcloudsms.SmsStatusPuller;
import com.github.qcloudsms.SmsStatusPullCallbackResult;
import com.github.qcloudsms.SmsStatusPullReplyResult;
import com.github.qcloudsms.httpclient.HTTPException;
import org.json.JSONException;
import java.io.IOException;
try {
// Note: 短信拉取功能需要联系腾讯云短信技术支持(QQ:3012203387)开通权限
int maxNum = 10; // 单次拉取最大量
SmsStatusPuller spuller = new SmsStatusPuller(appid, appkey);
// 拉取短信回执
SmsStatusPullCallbackResult callbackResult = spuller.pullCallback(maxNum);
System.out.println(callbackResult);
// 拉取回复,国际/港澳台短信不支持回复功能
SmsStatusPullReplyResult replyResult = spuller.pullReply(maxNum);
System.out.println(replyResult);
} catch (HTTPException e) {
// HTTP 响应码错误
e.printStackTrace();
} catch (JSONException e) {
// JSON 解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络 IO 错误
e.printStackTrace();
}
拉取单个手机短信状态
import com.github.qcloudsms.SmsMobileStatusPuller;
import com.github.qcloudsms.SmsStatusPullCallbackResult;
import com.github.qcloudsms.SmsStatusPullReplyResult;
import com.github.qcloudsms.httpclient.HTTPException;
import org.json.JSONException;
import java.io.IOException;
try {
int beginTime = 1511125600; // 开始时间(UNIX timestamp)
int endTime = 1511841600; // 结束时间(UNIX timestamp)
int maxNum = 10; // 单次拉取最大量
SmsMobileStatusPuller mspuller = new SmsMobileStatusPuller(appid, appkey);
// 拉取短信回执
SmsStatusPullCallbackResult callbackResult = mspuller.pullCallback("86",
phoneNumbers[0], beginTime, endTime, maxNum);
System.out.println(callbackResult);
// 拉取回复,国际/港澳台短信不支持回复功能
SmsStatusPullReplyResult replyResult = mspuller.pullReply("86",
phoneNumbers[0], beginTime, endTime, maxNum);
System.out.println(replyResult);
} catch (HTTPException e) {
// HTTP 响应码错误
e.printStackTrace();
} catch (JSONException e) {
// JSON 解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络 IO 错误
e.printStackTrace();
}
其他特性
使用代理
部分环境需要使用代理才能上网,可使用 ProxyHTTPClient 来发送请求,示例如下:
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import com.github.qcloudsms.httpclient.ProxyHTTPClient;
import org.json.JSONException;
import java.io.IOException;
try {
// 创建一个代理 httpclient
ProxyHTTPClient httpclient = new ProxyHTTPClient("127.0.0.1", 8080, "http");
String[] params = {"5678"};
SmsSingleSender ssender = new SmsSingleSender(appid, appkey, httpclient);
SmsSingleSenderResult result = ssender.sendWithParam("86", phoneNumbers[0],
templateId, params, smsSign, "", ""); // 签名参数未提供或者为空时,会使用默认签名发送短信
System.out.println(result);
} catch (HTTPException e) {
// HTTP 响应码错误
e.printStackTrace();
} catch (JSONException e) {
// JSON 解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络 IO 错误
e.printStackTrace();
}
使用连接池
多个线程可以共用一个连接池发送 API 请求,多线程并发单发短信示例如下:
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import com.github.qcloudsms.httpclient.PoolingHTTPClient;
import org.json.JSONException;
import java.io.IOException;
class SmsThread extends Thread {
private final SmsSingleSender sender;
private final String nationCode;
private final String phoneNumber;
private final String msg;
public SmsThread(SmsSingleSender sender, String nationCode, String phoneNumber, String msg) {
this.sender = sender;
this.nationCode = nationCode;
this.phoneNumber = phoneNumber;
this.msg = msg;
}
@Override
public void run() {
try {
SmsSingleSenderResult result = sender.send(0, nationCode, phoneNumber, msg, "", "");
System.out.println(result);
} catch (HTTPException e) {
// HTTP 响应码错误
e.printStackTrace();
} catch (JSONException e) {
// JSON 解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络 IO 错误
e.printStackTrace();
}
}
}
public class SmsTest {
public static void main(String[] args) {
int appid = 122333333;
String appkey = "9ff91d87c2cd7cd0ea762f141975d1df37481d48700d70ac37470aefc60f9bad";
String[] phoneNumbers = {
"21212313123", "12345678902", "12345678903",
"21212313124", "12345678903", "12345678904",
"21212313125", "12345678904", "12345678905",
"21212313126", "12345678905", "12345678906",
"21212313127", "12345678906", "12345678907",
};
// 创建一个连接池 httpclient, 并设置最大连接量为10
PoolingHTTPClient httpclient = new PoolingHTTPClient(10);
// 创建 SmsSingleSender 时传入连接池 http client
SmsSingleSender ssender = new SmsSingleSender(appid, appkey, httpclient);
// 创建线程
SmsThread[] threads = new SmsThread[phoneNumbers.length];
for (int i = 0; i < phoneNumbers.length; i++) {
threads[i] = new SmsThread(ssender, "86", phoneNumbers[i], "您验证码是:5678");
}
// 运行线程
for (int i = 0; i < threads.length; i++) {
threads[i].start();
}
// join 线程
for (int i = 0; i < threads.length; i++) {
threads[i].join();
}
// 关闭连接池 httpclient
httpclient.close();
}
}
使用自定义 HTTP client 实现
如果需要使用自定义的 HTTP client 实现,只需实现 com.github.qcloudsms.httpclient.HTTPClient 接口,并在构造 API 对象时传入自定义 HTTP client 即可,参考示例如下:
import com.github.qcloudsms.httpclient.HTTPClient;
import com.github.qcloudsms.httpclient.HTTPRequest;
import com.github.qcloudsms.httpclient.HTTPResponse;
import java.io.IOException;
import java.net.URISyntaxException;
// import com.example.httpclient.MyHTTPClient
// import com.exmaple.httpclient.MyHTTPRequest
// import com.example.httpclient.MyHTTPresponse
public class CustomHTTPClient implements HTTPClient {
public HTTPResponse fetch(HTTPRequest request) throws IOException, URISyntaxException {
// 1. 创建自定义 HTTP request
// MyHTTPrequest req = MyHTTPRequest.build(request)
// 2. 创建自定义 HTTP cleint
// MyHTTPClient client = new MyHTTPClient();
// 3. 使用自定义 HTTP client 获取 HTTP 响应
// MyHTTPResponse response = client.fetch(req);
// 4. 转换 HTTP 响应到 HTTPResponse
// HTTPResponse res = transformToHTTPResponse(response);
// 5. 返回 HTTPResponse 实例
// return res;
}
public void close() {
// 如果需要关闭必要资源
}
}
// 创建自定义 HTTP client
CustomHTTPClient httpclient = new CustomHTTPClient();
// 构造 API 对象时传入自定义 HTTP client
SmsSingleSender ssender = new SmsSingleSender(appid, appkey, httpclient);
参考资料
https://cloud.tencent.com/document/product/382/13613
https://zhuanlan.zhihu.com/p/66307658