微信分享链接用什么工具做(微信分享链接自己实现为卡片形式以及调试)
微信分享链接用什么工具做(微信分享链接自己实现为卡片形式以及调试)
2024-07-01 07:19:30  作者:失去了嗅觉  网址:https://m.xinb2b.cn/sport/rhh365167.html
一,微信分享概述

有时候我们需要微信分享内容,尤其是一个链接,但是呢,分享后希望看到的是下面的样式,就是一种卡片的形式,不希望看到的是一种链接的形式,只有一个标题,这样会让人产生误解,不敢点击,所以,卡片的形式是为了希望看到比较友好的效果,这个就需要借助微信平台公众号来实现

希望的:

微信分享链接用什么工具做(微信分享链接自己实现为卡片形式以及调试)(1)

目前的:

微信分享链接用什么工具做(微信分享链接自己实现为卡片形式以及调试)(2)

二,实现思路

公众号配置js域名和白名单

写一个静态页面,用于分享的页面

后端返回签名数据

1,注册公众号,并设置公众号的js域名以及IP白名单(就是获取签名的ticket的时候,调用的服务器)

微信分享链接用什么工具做(微信分享链接自己实现为卡片形式以及调试)(3)

微信分享链接用什么工具做(微信分享链接自己实现为卡片形式以及调试)(4)

2,公众号的js文档

文档地址:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

微信分享链接用什么工具做(微信分享链接自己实现为卡片形式以及调试)(5)

2.1:绑定域名

见1

2.2:引入js文件

http://res.wx.qq.com/open/js/jweixin-1.6.0.js

vue 直接安装就可以:npm install weixin-js-sdk

2.3:配置公众号的数据

