PHP TP模板下的微信登录(PC)
2016-05-27 10:53
417 查看
1.微信开发者账号的申请就不说,企业级;官网域名回跳地址。(微信开放平台APPID)
还有注意点:很多应用是放在微信公众号中的,此地微信登录是:微信公众平台APPID
2.请求代码构
这两部代码即可完成对微信的请求
2.编写回调代码:
步骤:
2.1 判断是不是有返回值;
2.2 获取access_token open_id;
2.3 获取微信用户信息;
2.4 检验微信token是否有效;
2.5 根据unionid查询查询本地 是否有数据 有得话,执行本地登录方法,成功或者失败 ;
2.6 没有得话 写入weixin_login user 表各一份数据 微信登陆表 用户表,执行本地登录方法,成功或者失败;
还有注意点:很多应用是放在微信公众号中的,此地微信登录是:微信公众平台APPID
2.请求代码构
<?php class ui_login_weixin_login extends ui { public function __construct() { parent::__construct(); //当前由用户 if (empty($this->uid)) { $biz_weixin_loginapi = new biz_weixin_loginapi(); $weixin_login_url = $biz_weixin_loginapi->get_url_code(); //请求到地址栏 header('location:' . $weixin_login_url); } else { header('location:' . WWW_DOMAIN); } } }
public function get_url_code(){ $url = self::WEIXIN_URL; //回调地址 $code_redirect_uri = urlencode(self::CODE_REDIRECT_URI); // self::CODE_REDIRECT_URI 回调地址需要urlencode ; $state = md5(uniqid(mt_rand(), true)); $_SESSION['weixin_login_state'] = $state; //请求地址 $url .= 'connect/qrconnect?appid='.self::APPID.'&redirect_uri='.$code_redirect_uri.'&response_type=code&scope=snsapi_login&state='.$state.'#wechat_redirect'; return $url; }
这两部代码即可完成对微信的请求
2.编写回调代码:
步骤:
2.1 判断是不是有返回值;
2.2 获取access_token open_id;
2.3 获取微信用户信息;
2.4 检验微信token是否有效;
2.5 根据unionid查询查询本地 是否有数据 有得话,执行本地登录方法,成功或者失败 ;
2.6 没有得话 写入weixin_login user 表各一份数据 微信登陆表 用户表,执行本地登录方法,成功或者失败;
<?php class ui_login_weixin_logincallback extends ui { public function __construct($S, $param) { parent::__construct(); // 如果已登陆 跳转到首页 if (! empty($this->uid)) { header('location:' . WWW_DOMAIN); return null; } $header = loadMod('glob/header'); $footer = loadMod('glob/footer'); $S->assign('header', $header); $S->assign('footer', $footer); $info = $this->login_callback($param['code'], $param['state']); $S->assign('info', $info); } /** * 微信登陆扫码后 访问得方法 */ protected function login_callback($code, $state) { // 如果返回值无code 或者state不对 跳转到首页 if (empty($code) || $state !== $_SESSION['weixin_login_state']) { return array( 'title' => '登陆失败,请重新尝试!', 'url' => '/', 'sec' => 5, 'msg' => 'alert' ); } // 获取access_token open_id $biz_weixin_loginapi = new biz_weixin_loginapi(); $result_access_token = $biz_weixin_loginapi->get_access_token($code); if ($result_access_token['msg'] !== 'success') { return array( 'title' => '登陆失败,请重新尝试!', 'url' => '/', 'sec' => 5, 'msg' => 'alert' ); } $access_token = $result_access_token['data']['access_token']; $open_id = $result_access_token['data']['openid']; // 获取用户信息 $result_user_info = $biz_weixin_loginapi->get_user_info($access_token, $open_id); if ($result_user_info['msg'] !== 'success' || empty($result_user_info['data']['unionid'])) { return array( 'title' => '登陆失败,请重新尝试!', 'url' => '/', 'sec' => 5, 'msg' => 'alert' ); } // 检验token是否有效 $check_token_res = $biz_weixin_loginapi->check_token($access_token, $open_id); if ($check_token_res['msg'] !== 'success') { return array( 'title' => '登陆失败,请重新尝试!', 'url' => '/', 'sec' => 5, 'msg' => 'alert' ); } // 登陆成功 根据unionid查询weixin_login user 是否有数据 有得话 直接读取 没有得话 $biz_login_weixin = new biz_login_weixin(); $user_id = $biz_login_weixin->get_userid_by_weixin_unionid($result_user_info['data']['unionid']); if (is_id($user_id['data'])) { $biz_login = new biz_login(); $biz_login->login($user_id['data'], 'is_login'); return array( 'title' => '登陆成功!', 'url' => '/home/welcome', 'sec' => 3, 'msg' => 'success' ); } // 没有得话 写入weixin_login user 表各一份数据 微信登陆表 用户表 $openid = $result_user_info['data']['openid']; $nickname = $result_user_info['data']['nickname']; $sex = $result_user_info['data']['sex']; $language = $result_user_info['data']['language']; $city = $result_user_info['data']['city']; $province = $result_user_info['data']['province']; $country = $result_user_info['data']['country']; $headimgurl = $result_user_info['data']['headimgurl']; $unionid = $result_user_info['data']['unionid']; $insert_res = $biz_login_weixin->add_weixin($openid, $nickname, $sex, $language, $city, $province, $country, $headimgurl, $unionid); if ($insert_res['msg'] !== 'success' || ! is_id($insert_res['data']['user_id'])) { return array( 'title' => '登陆失败,请重新尝试!', 'url' => '/', 'sec' => 5, 'msg' => 'alert' ); } $biz_login = new biz_login(); $biz_login->login($insert_res['data']['user_id'], 'is_login'); return array( 'title' => '登陆成功!', 'url' => '/home/welcome', 'sec' => 3, 'msg' => 'success' ); } }
public function get_access_token($code, $type = 1){ if(empty($code)) { return array('msg' => 'code_error'); } $url = self::API_URL; if($type === 1) { $appid = self::APPID; $secret = self::APP_SECRET; }else{ $appid = self::APPID_GZ; $secret = self::APP_SECRET_GZ; } $url .= 'sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code'; //获取access_token $res_json = runCurl($url); if(!$res_json) { return array('msg' => 'runCurl_error'); } $res_arr = json_decode($res_json, true); if(isset($res_arr['errcode'])) { return array('msg' => $res_arr['errmsg']); } return array('msg' => 'success', 'data' => $res_arr); }
public function get_user_info($access_token, $open_id){ if(empty($access_token) || empty($open_id)) { return array('msg' => 'empty_token_or_openid'); } $url = self::API_URL; $url .= 'sns/userinfo?access_token='.$access_token.'&openid='.$open_id; $res_json = runCurl($url); if(!$res_json) { return array('msg' => 'runCurl_error'); } $res_arr = json_decode($res_json, true); if(isset($res_arr['errcode'])) { return array('msg' => $res_arr['errmsg']); } return array('msg' => 'success', 'data' => $res_arr); }
public function check_token($access_token, $open_id){ if(empty($access_token) || empty($open_id)) { return array('msg' => 'empty_token_or_openid'); } $url = self::API_URL; $url .= 'sns/auth?access_token='.$access_token.'&openid='.$open_id; $res_json = runCurl($url); if(!$res_json) { return array('msg' => 'runCurl_error'); } $res_arr = json_decode($res_json, true); if( $res_arr['errcode'] !== 0 ) { return array('msg' => $res_arr['errmsg']); } return array('msg' => 'success'); }
相关文章推荐
- 仿微信支付页面
- 微信订阅号里实现oauth授权登录,并获取用户信息 (完整篇)
- 微信公众号开发(一、接收用户消息自动回复)
- 如何在微信朋友圈分享网页内容的时候能够有缩略图
- iOS 即时通讯 + 仿微信聊天框架 + 源码
- ios 微信登录
- 一个小程序:二分查找法寻找插入点
- 微信公众平台开发测试地址只能是花生壳了
- 关于“为什么很多人从qq转向使用微信?”的思考
- 微信分销如何发展回头客?
- 微信扫描支付
- Android使用Retrofit技术仿微信图片上传,可以选择多张图片拍照上传
- 微信订阅号发送?回复当前时间
- Android逆向之反编译微信客户端注入恶意代码盗取账号密码
- 微信开发调试
- java --微信支付
- 有图有话 | 嘘……你屏蔽了哪个微信群?
- android微信支付问题总结
- 支付宝或者微信支付的回调处理
- JAVA版微信支付V3-完全版