url 处理

微信授权后,返回的链接带有code 和 state 参数, 而code是一段字符串,而且是一次性的。
如果用户在认证后的页面将链接分享出去, 那么别的用户点击这个链接将会出现认证失败的情况。
对于这个问题,有三种处理方法:

  • php 尾处理,认证后queryString,将参数中的code和state去除掉
  • php 首处理,首次进入页面, queryString, 处理掉code和state参数
  • JS-SDK, 分享链接时,去除掉

php 尾处理

授权成功后,queryString, 将参数code和state过滤,重新拼接字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
//认证成功,处于登录状态
//todo

$params = explode('&', $_SERVER['QUERY_STRING']);
$urlHost = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?';
foreach ( $params as $k => $v ){
if ( empty($v) ) //去掉空白
continue;
if ( preg_match("/^code=|^state/", $v) ) //过滤 code state
continue;
$urlHost .= $v.'&';
}
header('Location: '.$urlHost);

php 首处理

利用SESSION标志用户是否是第一次授权。

1
2
3
4
5
6
7
if ( $_SESSION['oauthUrl'] ){ 
// queryString
// todo
$_SESSION[oauthUrl] = false; //处理完毕 置为false
}

// Oauth 过程

JS-SDK 处理

公众号开发者文档 。 JS-SDK的分享接口处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
wx.onMenuShareTimeline({
title: '', // 分享标题
link: '', // 分享链接 可以设置链接
imgUrl: '', // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});

wx.onMenuShareAppMessage({
title: '', // 分享标题
desc: '', // 分享描述
link: '', // 分享链接
imgUrl: '', // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});

本次的一个示例代码: https://github.com/chendongbupt/blog-example/blob/master/weChatOauth/filterUrl.php