以下代码可以进行优化和封装;这里我实现功能为主,就不封装啦。小伙伴可以自己试着封装一下。

1:书写登录表单

<view class="container">
<view class="title">登录</view>
<form catchsubmit="login">
<view class="inputView">
<input class="inputText" placeholder="请输入手机号" name="phone" bindblur="phone" />
</view>
<view class="inputView">
<input class="inputText" placeholder="请输入验证码" name="code" />
<button class="line" disabled="{{disabled}}" size="mini" bindtap="sendcode">{{codebtn}}</button>
</view>
<view class="loginBtnView">
<button class="loginBtn" type="primary" formType="submit">登录</button>
</view>
</form>
</view>

2:js

// pages/phone_login/phone_login.js
Page({ /**
* 页面的初始数据
*/
data: {
// 定义手机号
phone: '',
// 发送验证码倒计时
codebtn: '发送验证码',
// 是否禁用的按钮
disabled: false,
},
/**
* 失焦事件验证手机号
*/
phone(e) {
let phone = e.detail.value;
let reg = /^[1][3,4,5,7,8][0-9]{9}$/;
if (!reg.test(phone)) {
wx.showToast({
title: '手机号码格式不正确',
icon: "none",
duration: 2000
})
return false;
}
this.setData({
phone: e.detail.value
})
},
/**
* 发送验证码
*/
sendcode() {
let that = this;
let phone = this.data.phone;
if (phone == '') {
wx.showToast({
title: '手机号码不可以为空',
icon: "none",
duration: 2000
})
}
//发送手机号获取验证码
wx.request({
url: 'http://www.yan.com/mouth/login', //仅为示例,并非真实的接口地址
data: {
phone
},
header: {
'content-type': 'application/json' // 默认值
},
success: res => {
if (res.data.code == 200) {
wx.showToast({
title: '验证码已发送.请注意接收',
icon: "success"
})
let time = 60;
var times = setInterval(function () {
time--;
if (time > 0) {
that.setData({
codebtn: time,
disabled: true
});
} else {
that.setData({
codebtn: '发送验证码',
disabled: false
});
clearInterval(times)
}
}, 1000)
}else{
wx.showToast({
title: res.data.msg,
icon:"none",
duration:2000
})
}
}
})
},
/**
* 获取到验证码和手机号进行登录
*/
login(evt) {
var that = this;
let phone = evt.detail.value.phone;
let code = evt.detail.value.code; if (phone == "") {
wx.showToast({
title: '请填写手机号码',
icon: 'none',
duration: 2000
})
return false;
}
if (code == "" || isNaN(code) || code.length != 4) {
wx.showToast({
title: '验证码格式不正确',
icon: 'none',
duration: 2000
})
return false;
} else {
wx.request({
url: 'http://www.yan.com/mouth/code', //仅为示例,并非真实的接口地址
data: {
phone,
code
},
header: {
'content-type': 'application/json' // 默认值
},
success(res) {
// 提示登录成功
wx.showToast({
title: res.data.meg,
icon: 'none',
duration: 2000
}) }
}) } }
})

3:laravel7 路由

Route::group(['namespace' => 'mouth'], function () {
//登录展示
Route::get('mouth/login','PhoneLoginController@getPhone');
//验证码
Route::get('mouth/code','PhoneLoginController@phoneLogin');
});

4:控制器代码

<?php

namespace App\Http\Controllers\mouth;

use App\Http\Controllers\Controller;
use App\Models\Admin;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redis; class PhoneLoginController extends Controller
{
/**
* 接受手机号,发送验证码
*/
public function getPhone(Request $request)
{
// 接受手机号
$sendPhone = $request->get('phone');
// 用手机号查询用户信息是否有这个手机号, 没有就去进行注册,有就继续发送验证码
$test_phone = Admin::where('phone', $sendPhone)->first();
if ($test_phone == false) {
return ['code' => 500, 'meg' => '数据库没有这个手机号', 'data' => ''];
}
if (!preg_match('/^1[3-9]\d{9}$/', $sendPhone)) {
return ['code' => 1001, 'msg' => '手机号不符合规则', 'data' => ''];
}
//判断 是否重复发送
$redisPhone=Redis::get($sendPhone);
if ($redisPhone){
return ['code' => 1002, 'msg' => '手机号发送太过于频繁', 'data' => ''];
}
$statusStr = array(
"0" => "短信发送成功",
"-1" => "参数不全",
"-2" => "服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间!",
"30" => "密码错误",
"40" => "账号不存在",
"41" => "余额不足",
"42" => "帐户已过期",
"43" => "IP地址限制",
"50" => "内容含有敏感词"
);
// 手机号发送验证码
$smsapi = "http://api.smsbao.com/";
$user = "**********"; //短信平台帐号
$pass = md5("*********"); //短信平台密码
$code = rand('1000', '9999');
$content = "【百味园】您的验证码是$code,30秒内有效.若非本人操作请忽略此消息。";//要发送的短信内容
$phone = $sendPhone;//要发送短信的手机号码
$sendurl = $smsapi . "sms?u=" . $user . "&p=" . $pass . "&m=" . $phone . "&c=" . urlencode($content);
$result = file_get_contents($sendurl);
// 将验证码储在缓冲,设置过期时间为一分钟
Redis::setex($sendPhone,600,$code);
return ['code' => 200, 'meg' => $statusStr[$result], 'data' => ''];
}
// 验证手机号发送的验证码
public function phoneLogin(Request $request)
{
$login=$request->input();
// 接受验证码
$test_code=$login['code'];
// 取出储的验证码,键为接受到的手机好
$redisCode=Redis::get($login['phone']);
// 进行对比
if ($test_code!=$redisCode){
//返回前台
return ['code' => 500, 'meg' => '验证码错误', 'data' => ''];
}
// 验证成功,返回前台
return ['code' => 200, 'meg' => '登录成功', 'data' => ''];
}
}

