示例网页

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta name="format-detection" content="telephone=no">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<meta name="author" content="ershuai" />
<meta name="Copyright" content="ershuai" /><title>二帅</title><script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript" src="../scripts/common/wx_share/wechat_common_share.js"></script>
</head>
<body>init share
</body>
<script type="text/javascript">$(document).ready(function() {var initUrl = window.location.href;var shareLogo = "http://img3.imgtn.bdimg.com/it/u=224917259,3388622236&fm=21&gp=0.jpg";var lineLink = "https://www.baidu.com";var shareContent = "分享的内容描述";var shareTitle = "分享的标题描述";initShare(initUrl, lineLink, shareTitle, shareContent, shareLogo);});
</script>
</html>

wechat_common.share.js

var init_share_url = "http://[host]/wechat/initWechatConfig.xhtml";/*** 初始化分享* @param initUrl            当前初始化网页地址* @param lineLink         点击后跳转地址* @param shareTitle     分享标题* @param shareContent      分享内容* @param shareLogo         分享logo*/
function initShare(initUrl, lineLink, shareTitle, shareContent, shareLogo) {$.ajax({type : "post",url : init_share_url,data : {"initUrl" : initUrl,"initType" : "jsapi"},dataType : "json",error : function(request) {alert('初始化分享失败,请稍后重试');},success : function(ajaxRes) {var state = ajaxRes.state;if (state == 1) {var data = ajaxRes.data;//初始化微信配置wxShareConfig(data.appId, data.timestamp, data.nonceStr, data.signature);//分享准备wxShareReady(lineLink, shareTitle, shareContent, shareLogo);} else {alert(ajaxRes.msg);}}});
};/*** 初始化微信分享配置* @param appId* @param timestamp* @param nonceStr* @param signature*/
function wxShareConfig(appId, timestamp, nonceStr, signature) {wx.config({debug: false,appId: appId,timestamp: timestamp,nonceStr: nonceStr,signature: signature,jsApiList: ['checkJsApi','onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareQZone']});wx.error(function (res) {alert(res.errMsg);});
}/*** 分享准备* @param lineLink* @param shareTitle* @param shareContent* @param shareLogo*/
function wxShareReady(lineLink, shareTitle, shareContent, shareLogo) {wx.ready(function () {//获取“分享到朋友圈”wx.onMenuShareTimeline({title: shareTitle, // 分享标题link: lineLink, // 分享链接imgUrl: shareLogo, // 分享图标success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});//获取“分享给朋友”wx.onMenuShareAppMessage({title: shareTitle, // 分享标题desc: shareContent, // 分享描述link: lineLink, // 分享链接imgUrl: shareLogo, // 分享图标type: 'link', // 分享类型,music、video或link,不填默认为linkdataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空success: function () { // 用户确认分享后执行的回调函数//alert('已分享');//window.location.href = "https://www.baidu.com";},cancel: function () { // 用户取消分享后执行的回调函数//alert('已取消');}});//获取“分享到QQ”wx.onMenuShareQQ({title: shareTitle, // 分享标题desc: shareContent, // 分享描述link: lineLink, // 分享链接imgUrl: shareLogo, // 分享图标success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});//获取“分享到QQ空间”wx.onMenuShareQZone({title: shareTitle, // 分享标题desc: shareContent, // 分享描述link: lineLink, // 分享链接imgUrl: shareLogo, // 分享图标success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});//获取“分享到腾讯微博”wx.onMenuShareWeibo({title: shareTitle, // 分享标题desc: shareContent, // 分享描述link: lineLink, // 分享链接imgUrl: shareLogo, // 分享图标success: function () { // 用户确认分享后执行的回调函数},cancel: function () { // 用户取消分享后执行的回调函数}});});
}

到这里,前端就完事了

现在实现,init_share_url方法

var init_share_url = "http://[host]/wechat/initWechatConfig.xhtml";

initWechatConfig方法内容:

(因为我这个有多个服务号要维护,是根据rawId来判断的;一般情况是不用rawId参数的)

@RequestMapping("/initWechatConfig.xhtml")public void initWechatConfig(HttpServletRequest request, HttpServletResponse response) throws Exception {try {String initUrl = getParams("initUrl");//当前网页地址String initType = getParams("initType");if (CommonUtil.isNull(initUrl) || CommonUtil.isNull(initType)) {//判断nullthrow new BizException(ErrorMsg.PARAMS_NULL);}String rawId = getParams("rawId");if (CommonUtil.isNull(rawId)) {rawId = Constants.RawId_broker;}HashMap<String, Object> respMap = new HashMap<String, Object>();if ("jsapi".equals(initType)) {//初始化分享String noncestr = RandomUtil.nextInt(initType.toUpperCase(), 100, 999);//随机数,用uuid什么的也可以String timestamp = DateUtil.getTimestampWx();//时间戳 Long.toString(System.currentTimeMillis() / 1000)String signature = null;//获取Ticket ticket = this.wechatService.getJsapiTicket(rawId);signature = SHA1Util.signForJsapiTicket(ticket.getTicket(), noncestr, timestamp, initUrl);respMap.put("appId", Constants.getAppId(rawId));respMap.put("timestamp", timestamp);respMap.put("nonceStr", noncestr);respMap.put("signature", signature);} else if ("pay".equals(initType)) {//初始化支付}writeSuccMsg(response, respMap);} catch (Exception e) {log.error("初始化微信配置 异常:", e);writeErrorMsg(response, e.getMessage());}}

RequestAddr的参数配置

// 获取access_token的接口地址(GET) API要求每天限制2000 - 全局access_token
public static final String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";

// 获取ticket_url的接口地址(GET) API
public static final String ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
// 获取ticket_url的参数
public static final String ticket_url_params = "jsapi_ticket=JSAPI_TICKET&noncestr=NONCESTR&timestamp=TIMESTAMP&url=INIT_URL";

getJsapiTicket方法

public Ticket getJsapiTicket(String rawId) throws Exception {//请求全局access_tokenAccessToken accessToken = getAccessToken(rawId);//获取jsapi_ticketTicket ticket = WeChatUtils.getJsapiTicket(accessToken.getAccess_token());return ticket;}/*** 获取全局access_token 公共方法* @author ershuai * @version V1.0 * @param rawId* @return* @throws Exception*/public AccessToken getAccessToken(String rawId) throws Exception {//请求全局access_tokenAccessToken accessToken = WeChatUtils.getAccessToken(rawId);return accessToken;}

WeChatUtils类

/*** 凭证access_token的获取方法 -   全局access_token* @author ershuai* @version V1.0 * @return* @throws Exception*/public static AccessToken getAccessToken(String rawId) throws Exception {String appId = Constants.getAppId(rawId);String appSecret = Constants.getAppSecret(rawId);//urlString access_token_url = RequestAddr.access_token_url;//匹配参数access_token_url = access_token_url.replace("APPID", appId);access_token_url = access_token_url.replace("SECRET", appSecret);//匹配参数//请求String respStr = WebUtils.doGet(access_token_url, null);AccessToken accessToken = null;if (null != respStr) {accessToken = JSON.parseObject(respStr, AccessToken.class);}return accessToken;}/*** 凭证JsapiTicket的获取方法* @author ershuai * @version V1.0 * @param accessToken* @return* @throws Exception*/public static Ticket getJsapiTicket(String accessToken) throws Exception {//urlString jsapi_ticket_url = RequestAddr.ticket_url.replace("ACCESS_TOKEN", accessToken);//匹配参数jsapi_ticket_url = jsapi_ticket_url.replace("ACCESS_TOKEN", accessToken);//请求String respStr = WebUtils.doGet(jsapi_ticket_url, null);Ticket ticket = null;if (null != respStr) {ticket = JSON.parseObject(respStr, Ticket.class);}return ticket;}

SHA1Util类

/*** sign签名,对于 jsapi_ticket* @author ershuai* @version V1.0* @param jsapiTicket* @param noncestr* @param timestamp* @param initUrl* @return*/public static String signForJsapiTicket(String jsapiTicket, String noncestr, String timestamp, String initUrl) {String signature = null;// 注意这里参数名必须全部小写,且必须有序String signatureStr = RequestAddr.ticket_url_params;signatureStr = signatureStr.replace("JSAPI_TICKET", jsapiTicket);signatureStr = signatureStr.replace("NONCESTR", noncestr);signatureStr = signatureStr.replace("TIMESTAMP", timestamp);signatureStr = signatureStr.replace("INIT_URL", initUrl);try {MessageDigest crypt = MessageDigest.getInstance("SHA-1");crypt.reset();crypt.update(signatureStr.getBytes("UTF-8"));signature = byteToHex(crypt.digest());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}return signature;}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;}

PS:做完以上流程,应该就可以完成分享功能了;出现最多的错误应该就是签名不正确,这个问题检查几个微信参数就好了;

config:invalid url domain 错误是需要去  公众号设置 - 功能设置 - JS接口安全域名;配置域名

微信分享内容给朋友、朋友圈、QQ、QQ空间等相关推荐

  1. iOS9中实现微信分享到好友、朋友圈

    博客地址:http://blog.csdn.net/bettylu227 微信SDKdemo运行错误问题 微信SDK接入设置 实现分享到好友.朋友圈 微信SDKdemo运行错误问题 下载了官方的dem ...

  2. 微信分享多张图片到朋友圈的好操作

    今天很开心,通过分析某app的分享过程,发现了分享多张图片到微信朋友圈的好操作. 大家都知道,6.7.3还是7.0.0开始,微信分享多图到朋友圈的intent方式的入口就取消了. 但是竟然还有这种好操 ...

  3. uniapp项目中使用canvas生成海报并保存、微信分享、发送至朋友圈

    uniapp项目中使用canvas生成海报并保存.微信分享.发送至朋友圈 1.html <!-- 分享模态框 --><canvas canvas-id="poster&qu ...

  4. php qq分享内容到指定qq,分享内容到新浪微博|腾讯微博|qq空间

    分享内容到新浪微博|腾讯微博|qq空间 (2013-10-29 14:05:30) 标签: 内容 分享 微博 空间 分类: php function forward_sinaweibo(title) ...

  5. 微信分享给好友、朋友圈,显示标题、内容、图片

    先看效果: 一:微信公众号配置: 步骤二:绑定域名 先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名". 步骤三: ...

  6. html5网页分享到朋友圈,微信公众平台网页开发实战--1.微信分享一个网页到朋友圈...

    对微信的JSSDK进行封装一下,创建一份类似的文件结构,增加index.html与shareApi.js文件,结构如图3.3所示. 图3.3  3.2节文件结构 另外,提醒读者一下,wxJSSDK.j ...

  7. 前端控制微信分享到群,朋友圈的方法,js禁止微信分享 亲测可用

    直接上代码,下面代码都是开发过程中记录的怕丢了,就在这备个份,使用过程中有问题可以私信或者联系微信:wxid_7yiygpz72wk622 另也承接小程序,网站开发,H5开发,程序二次开发,APP开发 ...

  8. 关于自定义微信分享内容的总结

    补充一点,当微信分享完成后,出现了非二次分享问题,现象是,测试有时候点了分享,可以正常显示自定义分享内容,有时候又不行,这边要注意,我们测试的网络环境差,因此可能会出现跟我们不同的现象. 究其原因,是 ...

  9. android开发分享到微信,Android开发之微信分享到好友,朋友圈(示例代码)

    3. 快速集成 第二步:配置AndroidManifest.xml 下面清单文件的配置是全部的,没有的平台就是不需要配置 1.添加权限 2.添加activity信息 (注意: tencent后面的ap ...

最新文章

  1. 第一个 Mybatis 程序(CURD操作)
  2. Android网络连接判断与处理
  3. Internet Explorer 8 Beta 2十大看点
  4. mysql 时区设定_如何设置MySQL 时区
  5. HTML当中特殊字符的表示
  6. 十、Python第十课——字典的些许知识(重点)
  7. 服务器响应401,如果服务器返回401响应,则重定向到登录页面(Redirect to login page if server returns 401 response)...
  8. FlyMcu - 用于STM32芯片ISP串口程序一键下载的免费软件
  9. 大数据与云计算物联网的关系
  10. 【OPNsense】广东电信拨号用户通过OPNsense获取原生IPV6地址
  11. 如何写出一篇好的A-Level历史 essay?
  12. 我从华为身上学到的项目管理经验 -- 测试篇
  13. Dell OptiPlex 7090插入耳机有声音没有麦克风的解决方案
  14. 二级域名解析配置方法
  15. GoJS去除水印方法
  16. 论霸道,看大秦帝国有感
  17. 1123_AURIX_TC275_DAP接口学习
  18. Linux各目录及每个目录的详细介绍
  19. 老子研究文献知识发现数据竞赛
  20. POI Word表格删除行removeRow()

热门文章

  1. pet 计算机术语,计算机专业英语翻译1?计算机专业英语翻译1、Tobecompet 爱问知识人...
  2. 51单片机入门——Keil uVision4的使用
  3. 高等数学拾遗 矢量分析
  4. css怎么使图片变暗些
  5. TZT3818Y 静态信号测试分析系统
  6. 人工智能--技术发展史
  7. 微信pc端window10多开应用
  8. btrace调试利器
  9. 【微信小程序】之自定义顶部导航页签
  10. Ubuntu 18.04 LTS (Bionic Beaver) 已经发布附官网下载链接