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. webrtc-streamer实时播放监控

    公司要做web端监控实时播放,经过调研,webrtc-streamer的方式对前后端项目侵入最少,且没有延迟卡钝的现象. 一.准备工作 一个摄像头,摄像头对应的rtsp流链接,一台电脑,一个vue项目 ...

  2. 图解红黑树RBT

    rotation:

  3. Codeforces Round 961 (Div. 2)

    题目链接:Codeforces Round 961 (Div. 2) 总结:B1wa两发可惜,C出得有点小慢. A. Diagonals fag:贪心 Description:给定一个\(n * n\ ...

  4. 从找零钱问题到三数之和:一道经典面试算法题的全面剖析|LeetCode 15 三数之和

    LeetCode 15 三数之和 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 想象你是一个收银员,顾客给了你一张100元钱,商品只要85元. ...

  5. 使用MTR网络诊断

    安装 MTR Ubuntu: apt update apt upgrade apt install mtr-tiny CentOS: yum update yum install mtr 使用 MTR ...

  6. 4.vue Router路由设置

    router=>index.js 设置路由信息 1.路由文件按分组拆分多个 import analysisRouter from './analysisRouter'; import users ...

  7. Doris建明细测试表,导入测试数据

    分区.分桶.明细表 测试用户表 CREATE TABLE user_info( dt DATE, id varchar(36) NOT NULL DEFAULT '10', user_name var ...

  8. maven项目中解决 .git文件太大问题

    一.git项目上传后项目文件太大,git filter-branch手动清理 最近发现一个项目git目录已经达到200MB,严重影响了clone代码.操作之前请全量备份代码,操作失误可恢复 二.测试项 ...

  9. datax从mysql迁移数据到OceanBase

    datax部署 下载datax datax下载地址 安装datax tar -zxvf datax.tar.gz 使用datax 使用配置文件 { "job": { "s ...

  10. 5分钟搞定!用比扬云SD-WAN远程访问飞牛NAS全攻略

    作为一个NAS重度用户,我最近遇到了一个头疼的问题:如何在外部安全地访问家里的飞牛NAS?经过一番摸索,我发现比扬云SD-WAN是个不错的解决方案,今天就来分享我的实战经验. 一.为什么选择比扬云SD ...