微信公众号开发(七)JSSDK-监听分享朋友圈事件

微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包。

通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。

实现步骤

一:绑定域名
在公众号管理页面,设置JS接口安全域名,表示该域名下的所有页面,都拥有使用JSSDK的权限。

二:页面中引入JS文件

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

三:通过config接口注入权限验证配置
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用JSSDK的相关API。

在页面中添加这段js代码

参数介绍
debug:true为开启调试模式,调用的所有api的返回值会在客户端alert出来,若是生产环境则设置为false
appId:必填,公众号的唯一标识
timestamp:必填,时间戳
nonceStr:必填,随机生成的字符串
signature:必填,根据timestamp与nonceStr与jsapi_ticket按照某种算法生成的签名
jsApiList:必填,需要使用的JS接口权限,如:使用分享朋友圈接口,则填入onMenuShareTimeline,其他接口的名称可以在开发文档中找到。

jsapi_ticket:

生成签名signature还需要一个叫jsapi_ticket的参数,jsapi_ticket是公众号用于调用微信JS接口的临时票据,可以通过基础接口的access_token来获取,有效期为7200秒,调用次数有限,所以在后台也需要全局缓存jsapi_ticket。

获取jsapi_ticket的接口:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

代码:

//获取JSSDk的接口地址
   public static final String GET_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";

/**
    * 获取JSTicket
    */
   public static void getJsapi_ticket() {
	   //发送请求到指定的接口
	   String result=HttpUtil.sendGet(GET_TICKET_URL.replace("ACCESS_TOKEN",getAccessToken()),"");
	   System.out.println("JsTicket="+result);
   }

getAccessToken是之前开发教程(四)已经实现好的,有需要的可参考

成功即返回如下JSON:

{
    "errcode":0,
    "errmsg":"ok",
    "ticket":"bxLdikRXVbTPdHFKA",
    "expires_in":7200
}

获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。

签名算法:
规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。最后对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

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

验证签名算法是否正确,可以打开https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

当在页面引入微信js之后,用户跳转到页面的时候我们发送ajax请求,将当前页面的url传递到后台获取signature

页面请求代码:

后台Controller作用是拿到最终的签名signature,代码如下:

后台获取到signature之后前台取出来进行config注入:

	<script>
		$(function() {
			//进页面之后ajax发送后台生成签名,前台拿到签名进行config注入
			// alert(window.location.href);
			$.ajax({
				type : 'post',
				dataType : 'json',
				data : {
					'url' : window.location.href
				},
				url : '../getJSSDKSignature',
				success : function(data) {
					if (data.code == '200') {
						// alert(data.sn+";"+data.appid+";"+data.timestamp+";"+data.noncestr);
						//进行config注入工作
						wx.config({
							debug : false,
							appId : data.appid,
							timestamp : data.timestamp,
							nonceStr : data.noncestr,
							signature : data.sn,
							jsApiList : [ 'onMenuShareTimeline' ]
						//调用的接口
						});
					}
				}
			})
		})
				wx.ready(function() {
					// 在页面加载时就调用相关接口,如:分享到朋友圈、获取位置信息等接口
					wx.checkJsApi({
						jsApiList : [ 'onMenuShareTimeline' ],
						success : function(res) {
							if (res.errMsg == 'checkJsApi:ok') {
								//分享到朋友圈接口
								wx.onMenuShareTimeline({
									title : '抽奖活动', // 分享时的标题
									link : 'http://ansheng.nat300.top/getUserInfo.html', // 分享时的链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
									//用户确认分享后执行的回调函数
									imgUrl : 'https://imgsrc.baidu.com/baike/pic/item/f3d3572c11dfa9ec47272dce6cd0f703908fc1da.jpg', // 分享时显示的图标
									success : function() {
										//给用户添加1次抽奖机会
										alert("恭喜你,分享成功");
									},
									//用户取消分享后执行的回调函数
									cancel : function() {
										alert("取消分享");
									}
								});
							} else {
								alert("失败了.......");
							}
						}
					});
				});
		wx.error(function(res) {
			alert("error");
		});
	</script>

效果图: 

总结:1.获取Access_Token,根据Access_Token获取jsapi_ticket,根据jsapi_ticket通过算法整合拿到签名Signature,然后cinfig注入验证,验证成功可调用JSSDK方法

 

感兴趣的小伙伴可以扫码关注下公众号哦,公众号会分享高质量的技术文章哦

步骤一:引入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中的相关接口。
### 微信公众号 JSSDK 开发教程 #### 获取 Access Token 为了使用微信JSSDK,在服务器端需要先获取`access_token`。这是调用微信接口的全局唯一票据,有效时间为7200秒。开发者需自行负责在服务端维护此令牌并实现缓存机制以提高效率[^3]。 ```java // Java示例代码用于获取 access_token String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; URL url = new URL(accessTokenUrl); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("GET"); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null){ response.append(line); } reader.close(); JSONObject jsonResponse = new JSONObject(response.toString()); String accessToken = jsonResponse.getString("access_token"); ``` #### 配置 JS SDK 接口签名 前端页面加载前,通过后台向微信公众平台发起请求获得配置所需的参数列表,包括但不限于`noncestr`, `timestamp`, 和 `signature`等字段。这些数据用来验证当前网页访问合法性以及防止跨站伪造攻击[^1]。 ```javascript wx.config({ debug: false, // 开启调试模式, 调用的所有 api 的返回值会在客户端 alert 出来,建议仅在测试环境开启 appId: 'your-app-id', // 必填,公众号的唯一标识 timestamp: res.timestamp, // 必填,生成签名的时间戳 nonceStr: res.nonceStr, // 必填,生成签名的随机串 signature: res.signature,// 必填,签名 jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表 }); ``` #### 使用 JSSDK 功能 一旦完成上述准备工作之后就可以正常使用各种功能API了。比如这里展示了一个简单的例子——利用`getLocation()`方法取得用户的地理位置信息: ```html <button id="get-location">Get Location</button> <script src="//res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <script type="text/javascript"> document.getElementById('get-location').onclick = function(){ wx.getLocation({ success:function(res){ console.log(`Latitude:${res.latitude}, Longitude:${res.longitude}`); }, cancel:function(){ console.error('User refused to provide location.'); } }); }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒书

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值