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=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方法里网站域名测试

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

区域自动气象站讲解

TH-QC10当我们每天查看天气预报&#xff0c;安排出行计划&#xff0c;或是在户外活动时关注天气变化&#xff0c;很少有人会想到这一切背后默默付出的“英雄”——区域自动气象站。这些看似不起眼的气象监测设备&#xff0c;却在我们日常生活中扮演着至关重要的角色。今天&…

【话题】程序员35岁会失业吗?

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景招聘分析一、技术更新换代的挑战二、经验与技术的双重优势三、职业发展的多元化选择四、个人成长与职业规划的平衡五、结语文章推荐 背景 35岁被认为是程序员职业生…

【OJ】stack刷题

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 155. 最小栈1.1 分析1.2 代码 2. JZ31 栈的压入、弹出序列2.1 分析2.2 代码 3. 150. 逆波兰表达式求值3.1 分析3.2 代码 1. 155. 最小栈 1.1 分析 利用两个栈&#xff0c;一个栈a负责入数据和出数据&#xff0c;另一个…

分类预测 | Matlab实现DRN深度残差网络数据分类预测

分类预测 | Matlab实现DRN深度残差网络数据分类预测 目录 分类预测 | Matlab实现DRN深度残差网络数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现DRN深度残差网络数据分类预测&#xff08;完整源码和数据&#xff09;&#xff0c;运行环境为Matl…

合宙开发板Core_Air780E测试AT指令

一、官方资料 CORE-AIR780E 开发板是合宙通信推出的基于 Air780E 模组所开发的&#xff0c;包含电源&#xff0c;SIM 卡&#xff0c;USB&#xff0c;天线&#xff0c;音频等必要功能的最小硬件系统。以方便用户在设计前期对 Air780E 模块 进行性能评估&#xff0c;功能调试&…

CUDA10的安装

1、因为要用到tensorflow1.15.5的GPU版本&#xff0c;所以想安装cuda10来进行加速&#xff0c;通过nvidia-smi检查本机上的CUDA版本 2、下载的cuda10版本&#xff0c;cuda_10.0.130_411.31_win10.exe 下载的cudnn版本&#xff0c;cudnn-10.0-windows10-x64-v7.6.4.38.zip 然后…

mathtype如何嵌入到word中?mathtype 7永久激活码密钥及2024最新序列号附安装教程

将MathType嵌入到Word中的方法主要有三种&#xff0c;分别是&#xff1a; 通过加载项嵌入MathType。首先&#xff0c;在Word中点击“文件”按钮&#xff0c;选择“选项”&#xff0c;然后选择“加载项”一栏&#xff0c;找到MathType相关的加载项并勾选&#xff0c;点击“确定…

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

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

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

Kubernetes学习笔记8

Kubernetes集群客户端工具kubectl 我们已经能够部署Kubernetes了&#xff0c;那么我们如何使用Kubernetes集群运行企业的应用程序呢&#xff1f;那么&#xff0c;我们就需要使用命令行工具kubectl。 学习目标&#xff1a; 了解kubectl 命令帮助方法 了解kubectl子命令使用分…

看不惯各种信息收集表,我手写了一个身份证号输入组件

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 背景 shigen最近的需要填写各种报名表的场景有点多&#xff0c;很多场景都要输…

三防笔记本丨加固笔记本丨三防笔记本电脑赋能车辆检修

随着汽车数量的不断增加和交通运输行业的发展&#xff0c;车辆检修行业成为了保障交通安全和延长车辆寿命的重要领域。在车辆检修过程中&#xff0c;需要使用各种工具和设备来进行检测、维修和保养&#xff0c;而信息化技术的应用正逐渐渗透到这一行业中&#xff0c;为检修工作…

【C++】背包问题

目录 背包问题01 背包背包不装满问题背包必须满问题 完全背包 背包问题 背包问题属于动态规划的一类题型 01 背包 背包不装满问题 背包必须满问题 #include <iostream> using namespace std; const int N 1010; #include <vector> int main() {int n , V;int v[…

如何做好产业园运营?树莓集团:响应政府号召,规划,注重大局观

随着经济的发展和产业结构的调整&#xff0c;产业园区的建设和发展已经成为推动地方经济的重要力量。如何做好产业园运营&#xff0c;提高行业竞争力&#xff0c;现已成为了一个亟待解决的问题。树莓集团作为一家有着丰富产业园运营经验的企业&#xff0c;积极响应政府号召&…

从头开发一个RISC-V的操作系统(五)汇编语言编程

文章目录 前提RISC-V汇编语言入门RISC-V汇编指令总览汇编指令操作对象汇编指令编码格式add指令介绍无符号数 练习参考链接 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提 这个系列的大部分文章和知识来自于…

地面站Mission Planner从源码编译与运行

0. 环境 - win10&#xff08;基本需要100G硬盘&#xff09; - ubuntu18 1. 安装vs2022 下载 vs2022 community 在线安装包。 https://visualstudio.microsoft.com/ 打开 Visual Studio Installer 先安装 Visual Studio Community 2022本体。占用1.2GB。 Visual Studio Inst…

【linux】ubuntu ib网卡驱动如何适配

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

JQuery(一)---【JQuery简介、安装、初步使用、各种事件】

零.前言 在学习JQuery前&#xff0c;您需要具备以下知识&#xff1a; HTML相关知识(DOM)CSS相关知识JavaScript相关知识 一.JQuery 1.1JQuery简介 JQuery是一个JavaScript的“函数库”&#xff0c;不是JavaScript的一个框架&#xff0c;与“VUE、REACT”有本质区别&#x…

浅析智能数据采集技术在数字化转型中的核心作用|电商数据采集API接口的核心应用

随着科技的飞速发展和全球化的深入推进&#xff0c;数字化转型已经成为企业和社会发展的必然趋势。在这一背景下&#xff0c;智能数据采集技术作为数字化转型的核心驱动力&#xff0c;正发挥着越来越重要的作用。本文将从智能数据采集技术的定义、特点、应用场景以及对企业的影…

神经网络学习笔记10——RNN、ELMo、Transformer、GPT、BERT

系列文章目录 参考博客1 参考博客2 文章目录 系列文章目录前言一、RNN1、简介2、模型结构3、RNN公式分析4、RNN的优缺点及优化1&#xff09;LSTM是RNN的优化结构2&#xff09;GRU是LSTM的简化结构 二、ELMo1、简介2、模型结构1&#xff09;输入2&#xff09;左右双向上下文信…