自己顶一下,原来问题出在url上, 1 用request.getRequestDispatcher("/SubmitRequest.jsp").forward(request, response); 跳转页面后,其实url还是之前调用controller的地址, 2 但是在SubmitRequest.jsp中调用request.getScheme()+"://"+ request.getServerName()+request.getRequestURI()+"?"+request.getQueryString();取到的url是SubmitRequest.jsp,程序中用这个url得到的签名就不对了 3 生成签名的类中获取url的方法换成 url = request.getScheme()+"://"+ request.getServerName()+"/WeiXin/Controller"+"?"+request.getQueryString(); 和controller的url一致,然后再测试,发现wx.config执行成功了。
servlet跳转到的页面里调用wx.config出现invalid signature 错误?情况如下: 1 直接由微信菜单里调用JSP页面,页面里调用wx.config没有问题,调试都通过,能正确调用API,具体方法是在JSP中直接调用生成signature的类,代码大致如下 HttpServletRequest req = (HttpServletRequest) pageContext.getRequest(); Map<String, String> signature = new HashMap<String, String>(); signature = SdkConfig.getSignature(req); String appID = signature.get("appID"); String timestamp = signature.get("timestamp"); String nonceStr = signature.get("nonceStr"); String sign = signature.get("signature"); 2 为了实现只有绑定内部系统的粉丝才能访问页面,加入了一个servlet(例如名为controller)控制,判断粉丝如已绑定就重定向原来的页面,否则转向无权限页面,代码大致如下: request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); String code = request.getParameter("code"); TicketUser ticketUser = new TicketUser(); Boolean isBinded = ticketUser.valid(code); String url = request.getScheme()+"://"+ request.getServerName()+request.getRequestURI()+"?"+request.getQueryString(); logger.info("url: "+url); if (isBinded){ request.getRequestDispatcher("/SubmitRequest.jsp").forward(request, response); } else { request.getRequestDispatcher("/NoAuthority.jsp").forward(request, response); } 3 将菜单里的调用改成从controller进入页面,结果出现invalid signature错误 4 用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 测试生成的signature和程序中生成的是一致的 怀疑request.getRequestDispatcher导致的问题,请大神们帮助看下该怎么处理呢?
2020-10-14