【uniapp】微信小程序2024手机号快速验证及无感登录教程(内附代码)

news2024/11/26 3:26:35

组件:手机号快速验证组件
适用对象:企业/个体
费用:0.03元/次

目录

  • 前言
  • 思路
  • 前端
  • 后端代码
  • 无感登录
    • onload事件
    • 无感登录方法
    • 登录判断
    • 后端
    • mini_login2
  • 最后

前言

最近注册了公司,可以注册具有支付能力的小程序了,各种材料加备案、认证差不多花了一个月的时间,打算接入支付后,接入一个快速注册的组件,给用户带来便捷的操作体验,发现uniapp的文档不多,于是自己踩了坑,本次简单记录一下,方便以后使用回顾

思路

手机号快速验证->数据库判断是否有数据->没有则注册;有的话直接登录,并将无感登录的oepnid记录下来,下次用户点击快速注册先通过openid进行查询完成无感登录,节省验证费用开支

前端

uniapp建议用下面代码,用微信官方的调用不起来

<!-- #ifdef MP-WEIXIN -->
<button  type="primary" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">手机号一键登录</button>
<!-- #endif -->

方法

获取到手机号后存储在本地,手机号进行检测,有记录pass没有则入库

getPhoneNumber(e) {
    console.log(e.detail.code) // 动态令牌
    let that = this;
    uni.request({
        url: 'https://******/api/mini_getuserphone.php',
        data: {
            phonecode: e.detail.code
        },
        method: 'POST',
        header: {
            'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
        },
        success: (res) = >{
            console.log(res.data.data) if (res.data.code == 100) {
                uni.showToast({
                    title: res.data.msg,
                    icon: 'none'
                });

            } else if (res.data.code == 200) {
                //返回数据接收成功
                uni.showToast({
                    title: res.data.msg,
                    icon: 'none'
                });
                var errcode = res.data.data['errcode'];
                if (errcode == 0) {
                    //登陆成功
                    var openids = res.data.data['phone_info']['phoneNumber'];
                    //注册事件
                    // 跳转事件
                    uni.setStorageSync('openid', openids);
                    //注册判断携带unionid
                    const unionid = uni.getStorageSync('unionid');

                    that.mini_userphoneregidst(openids, unionid);
                    setTimeout(function() {
                        // 调用全局MQTT连接函数,进行MQTT连接
                        getApp().check_account_mqtt_connect();
                        uni.switchTab({
                            url: '/pages/index/index'
                        });
                    },
                    1200);

                } else {
                    uni.showToast({
                        title: res.data.data['errmsg'],
                        icon: 'none'
                    });
                }

            }
        }
    })

},

后端代码

注意:grant_type为client_credential和无感登录获取openid不一样

//mini_getuserphone.php
<?php
$phonecode=$_POST['phonecode'];


if ($phonecode) {
           
            $appid='wxcbf*******dbea';//小程序id
            $secret='87616ba8******c4589bf';//密钥
            $url="https://api.weixin.qq.com/cgi-bin/token?appid=$appid&secret=$secret&grant_type=client_credential";
             $header = array(
       'Accept: application/json',
    );
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 超时设置,以秒为单位
    curl_setopt($curl, CURLOPT_TIMEOUT, 1);
 
    // 超时设置,以毫秒为单位
    // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
 
    // 设置请求头
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    //执行命令
    $data = curl_exec($curl);
 
    // 显示错误信息
    if (curl_error($curl)) {
        print "Error: " . curl_error($curl);
          die(
        json_encode(
            array(
            'code' => 100,
            'data' => '',
            'msg' => '请求出错!'
        ),480));
    } else {
        // 打印返回的内容
        $result=json_decode($data,true);
        if (array_key_exists("errcode",$result))
          {
        //   echo "键存在!";
       
         die(
        json_encode(
            array(
            'code' => 100,
            'data' => '',
            'msg' => '获取token失败!'.$result['errmsg']
        ),480));
        
          }
        else
          {
      //token获取成功 继续获取手机号
      $access_token=$result['access_token'];
      curl_close($curl);
      
      
    //   请求新的连接
$url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" . $access_token;

$data = array('code' => $phonecode); // 请确保$code变量已经定义

$options = array(
    'http' => array(
        'header' => "Content-Type: application/json\r\n",
        'method' => 'POST',
        'content' => json_encode($data)
    )
);

$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);

$result = json_decode($response, true);

          

        
    //   请求新的连接
    
         die(
        json_encode(
            array(
            'code' => 200,
            'data' => $result,
            'msg' => ''
        ),480));
          }
          
    }


          
} 
else {
            // 已被处理或者不存在 请求重新登陆
            die(
        json_encode(
            array(
            'code' => 100,
            'data' => '',
            'msg' => '非法操作'
        ),480)
);
        }
