1、页面签名
/** * jsapi 签名 * jsapi_signature * 需要页面传递参数:url:所需签名页面的当前页面路径(可以用window.location.href查看) */ @RequestMapping(value="/jsapi_signature") @ResponseBody public PageData jsapi_signature(){ PageData pd =this.getPageData(); logger.info("jsapi 签名"); PageData pt=new PageData(); pd = this.getPageData(); try { String ticket = null; // 存储凭证和生成时间 FishingSingle instance = FishingSingle.instance; if (null != instance.getJsGenerateTime()) { Date currentTime = new Date(); // 计算时间差 long time = ((currentTime.getTime() - instance.getJsGenerateTime() .getTime()) / 1000); // ticket有效时间7200秒 if (time >= 7100) { // 获取js凭证 ticket = WeixinUtil.jsApi(); } else { ticket = instance.getJsTicket(); } } else { // 获取js凭证 ticket = WeixinUtil.jsApi(); } //ticket = WeixinUtil.jsApi(); Map<String, Object> paramsMap = new HashMap<String, Object>(); paramsMap.put("jsapi_ticket", ticket); System.out.println("jsapi_ticket="+ticket); paramsMap.put("timestamp", System.currentTimeMillis()); paramsMap.put("noncestr", "weixin"); // 调用js的页面完成路径 String total_url = pd.getString("url"); paramsMap.put("url",total_url+"&state=1"); pt.put("total_url", total_url); // 排序后的结果 String listStr = createLinkString(paramsMap); logger.info("排序后..." + listStr); // SHA-1加密 String tmpStr = new MySecurity().encode(listStr, MySecurity.SHA_1); logger.info("SHA-1加密后:" + tmpStr); // 保存js需要的4个参数 pd.put("appId",WeixinUtil.appId ); pd.put("timestamp",paramsMap.get("timestamp") ); pd.put("nonceStr",paramsMap.get("noncestr")); pd.put("signature",tmpStr); } catch (Exception e) { logger.error(e.toString(), e); } return pd; } /** * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 * * @param params * 需要排序并参与字符拼接的参数组 * @return 拼接后字符串 */ public static String createLinkString(Map<String, Object> params) { List<String> keys = new ArrayList<String>(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); Object value = params.get(key); if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符 prestr = prestr + key + "=" + value; } else { prestr = prestr + key + "=" + value + "&"; } } return prestr; }
2、分享js
/* * 注意: * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。 * 3. 常见问题及完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html * * 开发中遇到问题详见文档“附录5-常见错误及解决办法”解决,如仍未能解决可通过以下渠道反馈: * 邮箱地址:weixin-open@qq.com * 邮件主题:【微信JS-SDK反馈】具体问题 * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。 * * 说明:此js用于配置微信公众号js-sdk相关参数 * =======================本系统所有页面需要用到微信js-sdk相关接口都需要 加入此js即可==================================================== */ var server_path = "";//服务器路径 var basePath = "";//服务器路径 var debug = true; var appId = "wx0dd21a0061759b0c"; var timestamp = ""; var nonceStr = ""; var signature = ""; /** 初始化微信接口配置 */ function init_weixin_config(web_title,web_url,web_logo_small,web_description){ console.log("url11:"+window.location.href); /** 先通过本系统服务端的一个接口,获取该签名等信息 */ $.ajax({ url:"weixin/jsapi_signature", data:"url="+window.location.href, success:function(json){ timestamp = json.timestamp; nonceStr = json.nonceStr; signature = json.signature; console.log("timestamp:"+timestamp); console.log("nonceStr:"+nonceStr); console.log("signature:"+signature); console.log("url22:"+window.location.href); /** 获取签名等数据后再设置本地微信js配置参数 ,设置完下面的配置之后,别的页面就可以用 js-sdk的jsApiList中的功能了 */ wx.config({ debug: false, appId: appId, timestamp: timestamp, nonceStr: nonceStr, signature: signature, jsApiList: [ 'checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone', 'hideMenuItems', 'showMenuItems', 'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem', 'translateVoice', 'startRecord', 'stopRecord', 'onVoiceRecordEnd', 'playVoice', 'onVoicePlayEnd', 'pauseVoice', 'stopVoice', 'uploadVoice', 'downloadVoice', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'getNetworkType', 'openLocation', 'getLocation', 'hideOptionMenu', 'showOptionMenu', 'closeWindow', 'scanQRCode', 'chooseWXPay', 'openProductSpecificView', 'addCard', 'chooseCard', 'openCard' ] }); wx.ready(function(){ //wx.hideMenuItems({menuList: ['menuItem:share:qq','menuItem:share:weiboApp','menuItem:share:facebook','menuItem:share:QZone','menuItem:copyUrl','menuItem:share:email','menuItem:openWithQQBrowser','menuItem:openWithSafari','menuItem:share:brand']}); //wx.showMenuItems({menuList: ['menuItem:profile','menuItem:addContact']}); wx.showMenuItems({menuList: ['menuItem:share:qq','menuItem:share:weiboApp','menuItem:share:facebook','menuItem:share:QZone','menuItem:copyUrl','menuItem:share:email','menuItem:openWithQQBrowser','menuItem:openWithSafari','menuItem:share:brand']}); weixin_share_all_init(web_title,web_url,web_logo_small,web_description,0,0); }); } }); } /*=//////////////////以下几种分享用于通用的分享,如需个性化,请在自行的页面中编写////////////微信分享相关js 开始///////////////////////////////////////*/ /**微信分享统一初始化函数:页面通过此方法=初始化微信相关的所有分享接口*/ function weixin_share_all_init(title,link,imgUrl,desc,objType,objId){ desc = desc.substring(0,40); weixin_share_friends(title,link,imgUrl,desc,objType,objId); weixin_share_circle_of_friends(title,link,imgUrl,objType,objId); weixin_share_qq(title,link,imgUrl,desc,objType,objId); weixin_share_weibo(title,link,imgUrl,desc,objType,objId); weixin_share_QZone(title,link,imgUrl,desc,objType,objId); } /**保存分享成功记录======================客户端分享成功后调用,服务器保存分享记录=======================================*/ function save_share(link,channel,objType,objId){ $.ajax({ type: "get", url: basePath+"/share/save", data: "share.link="+link+"&share.channel="+channel+"&share.objType="+objType+"&share.objId="+objId, success: function(html){ /*alert("分享成功");*/ } }); } /** * 微信分享邀请注册成功后回调此函数 * @param link */ function share_registe_success(link){ if(link.indexOf("open_share")>-1){ $.ajax({ type: "get", url: basePath+"/hongbao/share_registe_success", success: function(json){ if(json.code=="00"){ alert("分享获取奖金成功"); window.location.href = basePath+"hongbao/share_registe_success_view?change_score_money="+json.change_score_money; }else{ alert("分享成功"); } } }); } } /**微信分享给朋友===============初始化此方法,用于设置 分享内容及监听事件=======1==========================*/ function weixin_share_friends(title,link,imgUrl,desc,objType,objId){ wx.onMenuShareAppMessage({ title: title, desc: desc, link: link, imgUrl: imgUrl, trigger: function (res) { // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回 alert('用户点击发送给朋友'); }, success: function (res) { //save_share(link,1,objType,objId); alert('已分享'); share_registe_success(link); }, cancel: function (res) { alert('已取消'); }, fail: function (res) { alert(JSON.stringify(res)); } }); } /**微信分享朋友圈===================页面需要初始化此方法==============2=================*/ function weixin_share_circle_of_friends(title,link,imgUrl,objType,objId){ wx.onMenuShareTimeline({ title: title, link: link, imgUrl: imgUrl, trigger: function (res) { // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回 // alert('用户点击分享到朋友圈'); }, success: function (res) { // save_share(link,2,objType,objId); alert('已分享'); share_registe_success(link); }, cancel: function (res) { // alert('已取消'); }, fail: function (res) { // alert(JSON.stringify(res)); } }); } /** * 微信分享QQ===================页面需要初始化此方法==============3================= */ function weixin_share_qq(title,link,imgUrl,desc,objType,objId){ wx.onMenuShareQQ({ title: title, desc: desc, link: link, imgUrl: imgUrl, trigger: function (res) { // alert('用户点击分享到QQ'); }, complete: function (res) { // alert(JSON.stringify(res)); }, success: function (res) { // save_share(link,3,objType,objId); alert('已分享'); share_registe_success(link); }, cancel: function (res) { // alert('已取消'); }, fail: function (res) { // alert(JSON.stringify(res)); } }); } /**微信分享到微博====================页面需要分享微博 需初始化此方法============4==================*/ function weixin_share_weibo(title,link,imgUrl,desc,objType,objId){ wx.onMenuShareWeibo({ title: title, desc: desc, link: link, imgUrl: imgUrl, trigger: function (res) { // alert('用户点击分享到微博'); }, complete: function (res) { // alert(JSON.stringify(res)); }, success: function (res) { // save_share(link,4,objType,objId); alert('已分享'); share_registe_success(link); }, cancel: function (res) { // alert('已取消'); }, fail: function (res) { // alert(JSON.stringify(res)); } }); } /**微信分享到QQ空间==============页面需要分享到QQ空间========5==========*/ function weixin_share_QZone(title,link,imgUrl,desc,objType,objId){ wx.onMenuShareQZone({ title: title, desc: desc, link: link, imgUrl: imgUrl, trigger: function (res) { // alert('用户点击分享到QZone'); }, complete: function (res) { // alert(JSON.stringify(res)); }, success: function (res) { // save_share(link,5,objType,objId); alert('已分享'); share_registe_success(link); }, cancel: function (res) { // alert('已取消'); }, fail: function (res) { // alert(JSON.stringify(res)); } }); } /**微信分享到QQ空间==============页面需要分享到QQ空间========5==========*/ function weixin_copyUrl(title,link,imgUrl,desc,objType,objId){ wx.onMenuShareQZone({ title: title, desc: desc, link: link, imgUrl: imgUrl, trigger: function (res) { // alert('用户点击分享到QZone'); }, complete: function (res) { // alert(JSON.stringify(res)); }, success: function (res) { // save_share(link,5,objType,objId); alert('已分享'); share_registe_success(link); }, cancel: function (res) { // alert('已取消'); }, fail: function (res) { // alert(JSON.stringify(res)); } }); } /*=/////////////////////////////////////////////////////微信分享相关js 结束////////////////////////////////////////////////////////////////////*/
3、页面代码
$(function(){ var web_title = '要分享的标题'; //标题 var web_url = '要分享的地址'; //路径 var web_logo_small = '分享图标的地址'; //图标 var web_description = '分享描述的内容'; //描述 init_weixin_config(web_title,web_url,web_logo_small,web_description); });