博客参考:

https://blog.csdn.net/jweicao/article/details/117334550

https://www.cnblogs.com/xiaoyantongxue/p/15586772.html

效果图:

微信小程序+laravel 7+ Redis +短信宝 实现手机号验证码登录的更多相关文章

  1. 如何使用微信小程序云函数发送短信验证码

    其实微信小程序前端和云端都是可以调用短信平台接口发送短信的,使用云端云函数的好处是无需配置域名,也没有个数限制. 本文使用的是榛子云短信平台(http://smsow.zhenzikj.com) ,S ...

  2. vue+uni-app商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录

    一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...

  3. 今天记录一下h5跳转小程序,可以通过短信推广小程序

    今天记录一下h5跳转小程序最简单的方法,首先准备条件,是一个已经上线的小程序 根据URL Schame进行跳转,在微信公众平台登录自己的小程序,然后生成RL Schame,如下图 其次按照步骤进行小程 ...

  4. 微信小程序一步一步获取UnionID,实现自动登录

    思路: 1.小程序端获取用户ID,发送至后台 2.后台查询用户ID,如果找到了该用户,返回Token,没找到该用户,保存到数据库,并返回Token 小程序端如何获取用户ID: 小程序端 wx.getU ...

  5. 微信小程序之 Index(仿淘宝分类入口)

    1.逻辑层 index.js //index.js //获取应用实例 const app = getApp() Page({ /** * 页面的初始数据 */ data: { menu: { imgU ...

  6. 微信小程序如何发送短信验证码,无需搭建服务器

    自从微信小程序提供云开发支持,开发者无需搭建后台服务器,使用微信提供的核心API就可以实现应用功能,此时就需要小程序能够自己发送短信,比如短信验证码,榛子云短信(http://smsow.zhenzi ...

  7. 微信小程序中用户登录和登录态维护

    提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件. 让用户 ...

  8. 微信小程序 教程及示例

    作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有,转载请联系作者获得授权.微信小程序正式公测, ...

  9. 近期热门微信小程序demo源码下载汇总

    近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...

随机推荐

  1. Redis设计与实现

    简述Redis设计与实现 Redis是一个高性能的key-value的非关系型数据库,Redis是运行在内存中的一种数据库,但是它也可以持久化到磁盘中,Redis的实现有着更为复杂的数据结构并且提供对 ...

  2. 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足

    前言 PC网页吊起支付宝支付界面报了如下这么个错误: 我明明申请的支付宝支付功能列表的签约已经生效了呀!怎么回事呢? 解决 支付宝商户中心:https://b.alipay.com/signing/p ...

  3. js正则表达式 (.+)与(.+?)

    (.+)默认是贪婪匹配 (.+?)为惰性匹配 疑问号让.+的搜索模式从贪婪模式变成惰性模式. var str = 'aaa<div style="font-color:red;&quo ...

  4. GFS 分布式文件系统

    GFS 分布式文件系统 1.GlusterFS概述 : GlusterFS简介  a) GlusterFS是一-个开源的分布式文件系统. 由存储服务器.客户端以及NFS/Samba存储网关(可选,根据 ...

  5. CephFS分布式文件系统

    目录 组件 基本组件 块存储 文件存储 对象存储 特点: 1.高性能: 2.高可用性: 3.高可扩展性: 4.特性丰富: 详细配置 一.准备机器 1.修改主机名 2.修改hosts文件 二.Ceph节 ...

  6. Squid代理服务器应用

    Squid代理服务器应用 目录 Squid代理服务器应用 一.Squid的脚本概念 1. Squid的作用 2. Web代理的工作机制 3. 代理服务器的概念 4. 代理服务器的作用 5. 代理的基本 ...

  7. Linux防火墙(iptables/firewalld)

    Linux防火墙(iptables/firewalld) 目录 Linux防火墙(iptables/firewalld) 一.iptables 1. iptables概述 2. netfilter和i ...

  8. Hadoop文件操作常用命令

    1.创建目录 #hdfs dfs -mkidr /test 2.查询目录结构 #hdfs dfs -ls / 子命令 -R递归查看//查看具体的某个目录:例如#hdfs dfs -ls /test 3 ...

  9. 帆软报表(finereport)图表钻取详细类别 当前页对话框展示

    添加参数栏,季度下拉框的控件命名为 jd 这里添加雷达图做案例 编辑→特效→ 添加JavaScript 参数:wd    值:分类名      #取雷达图所点击的点 参数:jd      值:公式$j ...

  10. 03并发编程(多道技术+进程理论+进程join方法)

    目录 03 并发编程 03 并发编程