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

news2024/11/17 18:27:32

在网站注册登陆这环节,增加微信扫码注册登陆,普通的方法需要开通微信开发者平台,生成二维码扫码后才能获取用户的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=mp1421140454
                switch ($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>";
                        }
                        else
                            return "谢谢关注!\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=mp1443448066
                        return '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=mp1421140453
            case '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();
}
	//多网站公用转发code
    private 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.coloradmin.cn/o/1573756.html

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

相关文章

Linux:五种IO模型的基本认识

文章目录 IO的本质五种IO模型异步和同步 阻塞IO非阻塞IO信号驱动IO IO的本质 在之前的内容中已经结束了对于网络和操作系统的学习&#xff0c;那么回过来再继续看IO&#xff0c;什么是IO呢&#xff1f; 对于网络的学习当中&#xff0c;实际上也是一种IO&#xff0c;数据从计算…

基于单片机钢琴电子节拍器系统设计

**单片机设计介绍&#xff0c;基于单片机钢琴电子节拍器系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机钢琴电子节拍器系统设计是一个综合性的项目&#xff0c;它结合了单片机编程、音频处理、用户界面设计等多个领域的…

Ai软件下载安装 Adobe Illustrator一键安装 5分钟搞定

ai软件又叫adobe illustrator软件,它是设计者们比较常用的平面设计软件,不仅可以用来学习日常的学习设计,还能够用作于商业设计用途,作为一款全球知名的矢量图形处理工具,ai软件广泛应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等.从事设计行业的…

Ceph学习 - 2.分布式文件系统DFS

文章目录 1.分布式文件系统DFS1.1 DFS简介1.1.1 存储基础1.1.2 分布式文件系统1.1.3 DSS简介1.1.4 常见的文件系统 1.2 原理解读1.2.1 分布式数据存储1.2.2 存储角色1.2.3 数据高可用 1.3 小结 1.分布式文件系统DFS 学习目标&#xff1a;这一节&#xff0c;我们从DFS简介、原理…

《MATLAB科研绘图与学术图表绘制从入门到精通》

解锁MATLAB科研绘图魅力&#xff0c;让数据可视化成为你的科研利器&#xff01; 1.零基础快速入门&#xff1a;软件操作实战案例图文、代码结合讲解&#xff0c;从入门到精通快速高效。 2.多种科研绘图方法&#xff1a;科研绘图基础变量图形极坐标图形3D图形地理信息可视化等&a…

JavaWeb前端基础(HTML CSS JavaScript)

本文用于检验学习效果&#xff0c;忘记知识就去文末的链接复习 1. HTML 1.1 HTML基础 结构 头<head>身体<body> 内容 图片<img>段落<p>图标<link> 标签 单标签双标签 常用标签 div&#xff1a;分割块span&#xff1a;只占需要的大小p&…

Linux网卡IP地址配置错误的影响

在Linux系统中&#xff0c;网络配置是保持系统顺畅运行的关键一环。正确配置网卡的IP地址对于确保网络通信的准确性和效率至关重要。然而&#xff0c;如果在这个过程中发生错误&#xff0c;可能会带来一系列问题。让我们一起探讨一下&#xff0c;如果Linux网卡的IP地址配置错误…

nVisual软件在企业运维管理中的价值

​ 企业运维常见问题 1. 设备进出机房&#xff0c;上架下架一直使用excel表格记录&#xff0c;无法持续跟踪机柜设备变化&#xff0c;对机房内设备管理无法做到全过程记录&#xff1b; 2. 资料分散缺乏统一管理&#xff0c;表格手工记录容易产生遗漏&#xff0c;资料不准确&a…

小核引导RTOS---RISC-V C906

文章目录 参考日志编译框架目标fip 启动流程fip文件组成BL2程序 总结思考备注 参考 参考1. How does FSBL load the FreeRTOS on the small core and execute it?参考2. Duo now supports big and little cores?Come and play!Milk-V Duo, start&#xff01;参考3. 使用uboo…

【御控物联】JavaScript JSON结构转换(16):对象To数组——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

【JavaSE零基础】00-基础语法(1-12章)

1 第一章 Java开发环境搭建 1.1 章节目标与知识框架 1.1.1 章节目标 掌握Java的开发环境搭建&#xff0c;会编写HelloWorld程序&#xff0c;并能够准确的进行编译和运行&#xff1b;理解path和classpath环境变量并可以自行配置。 1.1.2 知识框架 1.2 Java语言概述(了解) J…

20240404这个数字有什么特点吗?

今天是2024年的清明节&#xff0c;20240404这个数字让我提出了一个疑问&#xff0c;它是否有什么含义或者特点呢&#xff1f; 首先&#xff0c;如果把它拆分为两个整数的平方和&#xff0c;会怎么样呢&#xff1f; 于是&#xff0c;我一顿操作猛如虎&#xff0c;搞出了这么个…

如何在Python中将HTML实体代码转换为文本

在处理HTML数据时&#xff0c;有时会遇到HTML实体代码&#xff0c;这些代码是为了在HTML中表示特殊字符而使用的。例如&#xff0c;<表示小于符号(<)&#xff0c;>表示大于符号(>)&#xff0c;&表示和符号(&)等等。那么当我们在实际操作中可能会遇到下面的…

并发编程BlockingQueue、BlockingDeque

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 BlockingQueue 也叫做阻塞队列,在某些情况下对BlockingQueue的访问可能会…

Kubernetes学习笔记7

使用kubeadm部署Kubernetes集群方法 使用kubernetes部署单节点Master节点K8s集群。 在实际生产环境中&#xff0c;是不允许单master节点的&#xff0c;如果单master节点不可用的话&#xff0c;当导致我们的K8s集群无法访问。 可以使用kubeadm将单master节点升级为多master节点…

【计算机毕业设计】企业员工信息管理系统——附系统源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

[AIGC] Spring Interceptor 拦截器详解

文章目录 什么是Spring Interceptor如何使用Spring InterceptorSpring Interceptor的影响 什么是Spring Interceptor Interceptor&#xff08;拦截器&#xff09;是Spring MVC框架中的一种特性&#xff0c;类似于Servlet开发中的Filter&#xff08;过滤器&#xff09;&#xf…

007 CSS的继承和层叠 元素特性

文章目录 CSS属性的继承CSS属性的层叠选择器的权重 HTML元素的类型编写HTML注意事项元素隐藏方法CSS属性-overflowCSS样式不生效可能原因 CSS属性的继承 如果一个属性具备继承性&#xff0c;那么在该元素上设置后&#xff0c;它的后代元素都可以继承这个属性 如果后代元素自己…

UE4_如果快速做出毛玻璃效果_假景深

UE4_如果快速做出毛玻璃效果_假景深 2022-08-20 15:02 一个SpiralBlur-SceneTexture材质节点完成效果&#xff0c;启用半透明材质通过修改BlurAmount数值大小调整效果spiralBlur-SceneTexture custom节点&#xff0c;HLSL语言float3 CurColor 0;float2 BaseUV MaterialFloa…

浅谈智能照明控制系统的节能优势及其应用

【摘要】&#xff1a;通过智能照明控制系统与传统照明控制的对比&#xff0c;阐明智能照明控制系统的优势&#xff0c;基本组成、在智能建筑中的应用效果以及其实施存在的问题和前景展望。 【关键字】&#xff1a;智能照明控制&#xff1b;系统组成&#xff1b;优势&#xff1…