开发之前最好看下官方文档QAQ
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
5 附:检验授权凭证(access_token)是否有效
第一步:用户同意授权,获取code
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:
尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问
尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。
参数说明
下图为scope等于snsapi_userinfo时的授权页面:
用户同意授权后
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
错误返回码说明如下:
第二步:通过code换取网页授权access_token
首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。
请求方法
参数说明
返回说明
正确时返回的JSON数据包如下:
错误时微信会返回JSON数据包如下(示例为Code无效错误):
第三步:刷新access_token(如果需要)
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
请求方法
返回说明
正确时返回的JSON数据包如下:
错误时微信会返回JSON数据包如下(示例为code无效错误):
第四步:拉取用户信息(需scope为 snsapi_userinfo)
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
请求方法
参数说明
返回说明
正确时返回的JSON数据包如下:
错误时微信会返回JSON数据包如下(示例为openid无效):
附:检验授权凭证(access_token)是否有效
请求方法
参数说明
返回说明正确的JSON返回结果:
错误时的JSON返回示例:
public function actionWxThirds(){ //公众号 $appid='公众号appid'; $redirect_uri=urlencode('回调地址');//将字符串以url编码 $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo"; header("Location:".$url);//header函数向客户发送原始的HTTP报头}
public function actionRedirect(){ $code = Yii::$app->request->get('code'); $json = $this->actionAccessToken($code); $json = json_decode($json,true); $url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$json['access_token']."&openid=".$json['openid']; // 用户信息 $userInfos = $this->https_request($url); if($userInfos){ $userInfos = json_decode($userInfos,true); $userInfos['time'] = time()+600; //微信用户信息时长 Yii::$app->session['H5_wx_userInfo'] = $userInfos; $this->actionCheckWxInfo($userInfos); }}private function actionAccessToken($code){ $appid="公众号appid"; $appsecret="公众号的appsecret"; $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code"; $ret=$this->https_request($url); return $ret;}
private function https_request($url){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output;}