Home > Article > Backend Development > A problem with URL redirection in WeChat development
Post the code first:
public function getWxopneURL()
{
$code = I('get.code','','trim');
if(empty($code)){
$redirect_uri = urlencode(get_url());
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$this->appid.'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_base&state=oauth&connect_redirect=1#wechat_redirect';
file_put_contents('url.log', $url);
return header("Location:".$url);
}
//获取access_token
$access_token = file_get_contents("https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->key."&code=".$code."&grant_type=authorization_code");
$access_token = json_decode($access_token,true);
return $access_token['openid'];
}
/**
* 获取当前页面完整URL地址
*/
function get_url($val='',$valb='',$var=array()) {
$sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
if($valb == 'img'){
if (strstr($val,'http:')) return $val;
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$val;
}elseif($valb == 'url'){
$var['token'] = $GLOBALS['userinfo']['token'];
if (strstr($val,'http:')) return $val;
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').U($val,$var);
}
if ($GLOBALS['userinfo']){
$var = $_GET;
if(count(explode('emp_car',$_SERVER['REQUEST_URI'])) == 1)
{
$var['token'] = $GLOBALS['userinfo']['token'];
}
$relate_url = U('',$var) ;
}else{
$php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
$relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
}
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}
====================================
The problem is as follows:
A connection needs to be opened in the WeChat menu.
The link looks like this:
http://rusice.tunnel.qydev.co...
Locally, I use ugrok for penetration on the win platform. is accessible.
But today I put it on the server, Linux environment. Something went wrong.
The captured url is like this:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxdd658ea6d4dbc597&redirect_uri=http%3A%2F%2Fwx.mytbu.cn%2Findex.php%3Fg%3DActivity%26m%3DDoVote&response_type=code&scope=snsapi_base&state=oauth&connect_redirect=1#wechat_redirect
Later I tried it, without parameters, only domain name is possible.
It is also possible to bring one parameter, but not two parameters. I've been looking for this problem all day long, I hope someone can help me, thank you!
Post the code first:
public function getWxopneURL()
{
$code = I('get.code','','trim');
if(empty($code)){
$redirect_uri = urlencode(get_url());
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$this->appid.'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_base&state=oauth&connect_redirect=1#wechat_redirect';
file_put_contents('url.log', $url);
return header("Location:".$url);
}
//获取access_token
$access_token = file_get_contents("https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->key."&code=".$code."&grant_type=authorization_code");
$access_token = json_decode($access_token,true);
return $access_token['openid'];
}
/**
* 获取当前页面完整URL地址
*/
function get_url($val='',$valb='',$var=array()) {
$sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
if($valb == 'img'){
if (strstr($val,'http:')) return $val;
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$val;
}elseif($valb == 'url'){
$var['token'] = $GLOBALS['userinfo']['token'];
if (strstr($val,'http:')) return $val;
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').U($val,$var);
}
if ($GLOBALS['userinfo']){
$var = $_GET;
if(count(explode('emp_car',$_SERVER['REQUEST_URI'])) == 1)
{
$var['token'] = $GLOBALS['userinfo']['token'];
}
$relate_url = U('',$var) ;
}else{
$php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
$relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
}
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}
====================================
The problem is as follows:
A connection needs to be opened in the WeChat menu.
The link looks like this:
http://rusice.tunnel.qydev.co...
Locally, I use ugrok for penetration on the win platform. is accessible.
But today I put it on the server, Linux environment. Something went wrong.
The captured url is like this:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxdd658ea6d4dbc597&redirect_uri=http%3A%2F%2Fwx.mytbu.cn%2Findex.php%3Fg%3DActivity%26m%3DDoVote&response_type=code&scope=snsapi_base&state=oauth&connect_redirect=1#wechat_redirect
Later I tried it, without parameters, only domain name is possible.
It is also possible to bring one parameter, but not two parameters. I've been looking for this problem all day long, I hope someone can help me, thank you!
Have you configured a trusted domain name for authorized login?
This is a problem with URL parsing rules, because &m= is recognized as a parameter of the WeChat interface by default. redirect_uri=http://wx.mytbu.cn/index.php?g=Activity&m=DoVote
The parameter g after ?
is considered to be the parameter of your page index.php, and the m after &
is considered to be Parameters of the previous WeChat interface authorize page.
The problem that took 2 days was finally solved. It turned out that the callback domain name needed to be configured. It took me a long time to find a modified entry below. . . Is this a trap?
What’s even more annoying is the bug in WeChat’s official demo