1.需求描述

日常公众号开发中,业务部门对于微信内置分享(右上角->分享到朋友等)效果不太满意,需要我们自定义相关分享效果

1.1微信默认分享效果展示

1.2通过自定义分享后效果展示

1.3微信官方文档

JS-SDK说明文档:

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

2.具体实现

2.1后端(这里只展示大概代码,具体实现根据自己业务为准)

2.1.1Controller层

@RequestMapping("/getSignature")
private MsgData getSignature(String url, HttpServletResponse response, HttpServletRequest request) throws Exception {
MsgData msg = MsgData.successMsg();
String jsapi_ticket = wechatUtil.getJsapiTicket();if (jsapi_ticket == null || jsapi_ticket == "") {
msg.fail("失败");
return msg;
}
String nonceStr = UUID.randomUUID().toString();
String timestamp = Long.toString(System.currentTimeMillis() / 1000);
String str = "";
String signature = "";
str += "jsapi_ticket=" + jsapi_ticket;
str += "&noncestr=" + nonceStr;
str += "&timestamp=" + timestamp;
str += "&url=" + url;
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(str.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
Map<String, String> ret = new HashMap<String, String>();
ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonceStr);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
ret.put("appId", WechatConstant.APP_ID);
msg.setData(ret);
return msg;
} private 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;
}

2.1.2工具类wechatUtil

public String getJsapiTicket() {
if (redisService.hasKey(WechatConstant.JSAPI_TICKET_REDIS)) {
return (String) redisService.get(WechatConstant.JSAPI_TICKET_REDIS);
}
return getServerJsapiTicket();
} private synchronized String getServerJsapiTicket() {
try {
if (redisService.hasKey(WechatConstant.JSAPI_TICKET_REDIS)) {
return (String) redisService.get(WechatConstant.JSAPI_TICKET_REDIS);
}
String accessToken = getAccessToken();
if (accessToken == null || accessToken == "") {
return null;
} else {
String jsurl = WechatConstant.JSAPI_TICKET_URL;
String url = String.format(jsurl, accessToken);
String strTicket = ConnectionUtil.getUrlResult(url, null, "GET");
if (StringUtils.isBlank(strTicket)) {
return null;
}
JSONObject json = JSONObject.parseObject(strTicket);
if (json.containsKey("ticket")) {
String ticket = json.getString("ticket");
redisService.set(WechatConstant.JSAPI_TICKET_REDIS, ticket);
redisService.expire(WechatConstant.JSAPI_TICKET_REDIS, 60 * 110);// 110分钟过期
return ticket;
}
}
} catch (Exception e) {
logger.error("JsapiTicket-错误", e);
}
return null;
}

2.1.3工具类ConnectionUtil(HTTP接口工具,可根据项目自行封装)

public static String getUrlResult(String uri, String data, String method) {
StringBuffer sbf = new StringBuffer();
BufferedReader reader = null;
HttpURLConnection connection = null;
try { URL url = new URL(uri);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod(method);
connection.setConnectTimeout(8 * 1000);
connection.setReadTimeout(8 * 1000);
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
if (data != null && data.trim().length() != 0) {
OutputStream outwritestream = null;
try {
byte[] writebytes = data.getBytes();
// 设置文件长度
connection.setRequestProperty("Content-Length",
String.valueOf(writebytes.length));
outwritestream = connection.getOutputStream();
outwritestream.write(data.getBytes("UTF-8"));
outwritestream.flush(); } catch (Exception e) {
logger.error(e.getMessage());
} finally {
try {
outwritestream.close();
} catch (Exception e) {
}
}
}
connection.connect();
reader = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "UTF-8"));
String lines;
while ((lines = reader.readLine()) != null) {
sbf.append(lines);
}
} catch (Exception e) {
logger.error(e.getMessage());
} finally {
try {
reader.close();
} catch (IOException e) {
logger.error(e.getMessage());
}
try {
connection.disconnect();
} catch (Exception e) {
logger.error(e.getMessage());
}
}
return sbf.toString();
}

注意

由于微信获取api_ticket接口次数有限,建议将【api_ticket 】存储在本地缓存服务器中(这里使用的是redis)

2.2前端(vue)

2.2.1封装公共工具方法

/**
* 配置微信js-sdk
* @param {Object} shareData
* link:路径
* title:标题
* desc:描述
* imgUrl:图片链接
*/
const wxJsSdkConfig = function(shareData) { //配置微信js-sdk
let url = window.location.href.split('#')[0];
if (url != null && url != "") {
tcmAxios({
method: 'post',
url: requestUrl.getSignature,
data: {
url: url
},
then: function(response) {
if (response.success) {
let data = response.data;
let appId = data.appId;
let timestamp = Number(data.timestamp);
let nonceStr = data.nonceStr;
let signature = data.signature;
let jsApiList = ["updateAppMessageShareData",
"updateTimelineShareData"
];
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appId, // 必填,公众号的唯一标识
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: signature, // 必填,签名
jsApiList: jsApiList // 必填,需要使用的JS接口列表
});
wx.ready(function() { //需在用户可能点击分享按钮前就先调用
wx.updateAppMessageShareData({
title: shareData.title, // 分享标题
desc: shareData.desc, // 分享描述
link: shareData.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: shareData.imgUrl, // 分享图标
success: function() { }
});
wx.updateTimelineShareData({
title: shareData.title, // 分享标题
link: shareData.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: shareData.imgUrl, // 分享图标
success: function() {
// 设置成功
}
})
});
}
},
});
}
}

2.2.2使用

let shareData = {
link:window.location.href,
title:"标题",
desc:"描述",
imgUrl:"图片链接",
};
wxJsSdkConfig(shareData);

