微信公众号如何处理网页授权登录中的code被使用问题?

2026-06-10 13:041阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1525个文字,预计阅读时间需要7分钟。

微信公众号如何处理网页授权登录中的code被使用问题?

首先,微信公众号新闻页开发内容如下:

1. 开发网页授权登录: - 使用环境:开发工具:Eclipse;服务器:Atomcat8;开发语言:JAVA。

2. 网页授权登录功能: - 采用开发者自定义view类型,点击按钮实现页面跳转链接。

3. 微信网页:

首先微信公众号开发网页授权登录使用环境

开发工具:eclipse;服务器:tomcat8,开发语言:JAVA。

我写的网页授权登录时用开发者模式自定义view类型按钮点击跳转链接的。

微信网页授权登录首先以官方微信开发文档为准,大体共分为4步:

先说第一步获取code:

code说明:code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5扽这未被使用自动过期。

微信公众开发文档给的有获取code的链接,建议直接复制来用,然后替换其中相应的参数即可。

链接为:

open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

其中参数说明:

这官网上都有,这里展示是想说明一下scope参数,请注意看官网上给出的demo:

请注意微信授权登录scope两种redirect_url后面跟的链接使用的协议。

微信公众号如何处理网页授权登录中的code被使用问题?

这个协议使用不当可能会在项目部署到服务器上测试时在安卓和ios上出现问题。

至此,以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面);

以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

参数替换完毕如果以snsapi_userinfo为scope发起的网页授权,是在PC端点击菜单会跳出提示用户同意授权登录,如果用户未关注公众号时同样也会提示,示例页面:

如果是在移动端用户关注情况下则不会出现此页面。

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE,若跳转错误请根据日志输出的错误码在官网上查看相应的说明,附上官网上错误返回码说明:

然后是第二步根据链接传过来的code去获取网页授权access_token:

官网上给出的链接:

api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

这个access_token和基本的access_token不同,具体请参考官网说明,这里给出获取网页授权access_token的JAVA实现方法:

