Java微信公众号开发之使用拦截器获取粉丝openID

目的

本次实现的目的是:在微信公众号项目中,可能在每次访问页面的时候需要带上openid或者授权,查数据库太耗性能、多次多个地方去调授权接口也不是最佳的方案,如果能利用拦截器拦截到每次请求访问后台,这个时候在拦截器里判断是否已经有这个粉丝的openid,如果获取到了openid,就不用去走授权获取用户信息接口了,那么从哪里取这个openid呢,可以从Redis或其他缓存库里取,我使用了的拦截器处理:从Session里去取openid,取openid的前提是在第一次授权获取用户信息后,你需要将openId存到session里去,然后每次请求拦截器会拦截相关Api请求,从session中获取openid,然后判断openid,以此来做业务判断,如果获取不到就去走授权接口;

一、实现

  1.创建一个拦截器,拦截器配置如下,对拦截器不熟悉的请看:如何自定义一个拦截器

<
### Java 微信公众号 实现 获取 OpenID 示例代码 为了通过Java项目实现微信公众号获取OpenID功能,可以按照以下方法操作。此过程涉及使用AppID、AppSecret以及用户授权码(code),并通过调用微信API来获得用户的OpenID。 #### 准备工作 确保已经注册并配置好微信公众平台账号,并拥有合法的应用程序标识符(AppID)和应用程序密钥(AppSecret)[^1]。 #### 用户授权重定向URL构建 当用户访问应用时,需先引导其至微信OAuth2.0授权页面完成登录授权动作: ```java // 构建授权链接 String appId = "your_appid"; // 替换成实际的appid String redirectUrl = URLEncoder.encode("http://example.com/callback", "UTF-8"); // 回调地址编码处理 String scope = "snsapi_base"; // 如果只需要获取openid则设置为snsapi_base;如果还需要其他信息,则设为snsapi_userinfo StringBuilder authUrlBuilder = new StringBuilder(); authUrlBuilder.append("https://open.weixin.qq.com/connect/oauth2/authorize?") .append("appid=").append(appId) .append("&redirect_uri=").append(redirectUrl) .append("&response_type=code&scope=").append(scope).append("#wechat_redirect"); ``` #### 处理回调请求中的Code参数 一旦用户同意授权后会被重定向回指定的`redirect_url?code=CODE&state=STATE`路径,在这里可以从HTTP GET请求中提取出临时票据(code),用于下一步换取access_token及openid: ```java @WebServlet("/callback") public class CallbackServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String code = request.getParameter("code"); if (null != code && !"".equals(code.trim())) { try { // 使用code去交换access_token 和 openid String accessTokenAndOpenId = getAccessTokenAndOpenIdByCode(code); // 解析返回的结果... } catch (Exception e) { logger.error(e.getMessage(), e); } } // 继续后续逻辑... } } ``` #### 调用接口获取Access Token 及 OpenID 最后一步就是利用上一步得到的code向微信服务器发起POST请求以获取最终所需的access_token与openid组合数据包: ```java private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token"; /** * 根据授权后的code获取access_token和openid. */ private String getAccessTokenAndOpenIdByCode(String code) throws Exception{ Map<String,Object> params = Maps.newHashMap(); params.put("appid","your_appid"); params.put("secret","your_secret"); params.put("code",code); params.put("grant_type","authorization_code"); ResponseEntity<String> resultEntity = RestTemplateUtil.postForResponseEntity(ACCESS_TOKEN_URL,params); JSONObject jsonObject = JSON.parseObject(resultEntity.getBody()); return JsonUtils.toJSONString(jsonObject); // 返回json字符串形式的数据给前端解析 } ``` 上述代码片段展示了如何在一个典型的Web环境中集成微信OAuth2.0认证机制从而安全有效地取得用户的唯一身份识别号——OpenID
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Thinkingcao

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值