微信网页授权新版实现

学习 · 2022-03-18

文档

微信官方文档
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

流程

  • 1、引导用户进入授权页面同意授权,获取code
  • 2、通过code换取网页授权access_token(与基础支持中的access_token不同)
  • 3、如果需要,开发者可以刷新网页授权access_token,避免过期
  • 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

    要点

  • 1.snsapi_base的授权是静默的,但是该scope得到的access_token无法取得用户的具体信息
  • 2.snsapi_userinfo的授权是需要要弹出授权允许框供用户测确认允许的的,该scope得到的access_token无法可以得用户的具体信息,比如头像 昵称等。
  • 3.微信官方在去年已经明确规定,用户隐私信息不返回或者置空返回。例如:性别 地区 城市等等。
  • 4.其他微信接口需要的access_token非网页授权的,而是需要使用基础服务的access_token。官方设定为公众号的全局唯一接口调用凭据。

    开发

    需要的接口

  • 微信网页授权链接https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect,用于取得微信授权code
  • 取得授权凭证接口https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code,其中code来自上个链接的回调,code仅在回调 5 分钟内一次使用。

    {// 该接口正确返回的数据结构
    "access_token":"ACCESS_TOKEN", // 授权凭证
    "expires_in":7200, // 超时时间
    "refresh_token":"REFRESH_TOKEN", // 刷新凭证
    "openid":"OPENID", // 当前用户的openid
    "scope":"SCOPE"  // 应用授权作用域 snsapi_base snsapi_userinfo
    }
  • 取得用户信息接口 https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN,用于取得用户基本信息。

    {
      "openid": "OPENID",
      "nickname": "NICKNAME",
      "sex": 1,
      "province": "PROVINCE",
      "city": "CITY",
      "country": "COUNTRY",
      "headimgurl":"https://thirdwx.qlogo...",
      "privilege": ["PRIVILEGE1", "PRIVILEGE2"],
      "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }

实现

public function 登录方法() {
  if((strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false)){
    echo "<script>window.location.href='https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=回调地址response_type=code&scope=snsapi_base#wechat_redirect';</script>";exit;
  }else{
    echo '请使用微信浏览器登录';
    exit;
  }
}

public function 回调方法()
{
    $response = $this->https_request("https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APP_SECRET&code=" . $_GET['code'] . "&grant_type=authorization_code");
    $result_user = json_decode($response, true);

    // refresh_token
    $refresh_response = $this->https_request("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=" . $result_user['refresh_token']);
    $refresh_result_user = json_decode($refresh_response, true);

    //拉出用户信息
    $openid = $this->https_request("https://api.weixin.qq.com/sns/userinfo?access_token=" . $refresh_result_user['access_token'] . "&openid=" . $refresh_result_user['openid'] . "&lang=zh_CN");
    $result_userinfo = json_decode($openid, true);
    // 用户信息
    // [
    //   'nickname' => $result_userinfo['nickname'],
    //   'avatar' => $result_userinfo['headimgurl']
    // ]

}

微信截图_20220318102837.png

Theme Jasmine by Kent Liao | 桂ICP备15008025号-6