微信小程序+laravel 7+ Redis +短信宝 实现手机号验证码登录
以下代码可以进行优化和封装;这里我实现功能为主,就不封装啦。小伙伴可以自己试着封装一下。
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 +短信宝 实现手机号验证码登录的更多相关文章
- 如何使用微信小程序云函数发送短信验证码
其实微信小程序前端和云端都是可以调用短信平台接口发送短信的,使用云端云函数的好处是无需配置域名,也没有个数限制. 本文使用的是榛子云短信平台(http://smsow.zhenzikj.com) ,S ...
- vue+uni-app商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录
一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...
- 今天记录一下h5跳转小程序,可以通过短信推广小程序
今天记录一下h5跳转小程序最简单的方法,首先准备条件,是一个已经上线的小程序 根据URL Schame进行跳转,在微信公众平台登录自己的小程序,然后生成RL Schame,如下图 其次按照步骤进行小程 ...
- 微信小程序一步一步获取UnionID,实现自动登录
思路: 1.小程序端获取用户ID,发送至后台 2.后台查询用户ID,如果找到了该用户,返回Token,没找到该用户,保存到数据库,并返回Token 小程序端如何获取用户ID: 小程序端 wx.getU ...
- 微信小程序之 Index(仿淘宝分类入口)
1.逻辑层 index.js //index.js //获取应用实例 const app = getApp() Page({ /** * 页面的初始数据 */ data: { menu: { imgU ...
- 微信小程序如何发送短信验证码,无需搭建服务器
自从微信小程序提供云开发支持,开发者无需搭建后台服务器,使用微信提供的核心API就可以实现应用功能,此时就需要小程序能够自己发送短信,比如短信验证码,榛子云短信(http://smsow.zhenzi ...
- 微信小程序中用户登录和登录态维护
提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件. 让用户 ...
- 微信小程序 教程及示例
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有,转载请联系作者获得授权.微信小程序正式公测, ...
- 近期热门微信小程序demo源码下载汇总
近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...
随机推荐
- 统信UOS系统部署.Net Core 5.0
平时很少用Linux,需要的时候才查资料,记录下遇到的问题和解决办法.这次部署的系统是统信UOS,arm64位CPU 第一步:安装.Net Core 5.0运行环境 统信UOS是基于Debian 10 ...
- git 初始化本地项目并推送到远程
有一个新项目,开发了一些代码之后想推送到远程,具体的操作方式和命令如下: (使用 git bash) 1.切到项目目录中,例如 E:\git\smart-open 2.初始化git仓库并在本地提交 / ...
- bom案例5-简单动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...
- java中静态代码块初始化顺序
(一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下, ...
- python办公自动化系列之金蝶K3自动登录(二)
接上一篇博文python办公自动化系列之金蝶K3自动登录(一),我们接着聊聊利用python脚本实现金蝶K3 Wise客户端自动登录这一需求. 如上图所示,自动选择[组织机构]后,我们还需要驱动[当前 ...
- Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构
Zookeeper.Kafka集群与Filebeat+Kafka+ELK架构 目录 Zookeeper.Kafka集群与Filebeat+Kafka+ELK架构 一.Zookeeper 1. Zook ...
- Elasticsearch使用系列-基本查询和聚合查询+sql插件
Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...
- HashMap自动扩容机制源码详解
一.简介 HashMap的源码我们之前解读过,数组加链表,链表过长时裂变为红黑树.自动扩容机制没细说,今天详细看一下 往期回顾: Java1.7的HashMap源码分析-面试必备技能 Java1.8的 ...
- 02网络编程( socket套接字+TCP粘包 )
目录 02 网络编程 一.socket套接字编程 二.简易代码模板 2.1 服务端 2.2 客户端 三.通信循环及代码优化 四.黏包现象 五.struct模块 六.简易版本报头 七.上传文件数据 * ...
- C# 在PDF中添加墨迹注释Ink Annotation
PDF中的墨迹注释(Ink Annotation),表现为徒手涂鸦式的形状:该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线.下面,通过C#程序代码介绍如何 ...