"errcode":40163,"errmsg":"code been used

876529270 2017-06-28 08:10:49
刚刚接触 微信开发 被这个40163 困扰好多天了,心态崩了,求大神解决.直接上代码
用的是微信测试号开发,ngrok映射工具
现在的问题是
第一个用户可以顺利获取到openid,后面的用户就获取不到了
,每一次生成的code也是新的,但就是没有用,心态爆炸
拦截器代码

private static final String APPID = "??";
private static final String SCOPE = "snsapi_base";
private static String REDIRECT_URI = "https://b3d6bc4a.ngrok.io/WeChat/getOpenid.do";
private static String URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
String openid = (String) request.getSession().getAttribute("openid");
if (openid == null) {
REDIRECT_URI = UrlUtil.getURLEncoderString(REDIRECT_URI);
URL = URL.replace("APPID", APPID).replace("REDIRECT_URI", REDIRECT_URI).replace("SCOPE", SCOPE);
session.setAttribute("reqPath", request.getServletPath());
response.sendRedirect(URL);
session.setAttribute("URL", URL);
return false;
} else {
return true;
}
}

获取openid代码

private static final String APPID = "??";
private static final String SECRET = "??";
private static String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";

@RequestMapping("/getOpenid")
public String getOpenid(HttpServletRequest request, HttpServletResponse response) {
String path = (String) request.getSession().getAttribute("reqPath");

// 用户同意授权后,能获取到code
String code = request.getParameter("code");

// 获取网页授权access_token
JSONObject object = getOauth2AccessToken(APPID, SECRET, code);

request.getSession().setAttribute("openid", object.getString("openid"));
return "redirect:" + path;

}

public static JSONObject getOauth2AccessToken(String appId, String appSecret, String code) {
// 拼接请求地址
requestUrl = requestUrl.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code);
// 获取网页授权凭证
JSONObject jsonObject = null;

try {
jsonObject = HttpUtil.getJsonForGet(requestUrl);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return jsonObject;
}
...全文
19109 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
我迷了鹿ll 2018-03-14
  • 打赏
  • 举报
回复
这个和静态方法没什么关系吧,只是楼主讲链接设置成了全局变量,第一次请求对链接进行了修改并保存了下来,第二次请求来是对修改之后的链接进行替换,当然无法匹配到要修改的字符串,所以访问的还是第一次访问的链接,才会出现这样的错误
mianguiwu2107 2017-11-21
  • 打赏
  • 举报
回复
public class OAuthServlet extends HttpServlet { private static final long serialVersionUID = -1847238807216447030L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding( request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); // 用户同意授权后,能获取到code String code = request.getParameter("code"); String state = request.getParameter("state"); // 用户同意授权 if (!"authdeny".equals(code)) { // 获取网页授权access_token WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken("wxe34a90ac7bxxcab85c", "1207d566090a8344xxxd6224c02c", code); // 网页授权接口访问凭证 String accessToken = weixinOauth2Token.getAccessToken(); // 用户标识 String openId = weixinOauth2Token.getOpenId(); // 获取用户信息 SNSUserInfo snsUserInfo = AdvancedUtil.getSNSUserInfo(accessToken, openId); // 设置要传递的参数 request.setAttribute("snsUserInfo", snsUserInfo); request.setAttribute("state", state); } // 跳转到index.jsp request.getRequestDispatcher("index.jsp").forward(request, response); } } 第一次可以获取到信息,但是第二次就code已被使用 大哥,求教一下怎么改才能让code不被重复使用,具体代码有吗
pwj_ 2017-10-15
  • 打赏
  • 举报
回复
大哥,教教我
罗嘉Key 2017-07-26
  • 打赏
  • 举报
回复
分享网页的时候,带了一个code,这个如何解决啊
码无边 2017-06-30
  • 打赏
  • 举报
回复
自己给自己埋坑
876529270 2017-06-29
  • 打赏
  • 举报
回复
终于解决了,是静态方法的问题,静态方法只会初始化一次,后面再调用传参数,code值也改变不了

private static final String APPID = "??";
    private static final String SECRET = "??";
    private  String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
 
    @RequestMapping("/getOpenid")
    public String getOpenid(HttpServletRequest request, HttpServletResponse response) {
        String path = (String) request.getSession().getAttribute("reqPath");
         
        // 用户同意授权后,能获取到code
        String code = request.getParameter("code");
         
        // 获取网页授权access_token
        JSONObject object = getOauth2AccessToken(APPID, SECRET, code);
         
        request.getSession().setAttribute("openid", object.getString("openid"));
        return "redirect:" + path;
 
    }
 
    public  JSONObject getOauth2AccessToken(String appId, String appSecret, String code) {
        // 拼接请求地址
        requestUrl = requestUrl.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code);
        // 获取网页授权凭证
        JSONObject jsonObject = null;
 
        try {
            jsonObject = HttpUtil.getJsonForGet(requestUrl);
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return jsonObject;
    }
876529270 2017-06-28
  • 打赏
  • 举报
回复
沙发!!!!

3,156

社区成员

发帖
与我相关
我的任务
社区描述
微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,通过二次开发可以将公众账号由一个媒体型营销工具转化成提供服务的产品。
社区管理员
  • 微信开发
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