wx.config({ debug: true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 不能是字符串 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: [] // 必填,需要使用的 JS 接口列表});

2.4:分享执行

wx.ready(function (){ wx.onMenuShareAppMessage({ //需在用户可能点击分享按钮前就先调用 title: "test", // 分享标题 desc: "test分享,用于查看内容", // 分享描述 link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标 链接 success: ()=> { // 设置成功 console.log("分享好友设置成功"); } }) alert('已注册获取“发送给朋友”状态事件'); });

三,具体代码1,后端返回ticket

先调用微信接口获取token,然后根据token获取到ticket,然后根据ticket 获取签名

public class WeChatSignatureUtils { public static String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token"; public static String TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";//获取签名 public static WeChatSignatureDTO sign(String jsapiTicket, String url) { String nonce_str = create_nonce_str(); String timestamp = create_timestamp(); WeChatSignatureDTO weChatSignatureDTO = new WeChatSignatureDTO(); //注意这里参数名必须全部小写,且必须有序 String string1 = "jsapi_ticket=" jsapiTicket "&noncestr=" nonce_str "×tamp=" timestamp "&url=" url; try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(string1.getbytes("UTF-8")); weChatSignatureDTO.setNonceStr(nonce_str); weChatSignatureDTO.setTimestamp(timestamp); weChatSignatureDTO.setSignature(byteToHex(crypt.digest())); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return weChatSignatureDTO; }//获取ticket 一般要进行缓存 public static String getTicket(String appId, String secret) { log.info("getTicket appId:{},secret:{}", appId, secret); String tokenUrl = TOKEN_URL "?grant_type=client_credential&appid=" appId "&secret=" secret; JSONObject jsonObject = sendGet(tokenUrl); String accessToken = jsonObject.getString("access_token"); String ticketUrl = TICKET_URL "?access_token=" accessToken "&type=jsapi"; JSONObject ticketResponse =sendGet(ticketUrl); return ticketResponse.getString("ticket"); }//发送get请求 public static JSONObject sendGet(String url) { try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); // 设置请求的Header httpGet.addHeader("Content-Type", "application/json;charset=utf-8"); // 执行请求 HttpResponse response = httpClient.execute(httpGet); // 打印执行结果 JSONObject jsonObject = JSONObject.parseObject(EntityUtils.toString(response.getEntity(), "utf-8")); log.info("sendGetUrl:{}, sendGetResult:{}",url, JSON.toJSONString(jsonObject)); return jsonObject; } catch (Exception e) { e.printStackTrace(); } } private static String byteToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("x", b); } String result = formatter.toString(); formatter.close(); return result; } private static String create_nonce_str() { return UUID.randomUUID().toString(); } private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); }}

2,获取签名返回数据

public WeChatSignatureDTO getWechatSignature(WeChatSignatureParam param) { //获取ticket String verifyKey = Constants.JSAPI_TICKET_KEY; String jsapiTicket = redisService.getCacheObject(verifyKey); if (StringUtils.isBlank(jsapiTicket)) { jsapiTicket = WeChatSignatureUtils.getTicket(config.getDzsAppId(), config.getDzsSecret()); if (StringUtils.isBlank(jsapiTicket)) { throw new ServiceException("获取签名失败"); } redisService.setCacheObject(verifyKey, jsapiTicket, 7100L, TimeUnit.SECONDS); } WeChatSignatureDTO result = WeChatSignatureUtils.sign(jsapiTicket, param.getUrl()); result.setAppId(config.getDzsAppId()); result.setImgUrl(config.getDzsImgUrl()); return result; }

public class WeChatSignatureDTO implements Serializable { private String nonceStr; private String timestamp; private String signature; private String appId; private String imgUrl; public String getNonceStr() { return nonceStr; } public void setNonceStr(String nonceStr) { this.nonceStr = nonceStr; } public String getTimestamp() { return timestamp; } public void setTimestamp(String timestamp) { this.timestamp = timestamp; } public String getSignature() { return signature; } public void setSignature(String signature) { this.signature = signature; } public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; }}

public class WeChatSignatureParam implements Serializable { //这个url要和分享的页面link保持一致 private String url; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }}

3,前端代码

<template> <div class="app-container">system </div></template><script>import wx from 'weixin-js-sdk'import { getSignature } from '@/api/login'export default { name: "Secret", data() { return { info: {} }; }, created() { var res = await getSignature(); if (res.code === 200) { var da = res.data; this.info = res.data; wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: da.appId, // 必填,公众号的唯一标识 timestamp: da.timestamp, // 必填,生成签名的时间戳 nonceStr: da.nonceStr, // 必填,生成签名的随机串 signature: da.signature,// 必填,签名 jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareAppMessage'], // 必填,需要使用的JS接口列表 }); //然后 调用wxShare方法 this.wxShare(); }, methods: { wxShare() { console.log("wxShare begin") //通过ready接口处理成功验证 ,通过error接口处理失败验证 wx.ready(function (){ wx.updateAppMessageShareData({ //需在用户可能点击分享按钮前就先调用 title: "test", // 分享标题 desc: "test分享,用于查看内容", // 分享描述 link: location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: this.info.imgUrl, // 分享图标 success: ()=> { console.log("wxShare end") // 设置成功 console.log("分享好友设置成功"); } }) }); }}};</script>

四,注意事项

1,前端的link必须是和后端传入获取签名的url 一致

2,分享的页面和link传入的url一致

3,分享链接需要从公众号种分享或者生成二维码进行分享

4,对ticket需要进行缓存,因为7200s换一次

5,绑定的域名一定要和分享的url的域名一致

6,调试可以使用微信开发者工具

微信分享链接用什么工具做(微信分享链接自己实现为卡片形式以及调试)(6)

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools.html

7,先配置验证签名,然后点击分享的时候会调用分享的数据设置,这个微信会缓存数据的

五,开发者大概流程

1,获取签名

2,使用微信js-sdk调用配置和分享方法即可

  • 学校里的第一场雪(这是雪在江苏新东方校园落下的声音)
  • 2024-07-02这是雪在江苏新东方校园落下的声音白雪却嫌春色晚故穿庭树作飞花南京的雪如约而至从空中翩翩而降随风而起,洋洋洒洒一下雪,南京成了金陵也成就了一个诗意的江苏新东方雪如同一幕白纱拂过了校园的每一个角落教学楼、操场和花草树木银装素裹江苏新东方。
  • 黄晓明和张翰谁更油(被带上热搜的黄晓明绝非张翰之流能比)
  • 2024-07-02被带上热搜的黄晓明绝非张翰之流能比#娱乐聚焦#热搜榜单上突然出现了“任命张翰为黄晓明负责油腻工作”的话题讨论,并且一度登上第一位张翰原博文来自某大v,“啊啊啊啊啊啊受不了了!任命张翰为黄晓明全面负责油腻工作,原黄晓明同志不再担任黄晓明。
  • 初中数学解题大全动点最值(初中数学复习之分式讲解)
  • 2024-07-02初中数学复习之分式讲解首先感谢头条官方给予我的肯定,用了5天时间通过了新手期,一直有个想法把初中数学重要章节梳理一遍,以便初中学生中考取得好的成绩,那么今天就从分式开始吧不要忘记点赞首先说一下中考对分式这一章的要求概念:了。
  • 招投标员的工作内容及步骤(招投标从业人员必备素质)
  • 2024-07-02招投标从业人员必备素质在招投标行业竞争日益激烈的今天,从事招投标行业的我们必须具备以下素质,才不会在招投标的浪潮中被淹没1硬件基础1、行业知识:了解建设工程类和政府采购类的专业知识:建筑专业名词、术语、验收标准、设备和材料。
  • 诗琳通和孩子们合影(诗琳通身体抱恙入院)
  • 2024-07-02诗琳通身体抱恙入院11月22日,诗琳通公主殿下因身体抱恙,目前已在泰国朱拉隆功国王纪念医院接受治疗11月初以来,诗琳通公主身体欠佳,出现心跳异常难怪这几天在峰会上没有看到诗琳通公主的身影,为了王室操劳,原来是病了其实以。
  • 海贼王和之国篇登场全部人物
  • 2024-07-02海贼王和之国篇登场全部人物和之国登场的人物有草帽一伙,赤鞘九侠,凯多的百兽海贼团,大妈海贼团的部分人物,白胡子海贼团的残党,CP0,还有最后到来的红发海贼团,和海军大将和之国,日本漫画海贼王及其衍生作品中的一个国家位于伟大航路。
  • 成都外卖员年入40万(澳门90后小伙辞职做外卖年入千万)
  • 2024-07-02澳门90后小伙辞职做外卖年入千万澳门90后小伙辞职做外卖年入千万:互联网成就了我找记者、求报道、求帮助,各大应用市场下载“齐鲁壹点”APP或搜索微信小程序“壹点情报站”,全省600多位主流媒体记者在线等你来报料!,。
  • dnf永久活动史诗套(DNF玩家晒出神秘礼盒)
  • 2024-07-02DNF玩家晒出神秘礼盒大家好!在下风柜君,这次由我给各位带来DNF的趣事,希望勇士们喜欢自从DNF国服在8月22日上线武器幻化以来,已经过去了一周的时间在这7天内,风柜君相信已经有很多勇士把自己的武器变成了想要的外观武器幻。
  • 岁月静好句子(哪些句子可以表达岁月静好的意思)
  • 2024-07-02哪些句子可以表达岁月静好的意思时光,无比柔软,见证着我们所有经历的过往,岁月,沧桑依旧,沉淀着生命中的那些悲欢离合,时光深处,岁月静好阳光温淡,岁月静好,你不来,我不老潇潇人生,轻泛涟漪朵朵浪花,终归波平淡然若水,浅笑时光陌上漫步。
  • 你吃过几种瓜子(你嗑的那些瓜子)
  • 2024-07-02你嗑的那些瓜子春节期间,与亲朋好友闲聊时最常干的就是嗑瓜子不论男女,不论老少,不论是在自己家还是在亲戚家,瓜子盘一端上来,便开始你一把我一把地嗑起来,即使嘴里嗑起泡了,也停不下来毕竟,没有瓜子的春节还叫春节嘛!边嗑。
  • 青花椒长期储存方法(青花椒长期储存方法是怎样的)
  • 2024-07-02青花椒长期储存方法是怎样的青花椒可以冷冻保存,青花椒放在加水的塑料袋里,在冷冻室冷冻起来什么时候想用拿出来连冰带花椒弄下所需的多少放进汤里就行一般能保持一年,原汁原味和刚采摘的差不多青花椒也可以干制保存,传统的青花椒干制方法是。