这几天一直在调试wxjssdk,按照api的需求,http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html ,先是根据appid和秘钥获取access_token并存入缓存:注意的是 此处的appid 和 秘钥 是 微信公众平台的appid(区别于微信开放平台,开放平台无法设置域名)。

public final String sharing(String url, HttpServletResponse response) {
StringBuilder stringBuilder = new StringBuilder();
Map<String,String> resMap = new HashMap<String, String>();
//返回给app端
net.sf.json.JSONObject jb = new net.sf.json.JSONObject();
net.sf.json.JSONObject data = new net.sf.json.JSONObject();
try {
if (url.contains("#")){
url = url.substring(0,url.indexOf("#")); //不需要获取后面的#的内容
}
Map<String,String> ecPaymentMap = myPayService.findPaymentTypeListInfo(PAYMENT_TYPE_ID);
String accessToken = cacheUtil.readCache("access_token"); //获取token
if (StringUtil.isEmpty(accessToken)){
Map<String,String> getTokenMap = new HashMap<String, String>();
getTokenMap.put("grant_type","client_credential"); //获取access_token填写client_credential
getTokenMap.put("appid", ecPaymentMap.get("appId")); //第三方用户唯一凭证
getTokenMap.put("secret",ecPaymentMap.get("appKey")); //第三方用户唯一凭证密钥,
String resTokenData = HttpClientTools.doGet(WXURLConstant.ACCESSTOKENURL, getTokenMap);
if (StringUtil.isEmpty(resTokenData)){
logger.error("WXJs Token is null");
throw new RuntimeException();
}
JSONObject jsonObject = JSONObject.parseObject(resTokenData);
logger.info("WXJs resData" + jsonObject); if (jsonObject.get("access_token") !=null){
cacheUtil.setCache("access_token",jsonObject.get("access_token").toString(),Integer.valueOf(jsonObject.get("expires_in").toString()));
}else {
logger.error("get WXJs token error,errorCode: " + jsonObject.get("errcode"));
}
accessToken=cacheUtil.readCache("access_token");
}
String jsapiTicket = cacheUtil.readCache("jsapiTicket"); //获取jsapiTicket
if (StringUtil.isEmpty(jsapiTicket)){
Map<String,String> map = new HashMap<String, String>(); //请求获取JS-SDK使用权限签名算法
map.put("access_token",accessToken); //请求参数access_token
map.put("type","jsapi"); //请求参数type 固定
String ticketResData = HttpClientTools.doGet(WXURLConstant.JSAPITICKET, map);
if (StringUtil.isEmpty(ticketResData)){
logger.error("requestData is null");
return null;
}
JSONObject jsonObject = JSONObject.parseObject(ticketResData); if (!"0".equals(jsonObject.get("errcode").toString())){
logger.error("WX get jsapiTicket error" + jsonObject.toString());
jb.element("status", 002);
jb.element("msg", "jsapi error");
data.element("data",jsonObject);
jb.put("data",data);
stringBuilder.append(jb);
response.resetBuffer();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print(stringBuilder);
response.getWriter().flush();
response.getWriter().close();
response.flushBuffer();
return stringBuilder.toString();
}
cacheUtil.setCache("jsapiTicket",jsonObject.get("ticket").toString(),WXJSSDKConstant.EXPIRETIME); //缓存2个小时 其实有自动任务一个小时会执行一次 防止过期
jsapiTicket = jsonObject.get("ticket").toString();
}
String timestamp = String.valueOf(System.currentTimeMillis()/1000);
String nonceStr = TenpayUtil.getNonceStr();
Map<String,String> requestSignMap = new HashMap<String, String>(); //后去signature
requestSignMap.put("noncestr", nonceStr);
requestSignMap.put("jsapi_ticket",jsapiTicket);
requestSignMap.put("timestamp",timestamp);
requestSignMap.put("url",url);
String signature = "";
try {
signature = WXUtil.sha1Sign(requestSignMap);
} catch (JDOMException e) {
e.printStackTrace();
} //增加签名
jb.element("status", 0);
jb.element("msg", "OK");
resMap.put("appId", ecPaymentMap.get("appId"));
resMap.put("timestamp", timestamp);
resMap.put("nonceStr", nonceStr);
resMap.put("signature", signature);
data.element("data",resMap);
jb.element("data", data);
stringBuilder.append(jb.toString());
response.resetBuffer();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print(stringBuilder.toString());
response.getWriter().flush();
response.getWriter().close();
response.flushBuffer(); } catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}

第二步 是根据acces_token获取jsapi_ticket并存入缓存,注意此处的参数type要是jsapi,还有一个获取卡卷的接口,此处容易出错

第三部 就是根据jsapiticket 来获取signature,参数主要是16位随机数,ticket  时间串(注意此处的格式是秒) url (注意路径:传递的时候需要转码,后台后去的时候需要解码,这个一定要注意了,好多人在这上面被坑的。。。)

noncestr
jsapi_ticket
timestamp
url
第四步 把获得的结果传到前台即可 遇到的问题,主要是 报这个 config invalid signature

用jsskd自带的签名工具验签 发现没有问题,但是无论如何就是报签名错误。然后google了好多,最后发现原来是url的问题: 前端需要转码 需要转码 需要转码 ,后台需要解码 需要解码 需要解码。

