var protocol = window.location.protocol; //获取协议
var host = window.location.host; //获取域名
var posuDomainUrl = protocol + "//" + host; function WeChat(url, title, img, desc) {
var configData = {
title: title, // 分享标题
desc: desc, // 分享描述
link: url, // 分享链接
imgUrl: img, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
}; $.ajax({
url: posuDomainUrl + '/wechatShare/wechatShare.do',
type: 'POST',
data: {url:url},
success: function (resp) {
if (resp.data) {
resp.data.debug=false;
resp.data.jsApiList=['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'];
wx.config(resp.data);
wx.ready(function () {
//分享到朋友圈
wx.onMenuShareTimeline({ //例如分享到朋友圈的API
title: title, // 分享标题
link: url, // 分享链接
imgUrl: img, // 分享图标
success: function () {
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
}); //分享给朋友
wx.onMenuShareAppMessage({
title: title, // 分享标题
desc: desc, // 分享描述
link: url, // 分享链接
imgUrl: img, // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
}); //分享到QQ
wx.onMenuShareQQ(configData); //分享到腾讯微博
wx.onMenuShareWeibo(configData); //分享到QQ空间
wx.onMenuShareQZone(configData); wx.error(function (res) {
//alert(res.errMsg); //打印错误消息。及把 debug:false,设置为debug:ture就可以直接在网页上看到弹出的错误提示
});
});
} else {
return;
}
},error:function(e){
console.log(e);
}
});
}
package com.hlziben.web.controller.webController.wechatShare;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import com.hlziben.web.common.request.HonlineRestTemplate;
import com.hlziben.web.common.utils.EncryptUtils;
import com.hlziben.web.common.utils.HttpClientUtil;
import com.hlziben.web.common.utils.Setting;
import com.tzbao.api.common.utils.JsonResponse;
/**
*
*<dl>
*<dt>类名:WechatShareController</dt>
*<dd>描述: </dd>
*</dl>
*/
@Controller
@RequestMapping("wechatShare")
public class WechatShareController { public static final Log log = LogFactory.getLog(WechatShareController.class);
@Resource
private HonlineRestTemplate honlineRestTemplate;
@Resource
private StringRedisTemplate numberRedisTemplate; /**
* 向微信请求accessToken和ticket
* @param role
* @param phone
* @param code
* @param password
* @param repassword
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(method = RequestMethod.POST, value = "/wechatShare.do")
@ResponseBody
public Object register(
@RequestParam("url") String url, //前台传入URL
HttpServletRequest request, HttpServletResponse response, ModelMap model) { try{
//检查Redis中现有的accessToken和ticket
Long timeStamp=System.currentTimeMillis();
String accessToken=numberRedisTemplate.opsForValue().get("member_wechat_access_token");
String appId=Setting.getSetting("weixin.app.id");
String appSecret=Setting.getSetting("weixin.app.secret");
String ticket=numberRedisTemplate.opsForValue().get("wechatTicket"); //如果redis中的accessToken为空,则重新获取
if(StringUtils.isBlank(accessToken)||StringUtils.isBlank(ticket)){
String accessTokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+appSecret;
JSONObject objectAuthToken=HttpClientUtil.httpGetRequest(accessTokenUrl);
accessToken=objectAuthToken.get("access_token").toString();
numberRedisTemplate.opsForValue().set("member_wechat_access_token",accessToken,Long.valueOf(6600), TimeUnit.SECONDS);
String ticketUrl="https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token="+accessToken;
JSONObject objectTicket=HttpClientUtil.httpGetRequest(ticketUrl);
ticket=objectTicket.get("ticket").toString();
numberRedisTemplate.opsForValue().set("wechatTicket", ticket,Long.valueOf(6600), TimeUnit.SECONDS);
} //获取微信accessToken及ticket
Map<String, Object> resultMap = new HashMap<>();
String nonceString=UUID.randomUUID().toString();
String encodeStr="jsapi_ticket="+ticket+"&noncestr="+nonceString+"&timestamp="+timeStamp.toString()+"&url="+url;
String signature=EncryptUtils.codesBySHA1(encodeStr);
log.info(signature);
resultMap.put("appId",appId);
resultMap.put("nonceStr",nonceString);
resultMap.put("timestamp", timeStamp.toString());
resultMap.put("url", url);
resultMap.put("signature",signature);
resultMap.put("rawString",encodeStr);
return JsonResponse.getSuccessResponse(resultMap); }catch(Exception e){
log.error(e);
return JsonResponse.getServerErrorResponse("微信共享失败");
}
} }

封装微信jssdk自定义分享代码的更多相关文章

  1. 配置微信jssdk自定义分享

    前段时间做这个功能的时候遇到这个问题,之前的话是微信自动抓取界面第一张图,现在微信更新api,必须自行配置,接入jssdk,才能实现该功能. 详细可以查看微信的jssdk文档 微信官方开发者文档    ...

  2. 使用微信JSSDK自定义分享内容

    微信在6.0.2.58版本以后开始使用新的api,在Android系统中不能用以前的代码来自定义分享内容了. 现在自定义内容的方法走的是公众号的一套流程 1获取access_token 2得到toke ...

  3. .Net微信网页开发之使用微信JS-SDK自定义微信分享内容

    第一步.微信JS-SDK的使用步骤,配置信息的生成获取讲解: 关于JS-SDK的使用步骤和timestamp(时间戳),nonceStr(随机串),signature(签名),access_token ...

  4. c#微信开发,使用JS-SDK自定义分享功能,分享朋友圈,分享给朋友等

    如果一个后端开发掌握了微信开发,甚至有微信开发上线项目,这在换工作的时候 还是有竞争力的. 微信开发的资料很多,但是用asp.net c#进行微信开发好像比较少,或者资料不够完整. 使用JS-SDK自 ...

  5. 微信公众号jssdk自定义分享,二次分享自定义失败解决技巧

    百度上自定义微信分享标题以及描述的解决方法有很多,基本上都能实现一次分享:流程基本上是这样的 1.首先引入微信jssdk =><script src="http://res.wx ...

  6. 微信应用js-sdk自定义分享图文

    之前写过步骤 但是代码很少 这里奉献上我自己写的代码 我是用js做的 先奉上js部分的代码 <head> <meta charset="utf-8"> &l ...

  7. 使用微信JSSDK自定义微信分享标题、描述、和图标

    最近做一个项目的时候用到微信的分享 ,实现定义分享标题,图片,了解到微信在发布JSSDK后,把包括自定义分享在内的众多网页服务接口进行了统一.如果要想自定义分享自己的网页信息给好友或朋友圈,就最好使用 ...

  8. 微信公众号 分享接口 签名通过 分享无效果(JSSDK自定义分享接口的策略调整)

    为规范自定义分享链接功能在网页上的使用,自2017年4月25日起,JSSDK“分享到朋友圈”及“发送给朋友”接口,自定义的分享链接,其域名或路径必须与当前页面对应的公众号JS安全域名一致,否则将调用失 ...

  9. 微信JS-SDK实际分享功能

    为了净化网络,整顿诱导分享及诱导关注行为,微信于2014年12月30日发布了<微信公众平台关于整顿诱导分享及诱导关注行为的公告>,微信平台开发者发现,原有的微信分享功能不能用了,在ipho ...

随机推荐

  1. luogu3703 [SDOI2017]树点涂色(线段树+树链剖分+动态树)

    link 你谷的第一篇题解没用写LCT,然后没观察懂,但是自己YY了一种不用LCT的做法 我们考虑对于每个点,维护一个fa,代表以1为根时候这个点的父亲 再维护一个bel,由于一个颜色相同的段一定是一 ...

  2. 6. 重点来啦,pytest的各种装饰圈fixtures

    pytest中,fixture的目的是什么 为可靠的和可重复执行的测试提供固定的基线.(可以理解为测试的固定配置,使不同范围的测试都能够获得统一的配置.) fixture提供了区别于传统单元测试(se ...

  3. 搭建svn管理平台

    安装svn服务器:yum -y install subversion 创建svn的目录:mkdir -p /data/svn 初始化svn目录:svnadmin create /data/svn co ...

  4. linux系统下的日志,此日志对于系统安全来说是非常重要的一 个机制!!

    var/log/messages /etc/logrotate.conf 日志切割配置文件 (参考https://my.oschina.net/u/2000675/blog/908189) dmesg ...

  5. 用python脚本 从xls文件中读取数据

    导入 xlrd 第三方模块 import xlrd data = xlrd.open_workbook('test.xlsx') # 打开xls文件 table = data.sheets()[0] ...

  6. LeetCode936. Stamping The Sequence

    一.题面 You want to form a target string of lowercase letters. At the beginning, your sequence is targe ...

  7. Codeforces - 662A 思路巧妙的异或

    题意:给你\(n\)堆石子玩尼姆博弈,每堆石子可以是\(a_i\)也可以是\(b_i\),选择概率相等且每堆选择相互独立,求先手必胜(异或不为0)的概率 首先需要找出一种优雅的策略表示方法(利用异或的 ...

  8. FFT 深夜摸鱼小笔记

    本次笔记学习自算法导论 FFT核心:系数表示→(单位复数根)点值表示→(插值)系数表示 关于单位复数根 n次单位复数根\(ω\)为满足\(ω^n=1\)的复数 n次单位复数根恰好有n个,表示为\(ω_ ...

  9. hdu 1754 I Hate It 线段树基础题

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

  10. 2019.3.26 SQL语句(进阶3)

    表的联查 员工表与部门表 员工表:id,姓名,年龄,部门id 部门表:部门id,部门名,部门成立时间,部门领导,部门职责.... 表和表之间的关系 一对一 一对多 多对多 创建联查 创建表 先创建被依 ...