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是要和中转站一致的。