Js代码

  1. wx.config({
  2. debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  3. appId: '', // 必填,公众号的唯一标识
  4. timestamp: , // 必填,生成签名的时间戳
  5. nonceStr: '', // 必填,生成签名的随机串
  6. signature: '',// 必填,签名,见附录1
  7. jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
  8. });

其中主要获取signature这个参数,官方文档地址  https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

获取signature主要分四部

1、使用APPID和APPSecret获取access_token;

2、使用access_token获取jsapi_ticket ;

3、用时间戳、随机数、jsapi_ticket和要访问的url按照签名算法拼接字符串;

4、对第三步的字符串进行SHA1加密,得到签名。

注意事项:

1、签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
2、签名用的url必须是调用JS接口页面的完整URL。
3、出于安全考虑,开发者必须在服务器端实现签名的逻辑。

第一步:获取access_token(需要在服务器上 )

/**
 * 微信小程序获取accessToken
 *
 * @author Mr.Wen
 * @time 2017年8月28日
 */
public class GetAccessTokenUtil {// 网页授权接口
    public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
    public static Map<String, String> getAccessToken(String appid, String appsecret) {String requestUrl = GetPageAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret);
        HttpClient client = null;
        Map<String, String> result = new HashMap<String, String>();
        String accessToken = null;
        try {client = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(requestUrl);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String response = client.execute(httpget, responseHandler);
            JSONObject OpenidJSONO = JSONObject.fromObject(response);
            accessToken = String.valueOf(OpenidJSONO.get("access_token"));
            result.put("accessToken", accessToken);
        } catch (Exception e) {e.printStackTrace();
        } finally {client.getConnectionManager().shutdown();
        }return result;
    }
}
第二步:获取jsapi_ticket
/**
 * @author Mr.Wen
 * @description 获取ticket
 * @date 2018/3/29
 */
public class JsapiTicketUtil {// 网页授权接口
    public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";

    public static Map<String, String> JsapiTicket(String accessToken) {String requestUrl = GetPageAccessTokenUrl.replace("ACCESS_TOKEN", accessToken);
        HttpClient client = null;
        Map<String, String> result = new HashMap<String, String>();
        try {client = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(requestUrl);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String response = client.execute(httpget, responseHandler);
            JSONObject OpenidJSONO = JSONObject.fromObject(response);
            String errcode = String.valueOf(OpenidJSONO.get("errcode"));
            String errmsg = String.valueOf(OpenidJSONO.get("errmsg"));
            String ticket = String.valueOf(OpenidJSONO.get("ticket"));
            String expires_in = String.valueOf(OpenidJSONO.get("expires_in"));
            result.put("errcode", errcode);
            result.put("errmsg", errmsg);
            result.put("ticket", ticket);
            result.put("expires_in", expires_in);
        } catch (Exception e) {e.printStackTrace();
        } finally {client.getConnectionManager().shutdown();
        }return result;
    }
}

第三部:用时间戳、随机数、jsapi_ticket和要访问的url按照签名算法拼接字符串

String noncestr = WXUtil.generate();//随机字符串
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳
//4获取url
//5、将参数排序并拼接字符串
String str = "jsapi_ticket="+ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;

第四部:对第三步的字符串进行SHA1加密,得到签名,并返回结果

String str = "jsapi_ticket="+ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;
//6、将字符串进行sha1加密
String signature = SHA1.SHA1(str);
Map<String,String> map=new HashMap();
map.put("timestamp",timestamp);
map.put("accessToken",accessToken);
map.put("ticket",ticket);
map.put("noncestr",noncestr);
map.put("signature",signature);

测试返回的结果为:

此时前端js为:

  1. wx.config({
  2. debug: true, //调试阶段建议开启
  3. appId: "APPID",//APPID
  4. timestamp: "timestamp",//上面main方法中拿到的时间戳timestamp
  5. nonceStr: "nonceStr",//上面main方法中拿到的随机数nonceStr
  6. signature: "signature",//上面main方法中拿到的签名signature
  7. jsApiList: [
  8. //所有要调用的 API 都要加到这个列表中
  9. "chooseImage"//从本地的相册、图库选择图片
  10. ]
  11. });

以上的时间戳、随机数、签名一定要跟main方法中获取到的一致,否则会报invalid signature错误。

另外,这个签名的有效时间为7200秒,也就是2个小时,因此当超过两个小时候,再访问也会报invalid signature错误。

另外还有一个错误:invalid url domain

这个跟生成签名时用的url有关系,官网的说法是:

invalid url domain当前页面所在域名与使用的appid没有绑定,请确认正确填写绑定的域名,如果使用了端口号,则配置的绑定域名也要加上端口号(一个appid可以绑定三个有效域名)

