本文使用秒嘀科技的API,不才起初也找了几个,发现阿里云和腾讯云的需要企业认证之类的,网建的最低充值也要50大洋。无奈借用了朋友秒嘀科技的账号,听说进去还送10块钱的。
1.API接入流程:
2.代码开发流程
2.1 环境参数设置
application.yaml关于sms部分设置如下:
sms:
url: https://api.miaodiyun.com/20150822/industrySMS/sendSMS
accountSid: xxx
templateid: xxx
authToken: xxx
这里的几个参数值都是在秒嘀科技获取的。
2.2 pojo部分
秒嘀科技的API关于json格式返回示例(更多细节请参看官网API指南):
{
"respCode":"00000",
"respDesc":"成功",
"failCount":"1",
"failList":
[
{
"phone":"13896543210",
"respCode":"00111",
}
],
"smsId":"913945fec0204b1e94baa75a5c013f59"
}
由上述格式可新建类Result和failDetail,源码如下:
package com.xxx.sms.pojo;
/**
* @author
* @create
*/
public class failDetail {
private String phone;
private String respCode;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getRespCode() {
return respCode;
}
public void setRespCode(String respCode) {
this.respCode = respCode;
}
}
package com.xxx.sms.pojo;
import java.util.List;
/**
* @author
* @create
*/
public class Result {
private String respCode;
private String respDesc;
private String failCount;
private List<failDetail> failList;
private String smsId;
public String getRespCode() {
return respCode;
}
public void setRespCode(String respCode) {
this.respCode = respCode;
}
public String getRespDesc() {
return respDesc;
}
public void setRespDesc(String respDesc) {
this.respDesc = respDesc;
}
public String getFailCount() {
return failCount;
}
public void setFailCount(String failCount) {
this.failCount = failCount;
}
public List<failDetail> getFailList() {
return failList;
}
public void setFailList(List<failDetail> failList) {
this.failList = failList;
}
public String getSmsId() {
return smsId;
}
public void setSmsId(String smsId) {
this.smsId = smsId;
}
}
2.3 HttpUtil部分
由上图要求可编写如下类:
package com.xxx.sms.util;
import com.xxx.sms.pojo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
/**
* @author
* @create
*/
@Component
public class HttpUtil {
//获取application.yaml中配置的sms.url值
@Value("${sms.url}")
private String url;
//发送post请求
public Result sendPostRequest(MultiValueMap<String, String> requestBody){
RestTemplate client=new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// 以表单的方式提交
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//将请求头和请求体合并
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestBody, headers);
//发送请求
ResponseEntity<Result> response = client.exchange(url,
HttpMethod.POST, requestEntity, Result.class);
return response.getBody();
}
}
2.4 smsMainTest部分
可由上图构造请求体部分。
以下代码是整个项目中的一个模块,有关RabbitMQ的部分可忽略。
package com.xxx.sms.listener;
import com.xxx.sms.pojo.Result;
import com.xxx.sms.util.HttpUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@Component
@RabbitListener(queues = "sms")
public class SmsListener {
@Autowired
private HttpUtil client;
//可由env获得application.yaml中配置
@Autowired
private Environment env;
@RabbitHandler
public void executeSms(Map<String,String> map){
System.out.println("手机号:"+map.get("mobile"));
System.out.println("验证码:"+map.get("checkcode"));
// 时间戳
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String timestamp = sdf.format(new Date());
// 签名
String sig = DigestUtils.md5Hex(env.getProperty("sms.accountSid")+
env.getProperty("sms.authToken") + timestamp);
//构造请求体部分
MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
body.add("accountSid",env.getProperty("sms.accountSid"));
body.add("templateid",env.getProperty("sms.templateid"));
body.add("param",map.get("checkcode"));
body.add("to",map.get("mobile"));
body.add("timestamp",timestamp);
body.add("sig",sig);
body.add("respDataType","JSON");
//发送
Result result = client.sendPostRequest(body);
System.out.println(result.getRespCode());
System.out.println(result.getRespDesc());
}
}
测试,成功运行。