PHP实现网站微信扫码关注公众号后自动注册登陆实现方法及代码【关注收藏】

在网站注册登陆这环节,增加微信扫码注册登陆,普通的方法需要开通微信开发者平台,生成二维码扫码后才能获取用户的uinonid或openid,实现注册登陆,但这样比较麻烦还要企业认证交费开发者平台,而且没有和公众号强制绑定,不能实现公众号粉丝积累。

下面详情给大家说下原理和代码实现,【建议点关注收藏】,更多实用技术分享给大家。
可以实现网站微信扫码关注公众号后自动注册登陆实现方法,同时,可以多个网站公用一个公众号扫码登陆,做一个域名转发就行。

实现的原理:

  • 配置公众号后台服务器接口地址。
  • 每次网站打开生成的二维码带上一个随机数,一个码对应一个随机数保存到数据库。
  • 网站接口实现接收微信服务器发送过来的信息中带有随机数和openid信息,已关注用户自动登陆设置随机码状态为登陆,未关注公众号实现注册登陆后设置随机码状态为登陆。
  • 网站前端轮询随机码看是否登陆状态,是就设置登陆。

具体实现步骤:
微信公众号服务器配置,设置与开发-服务器配置,填入你的网站的接收微信发送信息地址。
在这里插入图片描述
代码实现:
代码里用的是php的 EasyWeChat第三方组件库

