记一次完整的微信公众号扫码登录开发(一)

前端面试问题:扫码登录原理详解 一、简介 从登录的交互形式角度,登录有很多方式:账号密码登录、验证码登录、手机号一键登录、扫码登录等等。 今天我们聊一聊扫码登录的原理。 先来看两个扫码登录的场景: 1. 手机已经登录知乎,如果我们想在PC网页登录,可以使用知乎移动端扫码登录。 2. 使用微信扫码登录PC网页ProcessOn (这是一个免费作图的网站)。 从账号体系角度,这是扫码登录的两种方式:自有账户登录登录和第三方登录。 我们在面试中问“请讲一讲扫码登录的原理”,通常指的是自有账户登录;而在实际业务开发中,基于微信的第三方登录是很 阅读详情

    对于微信公众号的文档,呃~ 就不过多的吐槽了。

    说起开发流程本身是很简单的,申请公众号 -- 编写代码 -- 配置域名【就是token验证,检查服务器的有效性】。

    首先介绍一下在开发中需要的必要操作

(一)编写后台接口

直接上示例代码吧:

class WeiChart
{
    protected $TOKEN = 'mytoken';//公众号后台配置url时定义的token 可以为任意符合规定的字符
    protected $APPID = 'APPID';//你的appid
    protected $SECRETE = 'SECRETE';//你的密钥

    // 入口方法
    public function wxAction()
    {
        //判断请求类型 验证token 或 推送事件回调
        if (isset($_GET['echostr'])){
            if ($this->checkSignature()) {
                $echoStr = $_GET["echostr"];
                echo $echoStr;
                exit;
            } else {
                echo '失败';
            }
        }else {
            // 事件回调
            $this->responseMsg();
        }
    }
    
    // 验证token 【服务器是否有效】
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $token = $this->TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);
        if ($tmpStr == $signature) {
            return true;
        } else {
            return false;
        }
    }

    // 处理微信相关信息请求和响应
    private function responseMsg()
    {
        // $postStr = $GLOBALS['HTTP_RAW_POST_DATA']; //php7.0以下可用
        $postStr = file_get_contents("php://input"); // php7.0以上包括7.0
        if (!empty($postStr)){
            libxml_disable_entity_loader(true);
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

            switch ($postObj->MsgType) {
                case 'text':
                    // 处理文本信息方法
                    break;
                case 'image':
                    // 处理图片消息
                    break;
                case 'location':
                    // 处理位置消息
                    break;
                case 'event':
                    // 处理事件消息
                    $this->doEvent($postObj);
                    break;
                default:
                    break;
            }
        }
    }

     // 处理事件消息
    private function doEvent($postObj)
    {
        switch (strtolower($postObj->Event)){
            case 'subscribe':
                // 关注第一次
                $this->_subscribe($postObj);
                break;
            case 'unsubscribe':
                // 取消关注
                $this->_unsubscribe($postObj);
                break;
            case 'scan':
                // 已关注
                $this->_scan($postObj);
                break;
            case 'click':
                // 自定义菜单点击事件
                break;
            default:
                break;
        }
    }

    // 关注公众号
    private function _subscribe($postObj)
    {
        $param['scene_id'] = str_replace("qrscene_", "", $postObj->EventKey);
        $param['openid'] = $postObj->FromUserName; // 点击关注的用户openid
        $content = '谢谢你关注我';
        $str = $this->_msgText($postObj->FromUserName, $postObj->ToUserName, $content);
        
    }

    // 定义 回复文字,图片,视频,音乐,新闻等等,相应的回复模板
    private $_msg_template = array(
        'text' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>',//文本回复XML模板
        'image' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[%s]]></MediaId></Image></xml>',//图片回复XML模板
        'music' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><MusicUrl><![CDATA[%s]]></MusicUrl><HQMusicUrl><![CDATA[%s]]></HQMusicUrl><ThumbMediaId><![CDATA[%s]]></ThumbMediaId></Music></xml>',//音乐模板
        'news' => '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>%s</ArticleCount><Articles>%s</Articles></xml>',// 新闻主体
        'news_item' => '<item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item>',//某个新闻模板
    );

    // 发送文本消息
    private function _msgText($to, $from, $content) {
        $response = printf($this->_msg_template['text'], $to, $from, time(), $content);
        return $response;
    }
}

上述代码基本实现了token验证及消息推送;

(二)后台配置url

