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. LPN问题

    郁昱老师的某次讲座,记录一下! LWE和LPN: 1.LWE是模p的:噪音取自离散高斯分布 2.LPN是模2的:噪音取自伯努利分布 3.LPN很难构造同态加密方案 4.都可以分为判定型和搜索型

  2. js脚本实现文本文件格式批量转换

    问题: 在Windows环境下,从某些软件中导出的文本格式的数据,选择了默认的ANSI格式.双击打开数据文件后,一切正常,没乱码问题.但是为什么自己的代码里,先按照ANSI格式打开,在转换为UTF8, ...

  3. ARM单片机知识点

    1.STM32编译信息 代码占用FLASH 大小为:Code + RO-data, 7420字节(5054+2366),所用的RAM 大小为:RW-data + ZI-data, 8576(372+8 ...

  4. 更换Linux系统镜像源

    更换Linux系统镜像源 切换镜像源通常是为了提高软件包下载的速度和稳定性.以下是CentOS 7切换镜像源的一般步骤: 一.安装wget(如果尚未安装) 首先,需要确保系统中安装了wget工具,因为 ...

  5. [记录点滴] 小心 Hadoop Speculative 调度策略

    [记录点滴] 小心 Hadoop Speculative 调度策略 目录 [记录点滴] 小心 Hadoop Speculative 调度策略 [0x00] 摘要 [0x01] 缘由 [0x02] 代码 ...

  6. Luogu P2292 HNOI2004 L 语言 题解 [ 紫 ] [ AC 自动机 ] [ 状压 dp ]

    L 语言:很好的一道状压 dp 题. 思路 看到这题,首先可以想到一个很暴力的 dp,设 \(dp_i\) 表示考虑到第 \(i\) 位能否被理解,暴力匹配字符串转移即可. 第一个优化也很显然,暴力匹 ...

  7. 让 LLM 来评判 | 评估你的评估结果

    评估你的评估结果 这是 让 LLM 来评判 系列文章的第三篇,敬请关注系列文章: 基础概念 选择 LLM 评估模型 设计你自己的评估 prompt 评估你的评估结果 奖励模型相关内容 技巧与提示 在生 ...

  8. Scrapy 入门基础

    原文学习参考链接:https://blog.csdn.net/u011054333/article/details/70165401 问题解决参考链接:https://blog.csdn.net/du ...

  9. [BZOJ3622] 已经没有什么好害怕的了 题解

    发现难以维护差值,于是令 \(K=\frac{n+k}2\),这样就把问题转化为了"糖果"比"药片"大的组数为 \(K\) 的情况有多少种. 设 \(dp_{i ...

  10. KUKA库卡机器人维修

    KUKA库卡机器人作为生产线上的核心设备,一旦出现KUKA机械手故障,将直接影响整个生产线的运行效率.及时的库卡机器人维修工作不仅能够迅速恢复机器人的工作状态,减少生产停滞时间,还能通过预防性维护降低 ...