您的位置 首页 > 数码极客

如何获取微信授权的code如何获取微信授权的appid!

背景:

2021-12-27 微信 cgi-bin/user/info 接口不再提供用户头像和昵称信息,大家无法在用户扫码通过关注事件无感知到拿到相关信息了;

按官方说法,获取用户头像昵称数据都需要用户前端网页授权,需要使用 sns/userinfo 接口;


补充:此方案针对的是公众号授权开放平台之后的,获取用户信息的流程;如果是独立的公众号或小程序,理论上和这个流程大体一致,但更为简单;如有疑问可以在评论留言。


方案流程如下:

如果是纯服务端开发,没有前端页面跳转,则需要有个跳转获取code的过程;

// 1.微信登录;第一次没有code,会自跳转生成一个code public function wxLogin() { $appid = I('appid'); // 某一个公众号的appid if (!isset($_GET['code'])) { $this->getCode($appid); } $tokenData = $this->getComponentAccessToken($appid, $_GET['code']); if (empty($tokenData['status']) { echo '授权失败' exit; } $userInfo = $this->getUserInfo($tokenData['data']['openid'], $tokenData['data']['access_token']); return $userInfo; } // 自跳转过程 public function getCode($appid, $scope='snsapi_userinfo') { $request = array( 'appid' => $appid, 'redirect_uri' => get_request_scheme().$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], 'response_type' => 'code', 'scope' => $scope, 'state' => 'state', 'component_appid' => C('APPID'), // 开放平台的appid ); $url = ';.http_build_query($request).'#wechat_redirect'; header("location: {$url}"); exit; } // 2.获取该appid授权的开放平台的access_token public function getComponentAccessToken($appid, $code): array { $url = "sns/oauth2/component/access_token"; $param = [ 'appid' => $appid, 'code' => $code, 'grant_type' => 'authorization_code', 'component_appid' => C('APPID'), // 开放平台的appid 'component_access_token' => $this->componentToken(), ]; $fetchData = $this->curlGet($url . '?' . http_build_query($param)); if (empty($fetchData)) { return ['status' => 0, 'msg' => '微信服务器登录失败', 'data' => []]; } //错误返回 {"errcode":40029,"errmsg":"invalid code"} //正确返回 {"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"oINQu5d6uAwEhIgFvpbah4atffbc","scope":"SCOPE"} $fetchData = json_decode($fetchData, true); if (isset($fetchData['errcode'])) { return ['status' => 0, 'msg' => $fetchData['errcode'] . '-' . $fetchData['errmsg'], 'data' => $fetchData]; } return ['status' => 1, 'msg' => '', 'data' => $fetchData]; } // 3. 获取公众号用户信息 // public function getUserInfo($openid, $access_token): array { $param = [ 'access_token' => $access_token, 'openid' => $openid, 'lang'=>'zh_CN', ]; $url = "sns/userinfo"; //请求失败:{"errcode":40003,"errmsg":" invalid openid "} //请求成功:{ // "openid": "OPENID", // "nickname": NICKNAME, // "sex": 1, // "province":"PROVINCE", // "city":"CITY", // "country":"COUNTRY", // "headimgurl":";, // "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ], // "unionid": "o6_bmasdasdsad6_xxxxxx" //} $fetchData = $this->curlGet($url . '?' . http_build_query($param)); if (empty($fetchData)) { return ['status' => 0, 'msg' => '微信服务器获取用户信息失败', 'data' => []]; } $fetchData = json_decode($fetchData, true); if (isset($fetchData['errcode'])) { return ['status' => 0, 'msg' => $fetchData['errcode'] . '-' . $fetchData['errmsg'], 'data' => $fetchData]; } return ['status' => 1, 'msg' => '', 'data' => $fetchData]; } public function curlGet($url, $headers = []) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = curl_exec($ch); curl_close($ch); return $data; } // 获取第三方平台component_access_token // {"component_access_token":"8BINO1szMZtuJshySnl6TEMXkmSdM-E8le1yzC4U9tPmLUr2wLEUJCaL9QIxFPT_OcoXAkNDMpm0HuPJzFASitiS-Daskk1URPy7xaUe1yNCPu_73oVDyXYsqFg0zVmxXVVjAHATRR","expires_in":7200} // 每个令牌是存在有效期(2小时)的,且令牌的调用不是无限制的,请第三方平台做好令牌的管理,在令牌快过期时(比如1小时50分)再进行刷新 public function componentToken() { $redis = new Redis(); $componenttoken = $redis->get(C('CTKEY')); if (!empty($componenttoken)) return $componenttoken; // VTKEY 参考 // 需要在微信服务器推送的时候存起来; 在这里用上 $verifyticket = $redis->get(C('VTKEY')); $params = array( 'component_appid' => C('APPID'), 'component_appsecret' => C('APPSECRET'), 'component_verify_ticket' => $verifyticket, ); $ret = $this->curlGet('cgi-bin/component/api_component_token', $params); $redis->set(C('CTKEY'), $ret['component_access_token'], C('CTTTL')); return $ret['component_access_token']; }


参考官方文档:

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“如何获取微信授权的code,如何获取微信授权的appid,如何获取微信授权登录,获取微信授权失败怎么解决,如何授权微信获取位置信息”边界阅读