【移动】微信公众好网页分享开发
2017-11-17 08:45
357 查看
/** * 【方法用途】 * 获得微信分享接口初始化配置参数 * 【方法说明】 * 第一步,从数据库获取token和ticket的信息:access_token码、ticket码、ex_access_token产生的timestamp。 * 第二步,如果access_token失效,发送请求进行刷新。 * 第三步,发送请求获得许可码jsapi_ticket,需要的请求参数:access_token。 * 第四步,使用jsapi_ticket,进行签名。签名需要内容按顺序有:jsapi_ticket、随机字符串(未规定长度)、时间戳、当前页面的url。 * url不含#以后的内容。将所需内容合并后使用sha1签名,生成signature。 * 最后返回初始化配置信息: * ticket: 下次可以使用,放在前端浏览器缓存 * expires_ticket:下次调用时判断ticket是否过期,需要重新申请。 * signature: sha1签名后的字符串 * 【备注】(废弃) * 在调用分享接口前,需要对微信JS-JDK进行初始化,首先要取得初始化参数。 * * * @return */ public String requestSign1(){ String web_url = httpServletRequest.getParameter("url"); if(web_url==null || "".equals(web_url)){ map = new HashMap<String, Object>(); map.put("flag", "error"); map.put("message", "您的网络出现异常,请关闭该页面,稍后重试"); json = (JSON) JSON.toJSON(map); return "error"; } /* * 如果上次使用的ticket存在,且不超时,可直接进行签名。 */ try { String access_token="",ticket=""; // Long ex_access_token=null,ex_ticket=null; // List<Sysconfig> list = sysconfigService.getSysconfigByConfigType("WECHATCONFIG"); Sysconfig tokenSysconfig = null; Sysconfig ticketSysconfig = null; for(Sysconfig sys : list){ if("access_token".equals(sys.getConfigName())){ access_token = sys.getConfigValue(); ex_access_token = sys.getRemark()==null||"".equals(sys.getRemark())? null:Long.parseLong(sys.getRemark()); tokenSysconfig = sys; } if("ticket".equals(sys.getConfigName())){ ticket = sys.getConfigValue(); ex_ticket = sys.getRemark()==null||"".equals(sys.getRemark())? null:Long.parseLong(sys.getRemark()); ticketSysconfig = sys; } } System.out.println("access_token:"+access_token); System.out.println("ex_access_token:"+ex_access_token); System.out.println("ticket:"+ticket); System.out.println("ex_ticket:"+ex_ticket); /* * 判断ticket是否过期,若有效则直接开始签名 * 若ticket过期,再判断token码是否过期,若没过期,使用token申请新的ticket * 若token也过期了,则重新申请token,然后再申请ticket */ if(ex_ticket==null || (System.currentTimeMillis()-ex_ticket)>7000000){ System.out.println("无ticket或ticket过期"); if(ex_access_token==null || (System.currentTimeMillis()-ex_access_token)>7000000){ System.out.println("token过期,重新申请……"); //请求token的地址 String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&" + "appid=" + WeChatUtil.APPID + "&secret=" + WeChatUtil.SECRET; //请求token String result = HttpRequestUtil.getRequest(token_url); /* * 判断返回错误信息的话只有两个内容 * 示例:{"errcode":40029,"errmsg":"invalid code"} * * 正确时返回的JSON数据包如下: * { * "access_token":"ACCESS_TOKEN", * "expires_in":7200, * } */ System.out.println(result); JSONObject token_message = JSONObject.fromObject(result); //判断是否成功获得token if(token_message.getString("access_token")!=null){ access_token = token_message.getString("access_token"); ex_access_token = System.currentTimeMillis(); //更新数据库中的请求数据 tokenSysconfig.setConfigValue(access_token); tokenSysconfig.setRemark(ex_access_token.toString()); this.sysconfigService.updateSysconfig(tokenSysconfig); System.out.println("成功更新token数据……"); }else{ map = new HashMap<String, Object>(); map.put("flag", "error"); map.put("message", "服务器异常,无法从微信公众平台获得授权"); json = (JSON) JSON.toJSON(map); return "error"; } } //下一步需要来获得ticket(到此已经成功获得新的token码,并更新入数据库) System.out.println("开始申请ticket……"); //生成ticket的参考时间,该变量在本分支中也用于签名 String jsapi_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?" + "access_token="+access_token+"&type=jsapi"; String result = HttpRequestUtil.getRequest(jsapi_ticket_url); System.out.println(result); JSONObject jsapi_ticket_message = JSONObject.fromObject(result); if(!"ok".equals(jsapi_ticket_message.getString("errmsg"))){ System.out.println("申请ticket失败……"); map = new HashMap<String, Object>(); map.put("flag", "error"); map.put("message", "身份信息过期,请关闭页面,重新点击公众菜单入口"); map.put("errcode", jsapi_ticket_message.getString("errcode")); json = (JSON) JSON.toJSON(map); return "error"; } ab8a ticket = jsapi_ticket_message.getString("ticket"); Timestamp timestamp = new Timestamp(System.currentTimeMillis()); ticketSysconfig.setConfigValue(ticket); ticketSysconfig.setRemark(String.valueOf(timestamp.getTime())); this.sysconfigService.updateSysconfig(ticketSysconfig); System.out.println("成功获得ticket……"); } System.out.println("开始使用ticket签名……"); //随机字符串 String noncestr = getRandomString(11); Timestamp timestamp = new Timestamp(ex_ticket); String str = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp.getTime() + "&url=" + web_url; //进行sha1签名 String signature = DigestUtils.sha1Hex(str); //返回内容 map = new HashMap<String, Object>(); //初始化配置必须参数 map.put("flag", "success"); map.put("timestamp", timestamp.getTime()); map.put("nonceStr", noncestr); map.put("signature", signature); map.put("appId", WeChatUtil.APPID); json = (JSON) JSON.toJSON(map); System.out.println("签名完毕……"); System.out.println(map.toString()); return "success"; } catch (Exception e) { e.printStackTrace(); } return "error"; }
/**
* 生成随机字符串
* @param length 需要生成字符串的长度
* @return
*/
public static String getRandomString(int length) {
String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
$.ajax({ type: 'POST', url: url, dataType: 'JSON', data: { 'url' : window.location.href.split('#')[0] }, async : false, success: function(msg){ console.log(msg); if (msg.flag == 'success') { wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: msg.appId, // 必填,公众号的唯一标识 timestamp: msg.timestamp, // 必填,生成签名的时间戳 nonceStr: msg.nonceStr, // 必填,生成签名的随机串 signature: msg.signature,// 必填,签名,见附录1 jsApiList: [ 'checkJsApi', 'openLocation', 'getLocation', 'onMenuShareTimeline', 'onMenuShareAppMessage' ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); var sysUrl = window.localStorage.getItem('shareUrl'); wx.ready(function(){ $('#wechat_share').hide(); alertX('您要分享的内容已经复制到剪贴板,请点击窗口右上角的菜单,选择发送给朋友。'); wx.onMenuShareAppMessage({ title: '个性化保单', // 分享标题 desc: window.localStorage.getItem("shareTip"), // 分享描述 link: window.localStorage.getItem("shareToWechatHref"), // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: sysUrl+"me/img/app_logo.png", // 分享图标 type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { onSuccess(); // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); }); } else { if(msg.errcode) { alertX(msg.errcode); } } }, error : function(msg){ alertX('服务器繁忙请稍后重试'); } });
相关文章推荐
- 类似818tu.c微信小说分销系统设计之多公众号网页授权自动登录源码分享
- 微信公众帐号开发教程第8篇-文本消息中使用网页超链接
- 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
- 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
- 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
- 微信公众平台开发学习--微信分享【微信公众开发者文档学习】
- 微信公众帐号开发教程第8篇-文本消息中使用网页超链接
- 微信网页开发weixin://preInjectJSBridge/fail、分享描述失效问题记录
- 微信公众帐号开发教程第14篇-自定义菜单的view类型(访问网页)
- 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
- 微信小程序开发文档:移动应用支持小程序类型分享(iOS应用)
- [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
- 微信公众帐号开发教程第8篇-文本消息中使用网页超链接
- 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
- 微信开发关闭当前网页跳到公众号主界面
- 微信网页开发分享
- 微信开发关闭当前网页跳到公众号主界面
- 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
- 小程序开发文档:移动应用支持微信小程序类型分享(Android应用)