/** * 获取网页授权凭证 * * @param appId 公众账号的唯一标识 * @param appSecret 公众账号的密钥 * @param code * @return WeixinAouth2Token */ public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) { WeixinOauth2Token wat = null; // 拼接请求地址 String requestUrl = "api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; requestUrl = requestUrl.replace("APPID", appId); requestUrl = requestUrl.replace("SECRET", appSecret); requestUrl = requestUrl.replace("CODE", code); // 获取网页授权凭证 JSONObject jsonObject = CommonUtil.api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

然后替换成相应的参数,JAVA代码为:

/** * 通过网页授权获取用户信息 * * @param accessToken 网页授权接口调用凭证 * @param openId 用户标识 * @return SNSUserInfo */ public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) { SNSUserInfo snsUserInfo = null; // 拼接请求地址 String requestUrl = "api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN"; requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId); // 通过网页授权获取用户信息 JSONObject jsonObject = CommonUtil.open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConfig.APP_ID+ "&redirect_uri=" + CommonUtil.urlEncodeUTF8(basePath)+ "&response_type=code" + "&scope=snsapi_userinfo" + "&state=STATE#wechat_redirect"; try { response.sendRedirect(urls);//重定向执行url }catch(Exception e){ e.printStackTrace(); } }

其中Base64.getBase64为Base64加密方法,WeChatConfig.URL为你自己微信公众平台配置的安全域名,CommUtil.urlEncodeUTF8对重定向链接进行编码。

提供一下Base64方法中的加密解密方法,请先下载相应的jar包:

** * Base64工具 CREATE 2016.12.14 form yjf * */ public class Base64 { /** * Base64加密 * */ @SuppressWarnings("restriction") public static String getBase64(String value) { byte[] bytes = null; String basevalue = null; try { bytes = value.getBytes("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (bytes != null) { basevalue = new BASE64Encoder().encode(bytes); } return basevalue; } /** * Base64解密 * */ @SuppressWarnings("restriction") public static String getFromBase64(String basevalue) { byte[] bytes = null; String result = null; if (basevalue != null) { BASE64Decoder decoder = new BASE64Decoder(); try { bytes = decoder.decodeBuffer(basevalue); result = new String(bytes, "utf-8"); } catch (Exception e) { e.printStackTrace(); } } return result; } }

然后时CommUtil.urlEncodeUTF8编码代码:

/** * URL编码(utf-8) * * @param source * @return */ public static String urlEncodeUTF8(String source) { String result = source; try { result = java.net.URLEncoder.encode(source, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; }

然后方法执行response.sendRedirect(urls);跳转回wxyz方法进行获取一系列参数,代码为:

@RequestMapping(value="/wxyz",method=RequestMethod.GET) public ModelAndView wxYz(ModelAndView mvc,HttpServletRequest req,HttpServletResponse response){ System.out.println("微信验证");//测试是否跳转到此方法中 String code=req.getParameter("code");//获取url参数中的code WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken(WeChatConfig.APP_ID, WeChatConfig.APP_SECRET, code); if(weixinOauth2Token.getOpenId()!=null){ String openId = weixinOauth2Token.getOpenId(); req.getSession().setAttribute("openId",openId);//将获取到的openID存入session缓存中 System.out.println("openId"+openId); mvc.addObject("openId",openId); mvc.setViewName("redirect:/weixin/wxLogin"); return mvc; } return null; }

其中AdvancedUtil.getOauth2AccessToken方法时获取网页授权access_token 方法,代码为:

/** * 获取网页授权凭证 * * @param appId 公众账号的唯一标识 * @param appSecret 公众账号的密钥 * @param code * @return WeixinAouth2Token */ public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) { WeixinOauth2Token wat = null; // 拼接请求地址 String requestUrl = "api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; requestUrl = requestUrl.replace("APPID", appId); requestUrl = requestUrl.replace("SECRET", appSecret); requestUrl = requestUrl.replace("CODE", code); // 获取网页授权凭证 JSONObject jsonObject = CommonUtil.open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConfig.APP_ID + "&redirect_uri=" + CommonUtil.urlEncodeUTF8(bassPath1)+ "&response_type=code" + "&scope=snsapi_userinfo" + "&state=STATE#wechat_redirect"; try { response.sendRedirect(url); } catch (IOException e) { e.printStackTrace(); } }else{ return new ModelAndView("weixin/repairs");//返回页面 } return null; }

至此,打开所需要的页面,无论时第一次进入还是刷新 都不会出现code been used这种情况了,至少本人测试没有出现过。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

本文共计1525个文字,预计阅读时间需要7分钟。

微信公众号如何处理网页授权登录中的code被使用问题?

首先,微信公众号新闻页开发内容如下:

1. 开发网页授权登录: - 使用环境:开发工具:Eclipse;服务器:Atomcat8;开发语言:JAVA。

2. 网页授权登录功能: - 采用开发者自定义view类型,点击按钮实现页面跳转链接。

3. 微信网页:

首先微信公众号开发网页授权登录使用环境

开发工具:eclipse;服务器:tomcat8,开发语言:JAVA。

我写的网页授权登录时用开发者模式自定义view类型按钮点击跳转链接的。

微信网页授权登录首先以官方微信开发文档为准,大体共分为4步:

先说第一步获取code:

code说明:code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5扽这未被使用自动过期。

微信公众开发文档给的有获取code的链接,建议直接复制来用,然后替换其中相应的参数即可。

链接为:

open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

其中参数说明:

这官网上都有,这里展示是想说明一下scope参数,请注意看官网上给出的demo:

请注意微信授权登录scope两种redirect_url后面跟的链接使用的协议。

微信公众号如何处理网页授权登录中的code被使用问题?

这个协议使用不当可能会在项目部署到服务器上测试时在安卓和ios上出现问题。

至此,以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面);

以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

参数替换完毕如果以snsapi_userinfo为scope发起的网页授权,是在PC端点击菜单会跳出提示用户同意授权登录,如果用户未关注公众号时同样也会提示,示例页面:

如果是在移动端用户关注情况下则不会出现此页面。

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE,若跳转错误请根据日志输出的错误码在官网上查看相应的说明,附上官网上错误返回码说明:

然后是第二步根据链接传过来的code去获取网页授权access_token:

官网上给出的链接:

api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

这个access_token和基本的access_token不同,具体请参考官网说明,这里给出获取网页授权access_token的JAVA实现方法:

/** * 获取网页授权凭证 * * @param appId 公众账号的唯一标识 * @param appSecret 公众账号的密钥 * @param code * @return WeixinAouth2Token */ public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) { WeixinOauth2Token wat = null; // 拼接请求地址 String requestUrl = "api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; requestUrl = requestUrl.replace("APPID", appId); requestUrl = requestUrl.replace("SECRET", appSecret); requestUrl = requestUrl.replace("CODE", code); // 获取网页授权凭证 JSONObject jsonObject = CommonUtil.api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

然后替换成相应的参数,JAVA代码为:

/** * 通过网页授权获取用户信息 * * @param accessToken 网页授权接口调用凭证 * @param openId 用户标识 * @return SNSUserInfo */ public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) { SNSUserInfo snsUserInfo = null; // 拼接请求地址 String requestUrl = "api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN"; requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId); // 通过网页授权获取用户信息 JSONObject jsonObject = CommonUtil.open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConfig.APP_ID+ "&redirect_uri=" + CommonUtil.urlEncodeUTF8(basePath)+ "&response_type=code" + "&scope=snsapi_userinfo" + "&state=STATE#wechat_redirect"; try { response.sendRedirect(urls);//重定向执行url }catch(Exception e){ e.printStackTrace(); } }

其中Base64.getBase64为Base64加密方法,WeChatConfig.URL为你自己微信公众平台配置的安全域名,CommUtil.urlEncodeUTF8对重定向链接进行编码。

提供一下Base64方法中的加密解密方法,请先下载相应的jar包:

** * Base64工具 CREATE 2016.12.14 form yjf * */ public class Base64 { /** * Base64加密 * */ @SuppressWarnings("restriction") public static String getBase64(String value) { byte[] bytes = null; String basevalue = null; try { bytes = value.getBytes("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (bytes != null) { basevalue = new BASE64Encoder().encode(bytes); } return basevalue; } /** * Base64解密 * */ @SuppressWarnings("restriction") public static String getFromBase64(String basevalue) { byte[] bytes = null; String result = null; if (basevalue != null) { BASE64Decoder decoder = new BASE64Decoder(); try { bytes = decoder.decodeBuffer(basevalue); result = new String(bytes, "utf-8"); } catch (Exception e) { e.printStackTrace(); } } return result; } }

然后时CommUtil.urlEncodeUTF8编码代码:

/** * URL编码(utf-8) * * @param source * @return */ public static String urlEncodeUTF8(String source) { String result = source; try { result = java.net.URLEncoder.encode(source, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; }

然后方法执行response.sendRedirect(urls);跳转回wxyz方法进行获取一系列参数,代码为:

@RequestMapping(value="/wxyz",method=RequestMethod.GET) public ModelAndView wxYz(ModelAndView mvc,HttpServletRequest req,HttpServletResponse response){ System.out.println("微信验证");//测试是否跳转到此方法中 String code=req.getParameter("code");//获取url参数中的code WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken(WeChatConfig.APP_ID, WeChatConfig.APP_SECRET, code); if(weixinOauth2Token.getOpenId()!=null){ String openId = weixinOauth2Token.getOpenId(); req.getSession().setAttribute("openId",openId);//将获取到的openID存入session缓存中 System.out.println("openId"+openId); mvc.addObject("openId",openId); mvc.setViewName("redirect:/weixin/wxLogin"); return mvc; } return null; }

其中AdvancedUtil.getOauth2AccessToken方法时获取网页授权access_token 方法,代码为:

/** * 获取网页授权凭证 * * @param appId 公众账号的唯一标识 * @param appSecret 公众账号的密钥 * @param code * @return WeixinAouth2Token */ public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) { WeixinOauth2Token wat = null; // 拼接请求地址 String requestUrl = "api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; requestUrl = requestUrl.replace("APPID", appId); requestUrl = requestUrl.replace("SECRET", appSecret); requestUrl = requestUrl.replace("CODE", code); // 获取网页授权凭证 JSONObject jsonObject = CommonUtil.open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConfig.APP_ID + "&redirect_uri=" + CommonUtil.urlEncodeUTF8(bassPath1)+ "&response_type=code" + "&scope=snsapi_userinfo" + "&state=STATE#wechat_redirect"; try { response.sendRedirect(url); } catch (IOException e) { e.printStackTrace(); } }else{ return new ModelAndView("weixin/repairs");//返回页面 } return null; }

至此,打开所需要的页面,无论时第一次进入还是刷新 都不会出现code been used这种情况了,至少本人测试没有出现过。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。