大家好,我是雄雄。

最新更新

2022年12月24日23:58:30
发现了个问题,解决了好久,问题如下:

  1. 当我直接将链接发送到微信中的时候,然后打开,发现分享出去还是个链接。
  2. 当我将链接分享到QQ时,发现是自定义卡片形式。
  3. 我将QQ的卡片在分享到微信里面时,打开分享到微信,是自定义卡片形式。

这个问题看了好久,淘宝找人花80没有解决,退款给我了,各大技术群问了个遍,也没有解决,CSDN悬赏问答,也未能解决,最后发现是:
微信不支持直接进去链接分享,不然分享的还是链接,需要从微信的入口进去,比如先将内容生成二维码,然后扫描进去在分享,就可以了!!!

前言

我们在分享公众号信息到微信或者群中的时候,会出现一个小卡片,如下所示:

但是呢,这种小卡片只能走微信的接口来实现,比如我们从公众号、小程序中分享的内容可以是这样的。如果我们将自己的博客分享到微信的话,只会出现个链接。


那么,试问一下你,分享出来个这样的链接,你会去点吗?会不会以为这就是个钓鱼链接。

今天,我们就来看看,如何将我们自己的站,搞一个和微信一样的分享卡片出来。

准备工作

  • 注册一个公众号,该公众号需要能认证的(企业认证)
  • 准备好你的站,前端展示的是vue,别的可以自己对应的转换。
  • 后端用java实现的,别的语言自己转换一下即可。

请注意,公众号可以是订阅号,也可以是服务号,但是必须是需要企业可以认证的,个人虽然说有的也可以认证,但是没有调用分享接口的权限。

前端业务实现(超详细)

weixin-js-sdk帮助文档在这里,可以提现看看,免得后面看到之后,显得那么陌生~
帮助文档

下面我们来介绍一下实现步骤:

  1. 打开微信公众平台,在“公众号设置”的“功能设置”里填写“JS接口安全域名”。

    不设置会被拦截,没法使用,大家可以仔细看看是如何设置的,第三点最重要:
  2. 在【基本配置】里面,配置一下你的ip白名单,不设置没法获取access_token,没有toekn,一切都免谈。


3. 在vue项目中,安装weixin-js-sdk的依赖:

npm install weixin-js-sdk --save
  1. 在需要分享的vue页面中写代码,先引入安装好的依赖。
// 引入wxjs
import wx from "weixin-js-sdk";
  1. methods中实现分享的功能:
