多网站域名共享微信网页授权:PHP实现微信授权代理转发

news2024/11/24 6:42:42

在做网站需要微信扫码或微信内授权注册登陆,但是做过类似功能的都知道,需要授权登陆比较麻烦。

需要满足以下条件:

  • 申请公众号
  • 网站域名备案
  • 开放平台注册新建应用审核

有没有简单,不需要申请免备案可用的方案,答案肯定是有,就是利用一个已有备案,已申请好的域名做数据中转,授权转发就行,即微信授权代理。下面就教大家如何实现?建议点赞收藏,如需使用本人搭建的代理,可+薇文章底部扫码+v。

微信网页授权文档:
微信网页授权PC扫码授权和移动端授权是不同的地址不同的接口。

PC扫码授权:
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

移动端微信内授权:
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

开发指南网页授权流程分为四步:

1.引导用户进入授权页面同意授权,获取code。----- 代理在这一步做。
2.通过code换取网页授权access_token(与基础支持中的access_token不同)
3.如果需要,开发者可以刷新网页授权access_token,避免过期
4.通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

微信网页授权代理转发原理图:

在这里插入图片描述
实例教程:
A域名:a.com,无备案使用微信网页授权方法。
在a.com增加一个方法生成代码链接跳转
B域名作为代理:b.com/proxy.php

function create_proxy()
{
		$device = cmf_is_mobile() ? 'mobile' : 'pc';
        
        $state = time();
        
        $redirect_uri = "http://a.com/proxy_notify";//接受转发回调地址
        $url = "b.com/proxy.php?appid={$config['appid']}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_base&state={$state}&device={$device}";
        header("location: {$url}");//跳转到代理链接
}

A域名接受代理转发的数据,

function wxlogin()
{
	if (!isset($_GET['code'])) {
            $http_referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : cmf_get_domain();//跳回原页面
            session('http_referer', $http_referer);

            $state = md5(uniqid(rand(), true));
            $callback = urlencode($redirect_uri);
            $wxurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$callback&response_type=code&scope=snsapi_userinfo&state=$state#wechat_redirect";
            $this->redirect($wxurl);
        }else{
            //第二步:通过code获取access_token
            $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid .'&secret=' . $appkey . '&code=' . $_GET['code'] .'&grant_type=authorization_code';
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_URL, $url);
            $json = curl_exec($ch);
            curl_close($ch);
            $arr = json_decode($json, 1);

            if(!empty($arr['errcode']))
            {
                exit($arr['errmsg']);
            }

            $access_token = $arr['access_token'];
            $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $arr['access_token'] .
                '&openid=' . $arr['openid'] . '&lang=zh_CN';
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_URL, $url);
            $json = curl_exec($ch);
            curl_close($ch);
            $userinfo = json_decode($json, 1);
            $openid = $userinfo['openid'];

            if($openid==""){
                echo "登录失败";
                die();
            }

          	//这里处理微信用户信息

            $http_referer = session('http_referer');
            $this->redirect($http_referer);

        }
}

B网站代理文件proxy.php:此文件主要是把回调地址临时存cookies,等微信授权回调时 ,数据原动的转发回原始站点A。

<?php
function is_HTTPS()
{
    if (!isset($_SERVER['HTTPS'])) return FALSE;
    if ($_SERVER['HTTPS'] === 1) {  //Apache
        return TRUE;
    } elseif ($_SERVER['HTTPS'] === 'on') { //IIS
        return TRUE;
    } elseif ($_SERVER['SERVER_PORT'] == 443) { //其他
        return TRUE;
    }
    return FALSE;
}
function getDomain()
{
    $server_name = $_SERVER['SERVER_NAME'];
    if (strpos($server_name, 'www.') !== false) {
        return substr($server_name, 4);
    }
    return $server_name;
}
$appid = '';
$scope = 'snsapi_login';
$state = '';
$code = '';
$redirect_uri = '';
$device = '';
$protocol = '';
if (is_HTTPS()) {
    $protocol = 'https';
} else {
    $protocol = 'http';
}
if (isset($_GET['device'])) {
    $device = $_GET['device'];
}
if (isset($_GET['appid'])) {
    $appid = $_GET['appid'];
}
if (isset($_GET['state'])) {
    $state = $_GET['state'];
}
if (isset($_GET['redirect_uri'])) {
    $redirect_uri = $_GET['redirect_uri'];
}
if (isset($_GET['code'])) {
    $code = $_GET['code'];
}
if (isset($_GET['scope'])) {
    $scope = $_GET['scope'];
}
if ($code == 'test') {
    exit;
}
if (empty($code)) {
    $authUrl = '';
    if ($device == 'pc') {
        $authUrl = 'https://open.weixin.qq.com/connect/qrconnect';
    } else {
        $authUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize';
    }
    $options = [
        $authUrl,
        '?appid=' . $appid,
        '&redirect_uri=' . urlencode($protocol . '://' . $_SERVER['HTTP_HOST'] . '/'),
        '&response_type=code',
        '&scope=' . $scope,
        '&state=' . $state,
        '#wechat_redirect'
    ];
    //把redirect_uri先写到cookie
    header(implode('', [
        "Set-Cookie: redirect_uri=",
        urlencode($redirect_uri),
        "; path=/; domain=",
        getDomain(),
        "; expires=" . gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT", time() + 60),
        "; Max-Age=" + 60,
        "; httponly"
    ]));
    header('Location: ' . implode('', $options));
} else {
    if (isset($_COOKIE['redirect_uri'])) {
        $back_url = urldecode($_COOKIE['redirect_uri']);
        header('Location: ' . implode('', [
                $back_url,
                strpos($back_url, '?') ? '&' : '?',
                'code=' . $code,
                '&state=' . $state
            ]));
    }
}
?>

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

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

