极简「Oauth2.0」微信网页授权教程

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

简要说明:

本文使用java web实现微信网页授权,整个授权过程是基于Oauth2.0授权码模式,这里不再赘述Oauth2.0。授权过程分为4步:
页面重定向至授权页面,获取code

  • 用户授权后,页面带着code重定向至client指定地址,使用code换取accessToken

  • 刷新accessToken(过期需要)

  • 使用accessToken获取用户信息(通常openId,nickname,headimgurl)

开发前准备工作:

  • 测试公众号,相当于你的开发主体在微信授权中心登记。需要appid,appsecret等信息

  • 内网穿透工具,需要和微信进行交互,本文使用的是NATAPP

  • web应用,本文使用springboot2+thymeleaf+joddhttp

代码片段:

1.开发跳转微信授权接口,直接将页面重定向,注意参数REDIRECTP_URI需要URLEncode。

String AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=%s&scope=%s&state=%s#wechat_redirect";
@GetMapping(value = "login")
public void wx(HttpServletRequest request, HttpServletResponse response) throws IOException {
    //1:重定向到授权页面: 引导用户进入授权页面同意授权,获取code
    String codeUrl = String.format(AUTHORIZE_URL, APPID, URLEncoder.encode(REDIRECT_URI, "utf-8"), RESPONSE_TYPE, SCOPE, STATE);
    response.sendRedirect(codeUrl);
}

2.用户授权后,微信会在上一步的REDIRECTP_URI拼接参数code。

String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
String GET_UERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN";
@GetMapping(value = "callback")
public ModelAndView wxcallback(@RequestParam("code") String code) throws IOException {
    //2:使用code换取access_token
    String accessTokenUrl = String.format(ACCESS_TOKEN_URL, APPID, APPSECRET, code);
    HttpResponse accessTokenResp = HttpRequest.get(accessTokenUrl).send();          
    JSONObject jsonObject = JSON.parseObject(accessTokenResp.bodyText());
    String token = jsonObject.getString("access_token");
    String openid = jsonObject.getString("openid");
    //3:刷新access_token (if need)
    //4:获取用户信息
    String getUerinfoUrl = String.format(GET_UERINFO_URL, token, openid);
    HttpResponse userinfoResp = HttpRequest.get(getUerinfoUrl).send();
    WxUser wxUser = JSON.parseObject(userinfoResp.charset("utf-8").bodyText(), WxUser.class);
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("userinfo", wxUser);
    modelAndView.setViewName("wx/wx_succ");
    return modelAndView;
}

3.简单的测试页面,展示下用户数据。

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>昵称:<p th:text="${userinfo.nickname}"></p></div>
    <div>头像:<img width="100" th:src="${userinfo.headimgurl }"></div>
</body>
</html>

4.验证结果。
在这里插入图片描述

整体实现还是比较简单的,但这也是Oauth2.0授权码模式的整个流程,其他网站类似(如github,微博等)。

微信OAuth2.0网页授权接口 微信OAuth2.0网页授权接口的thinkphp实现版本,主要实现了oauth网页受权,以及部分其他接口。 使用方法 为什么用OAuth2.0受权? 通过OAuth2.0受权的网页将会获取到打开者的微信信息,甚至包括微信昵称、头像等有用的数据,开发者们可以凭此设计出更多更丰富的页面应用,比如最近一直很火爆的红包类活动。除此之外还有个额外的好处,就是可以控制页面在非微信浏览器中无法打开,可以减少代码被人窥窃的风险。 那么红包类活动是如何使用OAuth2.0受权接口的呢? 1.首先用户打开页面连接(php页面),php接收到请求后将页面跳转到微信OAuth2.0受权页面,在获取到受权后再次将页面跳转回php服务器;此次跳转中带有用户的各种信息,php服务器记录后返回用户所看到的页面。 2.然后用户转发此页面,在转发的连接中带有自己的标识参数。当好友点击分享后的连接的时候也会重复第1步的步骤,当php服务器发现从微信OAuth2.0受权返回的数据中的用户数据与标识参数对应的分享者的用户数据不一致的时候,则可以判断出有好友打开了分享页面,给用户增加一个红包。 使用方法 AuthAction.class.php ---- 认证基类 IndexAction.class.php --- 测试类 index/Conf/config.php --- 设置 wx_appID 微信公众账号的appid wx_appsecret 微信公众账号的appsecret weixin_token 微信公众账号接口配置信息的Token wx_webauth_callback_url OAuth2.0授权后跳转到的默认页面 wx_webauth_expire OAuth2.0授权Token过期时间默认6500 配置好config.php后在微信公号后台设置index.php/Index/wechatInitAuth进行微信API认证,提示"配置成功"后方可使用。 测试公众号申请与具体的测试步骤见下方。 测试 IndexAction.class.php --- 测试类 申请微信测试公众帐号 微信提供测试用的公众账号,此帐号只能添加100个关注者且只有已关注的用户才可以进行OAuth2.0受权。 点此开通测试帐号 1.开通后将appID、appsecret、Token填入index/Conf/config.php中。然后将接口配置信息中的URL改至php服务器,将地址定位到index.php/Index/wechatInitAuth进行微信API认证,直到提示"配置成功"。 2.点击‘体验接口权限表--OAuth2.0网页授权(仅关注者才能授权)’中的修改,将授权回调页面域名改为php服务器地址。直到出现‘通过安全监测’。 配置完微信测试号后,在微信中打开http://项目目录/index.php(例:http://121.40.135.90/weixin_auth/index.php)将会在页面中打印出session中的受权数据,表示测试受权成功。 代码结构 在AuthAction中的初始化函数_initialize中进行了OAuth2.0受权,所有基于AuthAction的控制器都将进行受权过程(除了微信API认证过程wechatInitAuth)。 对于同一用户在受权过期时间内多次打开此控制器的页面,将不会进行多次受权,因为其受权信息记录在session中,以免重复受权,减慢访问速度。受权过期时间在index/Conf/config.php中wx_webauth_expire设置,建议不要大于微信的过期时间7200秒。 注意: 微信OAuth2.0受权分为snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息),AuthAction.class.php默认为snsapi_base,而且session中只记录了snsapi_base中的基础数据,如需要snsapi_userinfo请自行修改。 具体的实现方法见代码注释。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小麦

一起学习共同进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值