SpringBoot整合微信自定义分享接口,详解 (有源文件)

    科技2026-08-10  18

    目录

    1、前言

    2、整合步骤说明

    3、整合的详细代码(复制即用)

    1、前言

    很多的项目都做需要微信自定义分享接口,首先就是显得比较好看与能够展示一些网站的详细信息,其次就是可以获取到用户的分享的数据,这就方便对分享的数据进行分析等等。

    对接微信自定义分享接口的前提条件:

    1、认证的订阅号或认证的服务号

    2、备案的域名

    3、一台云服务器

    效果如下图:

    2、整合步骤说明

    官方的api文档链接:

    https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

    想要微信JS-SDK能够起作用,首先在公众号配置以下参数:

    1、配置IP白名单(即服务器的IP地址)

    2、配置JS安全域名(即备案的域名)

    公众号中配置的位置如下图:

    整合的步骤(方便看懂代码的实现):

    首先通过开发者ID(AppID)与开发者密码(AppSecret)这两个参数我们就能获取到access_token(access_token是公众号的全局唯一接口调用凭据),然后我们再通过这个access_token获得jsapi_ticket(jsapi_ticket是公众号用于调用微信JS接口的临时票据)。通过这个jsapi_ticket参数我们就可以生成JS-SDK权限验证的签名了。

    步骤如下图:

    注意:access_token与jsapi_ticket的有效时间为2个小时,而且access_token每天的调用次数为2000次,还有就是获取这两个参数需要发送http请求,所以我们无需每次都重新获取,可以用静态变量缓存或者用redis缓存起来,通过定时任务刷新,我这里为了方便演示所以直接用静态变量,与判断是否过期解决。

    3、整合的详细代码

    后端代码如下(具体的参数需要根据自己的实际填写)下面的代码用到了httpclient依赖与json解析依赖:

    package com.heiban.springboot.controller; import com.heiban.springboot.bean.Wx; import net.sf.json.JSONObject; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import java.io.IOException; import java.security.MessageDigest; import java.util.Formatter; import java.util.UUID; @Controller public class Index { private static final String AppID = ""; //开发者ID private static final String AppSecret = ""; //开发者密码 private static String access_token = ""; //调用接口的凭证 2个小时后就会过期需要重新获取 一天最多获取2千次 private static String jsapi_ticket = ""; //jsapi_ticket的有效时间也是2个小时 获取该参数需要通过access_token private static Long expireTime = 0L; //记录access_token 与 jsapi_ticket 的过期时间 @RequestMapping("/share") public String Share (ModelMap model){ String url = "http://域名/具体的路径?附带的参数";//即调用 JS-SDK的网址 Wx wxShare = getWxShare(url);//随机串、签名的时间戳、签名字符串 model.addAttribute("wxShare",wxShare); return "share"; } //获取微信分享的重要信息 public Wx getWxShare(String url){//url 即为访问网站的url Wx wx = new Wx(); //用于保存微信分享所需要的参数 //打开浏览器,创建HTTPClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); Long nowtime = System.currentTimeMillis();//获取当前的时间戳 //第一步 判断access_token 与 jsapi_ticket是否过期 如果过期了就重新获取 if (expireTime <= nowtime){//如果过期时间小于 当前的时间就证明过期了 //通过appid和appsecret,就可以向微信平台来换取access_token String token_access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+Index.AppID+"&secret="+Index.AppSecret; HttpGet httpGet = new HttpGet(token_access_url); CloseableHttpResponse response = null;//按回车,发起请求 try { response = httpClient.execute(httpGet); //解析响应 判断状态码是否是200 if (response.getStatusLine().getStatusCode()==200){ HttpEntity httpEntity = response.getEntity();//获取响应消息实体 String body = EntityUtils.toString(httpEntity);//获取返回的消息文本 JSONObject jsonObject = JSONObject.fromObject(body);//将消息文本解析成json String access_token = (String) jsonObject.get("access_token"); Index.access_token = access_token; } //第二步 通过access_token,向微信平台索取一个jsapi_ticket String jsapi_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+Index.access_token+"&type=jsapi"; httpGet = new HttpGet(jsapi_ticket_url); response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode()==200){//解析响应 判断状态码是否是200 HttpEntity httpEntity = response.getEntity();//获取响应消息实体 String body = EntityUtils.toString(httpEntity);//获取返回的消息文本 JSONObject jsonObject = JSONObject.fromObject(body);//将消息文本解析成json String errmsg = (String) jsonObject.get("errmsg"); if(errmsg.trim().equals("ok")){ String jsapi_ticket = (String) jsonObject.get("ticket"); Index.jsapi_ticket = jsapi_ticket; Index.expireTime = nowtime+5400000; //这里采用的过期时间是90分钟即一个半小时 } } } catch (IOException e) { e.printStackTrace(); }finally { //关闭资源 try {response.close();} catch (IOException e) {e.printStackTrace();} try {httpClient.close();} catch (IOException e) {e.printStackTrace();} } } //第三步 获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。 Long timestamp = System.currentTimeMillis()/1000;//用于签名的时间戳 单位为秒 String nonceStr = UUID.randomUUID().toString(); //获得随机串 //注意这里参数名必须全部小写,且必须有序 String string1 = "jsapi_ticket=" + Index.jsapi_ticket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url; String signature = ""; //签名字符串 try { MessageDigest messageDigest = MessageDigest.getInstance("SHA-1"); messageDigest.reset(); //reset()的必要性只表明getInstance()不进行初始化. messageDigest.update(string1.getBytes("UTF-8")); Formatter formatter = new Formatter(); for (byte b : messageDigest.digest()) formatter.format("%02x", b);//字节数组转换为十六进制字符串 signature = formatter.toString();//签名字符串 formatter.close(); }catch (Exception e){} wx.setNonceStr(nonceStr);//随机串 wx.setTimestamp(timestamp.toString());//签名的时间戳 wx.setSignature(signature);//签名字符串 return wx; } }

    前端代码如下(具体的参数需要根据自己的实际填写):

    <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>关注微信公众号:Java黑板</title> </head> <body> <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script> <script type="text/javascript"> wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: ' ', // 必填,公众号的唯一标识 timestamp: '[[${wxShare.timestamp}]]', // 必填,生成签名的时间戳 nonceStr: '[[${wxShare.nonceStr}]]', // 必填,生成签名的随机串 signature: '[[${wxShare.signature}]]',// 必填,签名 jsApiList: [ 'updateAppMessageShareData' ,'updateTimelineShareData' ] // 必填,需要使用的JS接口列表 }); wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateAppMessageShareData({//自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0) title: 'Java黑板', // 分享标题 desc: '关注微信公众号:Java黑板', // 分享描述 link: location.protocol+"//"+location.hostname+'/', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标的链接 success: function () { // 调用成功 } }); wx.updateTimelineShareData({//自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0) title: 'Java黑板', // 分享标题 link: location.protocol+"//"+location.hostname+'/', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标的链接 success: function () {                 // 调用成功 } }); }); </script> </body> </html>

    回复获取资源

    关注后回复 微信分享

    获取SpringBoot整合微信自定义分享接口源码

    Processed: 0.012, SQL: 9