Java微信分享接口开发

概述

微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈

详细

概述

概述

微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添加分享到朋友圈,关注微信号等按钮。

一、前言

(1)适合人群

1,JAVA服务端开发人员

2,初级人员开发人员

3,了解spring springboot + maven

3,了解小程序开发跟前端人员接口对接

(2)你需要准备什么?

1,积极主动学习

2,微信公众号开发基本流程

3,java后端几大框架掌握如(spring springboot maven )

二、前期准备工作

软件环境:eclipse

官方下载:https://www.eclipse.org/downloads/

1 ,基本需求

自定义微信分享的效果(自定义缩略图,标题,摘要)

三、项目结构

image.png

四、微信开发步骤

Java微信分享,步骤是

1、根据当前的url,获取signature,nonceStr,timestamp 和appId。 

2、通过signature,nonceStr,timestamp 和appId来配置微信 wx.config。 

3、通过wx.ready实现微信分享功能。

五、前端实现

引入微信JS-SDK

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">//分享核心js代码//获取随机串var createNonceStr = function() {return Math.random().toString(36).substr(2, 15);};// timestampvar createTimeStamp = function () {return parseInt(new Date().getTime() / 1000) + '';}; $.ajax({url :'http://jsaxwv.natappfree.cc/share/getSignature',type: 'post', //HTTP请求类型data: {url:location.href.split('#')[0], //url 如果写的是固定的值的话,分享之后在分享会报错timestamp: createTimeStamp,nonce_str: createNonceStr},timeout: 10000, //超时时间设置为10秒;success: function(data) {//微信初始化wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: "", // 必填,公众号的唯一标识timestamp: data.timestamp , // 必填,生成签名的时间戳nonceStr: data.nonceStr, // 必填,生成签名的随机串signature: data.signature,// 必填,签名,见附录1jsApiList: ["onMenuShareTimeline","onMenuShareAppMessage","onMenuShareQQ"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2});var openid=$("#openid").html();wx.ready(function(){var sdata = {imgUrl: "http://jsaxwv.natappfree.cc/share/img/blog/logo.png", // 分享图标link: "http://yst3qg.natappfree.cc/bootdo/wx/weixinAutoLogin?userId="+openid, title: "燕子约一周年庆典", // 分享标题desc: "分享描述", // 分享描述success: function () {alert("分享成功");},cancel: function () {alert("分享失败");}};wx.onMenuShareAppMessage(sdata);// 发送给朋友//wx.onMenuShareTimeline(sdata);//分享到朋友圈});wx.error(function(res){// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。//alert("抱歉,服务器初始化错误。");});},error: function(xhr, type, errorThrown) {//异常处理;console.log(xhr);console.log(type);console.log(errorThrown);}});</script>
六、java后端实现
@RequestMapping(value = "/getSignature", method = RequestMethod.POST)@ResponseBodypublic Map WeixinController(HttpServletRequest request, HttpServletResponse response) {response.setHeader("Access-Control-Allow-Origin", "*");Map ret = new HashMap();//获取前台传来的三个参数String timestamp = request.getParameter("timestamp");String nonce_str = request.getParameter("nonce_str");String url = request.getParameter("url");logger.info("url"+url+"==============="+nonce_str+"============"+timestamp);String accessToken = null;accessToken = redisTemplate.opsForValue().get("accessToken")+"";  accessToken =  shareUtil.getToken(GET_TOKEN_URL, APP_ID, SECRET);// 获取tokenString ticket = shareUtil.getTicket(GET_SIGNATURE_URL,accessToken);    // 获取ticketString signature = shareUtil.getSignature(ticket,url,nonce_str,timestamp); //获取签名ret.put("nonceStr", nonce_str);ret.put("timestamp", timestamp);ret.put("signature", signature);return ret;}
工具类我就把整个贴上来了,其中有些方法是没有用到的。getSignature()整个方法是微信分享中的核心方法,用来获取signature,nonceStr,timestamp 和appId这几个核心参数。
 // 获取access_tokenpublic static String getToken(String apiurl, String appid, String secret){//拼接访问地址String turl = String.format("%s?grant_type=client_credential&appid=%s&secret=%s", apiurl,appid, secret);HttpClient client = new DefaultHttpClient();//get请求HttpGet get = new HttpGet(turl);// 初始化解析json格式的对象JsonParser jsonparer = new JsonParser();String result = null;try{HttpResponse res = client.execute(get);String responseContent = null; // 初始化响应内容HttpEntity entity = (HttpEntity) res.getEntity();//设置编码格式responseContent = EntityUtils.toString((org.apache.http.HttpEntity) entity, "UTF-8");// 将json字符串转换为json对象JsonObject json = jsonparer.parse(responseContent).getAsJsonObject();if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){if (json.get("errcode") != null){// 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"}}else{// 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200}result = json.get("access_token").getAsString();}}}catch (Exception e){e.printStackTrace();}finally{// 关闭连接 ,释放资源client.getConnectionManager().shutdown();return result;}}

 // 获取getTicket

// 获取getTicketpublic static String getTicket(String apiurl,String access_token){  String turl = String.format("%s?access_token=%s&type=jsapi",apiurl,access_token);HttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(turl);JsonParser jsonparer = new JsonParser();// 初始化解析json格式的对象String result = null;try{HttpResponse res = client.execute(get);String responseContent = null; // 响应内容HttpEntity entity = res.getEntity();responseContent = EntityUtils.toString(entity, "UTF-8");JsonObject json = jsonparer.parse(responseContent).getAsJsonObject();// 将json字符串转换为json对象if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){if (json.get("errcode") == null){// 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"}}else{// 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200}result = json.get("ticket").getAsString();}}}catch (Exception e){e.printStackTrace();}finally{// 关闭连接 ,释放资源client.getConnectionManager().shutdown();return result;}}
七、申请说明与其他

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145000.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

前端uniapp防止页面整体滑动页面顶部以上,设置固定想要固定区域宽高

解决&#xff1a;设置固定想要固定区域宽高 目录 未改前图未改样式改后图改后样式 未改前图 未改样式 .main {display: flex;flex-direction: row;// justify-content: space-between;width: 100vw;// 防止全部移动到上面位置&#xff01;&#xff01;&#xff01;&#xff01…

【C++的OpenCV】第十三课-OpenCV基础强化(一):绝对有用!Mat相关的一系列知识(基础->进阶)

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…

在nodejs中如何防止ssrf攻击

在nodejs中如何防止ssrf攻击 什么是ssrf攻击 ssrf&#xff08;server-side request forgery&#xff09;是服务器端请求伪造&#xff0c;指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)…

C++核心编程--继承篇

4.6、继承 继承是面向对象三大特征之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; ​ 我们发现&#xff0c;定义这些类的定义时&#xff0c;都拥有上一级的一些共性&#xff0c;还有一些自己的特性。那么我们遇到重复的东西时&#xff0c;就可以考虑使…

大数据Flink(八十九):Temporal Join(快照 Join)

文章目录 Temporal Join(快照 Join) Temporal Join(快照 Join) Temporal Join 定义(支持 Batch\Streaming):Temporal Join 在离线的概念中其实是没有类似的 Join 概念的,但是离线中常常会维护一种表叫做 拉链快照表,使用一个明细表去 join 这个 拉链快照表 的 join …

GD32F10x的输出模式

1. 单片机型号的识别。 2. GPIO的输出模式。 1. 开漏模式 2.推挽模式 3.复用开漏模式 4.复用推挽模式。 开漏模式&#xff1a;&#xff08;写入位设置&#xff0c;输出数据寄存器来控制MOS&#xff09; 只有N-MOS管导通。PMOS不导通。 当N-MOS的栅极为0&#xff0c;N-MOS管…

SQL血缘解析原理

根据sql解析获取到表到表, 字段到字段间的关系,即血缘关系。实际上这是从sql文本获取到数据流的过程。 大致步骤如下&#xff1a; 1.sql文本进行词法分析 2.sql语法分析获取到AST抽象语法树 3.访问AST抽象语法树根据语法结构推测出数据的流向,例如create as select from 这种结…

排序:败者树和置换选择排序(解决外部排序中的优化问题)

1.算法目的&#xff08;败者树&#xff09; 解决多路平衡归并带来的问题。 在外部排序中&#xff0c;使用k路平衡归并策略, 选出一个最小元素需要对比关键字(k-1)次&#xff0c; 导致内部归并所需时间增加。&#xff08;可用“败者树”进行优化&#xff09; 2.败者树的定义 …

高德地图根据两点的经纬度计算两点之间的距离(修正版)

SQL语句可以用来计算两个经纬度之间的距离。下面是一个示例的SQL语句&#xff1a; SELECT id, ( 6371 * ACOS( COS( RADIANS( lat1 ) ) * COS( RADIANS( lat2 ) ) * COS( RADIANS( lng2 ) - RADIANS( lng1 ) ) SIN( RADIANS( lat1 ) ) * SIN( RADIANS( lat2 ) ) ) ) AS dista…

ROS系统读取USB相机图像数据

ROS系统读取USB相机图像数据 前言usb_cam 功能包下载与编译摄像头选择连接摄像头可配置参数 前言 usb_cam功能包简介 为了丰富机器人与外界的交互方式&#xff0c;已经增加了与机器人的语音交互方式&#xff0c;不仅使机器人能够说话发声&#xff0c;还能听懂我们说的话&#…

泽众APM性能监控软件

泽众Application Performance Management&#xff08;简称APM&#xff09;是一款专业的性能监控工具&#xff0c;可以对全链路如Web服务器、应用服务器、数据库服务器等进行实时监控&#xff0c;并以图表化的形式直观地呈现监控数据&#xff0c;为系统性能优化和定位问题提供准…

3 OpenCV两张图片实现稀疏点云的生成

前文&#xff1a; 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵RANSAC原理与实践 1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式…

ThreeJS-3D教学四-光源

three模拟的真实3D环境&#xff0c;一个非常炫酷的功能便是对光源的操控&#xff0c;之前教学一中已经简单的描述了多种光源&#xff0c;这次咱们就详细的讲下一些最常见的光源&#xff1a; AmbientLight 该灯光在全局范围内平等地照亮场景中的所有对象。 该灯光不能用于投射阴…

蓝桥杯每日一题2023.9.29

蓝桥杯大赛历届真题 - C&C 大学 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述1 题目分析 看见有32位&#xff0c;我们以此为入手点&#xff0c; B代表字节1B 8b b代表位&#xff0c;32位即4个字节 (B) 1KB 1024B 1MB 1024KB (256 * 1024 * 1024) / 4 67108864 故答案…

Spring | 基于SpringBoot的多数据源实战 - 使用seata实现多数据源的全局事务管理

Spring | 基于SpringBoot的多数据源实战 - 使用seata实现多数据源的全局事务管理 引言1.1 多数据源的必要性1.2 多数据源的应用场景 实战演示2.1 创建实体类2.2 配置数据源2.3 实现数据源配置类2.4 配置Repository类2.5 运行与验证 事务管理与数据一致性3.1 事务管理3.2 使用Se…

MySQL 索引底层 B+Tree 原理解析

目录 一、前言二、B-Tree 和 BTree 的区别三、InnoDB 和 MyISAM 存储引擎索引存储区别MyISAMInnoDB 四、InnoDB 联合索引底层数据结构五、MySQL 中三次磁盘IO最大能检索多少数据 一、前言 索引是帮助高效获取数据排好序的数据结构&#xff0c;任何数据库都会使用到索引&#x…

C++之容器类有趣的实验(二百四十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

uniapp:如何修改路由加载条的样式

路由加载条默认是绿色&#xff0c;通过元素选择工具我们可以知道元素的类名是#router-loadding .loadding&#xff0c;具体设置在h5-dom.js文件里。 我们直接在App.vue里对加载样式进行修改即可&#xff0c;如下图&#xff1a; !important一定记得要加&#xff0c;否则不生效&…

聊聊并发编程——Condition

目录 一.synchronized wait/notify/notifyAll 线程通信 二.Lock Condition 实现线程通信 三.Condition实现通信分析 四.JUC工具类的示例 一.synchronized wait/notify/notifyAll 线程通信 关于线程间的通信&#xff0c;简单举例下&#xff1a; 1.创建ThreadA传入共享…

缓存一致性(cache coherency)解决方案:MESI 协议状态转换详解

MESI 协议 一&#xff0c;MESI状态释义二&#xff0c;MESI状态转换1 Invalid after Reset2, Invalid > Exclusive3, Exclusive > Modified4 Modified > Shared, Invalid > Shared5 Shared > Invalid, Shared > Modified 三&#xff0c;状态转换场景总结Inval…