微信JS初始化--微信JS系列文章(一)
- 概述
 
微信JS的使用方法,官方文档已经描述得比较清楚了,这里我就不重复介绍了,本文意在提供现成的代码,供大家快速迭代开发,以及补充一下官方文档描述得不够清楚的地方,避免大家踩相同的坑。
- 微信JS初始化所需参数
 
wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
- JS-SDK使用权限签名算法
 
签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
通过上述的签名生成规则可以看出,要想获得签名,必须先获得jsapi_ticket,而jsapi_ticket的获取则需要通过access_token(获取access_token的方法后续文章进行说明)获得。由于jsapi_ticket的有效期为7200秒,因此必须缓存起来,一旦过期就要重新获取。获取jsapi_ticket的代码如下:
private boolean checkJsapiTicketEffective(){
    Long currentTime = new Date().getTime();
    if(weixinGetJsapiTicketResult==null
            || StringUtil.isEmpty(weixinGetJsapiTicketResult.getTicket())
            || currentTime>weixinGetJsapiTicketEffectiveTime){
        return false;//失效
    }else{
        return true;//有效
    }
}
@Override
public String getJsapiTicket() {
    if(checkJsapiTicketEffective()){//有效
        return weixinGetJsapiTicketResult.getTicket();
    }else{//失效
        Map<String, String> param = new HashMap<String, String>();
        param.put("access_token", getAccessToken().trim());
        param.put("type", "jsapi");
        String responseJson= null;
        try {
            responseJson = WeixinWebUtil.doGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket", param, "UTF-8", 3000, 3000);
            if(StringUtil.isEmpty(responseJson)){
                logger.error("获取 jsapi_ticket 失败");
                throw new BusinessException(ResGlobal.ERRORS_USER_DEFINED, new String[]{"获取 jsapi_ticket 失败"});
            }
            weixinGetJsapiTicketResult = JsonBinder.buildNormalBinder().toBean(responseJson, WeixinGetJsapiTicketResult.class);
            if(weixinGetJsapiTicketResult.getErrcode()!=0){
                logger.error("获取 jsapi_ticket 失败, responseJson: " + responseJson);
                throw new BusinessException(ResGlobal.ERRORS_USER_DEFINED, new String[]{"获取 jsapi_ticket 失败"});
            }
            Long currentTime = new Date().getTime();
            weixinGetJsapiTicketEffectiveTime = currentTime + weixinGetJsapiTicketResult.getExpires_in() * 1000;
            return weixinGetJsapiTicketResult.getTicket();
        } catch (IOException e) {
            logger.error("获取 jsapi_ticket 失败");
            throw new BusinessException(ResGlobal.ERRORS_USER_DEFINED, new String[]{e.getMessage()});
        }
    }
}
在获得jsapi_ticket后,可以根据签名生成规则生成签名,具体代码如下:
@Override
public WeixinJsSdkConfigVO getWeixinJsConfig(String signUrl) {
try {
signUrl = URLDecoder.decode(signUrl, "UTF-8");
WeixinConfig weixinConfig = ServiceManager.objectEnginService.getObject(ObjectEngineTypeCodeEnum.VMALL_BASE_CONFIG, Global.OBJECT_ENGIN_WEIXIN_BASE_INFO_ID, WeixinConfig.class);
String ticket = ServiceManager.weixinApiService.getJsapiTicket();
WeixinJsSdkConfigVO weixinJsSdkConfigVO = new WeixinJsSdkConfigVO();
weixinJsSdkConfigVO.setAppId(weixinConfig.getAppId());
weixinJsSdkConfigVO.setNonceStr(UUID.randomUUID().toString());
weixinJsSdkConfigVO.setTimestamp(Long.toString(System.currentTimeMillis() / 1000)); StringBuffer signature = new StringBuffer("");
signature.append("jsapi_ticket=");
signature.append(ticket);
signature.append("&noncestr=");
signature.append(weixinJsSdkConfigVO.getNonceStr());
signature.append("×tamp=");
signature.append(weixinJsSdkConfigVO.getTimestamp());
signature.append("&url=");
signature.append(signUrl); MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(signature.toString().getBytes("UTF-8"));
weixinJsSdkConfigVO.setSignature(byteToHex(crypt.digest()));
return weixinJsSdkConfigVO;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
logger.error(e.getMessage());
throw new BusinessException(ResGlobal.ERRORS_USER_DEFINED, new String[]{"获取JsSDK初始化参数异常"});
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
logger.error(e.getMessage());
throw new BusinessException(ResGlobal.ERRORS_USER_DEFINED, new String[]{"获取JsSDK初始化参数异常"});
}
}
- 页面微信JS初始化
 
