云片开发文档
https://www.yunpian.com/official/document/sms/zh_CN/scene/smsverify
SDK整合
pom依赖
<dependency>
<groupId>com.yunpian.sdk</groupId>
<artifactId>yunpian-java-sdk</artifactId>
<version>1.2.7</version>
</dependency>
发送短信工具类
import com.yunpian.sdk.YunpianClient;
import com.yunpian.sdk.model.Result;
import com.yunpian.sdk.model.SmsSingleSend;
import java.util.HashMap;
import java.util.Map;
/**
* 短信工具包
*/
public class MessageUtil {
private static final String APIKEY = "this is yunpian apikey";
/**]
* 发送短信
* @param code 验证码
* @param phone 手机号
*/
public static Map sendCodeMessage(String code, String phone){
Map res = new HashMap();
//初始化clnt,使用单例方式
YunpianClient clnt = new YunpianClient(APIKEY).init();
//发送短信API
Map<String, String> param = clnt.newParam(2);
param.put(YunpianClient.MOBILE, phone);
param.put(YunpianClient.TEXT, "【夲家信息技术】您的验证码是"+code+"。如非本人操作,请忽略本短信");
Result<SmsSingleSend> r = clnt.sms().single_send(param);
//获取返回结果,返回码:r.getCode(),返回码描述:r.getMsg(),API结果:r.getData(),其他说明:r.getDetail(),调用异常:r.getThrowable()
//账户:clnt.user().* 签名:clnt.sign().* 模版:clnt.tpl().* 短信:clnt.sms().* 语音:clnt.voice().* 流量:clnt.flow().* 隐私通话:clnt.call().*
//释放clnt
res.put("code",r.getCode());
res.put("msg",r.getMsg());
clnt.close();
return res;
}
public static void main(String[] args) {
Map map = sendCodeMessage("123456", "15011111111");
System.out.println(map);
}
}
至此,可以发送短信至手机
短信修改密码
前端展示
业务流程
前端调用获取验证码接口,填入验证码和手机号新密码一起请求修改密码接口。
开发前准备
准备一个全局Map容器就,用于保存下发的验证码、手机号和验证码生效时间
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* 全局变量
*/
@Configuration
@Component
@ConfigurationProperties(prefix ="param")
public class GlobalVar {
private Map<String,String> map = new HashMap<>();
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
获取验证码
@Resource
private GlobalVar globalVar;
/**
* 发送验证码
* @param request phone手机号
*/
@RequestMapping("/getMessageCode")
public Map getMessageCode(HttpServletRequest request) {
return sendCode(request.getParameter("phone"));
}
/**
* 发送验证码
* @param phone 手机号
*/
public Map sendCode(String phone) {
if (phone == null || phone.length() < 1) {
return fail("手机号错误");
}
boolean flag = globalVar.getMap().containsKey("_" + phone);
if (!flag || (flag && TimeUtil.comparaCurrentTime(globalVar.getMap().get(("_" + phone)), 60))) {
String code = CommonUtil.getCode(6);
Map map = MessageUtil.sendCodeMessage(code, phone);
if (map.get("code").equals(0)) {
globalVar.getMap().put(phone, code);//验证码
globalVar.getMap().put("_" + phone, TimeUtil.getTimeYMDHMS());//生效时间
return successMsg("发送成功");
}
return fail(map.get("msg").toString());
}
return fail("验证码发送过于频繁,请稍后再试");
}
修改密码
/**
* 修改密码
* @param request phone手机号、code验证码、password新密码、passwords再次输入密码
*/
@RequestMapping("/passwordEdit")
public Map passwordEdit(HttpServletRequest request) {
if (isNull(request, "phone", "code", "password", "passwords")) {
return fail("缺少参数");
}
String password = request.getParameter("password");
String passwords = request.getParameter("passwords");
if (!password.equals(passwords)) {
return fail("二次输入密码不一致");
}
//通过获取servlet中的访问用户id去数据库中获取用户信息
MobileUser mobileUser = mobileUserService.getById(getMobileUserId(request));
if (mobileUser == null) {
return fail("未获取到用户信息");
}
String phone = request.getParameter("phone");
if (!mobileUser.getPhone().equals(phone)) {
return fail("输入的手机号不是账户绑定手机号");
}
//验证码是否过期 是否与下发一致
if (globalVar.getMap().containsKey("_" + phone) && !TimeUtil.comparaCurrentTime(globalVar.getMap().get(("_" + phone)), 60 * 5)
&& globalVar.getMap().containsKey(phone) && globalVar.getMap().get(phone).equals(request.getParameter("code"))) {
mobileUser.setPassword(MD5Util.encrypt(password));
if (mobileUserService.updateById(mobileUser)) {
//清楚该手机号验证码相关
globalVar.getMap().remove(phone);
globalVar.getMap().remove("_" + phone);
return success();
} else {
return fail("密码更改异常");
}
}
return fail("验证码错误");
}