注意

在用户点击分享之前调用

微信公众号-自定义微信分享(vue)(JS-SDK)的更多相关文章

  1. 微信公众号开发--微信JS-SDK分享到朋友圈和分享给朋友

    之前写过一篇使用微信JS-SDK来实现扫一扫功能的博客 微信公众号开发–微信JS-SDK扫一扫功能 在该博客里介绍了微信JS-SDK的基本用法,其中包括以下几个步骤 还详细介绍了通过config接口注 ...

  2. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

  3. C#版微信公众号支付|微信H5支付|微信扫码支付问题汇总及解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存.代码在文章结尾处,有需要的 ...

  4. JAVA版开源微信管家—JeeWx捷微3.2版本发布,支持微信公众号,微信企业号,支付窗、小程序

    JeeWx捷微3.2微信企业号升级版本发布^_^ JeeWx捷微V3.2——多触点管理平台(支持微信公众号,微信企业号,支付窗.小程序)   JeeWx捷微V3.2.0版本引入了更多新特性,支持微信公 ...

  5. JeeWx捷微3.1小程序版本发布,支持微信公众号,微信企业号,支付窗——JAVA版开源微信管家

    支持小程序,JeeWx捷微3.1小程序版本发布^_^ JeeWx捷微V3.1——多触点小程序版本管理平台(支持微信公众号,微信企业号,支付窗)   JeeWx捷微V3.1.0版本紧跟微信小程序更新,在 ...

  6. JAVA版开源微信管家—JeeWx捷微3.1小程序版本发布,支持微信公众号,微信企业号,支付窗

    支持小程序,JeeWx捷微3.1小程序版本发布^_^ JeeWx捷微V3.1--多触点小程序版本管理平台(支持微信公众号,微信企业号,支付窗) JeeWx捷微V3.1.0版本紧跟微信小程序更新,在原有 ...

  7. JAVA开源微信管家平台——JeeWx捷微V3.3版本发布(支持微信公众号,微信企业号,支付窗)

    JeeWx捷微V3.3版本紧跟微信小程序更新,在原有多触点版本基础上,引入了更多的新亮点:支持微信公众号.微信企业号.支付宝服务窗等多触点开发:采用微服务框架实现,可插拔可集成,轻量级开发:对小程序的 ...

  8. CabloyJS的微信API对接模块:当前支持微信公众号和微信小程序

    Cabloy-微信是什么 Cabloy-微信是基于CabloyJS全栈业务开发框架开发的微信接口模块,当前整合了微信公众号和微信小程序的接口,达到开箱即用的使用效果.在Cabloy-微信的基础上,可以 ...

  9. vue 仿写微信公众号自定义菜单

    先看效果图 代码参考 <template> <div> <!-- 公众号设置 --> <el-col :span="24" style=& ...

  10. 微信公众号自定义菜单中添加emoji表情

    做微信公众号开发,可能会遇到如何加入emoji表情的问题.今天在“海南旅游小管家”公众号的菜单中加入了emoji表情,特此记录备忘. 1.登录微信公众号,在左侧找到[开发者工具]菜单,点击进入,找到[ ...

随机推荐

  1. 在 Windows 10 上实现免密码 SSH 登录

    前言 在日常开发中,SSH(Secure Shell)作为一种安全的远程登录协议,广泛用于 Linux 和 Windows 系统之间的连接.为了提高效率,我们可以通过配置免密码登录,省去每次连接时输入 ...

  2. wireshark抓包学习

    ip 过滤 ip.src_host ip.dst_host ip.addr mac 过滤 eth.src eth.dst eth.addr 端口过滤 tcp.port tcp.srcport tcp. ...

  3. flutter-TextField文本输入框 限制 数字键盘、输入小数点后两位

    关键代码 keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter(RegExp(" ...

  4. VS Code C++ 切换配置集

    前言 最近转型做Golang开发了,但有需求做视频传输,想用ffmpeg做测试,只是加点日志,方便测试,就想直接用VS Code做下开发好了,安装C/C++的插件,用MSYS2编译. 问题 C/C++ ...

  5. LCD显示器的接口协议

    简介LCD的接口有多种,常用的LCD的连接方式有如下几种:MCU(MPU)模式,RGB模式,SPI模式,VSYNC模式,MDDI模式,DSI模式,MIPI模式,LVDS模式,TTL模式,EDP模式. ...

  6. Vue 组件里添加键盘事件 keydown keyup不生效问题

    我在使用VueDraggableResizable制作一个窗口,然后需要点击esc关闭窗口. 但是键盘事件没有生效,写任何位置都不行. 解决方案 在需要触发esc事件的div或其他上给出 tabind ...

  7. Qt QVariant 与 自定义类型转换的方法

    Example: 1. 声明自定义类型可用于QVariant,类也能用,也是这样,QT的基本数据类型不用声明就可以用,而且存入是什么类型,拿出来还是什么类型 #include <QMetaTyp ...

  8. VUE-CLI 创建VUE3项目

    前言 第一篇当然是如何安装vue3 安装步骤 第一步安装vue-cli npm install -g @vue/cli // vue --version 第二步创建项目 vue create hell ...

  9. 【文献阅读】 PVDF &阻尼&有限元建模

    1. 压电Damper原理 Piezoelectric Composite Materials - ScienceDirect 当振动传递到压电材料时,振动能量通过压电效应转化为电能,产生交流电压.所 ...

  10. python excel 打开表格:表格名不知道应该怎么打开

    取所有表格名的倒数第一个就是操作的表格 import pandas as pd xl = pd.ExcelFile(xlPath) names = xl.sheet_names df = xl.par ...