//引入JS文件
<script type="text/javascript" src="${webRoot}/template/green/wap/statics/js/jweixin-1.0.0.js"></script>
$(function(){
    var signUrl = location.href.split('#')[0];
    signUrl = encodeURIComponent(signUrl);
    $.ajax({
        type:"POST",
        url: webPath.webRoot + "/wxsdk/getWeixinJsConfig.json",
        data:{'signUrl':signUrl},
        dataType:'json',
        success:function(msg) {
            if(msg.result == "success"){
                var weixinJsSdkConfig = msg.weixinJsSdkConfig;
                wx.config({
                    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                    appId: weixinJsSdkConfig.appId, // 必填,公众号的唯一标识
                    timestamp: weixinJsSdkConfig.timestamp, // 必填,生成签名的时间戳
                    nonceStr: weixinJsSdkConfig.nonceStr, // 必填,生成签名的随机串
                    signature: weixinJsSdkConfig.signature,// 必填,签名,见附录1
                    jsApiList: ['chooseImage', 'uploadImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
                });
            }else{
                showError("初始化失败,请稍后再试。");
            }
        },
        error:function(XMLHttpRequest, textStatus) {
            if (XMLHttpRequest.status == 500) {
                var result = eval("(" + XMLHttpRequest.responseText + ")");
                showError(result.errorObject.errorText);
                return false;
            }
        }
    });
});
特别需要注意的地方是页面链接的获取方式,以及在把页面链接传递到后台前,必须要先编码,后台生成签名前再进行解码,避免乱码的情况。至此,微信JS的初始化工作就已经完成了。
微信JS初始化--微信JS系列文章(一)的更多相关文章
- C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询
		
前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...
 - 微信JS图片上传与下载功能--微信JS系列文章(三)
		
概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...
 - 微信JS分享功能--微信JS系列文章(二)
		
概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...
 - 【微信小程序开发•系列文章六】生命周期和路由
		
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
 - 【转】利用 three.js 开发微信小游戏的尝试
		
前言 这是一次利用 three.js 开发微信小游戏的尝试,并不能算作是教程,只能算是一篇笔记吧. 微信 WeChat 6.6.1 开始引入了微信小游戏,初期上线了一批质量相当不错的小游戏.我在查阅各 ...
 - MPVUE - 使用vue.js开发微信小程序
		
MPVUE - 使用vue.js开发微信小程序 什么是mpvue? mpvue 是美团点评前端团队开源的一款使用 Vue.js 开发微信小程序的前端框架.框架提供了完整的 Vue.js 开发体验,开发 ...
 - 怎样调通微信支付及微信发货通知接口(Js API)
		
怎样调通微信支付及微信发货通知接口(Js API) 微信支付提供了一个支付測试页面,微信支付正式使用须要測通支付.发货通知接口 .告警接口.维权接口.告警接口.维权接口非常easy.支付界面调通也相对 ...
 - 1.Node.js 接入微信公众平台开发
		
一.写在前面的话 Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...
 - 3.Node.js 自定义微信菜单
		
文章目录: 1.Node.js 接入微信公众平台开发 2.Node.js access_token的获取.存储及更新 3.Node.js 自定义微信菜单 ...
 
随机推荐
- Java日期工具类,Java时间工具类,Java时间格式化
			
Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...
 - 深圳尚学堂:JavaScript中常见的字符串操作
			
快到春节放假了,春节后又是一大波的找工作热潮,在前端实招聘笔试时,必不可免额会考到关于JavaScript中字符串的处理问题.考的不是你会不会,而是你能不能在不借用XX手册或者XX指南再或者百度谷歌的 ...
 - [python]Python2编码问题
			
以下内容说的都是 python 2.x 版本 简介 基本概念 Python "帮"你做的事情 推荐姿势 基本概念 我们看到的输入输出都是'字符'(characters),计算机(程 ...
 - redis&rabbitMQ安装
			
前言: 学习python已经有一段时间了,最近在学twisted(博客:twisted安装),redis,rabbitMQ感觉有点难度,所以还是写下博客整理下. 一.Redis的安装 redis是一种 ...
 - git 打卡的第一天
			
因为某种原因,所以不得不重新巩固下前端的基础知识,从最基本的学习还得额外的学习新知识,倍感压力之大. 昨天初略学习下git,算是自己学习的一个新知识.简单记录下,希望四海八荒的大神看过来,有错的请指导 ...
 - asp.net core mvc权限控制:分配权限
			
前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Ident ...
 - JS - What does `void 0` mean?
			
语法 void expression // or void(expression) MDN的描述 能向期望一个表达式的值是 undefined 的地方插入会产生副作用的表达式.也就是为了避免产生某种副 ...
 - 读书笔记 effective c++ Item 5 了解c++默认生成并调用的函数
			
1 编译器会默认生成哪些函数 什么时候空类不再是一个空类?答案是用c++处理的空类.如果你自己不声明,编译器会为你声明它们自己版本的拷贝构造函数,拷贝赋值运算符和析构函数,如果你一个构造函数都没有声 ...
 - MATLAB中的分类器
			
MATLAB中的分类器 目前了解到的MATLAB中分类器有:K近邻分类器,随机森林分类器,朴素贝叶斯,集成学习方法,鉴别分析分类器,支持向量机.现将其主要函数使用方法总结如下,更多细节需参考MAT ...
 - 解决CSS中float:left后需要clear:both清空
			
现在,大部分的横排导航都是通过 ul -> li *n -> a 来实现的.具我所知,要达到这种效果,有几种方法可以实现. 1.传统处理方式: li {float:left;}/*这样,对 ...