public function index()
{$this->app->server->push(function ($message) {switch ($message['MsgType']) {case 'event'://接收事件推送: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454switch ($message['Event']) {case 'subscribe':  //关注事件, 扫描带参数二维码事件(用户未关注时,进行关注后的事件推送)$message['EventKey'] = str_replace('qrscene_','',$message['EventKey']);//别的站扫码登陆 域名转发if(strpos($message['EventKey'],'antcome')!==false || strpos($message['EventKey'],'axure9')!==false || strpos($message['EventKey'],'aichat')!==false){$post['code'] = $message['EventKey'];$post['openid'] = $message['FromUserName'];self::transfer_scan_code($post);}else{$WechatScan = new WechatScanModel();$find_user = Db::name('third_party_user')->where('openid',$message['FromUserName'])->find();if($find_user){$WechatScan->checkScan($message['EventKey'], $find_user['user_id']);}else{//官方接口调整无法取得用户头像和昵称,https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html$userinfo = $this->app->user->get($message['FromUserName']);$userinfo['headimgurl'] = '/static/images/user.png';$uid = Db::name('user')->order('id desc')->value('id');$userinfo['nickname'] = 'uihtm_'.($uid+1);//分销pid$scanCode = $WechatScan->getScanCode($message['EventKey']);if(!empty($scanCode['pid']))$userinfo['pid'] = $scanCode['pid'];$user_id = $WechatScan->saveUserInfo($userinfo);$WechatScan->checkScan($message['EventKey'], $user_id);//$WechatScan->checkScan($message['EventKey']);}}return "谢谢关注!\n"."<a href='".cmf_get_domain()."/wechat/index/user_auth'>点击授权登陆</a>";break;case 'unsubscribe':  //取消关注事件break;case 'SCAN':  //扫描带参数二维码事件(用户已关注时的事件推送)//别的站扫码登陆 域名转发if(strpos($message['EventKey'],'antcome')!==false || strpos($message['EventKey'],'axure9')!==false || strpos($message['EventKey'],'aichat')!==false){$post['code'] = $message['EventKey'];$post['openid'] = $message['FromUserName'];self::transfer_scan_code($post);}else{$WechatScan = new WechatScanModel();$find_user = Db::name('third_party_user')->where('openid',$message['FromUserName'])->find();if($find_user){$WechatScan->checkScan($message['EventKey'], $find_user['user_id']);}else{$userinfo = $this->app->user->get($message['FromUserName']);$userinfo['headimgurl'] = '/static/images/user.png';$uid = Db::name('user')->order('id desc')->value('id');$userinfo['nickname'] = 'uihtm_'.($uid+1);$user_id = $WechatScan->saveUserInfo($userinfo);$WechatScan->checkScan($message['EventKey'], $user_id);}}//更新用户昵称和头像if(strpos($find_user['nickname'], 'uihtm')!==false) {return "谢谢关注!\n" . "<a href='" . cmf_get_domain() . "/wechat/xxxxx'>点击授权登陆</a>";}elsereturn "谢谢关注!\n";break;case 'LOCATION':  //上报地理位置事件return "经度: " . $message['Longitude'] . "\n纬度: " . $message['Latitude'] . "\n精度: " . $message['Precision'];break;case 'CLICK':  //自定义菜单事件(点击菜单拉取消息时的事件推送)return "事件KEY值: " . $message['EventKey'];break;case 'VIEW':  //自定义菜单事件(点击菜单拉取消息时的事件推送)return "跳转URL: " . $message['EventKey'];break;case 'ShakearoundUserShake':Log::info('摇一摇周边事件');//摇一摇事件通知: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443448066return 'ChosenBeacon\n' . 'Uuid: ' . $message['ChosenBeacon']['Uuid'] . 'Major: ' . $message['ChosenBeacon']['Major'] . 'Minor: ' . $message['ChosenBeacon']['Minor'] . 'Distance: ' . $message['ChosenBeacon']['Distance'];break;default:return $message['Event'];break;}break;//接收普通消息: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453case 'text':return "Content: " . $message['Content'];break;case 'image':return "MediaId: " . $message['MediaId'] . "\nPicUrl: " . $message['PicUrl'];break;case 'voice':return "MediaId: " . $message['MediaId'] . "\nFormat: " . $message['Format'] . "\nRecognition: " . $message['Recognition'];break;case 'video':return "MediaId: " . $message['MediaId'] . "\nThumbMediaId: " . $message['ThumbMediaId'];break;case 'shortvideo':return "MediaId: " . $message['MediaId'] . "\nThumbMediaId: " . $message['ThumbMediaId'];break;case 'location':return "Location_X: " . $message['Location_X'] . "\nLocation_Y: " . $message['Location_Y'] . "\nScale: " . $message['Scale'] . "\nLabel: " . $message['Label'];break;case 'link':return "Title: " . $message['Title'] . "\nDescription: " . $message['Description'] . "\nUrl: " . $message['Url'];break;default:return $message['MsgType'];break;}//return "您好!验证码: ";});//        $this->app->server->setMessageHandler(function ($message) {
//            return "您好!欢迎使用 EasyWeChat!";
//        });return $this->app->server->serve()->send();
}//多网站公用转发codeprivate function transfer_scan_code($post=[]){if(strpos($post['code'],'uihtm.com')!==false)HttpService::post('https://www.uihtm.com/api/xxxxx', $post);if(strpos($post['code'],'antcome.com')!==false)HttpService::post('https://www.antcome.com/api/xxxxx', $post);if(strpos($post['code'],'axure9.com')!==false)HttpService::post('https://www.axure9.com/api/xxxxxx', $post);if(strpos($post['code'],'aichat')!==false)HttpService::post('https://chat.abc.com/web.php/wxmp/xxxxxx', $post);}

具体的HttpService用curl实现,自行百度找,这是就不啰嗦了。具体的演示到代码的里transfer_scan_code方法里网站域名测试

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

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

相关文章

【SQL】1890. 2020年最后一次登录(简单写法;窗口函数写法)

前述 sql 中 between 的边界问题 ---- between 边界&#xff1a;闭区间&#xff0c;not between 边界&#xff1a;开区间 在 sql 中&#xff0c; between 边界&#xff1a;闭区间not between 边界&#xff1a;开区间 题目描述 leetcode题目&#xff1a;1890. 2020年最后一…

【leetcode面试经典150题】16.接雨水(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

aardio教程五) 写Python风格的aardio代码(字符串篇)

前言 熟悉一个新的语言最麻烦的就是需要了解一些库的使用&#xff0c;特别是基础库的使用。 所以我想给aardio封装一个Python风格的库&#xff0c;Python里的基础库是什么方法名&#xff0c;aardio里也封装同样的方法名。 这样就不需要单独去了解aardio里一些方法的使用细节…

Lanelets_ 高效的自动驾驶地图表达方式

Lanelets: 高效的自动驾驶地图表达方式 附赠自动驾驶学习资料和量产经验&#xff1a;链接 LaneLets是自动驾驶领域高精度地图的一种高效表达方式&#xff0c;它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域&#xff0c;不仅可以表达车道几何&#xff0c;也可以完整表述车…

AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)

AIGC实战——ProGAN 0. 前言1. ProGAN2. 渐进式训练3. 其他技术3.1 小批标准差3.2 均等学习率3.3 逐像素归一化 4. 图像生成小结系列链接 0. 前言 我们已经学习了使用生成对抗网络 (Generative Adversarial Network, GAN) 解决各种图像生成任务。GAN 的模型架构和训练过程具有…

真实的招生办对话邮件及美国高校官网更新的反 AI 政策

这两年 ChatGPT 的热度水涨船高&#xff0c;其编写功能强大&#xff0c;且具备强大的信息整合效果&#xff0c;所以呈现的内容在一定程度上具备可读性。 那么&#xff0c;美国留学文书可以用 ChatGPT 写吗&#xff1f;使用是否有风险&#xff1f;外网博主 Kushi Uppu 在这个申…

基于卷积神经网络的天气识别系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

功能演示&#xff1a; 天气识别系统&#xff0c;vgg16&#xff0c;mobilenet卷积神经网络&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的天气识别系统是在pytorch框架下实现的&#xff0c;系统中有两个模型可选…

vue+elementUI实现表格组件的封装

效果图&#xff1a; 在父组件使用表格组件 <table-listref"table":stripe"true":loading"loading":set-table-h"slotProps.setMainCardBodyH":table-data"tableData":columns"columns.tableList || []":ra…

基于Springboot的Java学习平台

采用技术 基于Springbootjava学习平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统功能模块 后台管理 用户注册 课程信息 作业信息 资料信息…

电工技术学习笔记——正弦交流电路

一、正弦交流电路 1. 正弦量的向量表示法 向量表示方法&#xff1a;正弦交流电路中&#xff0c;相量表示法是一种常用的方法&#xff0c;用于描述电压、电流及其相位关系。相量表示法将正弦交流信号表示为复数&#xff0c;通过复数的运算来描述电路中各种参数的相互关系 …

java中的正则表达式和异常

正则表达式&#xff1a; 作用一&#xff1a;用来校验数据格式是否合法 作用二&#xff1a;在文本中查找满足要求的内容 不用正则表达式&#xff1a;检验QQ号是否合法&#xff0c;要求全部是数字&#xff0c;长度在6-20&#xff0c;不能以0开头 public class test {public stat…

【Linux实践室】Linux高级用户管理实战指南:创建与删除用户组操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux创建用户组命令2.1.1 知识点讲解2.1.2…

亲手开发全国海域潮汐表查询微信小程序详情教程及代码

最近在做一个全国海域潮汐表查询&#xff0c;可以为赶海钓鱼爱好者提供涨潮退潮时间表及潮高信息。 下面教大家怎么做一个这样的小程序。 主要功能&#xff0c;根据IP定位地理位置&#xff0c;自动查询出省份或城市的港口&#xff0c;进入后预测7天内港口潮汐表查询。 步骤&…

全坚固笔记本丨工业笔记本丨三防笔记本相较于普通笔记本有哪些优势?

三防笔记本和普通笔记本在设计和性能方面存在显著差异&#xff0c;三防笔记本相较于普通笔记本具备以下优势&#xff1a; 三防笔记本通常采用耐磨、耐摔的材料&#xff0c;并具有坚固的外壳设计&#xff0c;能够承受恶劣环境和意外碰撞&#xff0c;有效保护内部组件不受损坏。相…

【Linux】进程初步理解

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 冯诺依曼体系结构1.1 认识冯诺依曼体系结构1.2 存储金字塔 2. 操作系统2.1 概念2.2 结构2.3 操作系统的管理 3. 进程3.1 进程描述3.2 Linux下的PCB 4. task_struct本身内部属性4.1 启动4.2 进程的创建方式4.2.1 父…

C/C++预处理过程

目录 前言&#xff1a; 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作用的宏参数 5. 宏替换的规则 6. 宏和函数的对比 7. #和## 8. 命名约定 9. #undef 10. 命令行定义 11. 条件编译 12. 头文件的包含 13. 其他预处理指令 总结&#x…

谷歌在生成式人工智能领域的挑战与机遇:内部纷争与市场压力下的战略调整

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

nest获取传入接口的参数

代码 Query 可接收接口路径中传入的参数 Body 可接收body中传入的参数 Headers 可接收Headers中传入的参数 import { Controller, Post, Get, Body, Query, Headers } from nestjs/common;// 定义getList参数类型 export class ListDto {readonly page: number;readonly page…

keycloak - 鉴权VUE

目录 一、前言 1、背景 2、实验版本 二、开始干活 1、keycloak配置 a、创建领域(realms) b、创建客户端 c、创建用户、角色 2、vue代码 a、依赖 b、main.js 三、未解决的问题 目录 一、前言 1、背景 2、实验版本 二、开始干活 1、keycloak配置 a、创建领域(r…

SQL Server详细安装使用教程

1.安装环境 现阶段基本不用SQL Server数据库了&#xff0c;看到有这样的分析话题&#xff0c;就把多年前的存货发一下&#xff0c;大家也可以讨论看看&#xff0c;思路上希望还有价值。 SQL Server 2008 R2有32位版本和64位版本&#xff0c;32位版本可以安装在Windows XP及以上…