这里的url要确保可以访问到上述代码的wxAction方法,且这里的Token与代码中定义的$TOKEN值一致;这里我必须要强调一下这里配置的url的作用:1)验证开发者服务器的有效性;2)作为扫码关注公众号的事件推送回调地址;

 

    接下来说一下我开发中踩过的坑,希望对大家有所帮助能够在开发过程中少走弯路。这里我说明一下我开发用的时tp框架。

(一)路由问题

Token验证是get请求而事件推送回调时却是post,此时如果你要是定义路由我想一定会想到用'any',但是我试过了不行。不知道为什么,我反正是蒙了袄。建议开启混合模式路由在公众号后台配置url时用普通路由就欧克了;

(二)获取事件推送回调参数问题

在获取参数时有两个方法$GLOBALS['HTTP_RAW_POST_DATA']、file_get_contents("php://input");

$GLOBALS['HTTP_RAW_POST_DATA'] 在php7以后已经被移除了所以就不再有用;

file_get_contents("php://input") 拼了老命的建议用这个方法,官方也推荐我们使用php://input方式进行读取流。

我开始使用的是第一种死活获取不到,后来换成第二种这才拿到想要的数据。

(三)获取用户信息问题

微信公众号文档中获取access_token 和用户信息的方式都是网页授权的方式而我们这里用到的却不是,所以文档中的提供的接口就不能用了。

此时应该使用下面这种个url

$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='. $this->APPID .'&secret='.$this->SECRETE;
 

当我们使用上述的方式获取access_token 后已经不可以使用网页授权获取用户信息的方式获取用户信息否则会一直返回40001错误码,因为在许多地方看到有人就是这么写的。我在这里想提醒强调一下,希望大家都不要被误导了。

正确的获取用户信息url如下:

$url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='. $token .'&openid='. $openid .'&lang=zh_CN';

至此我走完了所有的曲折,看见了属于我的光明。特别要说一下就是在回调中该怎么调试file_put_contents() 是个极好用的函数。

还是多读微信公众号文档虽说有许多需要改进的但是还是要读。

感谢阅读,下章给大家分享如何生成微信公众号二维码。

基于若依框架实现微信扫码登录功能 扫码登录流程前端调用/uuid/get获取 UUID,生成含 UUID 的微信授权二维码;用户扫码后,微信回调,将openid与uuid绑定(存入 Redis);前端轮询,后端检查到openid后,查询关联的系统用户,生成 token 返回;前端使用 token 完成登录。账号绑定流程已登录用户点击 "绑定微信",前端获取微信授权code;调用,后端通过code获取openid,更新到当前用户的sys_user记录;绑定成功后,用户下次可直接扫码登录。 阅读详情

相关推荐

【二】微信公众号之扫码关注后自动登录

【二】微信公众号之扫码关注后自动登录 ​ 原来公司的官网就支持账号密码、手机验证码、QQ扫码授权、微信扫码授权等多种登录方式。昨天分享了微信公众号之扫码登录,今天接到需求说要为了咋们的公众号涨粉,要扫码后关注公众号后才可以登录,我一想这不是耍流氓嘛,登个网站还非得我关注。。。算了,产品爸爸说了算。 一、准备工作 查阅了微信公众号开发文档,发现可以用微信生成带参数二维码实现。看看人家的介绍 这不就是我们这个需求准备的接口嘛???? 二、整个流程说明 先来看看整个流程的时序图 然后咋们来捋一下整个流程

Zack_tzh的博客 5092

file_get_contents读取 https 请求

如果出现 读取不到数据:  $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET" $re=file_get_contents($url); 4 print_r($re)

嚼菜根 8550

LinuxCNC---在PC端显示开发板LinuxCNC界面

  今天在调试开发板时,执行开发板上的linuxcnc指令,总是出现如下报错 LINUXCNC - 2.9.0~pre0 application-specific initialization failed: couldn't connect to display "192.168.137.3:1" Error in startup script: invalid command name "image" while executing "image create photo -file $f/$i

中华田园巨龙 3470

file_get_contents 无法请求微信小程序https://api.weixin.qq.com接口的问题

小程序获取openid,file_get_contents无法获取 https://api.weixin.qq.com/sns/jscode2session?appid=APPID&amp;secret=SECRET&amp;js_code=JSCODE&amp;grant_type=authorization_code  里边的内容。终于网上查到解决方法: 原来要修改php.ini中的一...

乌云大帝的博客 1万+

STM32F103C8T6最小系统板GPIO配置避坑指南:从原理图到流水灯一次成功

