实现微信账号与WordPress账号的绑定

from:http://www.powerxing.com/wechat-account-link-to-wordpress/


 

WordPress上已经有不少能实现微信订阅号/公众号连接WordPress的插件,如微信公众订阅号插件、连接微信、微信机器人等,可以实现两者的内容同步,也可以自定义关键词回复,推送相关文章。

不过这类插件还没有实现的一个功能就是微信的账号跟WordPress账号的绑定,若用WordPress二次开发一些带有会员功能的公众号,往往需要以微信的账号(openid)作为WordPress的账号,这样在获取微信授权后,就可以直接实现登陆,省去用户再注册账号的繁琐步骤。

实现的流程很简单:

  1. 若用户未登陆,则引导用户访问微信oauth2授权页面,取得code
  2. 通过code换取网页授权access_token
  3. 返回access_token的同时已经返回了openid,通过openid就可以登陆了。
  4. 通常我们还需要用户的昵称头像等信息,因此用户首次访问时,需要再通过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代码如下:

  1. function power_user_is_login() {
  2. $appID = ;
  3. $appsecret = ;
  4. $wechat_token = ; // 开发中心的token
  5.  
  6. // 排除跳转至oauth2的页面
  7. if ( strpos($_SERVER[“REQUEST_URI”], ‘wp-login.php’) !== false || strpos($_SERVER[“REQUEST_URI”], $wechat_token) !== false ) return;
  8.  
  9. if (!is_user_logged_in()) {
  10.  
  11. if ( isset($_GET[‘code’]) ) {
  12. $code = $_GET[‘code’];
  13. $url = ‘https://api.weixin.qq.com/sns/oauth2/access_token?appid=’.$appID.‘&secret=’.$appsecret.‘&code=’.$code.‘&grant_type=authorization_code’;
  14.  
  15. $ch = curl_init();
  16. curl_setopt($ch, CURLOPT_URL, $url);
  17. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  18. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  19. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  20. $json = curl_exec($ch);
  21. $json = json_decode($json);
  22.  
  23. if ( isset($json->errcode) ) {
  24. header(“Content-type: text/html; charset=utf-8”);
  25. echo ‘系统出错,获取用户信息失败,请重试’; exit();
  26. }
  27.  
  28. $access_token = $json->access_token;
  29. $openid = $json->openid;
  30.  
  31. if ( !username_exists($openid) ) {
  32. $url = ‘https://api.weixin.qq.com/sns/userinfo?access_token=’.$access_token.‘&openid=’.$openid.‘&lang=zh_CN’;
  33. curl_setopt($ch, CURLOPT_URL, $url);
  34. $json = curl_exec($ch);
  35. $json = json_decode($json);
  36.  
  37. if ( isset($json->errcode) ) {
  38. header(“Content-type: text/html; charset=utf-8”);
  39. echo ‘系统出错,获取用户基本信息失败,请重试’; exit();
  40. }
  41.  
  42. $avator = $json->headimgurl;
  43. if (!$avator) $avator = ;
  44. if (substr($avator, 2) == ‘/0’) {
  45. $avator = substr($avator, 0, 2).‘/132’;
  46. }
  47.  
  48. $userdata = array(
  49. ‘user_login’ => $openid,
  50. ‘display_name’ => $json->nickname,
  51. ‘user_url’ => $avator,
  52. ‘user_pass’ => NULL,
  53. );
  54.  
  55. $user_id = wp_insert_user( $userdata ) ;
  56.  
  57. //On success
  58. if( is_wp_error($user_id) ) {
  59. echo ‘系统出错,创建用户失败,请重试’; exit();
  60. }
  61.  
  62. }
  63.  
  64. $user = get_userdatabylogin($openid);
  65. $user_id = $user->ID;
  66.  
  67. wp_set_current_user($user_id, $openid);
  68. wp_set_auth_cookie($user_id);
  69.  
  70. curl_close($ch);
  71.  
  72. } else {
  73. $site_uri = site_url();
  74. $redirect_uri = urlencode($site_uri.$_SERVER[“REQUEST_URI”]);
  75. $scope = ‘snsapi_userinfo’;
  76. $url = ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=’.$appID.‘&redirect_uri=’.$redirect_uri.‘&response_type=code&scope=’.$scope.‘&state=login#wechat_redirect’;
  77.  
  78. header(“Location: “.$url);
  79. exit();
  80. }
  81. }
  82. }
  83.  
  84. add_action( ‘init’, ‘power_user_is_login’);
php

补充appid等信息,然后将代码复制到主题中的function.php中,用户未登陆时,访问任一页面则会跳转到微信oauth2页面。用户验证登陆成功后,会返回到该页面中。