Java 手机验证码生成

来源:互联网 发布:linux退出 编辑:程序博客网 时间:2024/05/05 17:49

List:

1.需求

2.实现

3.总结


……1.需求……


用户提交订单申请,需要输入手机号,验证二维码。然后再判断用户输入的手机号是否正确,正确则生成订单信息入库。


……2.实现……


实现的思路是,1.发送二维码 2.验证二维码和redis中存放的是否一致 3.生成订单入库


1.发送二维码,其实是Java代码生成的随机数字,再用httpclient请求发短信的服务,输入用户名密码等参数信息,第一步就完成了。需要将验证码存入redis中,在第二步验证中用得到。

controller:

//http://managerapi.cuco.cn/order/getVerificationCode//{"memberMobile":"15633296156"}//获取验证码--zhouzhou--2017年5月6日14:21:14@API(value = "获取验证码")@RequestMapping(value = "/v1/order/getVerificationCode", method = RequestMethod.POST)public Object getVerificationCode(@RequestBody Order order) {ParamVerifyUtils.paramNotNull(order.getMemberMobile(), "获取验证码中手机号没有填写");System.out.println("手机号为:" + order.getMemberMobile());if (!PhoneFormatCheckUtils.isPhoneLegal(order.getMemberMobile())) {ResponseUtil.toFailureBody(ServerStatus.SHOW_ERROR, "请填写真实手机号。");}Member member = new Member();member.setMobile(order.getMemberMobile());Member memberinfo = this.memberService.getMemberByMobile(member.getMobile());if (memberinfo != null) {ExceptionUtil.throwWarn("您已成功提交申请,销售人员稍后会和您联系。");}String identifyCode = SMSUtils.getFourRandom();SMSUtils.sendMessage(member.getMobile(), identifyCode);JedisUtils.set("identifyCode" + order.getMemberMobile(), identifyCode, 120);System.out.println("生成验证码--" + identifyCode);return identifyCode;}


工具类:

get请求记得utf-8转码哟,否则手机会收到一堆小方格格。

public class SMSUtils {protected Logger logger = Logger.getLogger(this.getClass());public static boolean sendMessage(String mobile, String identifyCode) {boolean result = false;String userId = "马赛克";String password = "马赛克";String pszMobis = mobile;String pszMsg = "正式完成短信验证" + "【" + identifyCode + "】";// +String iMobiCount = "1";String pszSubPort = "*";String MsgId = RandomStringUtils.randomNumeric(19);try {String url = "是一串URL马赛克"//+ "userId=" + userId//+ "&password=" + password//+ "&pszMobis=" + pszMobis//+ "&pszMsg=" + pszMsg//+ "&iMobiCount=" + iMobiCount//+ "&pszSubPort=" + pszSubPort//+ "&MsgId=" + MsgId;// RelyHttpClient.sendGet(url, null, "UTF-8");// String responseBody = HttpClientUtils.sendGet(url, null,"UTF-8");String responseBody = HttpClientUtils.sendGet(url, null,"UTF-8");if (StringUtils.isNotBlank(responseBody)) {String sub = responseBody.substring(74, responseBody.lastIndexOf("</string>"));System.out.println("截取返回值=================" + sub);if (sub.length() > 15) {// 返回值长度大于15则表示成功result = true;System.out.println("验证码发至{}送成功" + mobile);} else {System.out.println("验证码发至{}失败{}" + mobile + responseBody);}}} catch (Exception e) {System.out.println("验证码发至{}异常{}" + mobile + e.getMessage());}return result;}/** * 产生4位随机数(0000-9999) *  * @return 4位随机数 */public static String getFourRandom() {Random random = new Random();String fourRandom = random.nextInt(10000) + "";int randLength = fourRandom.length();if (randLength < 4) {for (int i = 1; i <= 4 - randLength; i++)fourRandom = "0" + fourRandom;}return fourRandom;}


2.验证二维码和redis中存放的是否一致


@API("提交订单")@RequestMapping(value = "/v1/commit_order/pre_create",method = RequestMethod.POST)public Object preCreateOrder(@RequestBody Order order){//1.判断是否为空 ParamVerifyUtils.paramNotNull(order, "订单不能为空");ParamVerifyUtils.paramNotNull(order.getMemberName(), "会员姓名不能为空");ParamVerifyUtils.paramNotNull(order.getMemberMobile(), "会员手机号不能为空");ParamVerifyUtils.paramNotNull(order.getStatus(), "订单状态不能为空");ParamVerifyUtils.paramNotNull(order.getOrderFrom(), "订单来源不能为空");ParamVerifyUtils.paramNotNull(order.getVerificationCode(), "验证码不能为空");if (!PhoneFormatCheckUtils.isPhoneLegal(order.getMemberMobile())) {ResponseUtil.toFailureBody(ServerStatus.SHOW_ERROR, "请填写真实手机号。");}String identifyCode = JedisUtils.get("identifyCode" + order.getMemberMobile());if (StringUtils.isEmpty(identifyCode) || !identifyCode.equals(order.getVerificationCode())) {ResponseUtil.toFailureBody(ServerStatus.SHOW_ERROR, "验证码不正确,请重新获得验证码");    }//2.调用service插入return orderService.createOrder(order);}


 3.生成订单入库


//创建订单--zhouzhou--2017年5月6日15:21:14@Overridepublic Order createOrder(Order order) {// 会员姓名、会员手机号、订单状态(1.待处理)、remark、order_from、订单编号(年月日+8位随机数)//1.判断是否为空ParamVerifyUtils.paramNotNull(order, "订单不能为空");ParamVerifyUtils.paramNotNull(order.getMemberName(), "会员姓名不能为空");ParamVerifyUtils.paramNotNull(order.getMemberMobile(), "会员手机号不能为空");ParamVerifyUtils.paramNotNull(order.getStatus(), "订单状态不能为空");ParamVerifyUtils.paramNotNull(order.getOrderFrom(), "订单来源不能为空");//2.生成订单编号SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");Date date =new Date();String str_date = sdf.format(date);StringBuilder str=new StringBuilder();//定义变长字符串Random random=new Random();//随机生成数字,并添加到字符串for(int i=0;i<8;i++){    str.append(random.nextInt(10));}//将字符串转换为数字并输出int num=Integer.parseInt(str.toString());String order_num=str_date+num;System.out.println(order_num);//3.set 订单编号order.setOrderNum(order_num);order.setCreated(date);//4.插入orderMapper.insertSelective(order);return order;}


效果,哦,就是我手机上的短信==





……3.总结……


         实现很简单,就是用了个httpclient请求端口。然后存储在redis中,方便获取。提高获取的效率。多实践,多总结。




0 0
原创粉丝点击