curl_close($curl);
    
       

无感登录

一键登录成功后,将openid记录到数据库,用户在点击收取按登陆前进行调用判断,可以省去一笔开支

onload事件

onShow() {
	// #ifdef MP-WEIXIN
	//小程序登录检测
	this.mini_login()
	// #endif

},

无感登录方法

mini_login() {
	let that = this;

	uni.login({
		provider: 'weixin',
		success: loginRes => {
			console.log(loginRes);
			that.code = loginRes.code;
			// 2. 将用户登录code传递到后台置换用户SessionKey、OpenId等信息
			uni.request({
				url: 'https://dcloud.taila.club/api/mini_login2.php', //仅为示例,并非真实接口地址。
				data: {
					code: loginRes.code
				},
				method: 'POST',
				header: {
					'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
				},
				success: (res) => {
					console.log(res.data);

					uni.hideLoading()
					if (res.data.code == 200) {
						//存取session
						uni.setStorageSync('unionid', res.data.data.openid);
						uni.showToast({
							title: res.data.msg,
							icon: 'none'
						});


						//判断逻辑
						that.pd_login(res.data.data.openid);


					} else {
						uni.showToast({
							title: res.data.msg,
							icon: 'none'
						})
					}


				}
			});


		},
		fail: () => {
			uni.showToast({
				title: '获取 code 失败',
				icon: 'none'
			});
		}
	});

},

登录判断

pd_login(unionid) {
	let that = this;
	uni.request({
		url: 'https://******/mini_login_check.php',
		data: {
			unionid: unionid
		},
		method: 'POST',
		header: {
			'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
		},
		success: (res) => {
			console.log(res.data)
			if (res.data.code == 201) {
				//unionid在数据库没有记录 记录就可以不需要操作
				console.log('unionid在数据库没有记录 记录就可以不需要操作')
			} else if (res.data.code == 200) {
				var openids = res.data.data;
				uni.showModal({
					title: '提示',
					content: '检测到该账户已授权是否直接登录?',
					success: function(res) {
						if (res.confirm) {
							//登陆成功 由于之前开发问题openid就是手机号、账号 ||unionid才是真真的openid
							uni.setStorageSync('openid', openids);
							uni.setStorageSync('unionid', unionid);
							// 调用全局MQTT连接函数,进行MQTT连接
							getApp()
								.check_account_mqtt_connect();
							uni.switchTab({
								url: '/pages/my/my'
							});
						} else if (res.cancel) {
							console.log('用户点击取消');
						}
					}
				});
			}
		}
	})
},

后端

<?php
include 'conn.php';
header("Content-type:text/html;charset=utf-8");//字符编码设置
if (!$_POST) {
   die(
        json_encode(
            array(
            'code' => 400,
            'msg' => '缺少参数'
        ),480)
);
} 

$unionid=$_POST['unionid'];
$sql="SELECT * FROM `user` WHERE `UnionID` = '$unionid'";
// 执行查询
$result = $conn->query($sql);


if ($roows=mysqli_fetch_assoc($result)) {
  //success
   // 查到数据直接返回手机号进行登录
 echo json_encode(array('code' => 200, 'msg' => '登陆成功', 'data' => $roows['openid']));
 
} else {
  //fail
  // 查不到数据
echo json_encode(array('code' => 201, 'msg' => '尚未注册', 'data' => ''));
}







mini_login2


<?php
$code=$_POST['code'];
if ($code) {
           
            $appid='wx*****a';//小程序id
            $secret='876*********89bf';//密钥
            $url="https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";
             $header = array(
       'Accept: application/json',
    );
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 超时设置,以秒为单位
    curl_setopt($curl, CURLOPT_TIMEOUT, 1);
 
    // 超时设置,以毫秒为单位
    // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
 
    // 设置请求头
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    //执行命令
    $data = curl_exec($curl);
 
    // 显示错误信息
    if (curl_error($curl)) {
        print "Error: " . curl_error($curl);
          die(
        json_encode(
            array(
            'code' => 100,
            'data' => '',
            'msg' => '请求出错!'
        ),480));
    } else {
        // 打印返回的内容
        $result=json_decode($data,true);
        if (array_key_exists("errcode",$result))
          {
        //   echo "键存在!";
       
         die(
        json_encode(
            array(
            'code' => 100,
            'data' => '',
            'msg' => '获取token失败!'.$result['errmsg']
        ),480));
        
          }
        else
          {
        //   echo "键不存在!";
              // 开启redius
       
         //写入redius session_key名命的openid数据 默认存储2天
        curl_close($curl);
         die(
        json_encode(
            array(
            'code' => 200,
            'data' => $result,
            'msg' => '获取token成功'
        ),480));
          }
          
    }


          
} 
else {
            // 已被处理或者不存在 请求重新登陆
            die(
        json_encode(
            array(
            'code' => 100,
            'data' => '',
            'msg' => '非法操作'
        ),480)
);
        }
        
    
       

