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><?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对象
}
}来源:原文链接