📞 09318539889 📧 yxp@gansuwangzhan.cn

PHP微信开放平台-- tp5实现第三方网页微信扫码登录

作者:zaikun_admin时间:2022-04-30点击量:10次

最近小编接到一个项目需要使用微信公众平台,实现微信网页扫码登录。

首先到微信开放平台https://open.weixin.qq.com/,在微信开放平台注册开发者帐号,并且提交审核网站应用。然后获得相应的AppID和AppSecret。


流程:

前端编写代码生成一个二维码,然后用一个微信号扫描二维码并且确认登录,确认登录后,网页将会重定向到回调地址,并且戴上code,state参数,我们通过code参数获取access_token,获取access_token地址(https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={APPSECRET}&code={CODE}&grant_type=authorization_code),根据access_token和Openid请求(https://api.weixin.qq.com/sns/userinfo?access_token={ACCESS_TOKEN}&openid={OPENID}),然后就可以获取到登录的用户信息


前端代码如下:

login.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>微信扫码登录</title>
</head>
<body>
<div id="login_container"></div>
</body>
  <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
<input type="hidden" value="{$url}" id="url">
{include file="public/css"}
{include file="public/js"}
<script>
    var url=$("#url").val();
    var obj = new WxLogin({

        id:"login_container",     //展示二维码及相关信息的div的id

        appid: "wx***************b", //微信AppID

        scope: "snsapi_login", //OAuth2.0协议标准指定参数

        redirect_uri: "http"+url,         //回调地址

        state: "",          //参数,可带可不带

        style: "",          //样式  提供"black"、"white"可选,默认为黑色文字描述

        href: ""                  //自定义样式链接,第三方可根据实际需求覆盖默认样式。
    });</script>
</html>

用户扫码成功并且确认登录后,会带code和state重定向到回调地址,code是我们获取access_token的重要凭证,而access_token又是我们获取用户信息的唯一关键。

后台登录方法:
login.php

<?php
namespace app\index\controller;

use lib\WechatLogin;
use \think\Request;

class login extends \think\Controller
{

    public function login(){
        $request = Request::instance();
        $code = $request->get("code");
        $WechatLogin = \think\Config::get("config.WechatLogin");
        $wechat = new WechatLogin($WechatLogin);
        $access_token = $wechat->get_access_token($code);//获取access_token
        if(isset($access_token["errcode"])){//判断是不是发生错误,避免超时导致程序有误
            $Error_return["Status"] = false;
            $Error_return["ResultCode"] = $access_token["errcode"];
            $Error_return["Msg"] = $access_token["errmsg"];
            return json_encode($Error_return,JSON_UNESCAPED_UNICODE);//将错误以json格式输出
        }
        $user = $wechat->get_user_massage($access_token);//获取用户信息
        var_dump($user);//打印用户信息
        //以下就是登录操作,具体怎么实施按需求编写
    }
    
}

微信登录封装类:
WechatLogin.php

<?php
namespace lib;

/*
 * 微信网页授权登录登录
 */

class WechatLogin{
    protected static $AppID = "wx***************b";//内置AppID
    protected static $AppSecret = "0*******************************0";//内置AppSecret

	
    /**
     * 实例化类时设置微信AppID和AppSecret,无此需求可删除
     * WechatLogin constructor.
     * @param $data
     */
    public function __construct($data)
    {
        self::instance($data);
    }

    /**
     * 设置微信AppID和AppSecret
     * @param $data
     */
    protected static function instance($data){
        self::$AppID = $data["AppID"];
        self::$AppSecret = $data["AppSecret"];
    }

    /**
     * 获取access_token,用于获取用户信息
     * @param $code     用户扫码登录成功后,回调带的code
     * @return mixed
     */
    public function get_access_token($code){
        $AppID = self::$AppID;
        $AppSecret = self::$AppSecret;
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$AppID}&secret={$AppSecret}&code={$code}&grant_type=authorization_code";
        return json_decode(self::get($url),true);
    }

    /**
     * 获取用户信息
     * @param $data 获取access_token后,返回的数组
     * @return mixed
     */
    public function get_user_massage($data){
        $url = "https://api.weixin.qq.com/sns/userinfo?access_token={$data["access_token"]}&openid={$data["openid"]}";
        return json_decode(self::get($url),true);
    }

    /**
     * 发起get请求
     * @param $url      请求地址
     * @return false|mixed|string
     */
    public static function get($url){
        // 1. 初始化
        $ch = curl_init();
        // 2. 设置选项,包括URL
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch,CURLOPT_HEADER,0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        // 3. 执行并获取HTML文档内容
        $output = curl_exec($ch);
        if($output === FALSE ){
            $output = json_encode(["errcode"=>40013,"errmsg" => curl_error($ch)],JSON_UNESCAPED_UNICODE);
        }
        // 4. 释放curl句柄
        curl_close($ch);
        return $output;
        //return file_get_contents($url);    //返回json对象
    }
}

来源:原文链接