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

2023-11-19

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,这就说明配置成功了。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • VM16 CentOS 快照恢复以及Linux自动修复指令

    目录 快照恢复 自动修复磁盘 快照恢复 点击上图的拍摄快照 即可进行CentOS 6的虚拟机系统备份 需要恢复系统 就点击之前备份过的快照记录 即可恢复系统 自动修复磁盘 当Linux启动时出现 UNEXPECTED INCONSISTEN
  • 【threejs】根据点绘制直线

    实现代码
  • 东京大学最新研究成果!一种可实现陆空两栖的新型四足机器人SPIDAR,具备多模态运动能力

    原创 文 BFT机器人 现实中 蜘蛛可以凭借飘荡的蛛丝在空中漂浮 让它们能够穿越复杂地形 普通蜘蛛长度只有几毫米 重量只有几十克 如何让比蜘蛛重数百倍的机器人实现多模态运动 是众多学者研究的热点 具有多模态运动能力的机器人 几乎都是移动系统
  • ESP32-C2开发板 Homekit烧录教程

    准备 1 1硬件ESP32 C2开发板 如图1 1所示 图1 1 ESP32 C2开发板 1 2软件 CozyLife APP可以在各大应用市场搜索下载 也可以扫描二维码下载如图1 2所示 HomeKit flash download to
  • 【Maven】maven如何配置本地仓库?

    前言 很多小伙伴不清楚怎么配置maven本地仓库 这里给大家分享一下方法 如果觉得有用的话 记得点赞支持哦 1 创建新的路径 maven默认的存放路径是C盘 在你想要的位置创建一个存放maven repository的路径 我是创建在了D盘
  • 读取其他进程内存数据

    1 读取进程内存数据 读取其他进程内存数据 需要用到的windows API函数 BOOL ReadProcessMemory HANDLE hProcess LPCVOID lpBaseAddress LPVOID lpBuffer DW
  • Mysql-DML(数据处理语言)

    插入数据 insert into member values 1 张三 21 5000 insert into member id name values 2 李四 insert into member values 3 王五 23 300
  • typedef struct 用法详解

    typedef为C语言的关键字 作用是为一种数据类型定义一个新名字 当typedef与结构结合使用时 会有一些比较复杂的情况 而且在C语言和C 里面有略有差别 本文将详细讲解typedef struct的用法 第一篇 typedef str
  • C++异常处理

    如果你写的方法是给他人使用 那么 如果这个方法失败 最好是以抛异常的方式告诉别人 而不是在方法声明的地方写注释 0 成功 1 网络连接失败 3 参数错误 抛出异常 throw 1 抛出 int 类型异常 throw 1 2 抛出 doubl
  • Qt中QSplitter使QWidget改变屏占比

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 QSplitter是什么 二 具体代码 1 头文件 2 实现文件 总结 前言 在Qt中把QWidget窗体三等分 我想实现QWidget中的三等分窗口能够像QDockWidget类一样
  • 【Python3.8】ctypes加载dll: 报错 FileNotFoundError: Could not find module ‘xx.dll’ (or one of its

    问题 Python3 8 使用ctypes加载dll时报错 FileNotFoundError Could not find module xxx dll or one of its dependencies Try using the f
  • 二、EulerOS 基础命令行

    一 Linux命令基础知识 1 1 Linux的 GUI 与 CLI GUI Graphical User Interface 图形用户界面 用户界面的所有元素图形化 主要使用鼠标作为输入工具 使用按钮 菜单 对话框等进行交互 追求易用 C
  • vue3页面跳转

    vue3的页面跳转有两种方式 第一种是标签内跳转 第二种是编程式路由导航 1
  • Hadoop全集1-Hadoop简介

    Hadoop全集1 Hadoop简介 文章目录 Hadoop全集1 Hadoop简介 前言 一 Hadoop是什么 二 Hadoop的优势 三 Hadoop的组成 1 HDFS 2 MapReduce 3 Yarn 小结 前言 大数据时代
  • ffplay 播放m3u8 hls Failed to open segment of playlist 0

    用ffplay 播放m3u8文件 出现 Failed to open segment of playlist 0 Error when loading first segment test0 ts 错误 同样的文件用VLC播放正常 经过一番
  • Arcgis报错 ERROR 999999的解决方法汇总

    针对ERROR999999 官方给出的解决方案 1 修复几何 2 检查命名 3 检查创建输出位置的权限 4 大数据集分割处理 5 输出路径过长 6 以管理员模式运行 7 修改空数据属性 8 清除默认临时目录并重启程序 附方案地址 https
  • AD 封装组件的水平/垂直间距报错

    快捷键 D设计 R规则 一般情况下设置的都是 Electrical 下的Clearance 但是设置完了还是继续报错 是封装之间的水平间距问题 应该设置Placement 下的ComponentClearance
  • Nacos 1.4.1注册中心源码深度解析-服务下线

    服务下线比较简单 入口在com alibaba nacos naming controllers InstanceController deregister gt serviceManager removeInstance gt remov
  • Linux,Network manager 导致节点异常重启

    推断是Network manager 导致的 原因待查今天在VmWare的虚拟机上装了个测试RAC 又遇到了一个摸不到头绪的问题CRS装好后 一旦登陆图形界面 节点就重启 事情就有这么巧不登陆图形界面 观察了1个小时没问题 一旦登陆后 立刻
  • 微信JS-SDK获取signature签名以及config配置(微信转发分享页面需要)

    Js代码 wx config debug true 开启调试模式 调用的所有api的返回值会在客户端alert出来 若要查看传入的参数 可以在pc端打开 参数信息会通过log打出 仅在pc端时才会打印 appId 必填 公众号的唯一标识 t