1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 微信公众号自定义分享实现(开发者)

微信公众号自定义分享实现(开发者)

时间:2018-12-03 19:30:12

相关推荐

微信公众号自定义分享实现(开发者)

文章目录

一、公众号管理,绑定域名二、在页面引入JS文件三、通过config接口注入权限验证配置四、通过ready接口处理成功验证五、步骤三中参数获取1、Controller层2、Service层方法实现(1)首先是获取时间戳和随机串。(2)生成随机串方法(3)获取签名(4)其中获取jsapi_ticket的方法(5)获取jsapi_ticket前首先获取token(6)接获取签名中的Sha1方法 六、总结

一、公众号管理,绑定域名

进入微信公众号管理,在JS接口安全域名修改出配置自己的域名。

二、在页面引入JS文件

<script src="http://res./open/js/jweixin-1.0.0.js?v=7f54"></script>

三、通过config接口注入权限验证配置

wx.config({debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,appId: '${appId}', // 必填,公众号的唯一标识timestamp: '${timestamp}', // 必填,生成签名的时间戳nonceStr: '${nonceStr}', // 必填,生成签名的随机串signature: '${signature}',// 必填,签名jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline'] // 必填,需要使用的JS接口列表});

其中jsApiList表示需要使用的JS接口列表,上面“onMenuShareAppMessage”和“onMenuShareTimeline”分别是分享微信好友和分享微信朋友圈。后面第五步将会介绍在后台如何获取时间戳、随机串和签名等问题。

四、通过ready接口处理成功验证

// 获取需要使用的相关参数var memberSid = "${member.memberSid}";var baseUrl = "${baseUrl}";var linkUrl = baseUrl + "/lachinHit.html?memberSid="+memberSid+"&f="+flag;var src =baseUrl+ "/images/activity/lachin/fenxiangPic.png"wx.ready(function(){wx.onMenuShareAppMessage({title: '我的标题', // 分享标题desc: '我的分享描述', // 分享描述link: linkUrl, // 分享链接 imgUrl: src, // 分享图标type: '', // 分享类型,music、video或link,不填默认为linkdataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空success: function () {alert("分享微信好友成功!");},cancel: function () {alert('分享微信好友失败');}});wx.onMenuShareTimeline({title: '我的标题', // 分享标题desc: '我的分享描述', // 分享描述link: linkUrl, // 分享链接 imgUrl: src, // 分享图标type: '', // 分享类型,music、video或link,不填默认为linkdataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空success: function () {alert("分享微信好友成功!");},cancel: function () {alert('分享朋友圈失败');}});});

五、步骤三中参数获取

1、Controller层

JSONObject config = wxInfoService.JSConfig(request);model.addAttribute("member", member);model.addAttribute("appId", config.getString("appId"));model.addAttribute("timestamp", config.getString("timestamp"));model.addAttribute("nonceStr", config.getString("nonceStr"));model.addAttribute("signature", config.getString("signature"));

2、Service层方法实现

(1)首先是获取时间戳和随机串。

public JSONObject JSConfig(HttpServletRequest request) throws Exception {JSONObject json = new JSONObject();// 从配置文件中读取appidString appId = PropertiesLoader.get("appid");// 获取时间戳String timestamp = System.currentTimeMillis() / 1000 + "";// 生成随机串String nonceStr = CommonUtil.createNonceStr(10);String currentUrl = request.getRequestURL() + "";if (StringUtils.isNotEmpty(request.getQueryString())) {currentUrl = currentUrl + "?" + request.getQueryString();}// 获取签名,重要步骤String signature = getJSSign(nonceStr, timestamp, currentUrl);json.put("appId", appId);json.put("timestamp", timestamp);json.put("nonceStr", nonceStr);json.put("signature", signature);return json;}

(2)生成随机串方法

public static String createNonceStr(int length) {String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";String res = "";for (int i = 0; i < length; i++) {Random rd = new Random();res += chars.charAt(rd.nextInt(chars.length() - 1));}return res;}

(3)获取签名

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

public String getJSSign(String noncestr, String timestamp, String url)throws Exception {// 获取jsapi_ticketString ticket = getJSTicket();StringBuffer buffer = new StringBuffer();buffer.append("jsapi_ticket=" + ticket);buffer.append("&");buffer.append("noncestr=" + noncestr);buffer.append("&");buffer.append("timestamp=" + timestamp);buffer.append("&");buffer.append("url=" + url);String temp = buffer.toString();logger.info("getJSSign获取jsapi_ticket的参数为:currentUrl=" + url +"---timestamp=" + timestamp + "---nonceStr=" + noncestr +"----jsticket=" + ticket + "-----生成的signature=" + CommonUtil.Sha1(temp));return CommonUtil.Sha1(temp);}

(4)其中获取jsapi_ticket的方法

public String getJSTicket() throws Exception {String ticket = null;try {ticket = shopinRedis.get(Constants.JS_TICKET_KEY);if (ticket != null) {return ticket;}// 获取tokenString token = getToken();// url = "https://api./cgi-bin/ticket/getticket?type=jsapi&access_token=" + tokenString url = PropertiesLoader.get("wechat_api") + PropertiesLoader.get("js_ticket") + token;String result = HttpUtil.Get(url);JSONObject json = JSONObject.parseObject(result);ticket = json.getString("ticket");// 放入缓存this.shopinRedis.delete(Constants.JS_TICKET_KEY);this.shopinRedis.set(Constants.JS_TICKET_KEY, ticket, 60 * 60 * 1);} catch (Exception e) {e.printStackTrace();}return ticket;}

(5)获取jsapi_ticket前首先获取token

public String getToken() throws Exception {String accessToken = null;try {accessToken = shopinRedis.get(Constants.ACCESS_TOKEN_KEY);if (accessToken != null) {return accessToken;}// 读取配置信息中配置的appid和secretString appid = PropertiesLoader.get("appid");String secret = PropertiesLoader.get("secret");// url = "https://api./cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secretString url = PropertiesLoader.get("wechat_api") + PropertiesLoader.get("access_token") + "&appid="+ appid + "&secret=" + secret;String result = HttpUtil.Get(url);JSONObject json = JSONObject.parseObject(result);accessToken = json.getString("access_token");// token放入缓存this.shopinRedis.delete(Constants.ACCESS_TOKEN_KEY);this.shopinRedis.set(Constants.ACCESS_TOKEN_KEY, accessToken, 60 * 60 * 2);} catch (Exception e) {e.printStackTrace();}return accessToken;}

(6)接获取签名中的Sha1方法

public final static String Sha1(String s) {char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };try {byte[] btInput = s.getBytes();// 获得MD5摘要算法的 MessageDigest 对象MessageDigest mdInst = MessageDigest.getInstance("sha-1");// 使用指定的字节更新摘要mdInst.update(btInput);// 获得密文byte[] md = mdInst.digest();// 把密文转换成十六进制的字符串形式int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}}

六、总结

以上针对公众号开发者配置如有异常,请仔细检查保证appid,secret等参数无误。如有问题,请参照:微信公众平台开发文档:https://mp./wiki?t=resource/res_main&id=mp1421141115

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。