当前位置: 首页 > 后端技术 > PHP

微信网页授权

时间:2023-03-29 19:51:39 PHP

重新梳理已经做过的功能,过程中遇到问题,回顾过去知道新官方文档1准备(a.接入b.配置)a)修改/添加业务域名,网页授权域名;authorization回调域名不加http://协议头。微信绑定时要求将*.txt文件上传至根目录。需要将文件添加到我项目的.htaccess权限中,保证文件可以访问,否则绑定不通过b)公共平台参数appidsecret二函数过程结合项目实现如下功能:a)先授权获取userData存储库openid/unionid关系对应关系b)openid/unionidsession缓存c)在session有效期内延时d)access_token缓存并刷新;简单画个流程图:access_token缓存/刷新感觉没必要;因为openid过期了,必须重新获取;代码获取需要重定向,可以写在父类中;ci框架类WX_Controller扩展CI_Controller{public$wx_code;公共$wx_openid;公共$wx_unionid;公共$access_token;公共函数__construct(){parent::__construct();$this->load->library('session');//有会话缓存刷新缓存时间if(isset($_SESSION['openid'])){$this->session->mark_as_temp('openid',WX_USER_TEMPTIME);$this->session->mark_as_temp('unionid',WX_USER_TEMPTIME);$this->session->mark_as_temp('userData',WX_USER_TEMPTIME);}else{//1.鳕鱼e$this->get_wx_code();//2.token和openid$this->get_wx_acctoken();//3.验证token//4.如果第一次授权请求微信,否则查库获取userData$this->load->model('Mwxuser');$where=array('openid'=>$this->wx_openid);$userData=$this->Mwxuser->wx_user_list(0,1,$where);if(!$userData){$userData=$this->get_wx_user_data();}//5.缓存openidunioniduserData$sessionData=array('openid'=>$this->wx_openid,'unionid'=>$this->wx_unionid,'userData'=>$userData);$this->session->set_userdata($sessionData);}}}代码/*------------------------------------*\微信授权登录\*---------------------------------------------------------*///获取wx代码公众号范围:snsapi_userinfo也是静默的publicfunctionget_wx_code(){$code=$this->input->get('code');如果($code){$this->wx_code=$code;}else{$wx_get_code='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.WX_APP_ID.'&redirect_uri='.urlencode(UNION_INDEX).'&response_type=code&scope=snsapi_userinfo&state=STATE#微信重定向';$this->load->helper('url');重定向($wx_get_code);}}acc-token//获取wxaccesstoken//FIXME.jtwang:在这里缓存token好像没用,如果session-openid过期了,在这里缓存token也是没用的publicfunctionget_wx_acctoken(){//a.查询有效令牌//b.令牌过期刷新令牌刷新//c.刷新令牌过期并重新获取$this->load->library('mycurl');$wx_get_token='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.WX_APP_ID.'&secret='.WX_SECRET.'&code='.$this->wx_code.'&grant_type=authorization_code';$returnContent=$this->mycurl->curl_get($wx_get_token);$returnContent=json_decode($returnContent,true);如果(!isset($returnContent['access_token'])){die('error-page-todo-later-token'.$returnContent['errcode']);$access_token=$returnContent['access_token'];$refresh_token=$returnContent['refresh_token'];$this->wx_openid=$returnContent['openid'];//openid$this->wx_unionid=$returnContent['unionid'];//unionid$token_tempdate=time()+7200;$refresh_tempdate=time()+30*24*60*60;$this->access_token=$access_token;}拉取userData//请求微信拉取用户信息返回userDatapublicfunctionget_wx_user_data(){$wx_get_userinfo='https://api.weixin.qq.com/sns/userinfo?access_token='.$this->access_token.'&openid='.$this->wx_openid.'&lang=zh_CN';$returnContent=$this->mycurl->curl_get($wx_get_userinfo);$returnContent=json_decode($returnContent,true);如果(!isset($returnContent['openid'])){die('error-page-todo-later-userdata'.$returnContent['errcode']);}$userData=array();$userData['openid']=$returnContent['openid'];$userData['unionid']=$returnContent['unionid'];$userData['昵称']=$returnContent['昵称'];//$userData['sex']=$returnContent['sex'];$userData['省']=$returnContent['省'];$userData['city']=$returnContent['city'];$userData['国家']=$returnContent['国家'];$userData['headimgurl']=$returnContent['headimgurl'];//$userData['privilege']=$returnContent['privilege'];//入库$this->load->model('Mwxuser');$res=$this->Mwxuser->wx_user_add($userData);如果(!$res){死('error-page-todo-lateradduser-dataerror');}返回$userData;}}如有不妥请指教。