H5分享到微信朋友圈与好友实现思路

本文只是实现思路,代码写的比较水,仅供参考

使用springBoot 返回ModelAndView 实现

HTML使用Thymeleaf

1.添加MyX509TrustManager类(从微信提供的包中导入或自己创建都可以)

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;  import javax.net.ssl.X509TrustManager;  public class MyX509TrustManager implements X509TrustManager {  public void checkClientTrusted(X509Certificate[] chain, String authType)  throws CertificateException  {  }  public void checkServerTrusted(X509Certificate[] chain, String authType)  throws CertificateException  {  }  public X509Certificate[] getAcceptedIssuers()  {  return null;  }
}  

2.maven添加JSON依赖

<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib-ext-spring</artifactId><version>1.0.2</version>
</dependency>

3.创建WeixinUtil类

需要注意:

1.由于微信限制access_token获取次数,access_token需要缓存,建议由程序统一获取和刷新access_token,其他业务逻辑所使用的access_token均来自于该统一获取的access_token,不应该各自去刷新,目前access_token的有效期为7200秒,此处示例代码不做处理,实际开发请自行处理

2.微信appId与secret请根据项目要求自行存放到配置文件或Config类

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.servlet.http.HttpServletRequest;import net.sf.json.JSONObject;public class WeixinUtil {/*** 方法名:httpRequest</br>* 详述:发送http请求</br>* @param requestUrl* @param requestMethod* @param outputStr* @return 说明返回值含义* @throws 说明发生此异常的条件*/public static JSONObject httpRequest(String requestUrl,String requestMethod, String outputStr) {JSONObject jsonObject = null;StringBuffer buffer = new StringBuffer();try {TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();httpUrlConn.setSSLSocketFactory(ssf);httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);httpUrlConn.setRequestMethod(requestMethod);if ("GET".equalsIgnoreCase(requestMethod))httpUrlConn.connect();if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;httpUrlConn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {ce.printStackTrace();} catch (Exception e) {e.printStackTrace();}return jsonObject;}/*** 方法名:getWxConfig</br>* 详述:获取微信的配置信息 </br>* @param request* @return 说明返回值含义* @throws 说明发生此异常的条件*/public static Map<String, Object> getWxConfig(HttpServletRequest request) {Map<String, Object> ret = new HashMap<String, Object>();//此处appid与secret应该放到配置文件中,测试实现仅供参考String appId = "wxappId "; // 必填,公众号的唯一标识String secret = "wxsecret";//urlString requestUrl = request.getRequestURL().toString();String access_token = "";String jsapi_ticket = "";String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成签名的时间戳String nonceStr = UUID.randomUUID().toString(); // 必填,生成签名的随机串String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId + "&secret=" + secret;JSONObject json = WeixinUtil.httpRequest(url, "GET", null);if (json != null) {//要注意,由于微信限制access_token获取次数,access_token需要缓存,//建议由程序统一获取和刷新access_token,其他业务逻辑所使用的access_token均来自于该统一获取的access_token,不应该各自去刷新,//目前access_token的有效期为7200秒,此处示例代码不做处理,实际开发请自行处理access_token = json.getString("access_token");url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token + "&type=jsapi";json = WeixinUtil.httpRequest(url, "GET", null);if (json != null) {jsapi_ticket = json.getString("ticket");}}String signature = "";// 注意这里参数名必须全部小写,且必须有序String sign = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr+ "&timestamp=" + timestamp + "&url=" + requestUrl;try {MessageDigest crypt = MessageDigest.getInstance("SHA-1");crypt.reset();crypt.update(sign.getBytes("UTF-8"));signature = byteToHex(crypt.digest());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}ret.put("appId", appId);ret.put("timestamp", timestamp);ret.put("nonceStr", nonceStr);ret.put("signature", signature);return ret;}/*** 方法名:byteToHex</br>* 详述:字符串加密辅助方法 </br>* 开发人员:souvc  </br>* 创建时间:2016-1-5  </br>* @param hash* @return 说明返回值含义* @throws 说明发生此异常的条件*/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;}
}

4.测试controller

其中title/desc等字段亦可由前端通过js代入

@Controller
public class TestController {@RequestMapping(value = "/test", method = RequestMethod.GET)public ModelAndView test(HttpServletRequest request){ModelAndView model = new ModelAndView();Map<String,Object> ret = new HashMap<String,Object>();//获取必要参数信息ret= WeixinUtil.getWxConfig(request);根据业务编写业务代码//......//加入需要展示的标题titleret.put("title", "xxx");//加入需要展示的详情descret.put("desc", "xxx");//获取URLString url = request.getRequestURL().toString();//加入需要展示的详情URLret.put("link", url);model.addObject("wxConfig",ret);//返回页面model.setViewName("test");return model;}
}

5.HTML页面

//1.引入js
<script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>//2.通过config接口注入权限验证配置
wx.config({debug: true,appId: '[(${wxConfig.appId})]',timestamp: '[(${wxConfig.timestamp})]',nonceStr: '[(${wxConfig.nonceStr})]',signature: '[(${wxConfig.signature})]',jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData']
});//3.通过ready接口处理成功验证,并调用相应接口
wx.ready(function(){// 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口wx.updateAppMessageShareData({title: '[(${wxConfig.title})]', // 分享标题desc: '[(${wxConfig.desc})]', // 分享描述link: '[(${wxConfig.link})]', //分享URLimgUrl: "https://picsum.photos/200/200", // 分享图标,此处我测试使用了外部图片success: function () {// 用户确认分享后执行的回调函数},cancel: function () {// 用户取消分享后执行的回调函数}});// 获取“分享给朋友”按钮点击状态及自定义分享内容接口wx.updateTimelineShareData({title: '[(${wxConfig.title})]', // 分享标题link: '[(${wxConfig.link})]', //分享URL//分享给朋友不需要使用分享描述desc字段imgUrl: "https://picsum.photos/200/200", // 分享图标,此处我测试使用了外部图片success: function () {// 用户确认分享后执行的回调函数},cancel: function () {// 用户取消分享后执行的回调函数}});
});

6.在微信公众号配置中添加JS接口安全域名

7.测试效果

分享给好友:

分享到朋友圈:

8.完成

H5分享到微信朋友圈与好友实现思路相关推荐

  1. uni-app - H5 公众号网页分享到微信朋友圈 / 转发分享给朋友好友 / 分享到手机 QQ / 分享到 QQ 空间,给微信分享卡片设置图标、标题、描述文字等(JS-SDK 通用解决方案放心用)

    前言 如果您是纯 Vue.js 项目(或 Nuxt.js),请访问 Vue - 最新网页 H5 分享到微信朋友圈 / 转发分享好友 这篇详细教程. 目前网上大部分教程都过时了(老版本.无效),并且未对 ...

  2. js分享到微信朋友圈、QQ空间、QQ好友、新浪微博、腾讯微博、豆瓣、人人......

    各种分享...... <!DOCTYPE html> <html> <head> <title>share</title> <scri ...

  3. Android第三方应用分享到微信朋友圈,微信好友(原创)

    首先,这篇博客是面向刚刚开始做Android开发的程序员的,大牛可以飘过.然后,作为一个接触Android一年多,还没有毕业的我来说,写的博客难免有些错误,所以请大家多多指教,看大家都在写博客,目的无 ...

  4. 如何把计算机歌曲传给微信好友,如何将手机本地音乐分享到微信朋友圈分享音乐...

    当前,不支持将本地音乐分享到微信朋友圈,但是您可以安装喜马拉雅山,或者在上传后将其分享到微信朋友圈 1.以iPhone为例.首先打开音乐,然后找到要共享的音乐.以我下载的音乐为例,单击歌曲右侧的&qu ...

  5. 分享到微信朋友圈的内容被禁止访问,怎么办?

    作者: 轻易科技知行研发部 - 王海宇 分享到微信朋友圈的内容被禁止访问,怎么办? 写在前面 微信封禁的行为 关于微信封禁域名后解决办法 工程师镇楼 写在前面 随着互联网的发展,越来越多的app通过分 ...

  6. 模仿网易云音乐ScrollView大长图分享到微信朋友圈

    2018年11月17日 更新,可以支持大图分享到微信 思路如下,将大图保存到本地再分享到朋友圈和微信好友 public static void shareWeChatCircle(Activity a ...

  7. android友盟微信分享到朋友圈,2020年友盟分享到微信朋友圈

    2020年友盟分享到微信朋友圈 1.我想要对你说出我要说的最深的话语,我不敢,我怕你取笑 7.真心总是无人喜,偏偏套路撩人心 10.钱可以帮穷人思维的人解决温饱,却可以帮富人思维的人制造财富 十七.考 ...

  8. 微信朋友圈很多好友都变成长颈鹿头像是怎么回事?

    曾经有一段时间,微信朋友圈很多好友都变成长颈鹿头像,这是怎么回事?原来,是一则长颈鹿头像的问答题,咱们就来一起看看吧: 从前有一个房间,您走了进去,看到有一张床,床上面有二只狗,四只猫,一只长颈鹿,五 ...

  9. android 分享qq微信朋友圈,H5微信JS-SDK实现分享朋友 朋友圈以及QQ自定义分享

    1.准备工作 APPID公众号id.申请好友分享接口.ip白名单.js接口安全域名设置(必须是通过备案).要先登录微信公众平台进入"公众号设置"的功能设置里填写"JS接口 ...

  10. 大家一起看广告?微信朋友圈广告@好友评论互动功能全量开放

    4月9日,微信官方宣布,4月8日起,朋友圈广告@好友评论互动功能全量开放.用户收到朋友圈广告后,可以跟点赞.评论一样,在广告的评论区@好友与其进行互动. 微信方面表示,@好友评论互动能力全量开放,使朋 ...

最新文章

  1. 异常: java.security.InvalidKeyException: Illegal key size
  2. 有条件截取字符串_Python小课堂之木辛老师特别讲解:再次深入浅出字符串的格式化...
  3. python导入csv文件-python如何导入csv
  4. 2、RabbitMQ-simplest thing(简单队列)
  5. 程序员面试题精选100题(06)-二元查找树的后序遍历结果[数据结构]
  6. 预告 | 旷视天元的前世今生与移动端推理优化@清华专场
  7. USACO-Section2.1 The Castle (深度优先搜索)
  8. devops_DevOps专业人员如何成为安全冠军
  9. 转 ajax.dll 与 ajaxpro.dll的用法
  10. Silverlight显示滚动条
  11. 【学习 OpenCV】—— imgproc.hpp 核心api
  12. Ubuntu升级wine4.0
  13. 华为v3鸿蒙系统_重磅!华为鸿蒙系统问世!
  14. 2022年11月广东软考系统集成真题及答案解析
  15. 小伙用C++搞定远程桌面监控系统,轻松拿下12家offer!
  16. caj转pdf的方法
  17. 【筹码分析】改版通达信PAVE筹码引力分析个股强势区和走势
  18. CleanMyMac不停要求输入密码进行更改
  19. 今日头条的推荐阅读你为什么都喜欢?
  20. hadoop错误DataXceiver error processing WRITE_BLOCK operation

热门文章

  1. 控制台程序线程莫名被阻塞
  2. 2017 年,最热开源静态网站生成器 TOP 20 揭晓!
  3. 保护模式下的80386及其编程01:数据类型
  4. 对_stdcall 的理解 (转)
  5. 微信小程序开发——单行文本溢出显示省略号
  6. spark学习之sparksql语法优化
  7. 云服务预先定义正确的云计算SLA要求
  8. 论文笔记 Inverting Visual Representations with Convolutional Networks
  9. html转换为pdf的笔顺,正式出台的笔顺标准写法,很全面!(附电子打印版)
  10. 前端cookie 放到请求头_ajax请求头cookie问题