最后

《记一次云之家签到抓包》
《记一次视频抓包m3u8解密过程》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
《Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》

推荐专栏:

《Python爬虫脚本项目实战》

该专栏往期文章:
《【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)》

🥦如果感觉看完文章还不过瘾,欢迎查看我的其它专栏
🥦作者对python有很大的兴趣,完成过很多独立的项目:例如滇医通等等脚本,但是由于版权的原因下架了,爬虫这一类审核比较严谨,稍有不慎就侵权违规了,所以在保证质量的同时会对文章进行筛选

如果您对爬虫感兴趣请收藏或者订阅该专栏哦《Python爬虫脚本项目实战》,如果你有项目欢迎联系我,我会同步教程到本专栏!

🚀Python爬虫项目实战系列文章!!
⭐⭐欢迎订阅⭐⭐

【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)
【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

⭐⭐欢迎订阅⭐⭐
在这里插入图片描述

Python爬虫脚本项目实战
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1607017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用了 18 个月时间,做 AI 应用从 0 到 200 万用户,从亏损到盈利(4000 字全面复盘)

前言 距离上次《离职一年&#xff0c;收入10倍增长》总结到现在已经过去了 22 个月。在这段时间里我经历了从高峰跌到谷底又慢慢回弹。组建团队后经历了 10 个月的连续亏损&#xff0c;目前已经连续 12 个月盈利&#xff0c;专注于 AI 应用小程序方向&#xff0c;已累计 200 多…

Hadoop大数据处理技术-Linux相关命令

​7.Linux常用命令 1&#xff09;Windows中的dir&#xff1a;列出当前目录下所有的文件和目录 2&#xff09;cd&#xff1a;改变当前目录 cd命令并不能直接实现这种跳跃转换目录的功能 它只能让你在当前目录和其子目录之间来回切换 就像在一张平面地图上移动一样 如果想跨目录…

【Excel】使用VBA宏简单自定义Excel软件界面

改行做经济师学习Excel&#xff0c;偶有心得&#xff0c;摘录于此&#xff0c;备忘。 言简意赅&#xff0c;仅供自用。 1 实现效果 在Excel的左上角可添加按钮&#xff0c;该按钮的功能可由我们自己通过编写代码定义&#xff0c;能实现特定功能&#xff0c;并且在所有打开的…

Web端Webrtc,SIP,RTSP/RTMP,硬件端,MCU/SFU融合视频会议系统方案分析

Web端视频融合&#xff0c;会议互通已经是视频会议应用的大趋势&#xff0c;一是目前企业有大量的老视频会议硬件设&#xff0c;二新业务又需要Web端支持视频会议监控直播需求&#xff0c;迫切需要一个融合对接的方案&#xff0c;即能把老的设备用起来&#xff0c;又能对接新的…

界面组件Telerik UI for WPF 2024 Q1新版亮点 - 全新DateRangePicker组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

通过ABAP 程序自动创建ADSO模型-第一弹

学习新东西从来都是一件快乐的事情&#xff01;&#xff01; 前言 今天我讲一个很好玩的东西&#xff0c;那就是通过ABAP程序去自动生成BW的ADSO模型。我相信做过BW建模的小伙伴们都知道&#xff0c;BW模型建模是最基础且核心的部分&#xff0c;一旦设计出错&#xff0c;将会影…

电脑上删除的文件怎么恢复?这三个策略能帮到你!

“我很好奇&#xff0c;如果我在电脑上删除了一个比较重要的文件&#xff0c;还有机会恢复它吗&#xff1f;应该怎么做才能恢复这个文件呢&#xff1f;” 在使用电脑时&#xff0c;我们会将很多重要的数据或文件都保存在电脑上。如果电脑文件删除后我们才意识到文件是误删了&am…

