本文简单的介绍在微信里打开某个网站,希望在点击“分享到朋友圈”或“发送给朋友“时,自定义分享的内容, 即使用 JS-SDK 实现分享功能。
1. 前提
要想分享成功,需要申请一个公共号,获取特定的app_id 和 app_secret 。
2. 获取access_token
使用分配的 app_id 和 app_secret 去获取一个有效的 access_token ,路径为:
得到的返回值的格式为:
{"access_token":"<access_token>","expires_in":7200}
3. 获取jsapi的ticket
有了access_token以后,就可以使用该token去请求jsapi的ticket,路径为:
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=<access_token>&type=jsapi
得到的返回值的格式为:
{"errcode":0,"errmsg":"ok","ticket":"<ticket>","expires_in":7200}
4. 生成签名
有了以上内容后,就可以生成签名了,生成签名的需要的参数有:
- jsapi_ticket : 步骤 3 中获取的ticket
- noncestr : 一个混淆字符串,值可以任意,在后续中还会被用到,所以需要记住
- timestamp : 一个时间戳,就是从1970年1月1号零晨到当前的秒数,用 java 表示就是: System.currentTimeMillis()/1000
- url : 微信当前打开页面的完整的url
把以上四个键值对,按键名的字母序,拼接起来,做一个sha1的加密,拼接的顺序为:
jsapi_ticket=<ticket>&noncestr=<any_str>×tamp=<timestamp>&url=<current_page_url>
拼接完后做sha1加密就得到了签名,例如以下请求串:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VH5zlC1TiV7zG5Rb8FkGY3GQrZ2aRpFoQX1CLQ7BaBVpS3sHlUyuJC5UnzQFf1oGpg&noncestr=test×tamp=1429182394&url=http://m.ufenqi.com/items/2713/detail
加密后的值为: 85cf483b82edd0c9ada97635cf174446552201e9
注: 一个在线的sha1加密网站是: http://www.3464.com/tools/sha1/index.asp
注:java里可以使用 commons-codec 包里的 DigestUtils.sha1Hex() 方法得到加密值。
5. 实现分享代码
有了以上信息,就可以开始实现分享代码了:
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" ></script> <!--引用微信js-->
<script>
// 微信配置
wx.config({
appId: "<app_id>",
timestamp: '<上面步骤中签名用的时间戳>',
nonceStr: '<上面签名中用的混淆字符串>',
signature: '<计算得到的sha1加密串>',
jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] // 功能列表,我们要使用JS-SDK的什么功能
});
// 配置信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后
//config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。
//对于用户触发时才调用的接口,则可以直接调用,不需要放在ready 函数中。
wx.ready(function () {
//检查相应的接口api是否要用
wx.checkJsApi({
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage'
]
});
// 监听“分享给朋友”按钮,自定义分享内容及分享结果接口
wx.onMenuShareAppMessage({
title:'<分享标题>',
link:'<要分享的链接>',
imgUrl:'<分享时显示的图片>',
desc:'<分享描述>',
type:'link', //指定分享类型
});
// 监听“分享到朋友圈”按钮,自定义分享内容及分享结果接口
wx.onMenuShareTimeline({
title:'<分享标题>',
link:'<要分享的链接>',
imgUrl:'<分享时显示的图片>',
success:function(){ //可以定义一些分享执行后的通知事件
alert("success");
}
});
//验证配置出错时的结果通知
wx.error(function (res) {
alert('wx.error: '+JSON.stringify(res));
});
});
</script>
欢迎尝试
注:每次token的有效期是2个小时,所以需要定期的更新token;另外由于涉及到一些敏感和关键的信息,所以生成签名的逻辑一定要放在后台实现,然后给前端返把值推送回来。