相关文章

解决 ValueError: did not find HDF5 headers----安装netCDF4报错

报错如图 报错说是hdf5找不到&#xff0c;按照这个思路搞了半天都没搞好。后来换了一个安装命令 pip install netcdf41.5.7 成功&#xff01;&#xff01;

基于vue框架的大连盐业有限公司生产管理系统的设计与实现3hk5y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;计划员,工艺员,生产建模,生产计划,生产信息,生产监视,工艺质量,盐政信息 开题报告内容 一、引言 随着信息技术的飞速发展和市场竞争的日益激烈&#xff0c;传统盐业企业如大连盐业有限公司正面临着转型升级的迫切需求。传统管理模式下…

python-比较月亮大小/数组下标/人见人爱a+b

一:比较月亮大小 题目描述 小理是一名出色的狼人。众所周知&#xff0c;狼人只有在满月之夜才会变成狼。 同时&#xff0c;月亮的大小随着时间变化&#xff0c;它的大小变化 3030 天为一循环。 它的变化情况(从第一天开始)为 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,1…

Python提供内置正则表达式库

正则表达式是一种强大的文本处理工具&#xff0c;可以匹配文本片段的模式 最简单的正则表达式就是普通的字符串&#xff0c;可以匹配自身 要注意的是&#xff0c;正则表达式并不是一个程序&#xff0c;它使用一种特定的语法模式来描述在搜索文本时要匹配的一个或多个字符串。正…

UE5 C++: 插件编写05 | 批量删除无用资产

删除无用的asset 已经在地图中使用的asset会有asset reference EditorAssetLibrary&#xff08;按F12&#xff09;open header file&#xff0c;会有如下一个功能&#xff0c;可以找asset reference&#xff0c;返回bool值 UFUNCTION(BlueprintCallable, Category "Edi…

wpf在图上画矩形,矩形可拖动、大小可调节,使用装饰器Adorner调整矩形大小,限制拖动和调节范围

效果 功能 使用wpf实现 在图片上画一个矩形框该矩形框可以调节大小该矩形框可以拖动调整位置 注&#xff1a;这里的鼠标事件是&#xff0c;双击在图上画一个固定大小的矩形框&#xff0c;右键按住拖动矩形框。有需要的可以自行调整对应的鼠标事件 参考资料&#xff1a;https…

心理测试小程序开发心理健康MBTI人格测试,小程序源码部署支持多种流量主

简介 在当今这个高速运转的社会里&#xff0c;个人内心性格与心理健康日益成为人们关注的焦点。随着科技的日新月异&#xff0c;心理评估的方式正经历着深刻的变革&#xff0c;从传统的面对面咨询室中解放出来&#xff0c;无缝融入了我们日常使用的移动设备之中。这一趋势极大…

【网络安全】网络基础第一阶段——第四节:网络协议基础---- VRRP与网络架构设计

目录 一、VRRP 1.1 VRRP使用场景及简介 1.2 VRRP基本原理 1.2.1 VRRP基本结构 1.2.2 设备类型 1.2.3 VRRP工作原理 1.3 VRRP的基本配置 1.3.1 基于三层交换机的VRRP组配置 1.3.2 SMTPVRRP经典组网 1.4 端口聚合 1.4.1 端口聚合技术 1.4.2 聚合模式 1.4.3 Eth-trun…

Python项目Flask框架整合Redis

