博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java开发的微信分享到朋友圈功能
阅读量:7173 次
发布时间:2019-06-29

本文共 7340 字,大约阅读时间需要 24 分钟。

  hot3.png

微信分享到朋友圈其实是微信中的一个内置功能,但当我们想自定义分享的内容的时候,就得自己写js代码调用微信的jsapi。

过程大体分为两步:

一、当你打开一个页面(你项目中需要加入分享朋友圈功能的页面)时,会执行一段js代码,这段js代码中实现了一个微信注入权限的功能,因为只有注入权限之后你才可以调用微信的分享朋友圈的功能,微信注入权限接口的js代码如下所示:

$(function(){	    ajaxConfig();	}); 	function ajaxConfig(){	$.ajax({	        type:"post",	        dataType: "json",	        data: {	           url : location.href.split('#')[0]	        },	        url: "${pageContext.request.contextPath }/wxUser/testConfig.shtml",	        success: function(obj){	            if(obj.result == "success"){	                //微信注入权限接口	                wx.config({	                  debug: false,	                  appId: obj.appId,	                  timestamp: obj.timestamp,	                  nonceStr: obj.nonceStr,	                  signature: obj.signature,	                  jsApiList: [	                    'onMenuShareTimeline',  //分享到朋友圈                 	                  ]	              });	            }else{	                alert("加载数据错误");	            }	        },	        error:function(){	            alert("系统请求异常!");	        }	    });	}

如果接口权限注入成功,这个接口需要5个重要的参数,公众号的appid,时间戳timestamp,随机字符串nonceStr,以及加密签名signature,这四个参数通过ajax的回调函数进行接收,后台代码的实现如下:

@RequestMapping("/testConfig")	public void testConfig(String url,Model model,HttpServletResponse response) throws IOException{        String jsapi_ticket = JsapiTicketTimeTask.jsapi_ticket;        String result;        if("".equals(jsapi_ticket)){            result = "error";        }        //进行数据的加密(url,jsapi_ticket,nonceStr,timestamp)等参数进行SHA1加密        Map
ret = Sign.sign(jsapi_ticket, url); String appId=WxConfigure.getAPPID(); String timestamp = ret.get("timestamp"); String nonceStr = ret.get("nonceStr"); String signature = ret.get("signature"); result = "success"; JSONObject jsonObject = new JSONObject(); jsonObject.put("timestamp", timestamp); jsonObject.put("nonceStr", nonceStr); jsonObject.put("signature", signature); jsonObject.put("result", result); jsonObject.put("appId", appId); response.setContentType("application/json;charset=utf-8"); response.setHeader("Access-Control-Allow-Origin", "*"); response.getWriter().write(jsonObject.toString()); }

二、当你点击你页面的一个按钮时(携带有点击事件的标签,不一定非得是按钮),会弹出一个页面指向右上角提示你分享朋友圈(因为微信不能实现自定义的按钮直接分享到朋友圈,所以只能这样提示),会调用微信分享朋友圈的js代码,微信分享到朋友圈的js代码如下所示:

$("#share").on("click", function() {	    $("#shareit").show();	    wx.onMenuShareTimeline({	    	title: '欢迎来到慧聪网产业带性格色彩测试',	        link: 'https://rong580.com/wzh/wxUser/toTestChoice.shtml',	        imgUrl: '../img/zp-header.png',	        trigger: function (res) {	        },	        success: function (res) {	          alert('已分享');	          window.location.href="toIndex.shtml?tag4="+4;	        },	        cancel: function (res) {	          alert('已取消');	          window.location.href="toIndex.shtml";	        },	        fail: function (res) {	          alert(JSON.stringify(res));	        }	      });	});$("#shareit").on("click", function(){	  $("#shareit").hide(); 	})

这时候你点击分享朋友圈按钮,就可以将你自定义的内容分享到朋友圈了,这里的shareit就是你指引你分享到朋友圈的图片,通过点击事件可以控制它的显示与隐藏,这个图片你可以自定义,大概是这样的:

以上就是分享到朋友圈的功能实现;

在这个功能中会实现遇到一个问题,就是jsapiticket的获取,因为微信官方规定jsapiticket每天的获取次数是有限的,一旦超过次数就无法获取,这样就会影响到项目的正常功能,这里可以写一个定时器每小时获取一次就可以了。定时器利用spring的定时器来实现,直接在spring的配置文件中配置即可:

这里要注意一个问题,spring3和spring4中所使用的定时器是不一样的;

接下来附上相关的代码:

获取jsapiticket的类:

package chan.ye.dai.wexin;import chan.ye.dai.http.Con2http;import net.sf.json.JSONObject;/** * * @ClassName: JsapiTicketTimeTask * @Description: TODO(jsapi_ticket类) * @author anyou* @date 2016年12月9日 上午8:29:19 * */public class JsapiTicketTimeTask {    public static String jsapi_ticket = "";  /**   *   * @Title: getTicket   * @Description: TODO(每隔一个小时调用一次微信获取jsapi的接口的任务调用器,在spring配置里面调用)   * @param     设定文件   * @return void    返回类型   * @throws   */    public static void getTicket() {        //调用微信接口获取access_token凭证        //Constant.ACCESS_TOKEN = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET        String _url = WexinUrlConst.WEXIN_USER_ACCESS_TOKEN.replace("APPID", WxConfigure.getAPPID()).replace("SECRET", WxConfigure.getAPPSECRET());        String resp = new Con2http().httpsRequest(_url, "GET", null);        if (!resp.contains("errcode")) {			JSONObject object = JSONObject.fromObject(resp);			String access_token = (String) object.get("access_token");			 if(access_token != null && !"".equals(access_token)){	                //如果可以获取access_token,即可以调用jsapi_tiket的凭证了	                String ticketUrl = WexinUrlConst.JSAPI_TICKET.replace("ACCESS_TOKEN", access_token);   //Constant.JSAPI_TICKET = https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi	                String ticketStr = new Con2http().httpsRequest(ticketUrl, "GET", null);	                JSONObject ticketJson = JSONObject.fromObject(ticketStr);	                String errmsg = (String) ticketJson.get("errmsg");	                //如果调用成功,返回ok	                if("ok".equals(errmsg)){	                    jsapi_ticket = (String) ticketJson.get("ticket");		                 	                }			}		}        }}

sign类:

package chan.ye.dai.utils;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Formatter;import java.util.HashMap;import java.util.Map;import java.util.UUID;public class Sign {	public static Map
sign(String jsapi_ticket, String url) { Map
ret = new HashMap
(); String nonce_str = create_nonce_str(); String timestamp = create_timestamp(); String string1; String signature = ""; //注意这里参数名必须全部小写,且必须有序 string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "&timestamp=" + timestamp + "&url=" + url; System.out.println(string1); try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(string1.getBytes("UTF-8")); signature = byteToHex(crypt.digest()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } ret.put("url", url); ret.put("jsapi_ticket", jsapi_ticket); ret.put("nonceStr", nonce_str); ret.put("timestamp", timestamp); ret.put("signature", signature); return ret; } private static String byteToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; } private static String create_nonce_str() { return UUID.randomUUID().toString(); } private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); }}

 

 

转载于:https://my.oschina.net/ayo123/blog/804660

你可能感兴趣的文章
tomcat应用转到weblogic上时的问题
查看>>
国外程序员是如何准备面试的
查看>>
Zookeeper监控之——node-zk-browser
查看>>
我的友情链接
查看>>
10个最酷的linux单行命令
查看>>
myeclipse 10 在mac retina 屏幕下显示字体模糊解决方法
查看>>
创建自定义的指令
查看>>
javascript对象中判断属性
查看>>
git删除分支与合并分支
查看>>
Python元组
查看>>
HD TUNE以及所有其他硬盘检测工具都不能使用的情况
查看>>
Linux内存分析
查看>>
vSphere 5.5 vCenter迁移至分布式交换机
查看>>
排序 遍历
查看>>
第二次作业
查看>>
Mysql主从复制
查看>>
高斯消元法解非奇异线性方程组的MATLAB程序
查看>>
手势UIGestureRecognizer
查看>>
mongo 手册阅读笔记
查看>>
viewport ——视区概念
查看>>