雲片開發文檔
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("驗證碼錯誤");
}