洛塔服务号回复016获取代码。
公众号设置 ==> 功能设置 ==> 填写“JS接口安全域名”
前端引入微信的js
为了方便发送post请求,测试代码还引入了jquery
前端的config各个参数,特别是签名,需要从后台获取。最好的方式是请求一个url,然后后台将所有config对应数据都返回。本例为了方便,连同url的所有参数,都固定到后台了。真实业务可根据需要调整。
引入用到了部分加密包和获取随机字符串,需要maven引入
org.apache.commons
commons-lang3
commons-codec
commons-codec
后台Java代码如下
/**
* 完整项目源码可关注公众号"lootaayun"(洛塔),回复016获取
*/
@PostMapping("wx16")
public JSONObject jssdkParam() throws Exception {
// 先获取access_token,这部分正式环境需要配置定时获取,每天2000次调用限制
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET;
String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).execute().body();
System.out.println(result);
String accessToken = JSON.parseObject(result).getString("access_token");
// 获取jsapi_ticket,这部分需要正式环境定时获取,7200秒内有效
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";
result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).execute().body();
System.out.println(result);
String ticket = JSON.parseObject(result).getString("ticket");
// 签名
String noncestr = RandomStringUtils.randomAlphanumeric(8);
long timestamp = System.currentTimeMillis()/1000;
String signurl = "http://test.lootaa.com/wx16.html"; //如果signurl带有#,则只取#之前的部分
String param = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + signurl;
System.out.println(param);
String signature = DigestUtils.sha1Hex(param);
System.out.println(signature);
JSONObject data = new JSONObject();
data.put("appId", APPID);
data.put("timestamp", timestamp);
data.put("nonceStr", noncestr); //这个参数比较特殊,后台用的是noncestr,前端S要大写,用的nonceStr
data.put("signature", signature);
return data;
}
前端直接调用上面后台写好的接口,将数据放到config中。
其中,jsApiList放入的是JS-SDK中需要的,openTagList是开放标签,本例中把4个全放入了。
$.post("http://test.lootaa.com/lootaa-wechat/wx16", {}, function(info) {
wx.config({
debug : true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。
appId : info.appId, // 必填,公众号的唯一标识
timestamp : info.timestamp, // 必填,生成签名的时间戳
nonceStr : info.nonceStr, // 必填,生成签名的随机串
signature : info.signature,// 必填,签名
jsApiList : [], // 必填,需要使用的 JS 接口列表
openTagList : [ "wx-open-launch-weapp", "wx-open-launch-app", "wx-open-subscribe", "wx-open-audio" ]
});
}, "json");
直接将下面的wx-open-launch-weapp放入自己的网页中即可。
id:任意唯一值,可以使用做跳转成功或者失败的监听。
username:小程序的唯一值,后台可以看到,gh_开头的那个。
path:进入小程序的路径。一般为pages/index/index
这个地方略微麻烦点,因为我没有上架到市场的APP,所以只能按照官方文档记录,没有完整测试。
前面介绍过如何使用网页实现订阅通知,文章标题是《公众号订阅通知》,所以这里只介绍如何订阅,至于订阅之后如何下发可以看前面的文章。
参数template是公众号后台选择好的模板id
扩展音频标签,用于接入微信浮窗播放器。直接加入就能用。
src是mp3文件路径,cover是封面图片。
官方文档还介绍到了插槽形式。鉴于本人是个后端开发,前端基础实在薄弱,就不尝试了。
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
/**
* 公众号开放标签的使用
* 前置条件:设置与开发-->功能设置-->JS接口安全域名
*/
@RestController
public class Test016 {
public static final String APPID = "wx276049d6a7551dca";
public static final String SECRET = "cbe109fdf6f399bd72ed3a4afafa21b1";
/**
* 完整项目源码可关注公众号"lootaayun"(洛塔),回复016获取
*/
@PostMapping("wx16")
public JSONObject jssdkParam() throws Exception {
// 先获取access_token,这部分正式环境需要配置定时获取,每天2000次调用限制
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET;
String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).execute().body();
System.out.println(result);
String accessToken = JSON.parseObject(result).getString("access_token");
// 获取jsapi_ticket,这部分需要正式环境定时获取,7200秒内有效
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";
result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).execute().body();
System.out.println(result);
String ticket = JSON.parseObject(result).getString("ticket");
// 签名
String noncestr = RandomStringUtils.randomAlphanumeric(8);
long timestamp = System.currentTimeMillis()/1000;
String signurl = "http://test.lootaa.com/wx16.html"; //如果signurl带有#,则只取#之前的部分
String param = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + signurl;
System.out.println(param);
String signature = DigestUtils.sha1Hex(param);
System.out.println(signature);
JSONObject data = new JSONObject();
data.put("appId", APPID);
data.put("timestamp", timestamp);
data.put("nonceStr", noncestr); //这个参数比较特殊,后台用的是noncestr,前端S要大写,用的nonceStr
data.put("signature", signature);
return data;
}
}