本文详细介绍了STM32F103C8T6最小系统板GPIO配置的实战指南,从硬件准备到流水灯实现,涵盖了九大关键步骤。特别针对新手常见问题,如GPIO配置、开发环境搭建和程序下载调试,提供了详细的解决方案和避坑技巧,帮助开发者快速掌握STM32开发基础。

weixin_33756596的博客 340

多核系统核间通信(IPC)设计:从硬件机制到软件实现

在多核处理器与嵌入式系统设计中,核间通信(IPC)是实现计算资源协同工作的核心技术。其原理基于共享内存、硬件邮箱与中断等底层硬件机制,通过构建结构化的消息传递通道,实现核间高效、可靠的数据交换。该技术的核心价值在于打破多核间的壁垒,将分散的计算单元整合为有机整体,从而显著提升系统整体性能与响应能力。在工程实践中,IPC广泛应用于智能座舱、边缘AI网关、实时控制系统等场景,用于处理如仪表显示、AI推理、实时控制等复杂任务。本文聚焦于基于共享内存与VRING的消息队列实现,深入剖析缓存一致性、内存屏障等关键问题

weixin_27006759的博客 596

微信JSSDK接入问题记录及源码

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34310369的博客 258

MuJoCo柔性体仿真实战:从FlexComp建模到自定义模型导入

柔性体仿真是机器人交互研究中不可或缺的一环,MuJoCo作为高精度物理求解器,凭借高效的求解速度与批量并行能力,成为强化学习与软体抓取任务的热门选择。其FlexComp机制将连续材料离散为粒子-约束系统,以较低建模成本模拟布料、软组织等形变行为,相比Gazebo等平台更具实时性与可扩展性。技术价值体现在自定义柔性体建模与导入流程中:通过XML配置网格密度、间距与材料参数,即可生成贴合任务需求的软体垫子或硅胶抓手。在柔性抓取、颗粒抓手、医疗仿真等场景中,该方法能快速构建可训练的环境。围绕环境搭建、FlexCo

weixin_29045585的博客 159

微信公众平台模板消息范例 PHP

<?php $ac = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET'); $wxt = json_decode($ac,true); $url = 'https://api.weixi...

weixin_34074740的博客 150

适航规章、标准,书籍资料下载汇总(增加DO-160G中英文版)

很多读者之前问我有没有DO-160G的资源,现在终于找到啦!如果大家有其他想要的资源,可以在留言区告诉我,有空我会帮大家找找看~文末有下载链接:更新日志:2024-9-28:初版。2024-10-21:增加DO-330英文版PDF下载。2024-10-30:增加DO-160G中文版(非机翻)和英文版PDF下载。以下是一些收集到的适航相关的资料,分享给大家。(如果没有你想要的资料,请留言,等找到会及时更新!

qq_41854911的博客 2758

Pytorch CIFAR10图像分类 EfficientNet v1篇

EfficientNet源自Google Brain的论文EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. 从标题也可以看出,这篇论文最主要的创新点是. 论文提出了,混合缩放,把网络缩放的三种方式:深度、宽度、分辨率,组合起来按照一定规则缩放,从而提高网络的效果。EfficientNet在网络变大时效果提升明显,把精度上限进一步提升,成为了当前最强网络。

风信子的猫Redamancy的快乐星球 1851

微信公众号第三方登录,简单易懂

java实现微信登录

qq_38009397的博客 3536

第1章 大数据概述

三次信息化浪潮 信息化浪潮 发生时间 标志 解决的问题 代表企业 第一次 1980年前后 个人计算机 信息处理 Intel、AMD、IBM、苹果、微软、联想、戴尔、惠普等 第二次 1995年前后 互联网 信息传输

wyz191的专栏 7088

【一】微信公众号之扫码登录

微信公众号之扫码登录 ​ 原来公司的官网就支持账号密码、手机验证码、QQ扫码授权、微信扫码授权等多种登录方式。今天要分享的就是关于微信扫码授权登录的原理。 一、准备工作 使用的是微信登录功能实现的,需要先在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。 二、授权流程说明 微信授权登录让微信用户使用微信身份安全登录第三方应用或网站,当微信用户授权登录接入微信的第三方应用后,第三方就可以获取到用户的接口调用

Zack_tzh的博客 4489

团体程序设计天梯赛竞赛题--登顶题【L3-039 攀岩】

登顶级 3 道题,每道题 30 分,满分为 90 分。

Pretty Boy Fox的博客 653

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

一扫即入,如何通过微信公众号扫码登录网站?

这篇文章一起聊聊微信公众号二维码登录是怎么回事,它的工作流程是什么,它怎么保证你的身份安全。以及,如果你是一个开发者,如何在自己的网站上增加扫码登录。

未读代码 5991

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

使用Spring Boot Security 实现多认证 手机号登录 微信扫码登录 微信扫码注册

利用Spring Security 实现基于手机号密码的登录功能,并结合微信扫码实现用户注册的功能。通过我这种方案,用户可以选择使用手机号密码登录,或者通过微信扫码进行注册。我们将详细介绍了如何获取微信授权二维码、微信授权回调、注册接口以及自定义认证提供者等方面的实现细节。您将了解到如何使用Spring Security构建安全可靠的身份认证系统,并且为用户提供多样的登录与注册选择

Likefr 5365

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

微信公众号扫码登录(一)—— 获取微信公众号二维码

总的来说只要细心看文档还不算是特别难理解的,所以一定要多看文档!总的来说流程就是那三步:因为文章是本人理解记录的,可能会有错误,有错误问题欢迎交流!

YXXXYX的博客 1万+

通过小程序实现微信扫码授权登录,网站接入微信扫码登录功能(免费)

网站如果想要实现微信扫码登录其实有很多种方案,常见的方案就是微信开放平台和微信公众号服务号。前者是目前大部分网站并且是微信认可的一种方式,后者是开发者发现服务号具备扫码关注后即可获取用户基本信息的能力后而开发的一种方式。

TANKING,开源开发者! 1万+

扫码登录的原理和实现

来源:扫码登录的原理和实现 1概述 在日常Web端产品的使用中,一般都会支持扫码登录,这种方式操作简单,相对传统的手机号登录等方式速度更快、安全性更高,还可以增加自家产品的粘合度。 2登录原理 扫码登录本质是解决将APP端的用户登录信息(通常是Token)通过扫码的形式安全稳定地同步给Web端。 1)用户打开Web端网页,进入扫码登录的界面; 2)从Web端服务器获取二维码的图并获取其状态; 3)Web端服务器在生成二维码时,会生成一个uuid和二维码进行关联,并将uuid存入db记录中;

