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

微信公众号关注: Java黑板

目录

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整合微信自定义分享接口源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。