微信公众号关注: 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 + "×tamp=" + 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整合微信自定义分享接口源码