Mark66890620 4487

微信公众号开发(4)-实现PC扫码登录

一、PC微信扫码登录原理简介 PC端调用微信服务端的ticket接口,微信服务端获取ticket,PC端拿到ticket之后,生成带参数登录二维码,用户扫码之后会发送扫码事件消息到微信服务端,这个消息中会带上用户微信的openId,根据openId调用获取用户接口拿到用户信息,包含unionId、昵称、头像、性别等字段,这里可以将用户信息存入redis,在PC获取登录二维码之后我们要加一个轮询获取用户扫码状态,原理就是查询redis是否存入的用户信息,如果存入,那么开始做登录流程。 二、代码实现 1、微信服

cxh1299543968的博客 2915

vue 实现微信扫码登录的方法

已登录

花生日记 7274

扫码登录实现原理

转 扫码登录实现原理 ...

weixin_38851693的博客 3622

【PHP+微信开发系列】之微信扫码登录

微信扫码登录总体说明:先获取token和ticket,通过微信生成二维码接口生成二维码,把二维码信息添加到数据表中,用户扫码时检测二维码扫描状态,扫描成功后更新二维码状态,跳转页面。

qq_25285531的博客 3258

微信公众号扫码登录处理逻辑

最近项目系统JasmineProject集成了微信扫码功能,在实现的工程中遇到了一些坑,梳理了下大概流程逻辑 参考文档。

qq_34831192的博客 840

一篇文章,带你了解微信扫码登录

文章目录前言一、功能背景二、扫码登录原理1.基本原理三、实现效果图1.登录页2.点击微信账号登录3.已绑定微信的账号4.未绑定微信号的账号四、代码实现1.准备工作2.编写代码总结 前言 Hi,大家好,我是希留。 很多PC端的网站都有使用微信扫码登录的功能,不需要输入用户名和密码,打开手机微信扫一扫,就可以自动登录,确实很便捷。 那么,它是如何实现快捷登录的呢? 本篇文章就带大家通过真实项目的登录场景来了解一下微信扫码登录的整个流程。如果对你有帮助的话,还不忘点赞支持一下,感谢! 一、功能背景 公司的平

Java升级之路的博客 3713
上一篇: 导入sql文件时遇到到文件过大导入失败怎么解决
下一篇: 记一次完整的微信公众号扫码登录开发--生成公众号二维码(二)
一只小béi
博客等级 码龄9年 15粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值