前端:url在JavaScript中千万别忘记“encodeURIComponent”!

url在JavaScript中千万别忘记“encodeURIComponent”!

url在JavaScript中千万别忘记“encodeURIComponent”!

后台:

public String sharing(HttpServletRequest request, HttpServletResponse response){
String url = request.getParameter("url"); //分享链接url
try {
logger.info("beforeDecode:" + url);
url = URLDecoder.decode(url,"utf-8");
logger.info("afterEncode:" + url);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return wXSharingService.sharing(url,response);
}

  

												

微信jssdk 返回的 config invalid signature的更多相关文章

  1. 微信分享链接出现config:invalid signature错误的解决方法

    首先贡献jssdk下载地址:http://demo.open.weixin.qq.com/jssdk/sample.zip  不建议大家在*SDN上花钱买积分下载 当开发微信时需要做特定的页面做分享时 ...

  2. Vue微信自定义分享时安卓系统config:ok,ios系统config:invalid signature签名错误,或者安卓和ios二次分享时均config:ok但是分享无效的解决办法

    简述需求:要求指定页面可以进行微信自定义分享(自定义标题,描述,图片,链接),剩下的页面隐藏所有基础接口.二次分享依然可以正常使用,切换至其他页面也可以正常进行自定义分享. 这两天在做微信自定义分享的 ...

  3. 微信jssdk config:invalid signature 签名错误 ,问题排查过程

    invalid signature签名错误.建议按如下顺序检查: 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisi ...

  4. 微信网页分享 jssdk config:invalid signature 签名错误

    invalid signature签名错误.建议按如下顺序检查: 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisi ...

  5. 调用微信公众平台扫一扫示例及解决接口报错 { "errMsg": "config:invalid signature" }

    一.解决报错问题 单从报错信息 invalid signature 就可以看出是 签名signature 有问题, 查了很多资料,终于知道了问题点, 后台让我直接调接口是不对的,签名是根据请求接口的页 ...

  6. 微信公众号报错 config:invalid signature

    官方已经提供了微信 JS 接口签名校验工具(http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign),填入相应的参数就能出来相应的signa ...

  7. 在做微信分享到朋友圈时,手机扫码报config:invalid signature,分享后后正常的问题,是url问题

    是按照以下步骤检查的 除了ACCESS_TOKEN没有缓存其他都可以 如果是invalid signature签名错误.建议按如下顺序检查: 1.确认签名算法正确,可用 http://mp.weixi ...

  8. 微信分享报错config:invalid url domain

    错误类型:invalid url domain 调试返回参数: { "errMsg": "config:invalid url domain" } 截图: 环境 ...

  9. 微信公众号签名错误 invalid signature

    在出现了 invalid signature签名错误后按照以下步骤进行校验1.确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=j ...

随机推荐

  1. Ntp客户端

    function parseMsg (buffer) { if (buffer.length !== 48) return; const pkt = {}, now = new Date().getT ...

  2. 在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 <!-- 把需要生成截图的元素放在一个元素容器里,设置一个ref --> <di ...

  3. Django项目使用七牛云存储图片

    Django项目使用七牛云存储图片 最近,写了一个django项目,想在项目中使用七牛云存储上传图片,在网上搜索到django-qiniu-storage,查看文档,按步骤居然设置成功了. 安装 1 ...

  4. Ubuntu下配置安装Hadoop 2.2

    ---恢复内容开始--- 这两天玩Hadoop,之前在我的Mac上配置了好长时间都没成功的Hadoop环境,今天想在win7 虚拟机下的Ubuntu12.04 64位机下配置, 然后再建一个组群看一看 ...

  5. 2019第九届MathorCup数学建模

    题目下载:https://www.lanzous.com/i3taz2j 总共四个问题 问题1 首先附件一中的数据,拿到后肯定感觉棘手.我们的处理方法: 在下面缺失数据的地方我们都认为是问题3中的预测 ...

  6. Cloudera Manager安装之Cloudera Manager安装前准备(Ubuntu14.04)(一)

    其实,基本思路跟如下差不多,我就不多详细说了,贴出主要图. 博主,我是直接借鉴下面这位博主,来进行安装的!(灰常感谢他们!) 在线和离线安装Cloudera CDH 5.6.0  Cloudera M ...

  7. c++ 常用的遍历,删除,分割等等文件处理函数代码实现

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9622851.html 删除文件目录函数: void myDeleteDirectory(CSt ...

  8. hadoop Shell命令详解

    调用文件系统(FS)Shell命令应使用bin/hadoop fs <args>的形式.所有的的FS shell命令使用URI路径作为参数.URI路径详解点击这里. 1.cat说明:将路径 ...

  9. Windows下SVN回滚到旧版本(TortoiseSVN)

    当发现新提交的代码有问题,然后想将某个旧的版本作为最新的版本时,可以使用回滚, 操作步骤如下: 1. 签出(CheckOut)最新版本的代码到电脑中(不能做任何修改) 2. 执行TortoiseSVN ...

  10. Golang教程:并发介绍

    Go是并发语言,而不是并行语言.在讨论Go并发性之前,我们必须首先了解什么是并发,以及并发与并行的区别. 什么是并发 并发(concurrency)是指一次处理大量事情的能力.让我们用一个例子来说明. ...