柔晶美网络工作室

柔晶美网络工作室,倾心于web技术的博客站点

关注我 微信公众号

您现在的位置是: 首页 > 博客日记

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

2020-02-06 admin php  1715

目前一个微信服务号,只能绑定两个域名,如果需要绑定更多的域名,可以使用中转授权的方法,通过跳转到跳转网站获取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'];
}
    }

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

文章评论


需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!