getShareInfo() {//获取url链接(如果有#需要这么获取)var url = encodeURIComponent(window.location.href.split("#")[0]);//获取url链接(如果没有#需要这么获取)// var url = encodeURIComponent(window.location.href);getSing(url).then(res => {wx.config({debug: false, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。appId: res.data.appId, // 必填,公众号的唯一标识timestamp: parseInt(res.data.timestamp), // 必填,生成签名的时间戳nonceStr: res.data.nonceStr, // 必填,生成签名的随机串signature: res.data.signature, // 必填,签名jsApiList: ["updateAppMessageShareData","updateTimelineShareData"] // 必填,需要使用的 JS 接口列表});wx.ready(() => {var shareData = {title: "每日新闻",desc: "2022年12月20日21:47:55每日新闻",link: window.location.href,imgUrl: "https://blogobs.88688.team/blog/l-logo-y.jpg"};//自定义“分享给朋友”及“分享到QQ”按钮的分享内容wx.updateAppMessageShareData(shareData);//自定义“分享到朋友圈”及“分享到 QQ 空间”按钮的分享内容(1.4.0)wx.updateTimelineShareData(shareData);});//错误了会走 这里wx.error(function (res) {console.log("微信分享错误信息", res);});});},

代码说明:

  • url 是我们要分享页面的链接,需要传递到后端进行加密签名(后端的代码我们待会儿看)
  • getSing方法是后端进行签名的方法,安全起见,所有config初始化中的关键信息,都从后端往回拿。
  • jsApiList是我们需要实现的功能的方法列表,逗号隔开。
  1. created中调用一下getShareInfo方法:
// 调用分享的事件this.getShareInfo();

前端内容就这些,下面我们看看后端做了哪些操作。


后端代码实现(超详细)

  1. 获取token:为什么要获取token,微信公众号开发中,不管你做啥操作,都需要这个token,并且有效时间是7200s,也就是两个小时,两小时后就失效,下面是java中获取token的代码:
 /*** 获取access_token的值* @return*/@GetMapping("/getToken")public String getToken() {String token = "";String path = "token?grant_type=client_credential&appid=" + APPID + "&secret=" + APPSECRET;String body = HttpUtil.createGet(WX_GZH_API + path).execute().body();log.info("获取了token,返回数据" + body);JSONObject object = JSON.parseObject(body);//获取tokentoken = object.getString("access_token");//失效时间String expires_in = object.getString("expires_in");//将token值的值放在redis里面redisService.setCacheObject("gzh_access_token", token,7190,TimeUnit.SECONDS);return token;}

WX_GZH_API

//公众号请求的地址public static String WX_GZH_API = "https://api.weixin.qq.com/cgi-bin/";

APPIDAPPSECRET换成你自己的就行。

  1. 获取api_ticket,这个是用在签名里面的,直接请求接口获取就行。
/*** 获取jsapi_ticket* @return*/@GetMapping("/getJsapiTicket")public String getJsapiTicket() {//获取redis里面的tokenObject access_token = redisService.getCacheObject("gzh_access_token");if (access_token==null) {access_token = getToken();}String path = "ticket/getticket?access_token=" + access_token.toString() + "&type=jsapi";String body = HttpUtil.createGet(WX_GZH_API + path).execute().body();log.info("获取了JsapiTicket,返回数据" + body);JSONObject object = JSON.parseObject(body);//获取ticketString ticket = object.getString("ticket");//错误码Integer errcode = object.getInteger("errcode");if(errcode==0){//将ticket值的值放在redis里面redisService.setCacheObject("gzh_ticket", ticket,7190,TimeUnit.SECONDS);}return ticket;}

这两个方法我都写了缓存,和是失效时间,并且在用的时候都会去判断缓存里面有没有值,没有的话,我们再去请求重新获取,而不是每次都请求获取,这样会造成接口请求频繁受到限制的问题。

  1. 开始签名:
/*** 开始签名*/@GetMapping("/getSing")public ResponseResult getSing(String url){//从redis里面获取ticketObject ticket = redisService.getCacheObject("gzh_ticket");if(ticket==null){ticket = getJsapiTicket();}Map<String, String> ret = WeChatUtils.sign(ticket.toString(), url);JSONObject objectData = new JSONObject();for (Map.Entry entry : ret.entrySet()) {objectData.put(entry.getKey().toString(),entry.getValue());}objectData.put("appId", APPID);return ResponseResult.success(objectData);}

签名的几个工具类如下所示:

//******************************************// 公众号网页开发//******************************************public static Map<String, String> sign(String jsapi_ticket, String url) {Map<String, String> ret = new HashMap<String, String>();String nonce_str = create_nonce_str();String timestamp = create_timestamp();String string1;String signature = "";//注意这里参数名必须全部小写,且必须有序string1 = "jsapi_ticket=" + jsapi_ticket +"&noncestr=" + nonce_str +"&timestamp=" + timestamp +"&url=" + url;System.out.println(string1);try{MessageDigest crypt = MessageDigest.getInstance("SHA-1");crypt.reset();crypt.update(string1.getBytes("UTF-8"));signature = byteToHex(crypt.digest());}catch (NoSuchAlgorithmException | UnsupportedEncodingException e){e.printStackTrace();}ret.put("url", url);ret.put("jsapi_ticket", jsapi_ticket);ret.put("nonceStr", nonce_str);ret.put("timestamp", timestamp);ret.put("signature", signature);return ret;}private static 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;}private static String create_nonce_str() {return UUID.randomUUID().toString();}private static String create_timestamp() {return Long.toString(System.currentTimeMillis() / 1000);}

加密签名接口请求如下:

然后我们就实现了,你试试你的可以不。

vue实现将自己网站(h5链接)分享到微信中形成小卡片(超详细)相关推荐

  1. html 微信发送给朋友,H5链接分享给微信好友,显示标题、描述、缩略图

    效果展示 image.png 1.公众号设置 1.1公众号需要经过认证,具有分享接口功能 image.png 1.2填写正确的域名(域名需要经过备案) image.png 1.3 保存好AppID.A ...

  2. 判断H5页面环境在微信中还是小程序中

    用小程序提供的wx.miniProgram.getEnv可以获取环境参数 <script type="text/javascript" src="https://r ...

  3. 大疆无人机空三建模干货分享(大疆智图集群建模超详细教程)

    Part 01 大疆无人机空三建模干货分享(大疆智图集群建模超详细教程) 大疆智图集群简介 大疆在今年5月推出的智图3.0.0及以上版本中加入了集群功能,有集群版许可的用户可以使用此功能.智图集群是由 ...

  4. 超级链接代码,html中的a标签,超链详细用法

    超级链接代码,html中的a标签,超链详细用法 随着互联网的发展,网站的兴起,超链接随处可见.我们使用电脑或手机上网,能够穿梭在各个网页之间,都是通过超链接实现的.超链接就像通向另一个" 世 ...

  5. 记录:app内嵌H5页面分享到微信后,在安卓手机打开白屏,苹果手机正常渲染的问题始末

    **背景:**app内嵌的一个个人名片页面需要分享到微信,测试环境下,分享到微信后,安卓和苹果手机都能正常渲染,生产环境苹果手机没问题,安卓手机打开分享的链接,页面一直空白. **原因分析:**单独加 ...

  6. 最新链接分享给微信好友和微信朋友圈带图标和摘要的方法

    首先这一定需要使用微信jssdk,但是在你使用了微信jssdk之后,依旧分享的链接不带图标和摘要,那就看看我踩的坑吧. 前端代码 我这里引入了jQuery(不用jQuery的写法的话可以不引入),然后 ...

  7. 网站页面实现分享到微信、QQ空间新浪微博等网站的方法

    首先在你的内容页面增加以下代码 <div class="bdsharebuttonbox bdshare-button-style0-16" data-bd-bind=&qu ...

  8. url获取网站信息不包含网页源文件内的标签_超详细的网站内部seo优化教程

    很多人把seo分为站内和站外,也有人把seo分为搜索需求覆盖,收录,排序,展现和数据分析,结果是一样的,看待seo的角度有所不同.网站内部即站内seo优化教程主要从站内讲解如何做seo.另外,一篇文章 ...

  9. H5网页如何在微信中自定义分享链接

    1.引入js文件 <script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js" type="text/ja ...

最新文章

  1. php trim用法,php trim函数怎么用?
  2. Python OOP:面向对象基础,定义类,创建对象/实例,self,创建多个对象,添加对象属性,访问对象属性,__init__方法,带参数的__init__,__str__方法,__del__方法
  3. mysql5.7 单机多实例_MySQL数据库 5.7.21单机多实例安装
  4. 【第六课】Smart 3d常见问题集锦
  5. windows服务器虚拟机 全屏,虚拟机安装Windowsxp系统后无法全屏的解决方法
  6. Python语音转文字、音频切割、语音识别
  7. 北邮大一第二学期计算机学院课表,北京邮电大学
  8. 618当天,90%的程序员在干什么?
  9. 玩苹果为什么要越狱?
  10. 估值篇之最关键指标ROE
  11. 总结一下面试中经常被问到的面试题,希望对各位初中级同胞有用。
  12. XCode11上传ipa到AppStoreConnect
  13. 串行传输,并行传输,异步同步传输
  14. Html5大文件断点续传实现方法
  15. 2020年全国职称计算机应用能力杭州考点,杭州职称计算机应用能力要求相关政策规定...
  16. 王者归来!中国软件生态大会再次登场 16城市生态合作大幕拉开
  17. 证券基础知识——一手代表多少数量?
  18. linux下网卡测速,Linux下 网卡测速
  19. 以下不是python内置函数的是_python课堂整理16---内置函数
  20. DirectX 8.0 简介 (转)

热门文章

  1. 南昌市-中安协-安防工程企业设计施工维护能力评价
  2. 性能优化与压测引擎二:分布式压测引擎pea
  3. SpringBoot-记录一只noob在学习中遇到的-问题2:Field providerDao in com.shen.EurekaProvider.service.impl.Provider……
  4. “英雄联盟注册页面”来咯~~
  5. expert个人版 sqlite_SQLite可视化管理工具(SQLite Expert Pro)
  6. 【手写 Vue2.x 源码】第二十二篇 - dep 和 watcher 关联
  7. linux系统里常用的抓图工具,LINUX下的抓图工具——SCROT
  8. ubuntu 下安装hexo
  9. 别小看空格对网页布局的危害
  10. 阅读是为了拓宽知识面,而写作才能沉淀