面试官最怕你懂的Kafka面试题,一招致胜!

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、前言Kafka的优点Kafka的使用场景…

赞:java使用easy-excel导入模板下载提供用户进行导入

就是我们在点击导入的时候&#xff0c;一般都是有一个模板的&#xff0c;我们需要下载这个模板&#xff0c;然后再按照这个excel模板填充数据之后&#xff0c;再导入。 那么导出模板下载&#xff0c;说白了和前面一篇 赞&#xff1a;java使用easy-excel导出数据的通用模板思路…

Linux——日志的编写与线程池

目录 前言 一、日志的编写 二、线程池 1.线程池基本原理 2.线程池作用 3.线程池的实现 前言 学了很多线程相关的知识点&#xff0c;线程控制、线程互斥、线程同步&#xff0c;今天我们将他们做一个总结&#xff0c;运用所学知识写一个较为完整的线程池&#xff0c;同时…

算法打卡day38

今日任务&#xff1a; 1&#xff09;完全背包理论基础(卡码网52. 携带研究材料) 2&#xff09;518.零钱兑换II 3&#xff09;377. 组合总和 Ⅳ 4&#xff09;复习day13 完全背包理论基础(卡码网52. 携带研究材料) 题目链接&#xff1a;52. 携带研究材料&#xff08;第七期模拟…

go语言是如何实现协程的

写在文章开头 go语言的精华就在于协程的设计&#xff0c;只有理解协程的设计思想和工作机制&#xff0c;才能确保我们能够完全的利用协程编写强大的并发程序。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客专…

51-M.2 B Key-5G模块 (U)SIM卡电路设计

视频链接 M.2 B Key-5G模块 &&#xff08;U&#xff09;SIM卡电路设计01_哔哩哔哩_bilibili M.2 B Key-5G模块 &&#xff08;U&#xff09;SIM卡电路设计 1、5G模块 &&#xff08;U&#xff09;SIM卡相关概念 1.1、5G模块&#xff08;RM500Q-GL&#xff09; R…

✯✯✯绍兴ISO9001认证:打造卓越质量管理的核心引擎✯✯✯

&#x1f308;绍兴ISO9001认证&#xff1a;&#x1f33a;打造卓越质量管理的&#x1f497;核心引擎&#x1f955; &#x1f688;在绍兴这座历史悠久、&#x1f345;文化底蕴深厚的城市中&#xff0c;&#x1f3e3;企业间的竞争日趋激烈。&#x1f481;‍♂️为了在这场激烈的&a…

LeetCode第797题: 所有可能的路径

目录 1.问题描述 2.问题分析 1.问题描述 给你一个有 n 个节点的有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09;。 graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08…

openai api_key分享

sk-proj-aHU3aSlMAReiF8d6li9BT3BlbkFJsxmlRhLKlR55xIjpeJ10 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

二次元AI绘画生成器免费:教你生成精美图片

二次元AI绘画生成器&#xff0c;无疑是现代技术与艺术完美结合的典范。这些工具不仅将复杂的绘画过程简化&#xff0c;更让每一个艺术爱好者的创意得以充分展现。这些生成器能够精准捕捉大家的创意精髓&#xff0c;将其转化为细腻、独特的二次元画作。无论是角色设计、场景描绘…

波奇学Linux:ip协议

ip报文解析 4位版本&#xff1a;一般是4表示通信的ip版本号是ipv4还是ipv6 4位首部长度&#xff1a;数值*4ip报头长度 取值范围为[0101,1111], 报头长度就是[5*420,15*460] 8位服务类型(TOS)&#xff1a;4位TOS位段和3位优先权字段和一位保留字段 4位TOS相当于给路由器转发…

Redis快速入门操作

启动Redis 进入命令行客户端 字符串命令常用操作&#xff08;redis默认使用字符串来存储数据&#xff09; 列表&#xff08;Lists&#xff09;常用操作 集合&#xff08;Sets&#xff09;常用操作 &#xff08;无序集合且元素不可重复&#xff09; 有序集合&#xff08;So…

windows和虚拟机互传文件

在虚拟机中设置共享文件夹 操作方法&#xff1a;打开VMware–>虚拟机–>设置–>选项–>共享文件夹&#xff08;见下图&#xff09;&#xff0c;大家在共享文件夹当中就可以把Windows当中的D盘或者其它盘共享到虚拟机中。比如我就是将D盘和E盘共享到了虚拟机中。 共…