操作前必看

微信自带的点击按钮分享已经下架了,目前只支持在微信浏览器点击右上角的分享,自己配置分享参数,而且目前分享参数也无法使用。

原因:响应国家反垄断规章,微信调整可实现访问外链;
异常:现在点击微信聊天发出来的链接,再点分享会直接成为字符串链接形式
解决办法:

1.将链接添加至公众号的自定义菜单中,从公众号菜单进入分享
2.扫描二维码分享
3.将链接保存至微信收藏中,从我的收藏进入分享
其余其他地方进入分享都是链接形式

注意

切记缓存 jsapi_ticketaccessToken,每天的请求有限制

没有公众号,那么申请测试号进行测试,但是必须有域名,目前的内网穿透工具好像都无法使用了

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

进入上方网址,微信扫码登录即可得到一个拥有微信分享权限的测试号。暂时只需要appID和appsecret。JS接口安全域名填自己的域名,不需要带http/https。接口配置信息配置需要我们完成后端代码才能配置。

微信分享接口

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;@Controller
@RequestMapping(value = "/wechatshare")
public class WeChatShareController {private final static Logger log = LoggerFactory.getLogger(WeChatShareController.class);/*** 获取微信加密信息* @return*/@RequestMapping(value = "/getsignature")@ResponseBodypublic Map<String, Object> toTranscript(String urls) {Map<String, Object> data = new HashMap<String, Object>();Map<String, Object> wxInfo = new HashMap<>();try {String accessToken = WeChatUitl.getAccessToken();String jsapiTicket = WeChatUitl.getTicket(accessToken);String noncestr = UUID.randomUUID().toString().replace("-", "").substring(0, 16);//随机字符串String timestamp = String.valueOf(System.currentTimeMillis()/ 1000);// 时间戳String params = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;//将字符串进行sha1加密String signature = WeChatUitl.getSHA1(params);//微信appIdString appId = WeChatUitl.appIdWx;wxInfo.put("appId", appId);wxInfo.put("accessToken", accessToken);wxInfo.put("jsapi_ticket", jsapiTicket);wxInfo.put("timestamp", timestamp);wxInfo.put("nonceStr", noncestr);wxInfo.put("signature", signature);wxInfo.put("msg", "success");wxInfo.put("status", "1");wxInfo.put("code", "1");log.info("微信分享成功");return wxInfo;} catch (Exception e) {wxInfo.put("code", "0");wxInfo.put("status", "0");wxInfo.put("msg", "error");log.error("获取微信加密信息" + e.getMessage(), e);return wxInfo;}}
}

微信分享工具类

import net.sf.json.JSONObject;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class WeChatUitl {// 获取token的描述,自己定义就可以了public static final String tokenWx = "xxxxxxxxxxxxxxx";// 微信appid---微信公众平台public static final String appIdWx = "xxxxxxxxxxxxxx";// 微信AppSecret---微信公众平台public static final String appSecretWx = "xxxxxxxxxxxxxxxxxxxxxxxxxx";/*** 获取access_token** @return*/public static synchronized  String getAccessToken() {String access_token = "";String grant_type = "client_credential";//获取access_token填写client_credential//这个url链接地址和参数皆不能变String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grant_type + "&appid=" + appIdWx + "&secret=" + appSecretWx;try {URL urlGet = new URL(url);HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();http.setRequestMethod("GET"); // 必须是get方式请求http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");http.setDoOutput(true);http.setDoInput(true);http.connect();InputStream is = http.getInputStream();int size = is.available();byte[] jsonBytes = new byte[size];is.read(jsonBytes);String message = new String(jsonBytes, "UTF-8");JSONObject demoJson = JSONObject.fromObject(message);access_token = demoJson.getString("access_token");is.close();} catch (Exception e) {e.printStackTrace();}return access_token;}/*** 获取jsapi_ticket** @param access_token* @return*/public static synchronized  String getTicket(String access_token) {String ticket = null;String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";//这个url链接和参数不能变try {URL urlGet = new URL(url);HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();http.setRequestMethod("GET"); // 必须是get方式请求http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");http.setDoOutput(true);http.setDoInput(true);http.connect();InputStream is = http.getInputStream();int size = is.available();byte[] jsonBytes = new byte[size];is.read(jsonBytes);String message = new String(jsonBytes, "UTF-8");JSONObject demoJson = JSONObject.fromObject(message);System.out.println("JSON字符串:" + demoJson);ticket = demoJson.getString("ticket");is.close();} catch (Exception e) {e.printStackTrace();}return ticket;}/*** SHA、SHA1加密** @parameter: str:待加密字符串* @return: 加密串**/public static String getSHA1(String str) {try {MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); //如果是SHA加密只需要将"SHA-1"改成"SHA"即可digest.update(str.getBytes());byte messageDigest[] = digest.digest();// Create Hex StringStringBuffer hexStr = new StringBuffer();// 字节数组转换为 十六进制 数for (int i = 0; i < messageDigest.length; i++) {String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);if (shaHex.length() < 2) {hexStr.append(0);}hexStr.append(shaHex);}return hexStr.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}
}

h5页面示例

$(function () {var winUrl = window.location.href.split("#")[0];/* if(winUrl.indexOf('from=singlemessage')>0 || winUrl.indexOf('isappinstalled')>0){winUrl = winUrl.split('?from=singlemessage')[0]} */var meta = document.getElementsByTagName('meta');var share_desc = '';for (i in meta) {if (typeof meta[i].name != "undefined" && meta[i].name.toLowerCase() == "description") {share_desc = meta[i].content;}}$.ajax({type: "post",url: "/post/getShareSignature",crossDomain: true,dataType: "json",contentType: "application/json; charset=utf-8",data: JSON.stringify({"articleUrl": encodeURIComponent(winUrl)}),success: function (msg) {//console.log(" timestamp:" + msg.data.timestamp + " ; noncestr:" + msg.data.noncestr + ";  signature:" + msg.data.signature);wx.config({debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: "wx91f855a7c7f4187b", // 必填,公众号的唯一标识timestamp: msg.data.timestamp, // 必填,生成签名的时间戳nonceStr: msg.data.noncestr, // 必填,生成签名的随机串signature: msg.data.signature, // 必填,签名,见附录1jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2});wx.ready(function () {var title, img_url;if (winUrl.indexOf('post') != -1) {//IOS系统分享时读取图片路径会出现问题 用 encodeURI 来处理下title = $("#articleTitle").val();img_url = encodeURI($("#coverImg").val());} else if (winUrl.indexOf('school') != -1) {title = document.title;img_url = encodeURI($("#schoolBadge").attr("src"));} else if (winUrl.indexOf('seventy') != -1) {title = document.title;img_url = encodeURI('https://xsn.com.cn/fileDir/cnypaData/seventy.jpg');} else {title = document.title;img_url = encodeURI(location.href.split('.cn/')[0] + '.cn/img/Group.png')}//分享到朋友圈wx.onMenuShareTimeline({title: title, // 分享标题link: winUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: img_url, // 分享图标success: function () {console.log('已分享');},cancel: function () {console.log('已取消');},fail:function(res){alert(JSON.stringify(res))}}); //分享给微信好友wx.onMenuShareAppMessage({title: title, // 分享标题desc: share_desc,link: winUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: img_url, // 分享图标type: '', // 分享类型,music、video或link,不填默认为linksuccess: function () {console.log('已分享');},cancel: function () {console.log('已取消');},fail:function(res){alert(JSON.stringify(res))}});wx.error(function (res) {console.log("res:", res)})});},error: function (XMLHttpRequest, textStatus, errorThrown) {console.log("error" + errorThrown);}});})//  微信js - sdk分享 end

Java-微信H5分享功能相关推荐

  1. 微信h5分享好友和朋友圈功能

    在开发公众号H5项目时,如果想和小程序一样有分享朋友圈和好友功能时发现会不一样. 开发微信小程序时做分享有会有onShareAppMessage 这个方法.因为H5有许多限制,所以在做微信H5分享时就 ...

  2. 微信H5分享外部链接,缩略图不显示

    微信公众号酒酒酒搜索 "微信H5分享外部链接,缩略图不显示" 查看原文 前言:最近做了一款推广茶的APP软件,展厅.产品需要分享功能:从APP内分享到H5网页:微信内打开H5网页, ...

  3. 微信自定义分享功能实现

    微信自定义分享功能实现 微信自定义分享功能实现 一.实现的关键 1.后端的任务 2.前台的任务 二.实现具体步骤 1.js安全域名配置(被分享的网址必须实现) 2.添加服务器配置(成为开发者) 3.生 ...

  4. php 微信分享功能_基于thinkPHP实现的微信自定义分享功能

    这篇文章主要介绍了基于thinkPHP实现的微信自定义分享功能,结合实例形式分析了thinkPHP调用微信接口实现自定义分享功能的相关操作技巧,需要的朋友可以参考下 本文实例讲述了基于thinkPHP ...

  5. 微信H5分享接口问题(避开99%坑)

    记录一下微信H5分享接口问题(一次性跳出99%的坑)-小叶白龙博客 这个是官方分享接口地址:概述 | 微信开放文档 微信 JS 接口签名校验工具:微信 JS 接口签名校验工具 1,按文档第一步到第四步 ...

  6. 【vue/uni-app】微信sdk分享功能在vue中开发中的一些个人纪录

    在vue开发微信sdk分享功能中的一些个人纪录 先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名". 我这里用的是 ...

  7. 微信分享源码PHP版JS-SDK接口_微信JSSDK分享功能图文实例详解

    本文实例讲述了微信JSSDK分享功能.分享给大家供大家参考,具体如下: 这里以微信分享到朋友圈,分享给微信好友为例为参考,进行调用测试,想添加其他的功能,自行查看开发人员文档即可 工欲善其事,必先利其 ...

  8. 微信禁止分享功能怎么设置

    微信禁止分享功能怎么设置 how to do? 有时候我们在微信端,有的内容并不希望用户分享出去,就需要设置禁止分享功能,废话少说,切入正题888: how to do? 引入jssdk.js htt ...

  9. Android微信h5分享,H5网页实现微信分享功能

    H5网页实现微信分享功能 一,首先在公众号管理后台"公众号设置"的"功能设置"里填写JS接口安全域名,域名需要通过ICP备案,没有备案域名可以用SAE.BAE等 ...

  10. 微信H5分享到朋友圈,转发朋友功能随记

    最近刚做了一个微信公众号H5项目,里面包含一个分享到朋友圈和分享给好友的功能.配置白名单以及公众号js安全域名这些就不赘述了,接下来简单介绍下实现这个功能的几个前端步骤 因为是微信网页开发,项目里如果 ...

最新文章

  1. Ubuntu 16.04安装VMware-Workstation-12
  2. lucene源码分析(3)facet实例
  3. vue 下echarts卸载和安装指定版本
  4. static_cast, dynamic_cast, const_cast探讨【转】
  5. office2019安装Mathtype7.4运行时错误‘53’,文件未找到:MathPage.WLL
  6. rabbitmq-server 安装方法
  7. 乐高科技系列搭建指南 pdf_近30年十辆乐高科技系列摩托车回顾_积木
  8. 存储引擎和Mysql服务层出现索引信息不一致错误提示
  9. 手动在viewpager的最后一页滑到第一页。
  10. 游戏编程入门步骤,想不到吧.
  11. matlab prn文件,教你妙用PRN文件 实现文档的换机打印
  12. html中px em pt区别介绍
  13. Wed Aug 03 19:48:03 +0800 2022这种字符串,怎么转成时间格式年月日
  14. 2021SAAE上海第七届教育装备展览会
  15. matlab:matlab神经网络工具的使用
  16. harry potter
  17. 软件测试学习心得-5
  18. PHP 验证码无法显示的问题
  19. 理论力学中的 动量定理、动量矩定理、动能定理
  20. Tree-Shaking原理

热门文章

  1. 销售单显示进仓单价的若干问题
  2. BUUCTF RE reverse2
  3. 防御性驾驶技术全集详细技巧-什么是防御性驾驶
  4. 考研 资源 论坛 英语 计算机
  5. 全志T3 ARM+Ethercat+Codesys工业控制器设计方案
  6. 利亚德虚拟演播技术分析
  7. 告别BenQ, 新选blackberry
  8. unity2d导出apk_顺利将2D内容导入Unity的良好工作流程,第I部分:创作和导出
  9. Android中禁用硬件加速的几种方式
  10. GetDC、ReleaseDC、CreateSolidBrush、SelectObjec、DeleteObject、Rectangle、Ellipse在窗体上进行绘图的函数和绘图步骤说明