微信公众平台开发历程(四)

微信JSSDK调用

微信jssdk调用和授权一样,需要配置接口域名。

在每个需要调用sdk的页面上都加上一个外联的js:<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
并且要注入一下权限的验证配置:
wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

数解读

    signature签名

   其他的参数其实很好搞定,这个签名参数生成是:

   1、首先你要有一个参数,叫做 jsapi_ticket,前文中在accesstoken获取的地方我有提到过,这个参数和accesstoken一样,每天的调用次数有限,所以要和accesstoken一样使用线程去调用它,全局缓存这个参数,需要的时候调用,获取方式请看微信官方api。

   2、签名算法官方给出的是:
微信官方也给了一个算法的demo( http://demo.open.weixin.qq.com/jssdk/sample.zip),可以自行下载。

校验是否正确的页面


还有一个校验加密是否正确的页面:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

这个加密很多被坑的地方就是获取当前网页的url,我这里试了很多种方法都加密不正确,最后用了微信给的脚本方法:

var url = location.href.split('#')[0];

获取到这个以后所有的参数用ajax传到后台加密,然后再传回前台脚本中。

调起接口


我们这里先讲一个调起扫码的接口:

签名加密有了之后,jsApiList里面加入你需要的及接口名称,例如:

wx.config({
	debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
	appId: '<%=Configure.appId %>', 
	timestamp: timestamp, 
	nonceStr: nonceStr, 
	signature: signature,
	jsApiList: ['chooseWXPay', 'scanQRCode'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

如何调起接口:

wx.ready(function(){	            	
$("#scan").click(function () {
       wx.scanQRCode({
                needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
		scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
		success: function (res) {
		        var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                        alert(result);
		}
	});
});

给某一个按钮或者超链接加上这个click时间,就可以调起扫码接口了。

附上注入配置的脚本


$(function() {
	var url = location.href.split('#')[0];
  	var timestamp, nonceStr, signature;
  	$.ajax({
                type : "post",
		url : "<%=basePath %>/pay/ajax.jsp",
		data : {
			"jsapi_ticket" : '<%=TokenThread.jsapi_ticket %>',
			"url" : url
		},
		dataType : "json",
		async: false,
		success : function(data) {
			timestamp = data.timestamp;
			nonceStr = data.nonceStr;
			signature = data.signature;
		},
		error : function(XMLHttpRequest) {
		},
	});
	wx.config({
	    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
	    appId: '<%=Configure.appId %>', 
	    timestamp: timestamp, 
	    nonceStr: nonceStr, 
	    signature: signature,
	    jsApiList: ['chooseWXPay', 'scanQRCode'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
	});
});
ajax.jsp
request.setCharacterEncoding("UTF-8");

String jsapi_ticket = request.getParameter("jsapi_ticket");
String url = request.getParameter("url");

Map<String, String> ret = SignUtil.sign(jsapi_ticket, url);

JSONObject object = new JSONObject();

for (Map.Entry entry : ret.entrySet()) {
	object.put(entry.getKey(), entry.getValue());
}

out.println(object);
out.flush();
out = pageContext.pushBody();
SignUtil.java的sign方法
public static Map<String, String> sign(String jsapi_ticket, String url) {
	Map<String, String> ret = new HashMap<String, String>();
	String nonce_str = create_nonce_str();
	String timestamp = create_timestamp();
	String string1;
	String signature = "";
	//注意这里参数名必须全部小写,且必须有序
	string1 = "jsapi_ticket=" + jsapi_ticket +
		"&noncestr=" + nonce_str +
		"×tamp=" + timestamp +
		"&url=" + url;
	System.out.println(string1);
	try {
		MessageDigest crypt = MessageDigest.getInstance("SHA-1");
		crypt.reset();
		crypt.update(string1.getBytes("UTF-8"));
		signature = byteToHex(crypt.digest());
	} catch (NoSuchAlgorithmException e) {
		e.printStackTrace();
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}
	ret.put("url", url);
	ret.put("jsapi_ticket", jsapi_ticket);
	ret.put("nonceStr", nonce_str);
	ret.put("timestamp", timestamp);
	ret.put("signature", signature);
	return ret;
}

步骤一:引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js 备注:支持使用 AMD/CMD 标准模块加载方法加载 步骤二:通过config接口注入权限验证配置 所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。 wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,企业号的唯一标识,此处填写企业号corpid timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名,见附录1 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); 步骤三:通过ready接口处理成功验证 wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 }); 步骤:通过error接口处理失败验证 wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 }); 接口调用说明 所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数: success:接口调用成功时执行的回调函数。 fail:接口调用失败时执行的回调函数。 complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。 cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。 trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值