java微信网页授权获取openid报40163错code被使用的简易解决方案,无需在菜单链接上加connect_redirect=1

这里写自定义目录标题

问题分析

造成这种报错的原因基于官方的解释是微信端发送了两次相同的请求用户信息时使用同一个code值导致的报错,所以且不论这种设定是否合理,我们解决问题还是得从自身的服务器或者代码找到原因来解决。我的微信公众号的业务流程是通过微信端的菜单请求https://open.weixin.qq.com/connect/oauth2/authorize
获取code值再根据配置的redirect_uri将code值传到后台
在后台用这个code值请求
https://api.weixin.qq.com/sns/oauth2/access_token
来获取当前用户的openid
我分析得出的原因是服务器在后台请求获取openId的速度过慢导致微信端迟迟收不到回应故而重新发送一条,结果用一个相同的code请求两次导致报错

解决思路

网上说的大部分是通过加connect_redirect=1来解决这个问题,但是在我这里不适用(我猜可能是微信端前些年可能有这个参数但是后来给删了因为官方文档上也没有这个参数说明),我的解决思路是在第一次请求时用code设置一个短时间的本地缓存,在第二次请求报40163时根据code去缓存中拿到数据即可。

关键代码

String code = request.getParameter("code");
String openid = "";
Object opendIdCacheObj = CacheManager.getInstance().getObj(code);
//CacheManager是我自己的缓存控制类,其实这一层判断没必要,第二次进入这个方法时缓存里大概率是没有值的,因为只有请求时间大于微信服务器的过期时间才会触发两次请求,这个时候第一次请求还尚未完成,值肯定不在缓存中
if (opendIdCacheObj == null) {
   
	String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你回答这个问题。首先,关于前端开发工程师,需要掌握 HTML、CSS 和 JavaScript 技术,熟悉微信公众号和小程序开发相关文档。其次,跳转微信小程序页面需要自定义菜单,可以通过微信公众平台的开发者中心进行设置。设置完自定义菜单后,可以通过微信小程序 SDK 的接口获取用户的 codeopenid。 以下是实现跳转微信小程序页面,获取codeopenid的简单示例代码: ```javascript // 1. 获取 code var wxUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?"; var appId = "your_appId"; // 公众号的AppID var redirectUri = encodeURIComponent("your_redirect_uri"); // 授权后重定向的回调链接地址 var responseType = "code"; var scope = "snsapi_base"; // 静默授权获取用户openid,不需要用户确认 var state = "state"; // 可以认为是传递的参数 var wxAuthUrl = wxUrl + "appid=" + appId + "&redirect_uri=" + redirectUri + "&response_type=" + responseType + "&scope=" + scope + "&state=" + state + "#wechat_redirect"; console.log(wxAuthUrl); // 2. 通过 code 获取 openid // 在小程序中引入微信官方提供的SDK const app = getApp(); wx.login({ success: function (res) { if (res.code) { // 发起网络请求,通过code换取openid wx.request({ url: 'https://api.weixin.qq.com/sns/jscode2session', data: { appid: '小程序的AppID', secret: '对应的AppSecret', js_code: res.code, grant_type: 'authorization_code' }, success: function (res) { console.log(res.data) // data中包含了openid } }) } else { console.log('登录失败!' + res.errMsg) } } }) ``` 以上是一个简单的示例代码,你可以根据需要进行修改和调整来适应你的具体业务场景。希望能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值