一、在配置文件中创建Redis连接信息 二、 实现Redis配置类 import redis from config.config import REDIS_HOST, REDIS_PORT, REDIS_PASSWD, REDIS_DB, EXPIRE_TIMEclass RedisDb():def __init__(self, REDIS_HOST, REDIS_PORT, REDIS_DB, EXPIRE_TIME, REDIS_PASSWD):# 建立…

【笔记】KaiOS 系统框架和应用结构(APP界面逻辑)

KaiOS系统框架 最早自下而上分成Gonk-Gecko-Gaia层,代码有同名的目录,现在已经不用这种称呼。 按照官网3.0的版本迭代介绍,2.5->3.0已经将系统更新成如下部分: 仅分为上层web应用和底层平台核心,通过WebAPIs连接上下层,这也是kaios系统升级变更较大的部分。 KaiOS P…

Spring Boot 点餐系统:您的餐饮技术伙伴

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统&#xff0c;它彻底改变了过去传统的…

Spring不能处理的循环依赖

文章目录 场景一&#xff1a;prototype 类型的循环依赖场景二&#xff1a; constructor 注入的循环依赖场景三&#xff1a;普通的 AOP 代理 Bean 的循环依赖–默认是可以的场景四&#xff1a;Async 增强的 Bean 的循环依赖总结 参考&#xff1a;https://blog.csdn.net/wang4896…

Redis系列补充:聊聊布隆过滤器(go语言实践篇)

1 介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是 Redis 4.0 版本之后提供的新功能&#xff0c;我们一般将它当做插件加载到 Redis Service服务器中&#xff0c;给 Redis 提供强大的滤重功能。 它是一种概率性数据结构&#xff0c;可用于判断一个元素是否存在于一个集…

Elasticsearch导出导入数据

1.概念回顾 2.基础操作 展示详细信息 GET&#xff1a;http://127.0.0.1:9200/_cat/indices?v Java代码将文件导入到ES package com.Graph.medicalgraph;import org.apache.http.HttpHost; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.act…

Java中的位图和布隆过滤器(如果想知道Java中有关位图和布隆过滤器的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习之前的数据结构的时候&#xff0c;我们使用的数据量都不是很大&#xff0c;但是在生活中&#xff0c;我们常常面临着要处理大量数据结果并得出最终结果&#xff0c;那么有没有什么数据结构可以帮助我们实现这样的功能呢&#xff1f; ✨✨✨这里是秋刀鱼不…

Circular dependency between the following tasks(gradle循环依赖的问题)

简介 目前公司项目主要使用gradle而不是maven&#xff0c;所以对gradle的使用不是很清楚&#xff0c;遇到这个问题的时候一直在晚上查资料&#xff0c;但是解决方案基本都是安卓的&#xff0c;后续先前辈请教了一下&#xff0c;才找到解决方案。 问题解析 本质上就是两个模块…

【QT 5 调试软件+Linux下调用脚本shell-无法调度+目录拼写+无法找目录+sudo权限(2)+问题解决方式+后续补充】

【QT 5 调试软件Linux下调用脚本shell-无法调度目录拼写无法找目录sudo权限&#xff08;2&#xff09;问题解决方式后续补充】 1、前言2、问题综述&#xff1a;自研qt上位机无法调度脚本&#xff08;1&#xff09;可能原因1&#xff1a;无法找到目录情况说明&#xff1a;解决思…

程序人生:软件测试 非技术性面试题【建议每个测试人观看】

1、自我介绍&#xff1a;三分钟左右 2、为什么从郑州/太原离职&#xff1f; 3、你的职业规划是什么样的&#xff1f; 4、对下一家公司有什么自己的想法吗&#xff1f; 5、你觉得作为一名测试工程师&#xff0c;应该具备什么样的素养&#xff1f; 6、你觉得管理层&#xff…

HTML | 外部引入 CSS 的2种方式:link和@import有什么区别?

外部引入 CSS 有2种方式&#xff0c;link 和 import。就结论而言&#xff0c;强烈建议使用 link &#xff0c;慎用 import 方式。 两者都是外部引用 CSS 的方式&#xff0c;但是存在一定的区别&#xff1a; &#xff08;1&#xff09;从属关系区别 link是HTML / XHTML标签&a…

react crash course 2024(3) jsx语法及组件

创建组件的文件结构 rafce创建组件内容 const NavBar () > {return (<div>NavBar</div>) }export default NavBar 使用该组件 组件传值 或者把props解构 设置默认值 5.用自定义组件包裹一些元素 把他们传值 元素直接变成了参数被传进来