这个url必须是:“公众号设置---功能设置----JS接口安全域名”中绑定的三个域名之一

若是以上的配置没有问题,且dubug也设置为了true,那么再访问的时候,就会出现一个config:ok,这就说明配置成功了。

微信JS-SDK获取signature签名以及config配置(微信转发分享页面需要)相关推荐

  1. 微信-js sdk invalid signature签名错误 问题解决

    微信-js sdk invalid signature签名错误 问题解决 参考文章: (1)微信-js sdk invalid signature签名错误 问题解决 (2)https://www.cn ...

  2. 微信js sdk 授权上传头像下载代码片段和注意事项

    /*  * 描述:当前页授权  * @param url   例:index.html / 如果有参数,需加密index.html?id=1     */ 1.对需要运用js sdk的页面授权 get ...

  3. 使用微信js sdk关于选择及上传图片至腾讯云COS

    使用微信js sdk关于选择及上传图片至腾讯云COS 使用微信js sdk关于选择及上传图片至腾讯云COS 背景 名词 参考 效果图展示 开发步骤 1:概要步骤 2:上代码 结束: 使用微信js sd ...

  4. 微信JS SDK开放,前端开发者“鸡冻”了!

    HTML5又一次逆袭了,其实之前微信也是有一些JS API的,比如分享.但这次一股脑开放了拍摄.录音.语音识别.二维码.地图.支付.分享.卡券等几十个API,这条消息不需宣传,瞬间就占满了HTML5从 ...

  5. 实战微信JS SDK开发:贺卡制作与播放(1)

    前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...

  6. 微信js sdk 分享 失败 有时候好 有时候坏

    微信js sdk 分享 失败  有时候好 有时候坏 用了一个www开头的域名 和一个xx.com的域名 两个在解析上有问题. 实践是www.xx.com的比较 稳定 转载于:https://www.c ...

  7. 微信公众号/微信小程序获取用户信息以及推送微信模版消息_MQ

    微信公众号/微信小程序获取用户信息以及推送微信模版消息_MQ 一.获取用户信息 1.首先我们需要了解什么是微信用户的OpenID 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密 ...

  8. jsessionid 对微信JS SDK 签名的影响

    用户第一次访问微信公众号页面,获取的URL通常会带有 jsessionid,例如:http://www.baidu.com/test;jsessionid=*******, 测试时发现首次进入微信会出 ...

  9. 微信JS SDK开发 共享问题小结

    首先,我要吐槽一下这个SDK,看了第一遍,完全不知所云,一会获取这个,一会获取那个,也没确切的告诉怎么获取. 和腾讯客服(拿钱不干事的好工作)讨教,人家不懂技术,不知道怎么解决,也没有相关技术人员对应 ...

最新文章

  1. 循环for语句 if语句
  2. 为什么智能车竞赛没有清华学生参加比赛呢?
  3. Office 365系列(3)------Office 365认证使用ADFS安装部署参考
  4. Hud 敌兵布阵 --线段树的插点问线
  5. spring el 三元表达式
  6. python 复制文件_10 行 Python 代码写 1 个 USB 病毒
  7. 从“做什么”到“怎么做”,说说一只蚊子
  8. 阿里云基础产品技术月刊 2018年12月
  9. Android pad适配札记
  10. oracle用exp定时备份数据库,oracle exp备份数据库
  11. Mac读写NTFS移动硬盘
  12. python把句子里单词最后一个字母换成大写
  13. Flutter列表ListView学习
  14. 5个Libra协会成员加入,这家创业公司凭什么与Facebook 竞争?
  15. 语音识别ASR和NLP有什么区别?
  16. flyway的checksum
  17. 基于LightGBM分类实现英雄联盟数据预测(二)
  18. VisionMobile 2011年智能手机数据
  19. python中的Queue
  20. 【物联网平台】ThingsBoard 是一个用于数据收集、处理、可视化和设备管理的开源物联网平台

热门文章

  1. 【装机必看】主板该怎么选
  2. vue组件传值之事件总线
  3. 微信三方登录与注册逻辑处理
  4. Debian安装nodejs
  5. 安卓再无甜点,但船长觉得是个好事!
  6. 【游记】GDKOI2023游寄
  7. 文本框输入位数 html,[求助]请问如何在文本框中限制输入数字的位数(已解决)...
  8. java如何设置1.5倍行距_【转】如何解决mathtype公式拉大word中行间距的问题
  9. mac简体拼音打出来是英文_Mac如何打出各种标点符号、特殊符号、注音文、全角英文?...
  10. vue框架下的TodoMVC