接入短信平臺(雲片)實現短信更改密碼(登陸同流程)

雲片開發文檔

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("驗證碼錯誤");
    }

接口文檔

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章