PHP微信登录支持多域名的方法

发布于2020-02-07 08:25:42  分类:php   阅读( 78 ) 

目前一个微信服务号,只能绑定两个域名,如果需要绑定更多的域名,可以使用中转授权的方法,通过跳转到跳转网站获取code,再携带code跳转回请求的域名,请求域名再使用code和密钥获取openid等。

中转站代码,首先是laravel中是这样的:

//微信登录借权中转获取code
public function wxgetcode(Request $request)
{
$redirect_url = $request->url;
$appid = env('WEIXIN_KEY');
$appKey = env('WEIXIN_SECRET');
$redirect_url = $redirect_url;
if (!isset($request->code)){
$scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';
$uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];
if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI'];
$baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri);
$urlObj["appid"] = $appid;
        $urlObj["redirect_uri"] = "$baseUrl";
        $urlObj["response_type"] = "code";
        $urlObj["scope"] = "snsapi_base";
        $urlObj["state"] = "STATE"."#wechat_redirect";
$buff = "";
foreach ($urlObj as $k => $v){
if($k != "sign") $buff .= $k . "=" . $v . "&";
}
$bizString = trim($buff, "&");
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; 
Header("Location: $url");
exit();
}else{
//获取code码
$code = $request->code;
Header("Location: $redirect_url?code=$code");//返回源网站
}
}

如果不是框架,通用的php代码如下:

//微信登录借权中转获取code
$appid = '';//服务号id
$appKey = '';//服务号key
$redirect_url = $redirect_url;
if (!isset($_GET['code'])){
$scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';
$uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];
if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI'];
$baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri);
$urlObj["appid"] = $appid;
        $urlObj["redirect_uri"] = "$baseUrl";
        $urlObj["response_type"] = "code";
        $urlObj["scope"] = "snsapi_base";
        $urlObj["state"] = "STATE"."#wechat_redirect";
$buff = "";
foreach ($urlObj as $k => $v){
if($k != "sign") $buff .= $k . "=" . $v . "&";
}
$bizString = trim($buff, "&");
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; 
Header("Location: $url");
exit();
}else{
//获取code码
$code = $_GET['code'];
Header("Location: $redirect_url?code=$code");//返回源网站
}

发起请求的客户端网站,获取openid的代码如下:

    //微信登录通过中转授权获取openid,无需授权网址
    public function zzgetopenid(){
//数据库中获取密钥
$config = (new Table('config'))->fetchAll();
$appid = $config[6]['value'];
$appKey = $config[7]['value'];
    if (!isset($_GET['code'])){
    //跳转站没有返回code
    $bzurl = 'https://'.trim($_SERVER['SERVER_NAME']).'/admin/zzgetopenid';//本站url
    $url = 'https://www.smttop.com/weixin.php?url='.$bzurl;
    Header("Location: $url");//跳转获取
    }else{
//已获取code码,开始获取openid
$code = $_GET['code'];
$urlObj["appid"] = $appid;
$urlObj["secret"] = $appKey;
$urlObj["code"] = $code;
$urlObj["grant_type"] = "authorization_code";
$buff = "";
foreach ($urlObj as $k => $v){
if($k != "sign") 
$buff .= $k . "=" . $v . "&";
}
$bizString = trim($buff, "&");
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; 
$options = array();
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
$openid = $data['openid'];
if($openid){
//查找数据库中是否有该openid
$check = (new Table('users'))->wherearray(['openid'=>$openid])->fetch();
if (!$check) {//如果第一次访问,自动创建账号
        //$bd = "/admin/bdyyzh?timestamp=".time()."&openid=".$openid;
        //Header("Location: $bd");
        $username = 'new'.time();//随机用户名
$password = md5('123456');//初始密码
$update = array('用户名' => $username,'openid'=>$openid,'密码' => $password,'用户组'=>'普通');
$count = (new Lssjb)->insert('users',$update);//自定义函数支持中文字段
if($count > 0){
//保存会话
session_start();
$_SESSION['userinfo'] = ['username' => $username];
echo "<script>alert('微信登录成功!');location.href='/';</script>";
}
}else{
//登录
            $username = $check['用户名'];
session_start();
$_SESSION['userinfo'] = ['username' => $username,'openid' => $openid];
if($username == 'admin'){
//管理员跳转到后台
echo "<script>location.href='/admin/bgsx';</script>";
}else{
//普通用户跳转到首页
echo "<script>alert('微信登录成功!');location.href='/';</script>";
}
}
}else{
echo '没有获取到openid';
}
}
    }

注意,微信服务号的id和key是要和中转站一致的。

最后更新于:2020-02-07 09:26:01


上一篇: 重构PHP通用查询系统之5——PDO操作MYSQL数据库的常用方法

下一篇: 2020年新版EXCEL通用查询系统安装使用教程


  • 最新评论(共0条)
需要登录才能发表评论

加入组织

  • QQ
  • 1. 手Q扫左侧二维码

    2. 搜Q群:617719749

    3. 点击加入学习群

最新评论