from:http://www.powerxing.com/wechat-account-link-to-wordpress/
WordPress上已经有不少能实现微信订阅号/公众号连接WordPress的插件,如微信公众订阅号插件、连接微信、微信机器人等,可以实现两者的内容同步,也可以自定义关键词回复,推送相关文章。
不过这类插件还没有实现的一个功能就是微信的账号跟WordPress账号的绑定,若用WordPress二次开发一些带有会员功能的公众号,往往需要以微信的账号(openid)作为WordPress的账号,这样在获取微信授权后,就可以直接实现登陆,省去用户再注册账号的繁琐步骤。
实现的流程很简单:
- 若用户未登陆,则引导用户访问微信oauth2授权页面,取得code
- 通过code换取网页授权access_token
- 返回access_token的同时已经返回了openid,通过openid就可以登陆了。
- 通常我们还需要用户的昵称头像等信息,因此用户首次访问时,需要再通过access_token获取基本信息,再通过这些基本信息创建一个WordPress用户。创建用户之后,以后的登陆只需要进行到第3步即可。
微信用户的信息获取查看官方API文档(http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息)即可,通过使用WprdPress提供的函数,可以很方便的实现上述流程。
主要应用到了 PHP 的 cURL 来进行api的通信,然后通过 WordPress 函数 wp_insert_user()
创建新用户、函数 wp_set_current_user()
和 wp_set_auth_cookie()
实现用户登陆。
PHP代码如下:
- function power_user_is_login() {
- $appID = ”;
- $appsecret = ”;
- $wechat_token = ”; // 开发中心的token
- // 排除跳转至oauth2的页面
- if ( strpos($_SERVER[“REQUEST_URI”], ‘wp-login.php’) !== false || strpos($_SERVER[“REQUEST_URI”], $wechat_token) !== false ) return;
- if (!is_user_logged_in()) {
- if ( isset($_GET[‘code’]) ) {
- $code = $_GET[‘code’];
- $url = ‘https://api.weixin.qq.com/sns/oauth2/access_token?appid=’.$appID.‘&secret=’.$appsecret.‘&code=’.$code.‘&grant_type=authorization_code’;
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
- $json = curl_exec($ch);
- $json = json_decode($json);
- if ( isset($json->errcode) ) {
- header(“Content-type: text/html; charset=utf-8”);
- echo ‘系统出错,获取用户信息失败,请重试’; exit();
- }
- $access_token = $json->access_token;
- $openid = $json->openid;
- if ( !username_exists($openid) ) {
- $url = ‘https://api.weixin.qq.com/sns/userinfo?access_token=’.$access_token.‘&openid=’.$openid.‘&lang=zh_CN’;
- curl_setopt($ch, CURLOPT_URL, $url);
- $json = curl_exec($ch);
- $json = json_decode($json);
- if ( isset($json->errcode) ) {
- header(“Content-type: text/html; charset=utf-8”);
- echo ‘系统出错,获取用户基本信息失败,请重试’; exit();
- }
- $avator = $json->headimgurl;
- if (!$avator) $avator = ”;
- if (substr($avator, –2) == ‘/0’) {
- $avator = substr($avator, 0, –2).‘/132’;
- }
- $userdata = array(
- ‘user_login’ => $openid,
- ‘display_name’ => $json->nickname,
- ‘user_url’ => $avator,
- ‘user_pass’ => NULL,
- );
- $user_id = wp_insert_user( $userdata ) ;
- //On success
- if( is_wp_error($user_id) ) {
- echo ‘系统出错,创建用户失败,请重试’; exit();
- }
- }
- $user = get_userdatabylogin($openid);
- $user_id = $user->ID;
- wp_set_current_user($user_id, $openid);
- wp_set_auth_cookie($user_id);
- curl_close($ch);
- } else {
- $site_uri = site_url();
- $redirect_uri = urlencode($site_uri.$_SERVER[“REQUEST_URI”]);
- $scope = ‘snsapi_userinfo’;
- $url = ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=’.$appID.‘&redirect_uri=’.$redirect_uri.‘&response_type=code&scope=’.$scope.‘&state=login#wechat_redirect’;
- header(“Location: “.$url);
- exit();
- }
- }
- }
- add_action( ‘init’, ‘power_user_is_login’);
补充appid等信息,然后将代码复制到主题中的function.php中,用户未登陆时,访问任一页面则会跳转到微信oauth2页面。用户验证登陆成功后,会返回到该页面中。