200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > JAVA调用梦网云通讯平台API实现短信发送

JAVA调用梦网云通讯平台API实现短信发送

时间:2023-02-05 08:04:03

相关推荐

JAVA调用梦网云通讯平台API实现短信发送

JAVA调用梦网云通讯平台API实现短信发送

调用通讯平台API发送短信示意图

调用通讯平台API发送短信的示意图如下(根据我的理解简单画的,如果有不对的地方,欢迎留言指出)。

开发者首先设定必需的参数,包括请求的url请求方式post数据等等,发送出一个http请求;通讯平台接收到http请求后,解析请求体中的各项参数,并校验各项参数是否合法,如果参数合法,则将短信转发给收信人,最后将发送状态信息返回给接口调用方。

注册通讯平台账号

要调用通讯平台的API,首先需要在相应的通讯平台注册一个账号。本文以梦网云通讯平台为例。账号注册完成后,平台会赠送10元话费,如果仅仅做测试的话,这个钱足够了。

这个账号和密码仅仅是用于登录梦网云平台的账号和密码,或者说,是用于充值的账号和密码,与后面提到的用于发送短信的账号密码无关。

账号注册完成后,点击业务中心查看平台分配的用于短信发送的发送账号密码和APIKey,当然还有RestUrl,其中,密码和APIKey是在点击获取后通过短信的方式发送到手机上的。

这个时候还不能发送短信,为什么呢?因为任何通讯平台都不允许随意发送短信,发送内容要符合要求才行。点击信安中心,这里有很多短信预设模板,基本上会满足大多数的短信发送需求,如果没有满足需求的模板,可以进行模板定制,不过模板定制化需要上传证件进行认证。这里我们选择一个工资入账的模板开心开心。

模拟发送短信的http请求

一切准备就绪,现在可以发送短信了吗?做个测试先~

现在需要一个可以模拟发送http请求的工具,这样的工具有很多,如fiddler,postman,本文以 bejson 为例。

填好必要的参数后,发送请求数据,如果返回的请求结果中result等于0,则代表短信发送成功。

其中post数据中,各项参数说明见下表:

编码实现

经过之前的准备工作,现在可以编码实现了。而这个实现过程,其实就是将上一步中模拟发送短信的http请求由模拟器实现改为编码实现。

与模拟器所填写参数对应的JAVA编码实现如下:

public class CHttpPost {// http请求失败private static int ERROR_310099 = -310099;// 连接超时时间(毫秒) 10秒private static int HTTP_CONNECT_TIMEOUT = 10 * 1000;// 从连接池获取connection的超时时间1秒private static int HTTP_CONNECTION_REQUEST_TIMEOUT = 1 * 1000;// 响应超时时间(毫秒) 10秒private static int HTTP_SOCKET_TIMEOUT = 10 * 1000;// 请求路径public static String REQUEST_PATH = "/sms/v2/std/";public String singleSend(Message message, String ipAddress, String ipProxy, String portProxy) {String result = String.valueOf(ERROR_310099);try {String urlSingleSend = "http://" + ipAddress + REQUEST_PATH + "single_send";result = send(message, urlSingleSend, ipProxy, portProxy);} catch (Exception e) {e.printStackTrace();}return result;}public String batchSend(Message message, String ipAddress, String ipProxy, String portProxy) {String result = String.valueOf(ERROR_310099);try {String urlBatchSend = "http://" + ipAddress + REQUEST_PATH + "batch_send";result = send(message, urlBatchSend, ipProxy, portProxy);} catch (Exception e) {e.printStackTrace();}return result;}private String send(Message message, String httpUrl, String ipProxy, String portProxy) {String result = String.valueOf(ERROR_310099);try {// 对密码进行加密String encryptPwd = encryptPwd(message.getUserid(), message.getPwd(), message.getTimestamp());// 设置加密后的密码message.setPwd(encryptPwd);Field[] fields = message.getClass().getDeclaredFields();JSONObject requestBody = new JSONObject();// 循环拼接请求参数for (int i = 0; i < fields.length; i++) {String fieldName = fields[i].getName();String fieldNameUpper = Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);Method getMethod = message.getClass().getMethod("get" + fieldNameUpper);Object value = getMethod.invoke(message);if (value != null) {//拼接请求参数requestBody.put(fieldName, value);}}// 设定编码方式StringEntity stringEntity = new StringEntity(requestBody.toString(), StandardCharsets.UTF_8);// 定义请求头HttpPost httpPost = new HttpPost(httpUrl);httpPost.setHeader("Content-Type", "application/json");// 定义请求体httpPost.setEntity(stringEntity);// 创建连接CloseableHttpClient httpClient = HttpClients.createDefault();HttpHost proxy = null;if (ipProxy != null && portProxy != null) {// 设置代理proxy = new HttpHost(ipProxy, Integer.parseInt(portProxy), "http");}// 设置请求超时时间RequestConfig requestConfig = RequestConfig.custom().setProxy(proxy).setConnectTimeout(HTTP_CONNECT_TIMEOUT).setConnectionRequestTimeout(HTTP_CONNECTION_REQUEST_TIMEOUT).setSocketTimeout(HTTP_SOCKET_TIMEOUT).build(); httpPost.setConfig(requestConfig);HttpEntity entity = null;HttpResponse httpResponse = null;try {// 向网关请求httpResponse = httpClient.execute(httpPost);// 若状态码为200,则代表请求成功if (httpResponse != null && httpResponse.getStatusLine().getStatusCode() == 200) {//获取响应的实体entity = httpResponse.getEntity();result = EntityUtils.toString(entity);} else {// 设置错误码result = String.valueOf(ERROR_310099);System.out.println("请求失败:" + httpResponse.getStatusLine().toString());}} catch (Exception e) {result = String.valueOf(ERROR_310099);e.printStackTrace();}} catch (Exception e) {result = String.valueOf(ERROR_310099);e.printStackTrace();}return result;}public String encryptPwd(String userid, String pwd, String timestamp) {// 加密后的字符串String encryptPwd = null;try {String passwordStr = userid.toUpperCase() + "00000000" + pwd + timestamp;// 对密码进行加密encryptPwd = getMD5Str(passwordStr);} catch (Exception e) {e.printStackTrace();}return encryptPwd;}private static String getMD5Str(String str) {MessageDigest messageDigest = null;// 加密前的准备try {messageDigest = MessageDigest.getInstance("MD5");messageDigest.reset();messageDigest.update(str.getBytes("UTF-8"));}catch (NoSuchAlgorithmException e) {e.printStackTrace();//初始化加密类失败,返回null。return null;}catch (UnsupportedEncodingException e) {e.printStackTrace();//初始化加密类失败,返回null。return null;}byte[] byteArray = messageDigest.digest();// 加密后的字符串StringBuffer md5StrBuff = new StringBuffer();for (int i = 0; i < byteArray.length; i++) {if (Integer.toHexString(0xFF & byteArray[i]).length() == 1){md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));} else {md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));}}return md5StrBuff.toString();}}

最后附上完整的Demo链接/download/lanshanzhuyao/11094599

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。