1.先看开发文档,操作流程
官方文档
点击查看
1).绑定域名
步骤一:绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
备注:登录后可在“开发者中心”查看对应的接口权限。
2).步骤二:引入JS文件
步骤二:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js](http://res.wx.qq.com/open/js/jweixin-1.4.0.js)
如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js](http://res2.wx.qq.com/open/js/jweixin-1.4.0.js) (支持https)。
备注:支持使用 AMD/CMD 标准模块加载方法加载
3).步骤三:通过config接口注入权限验证配置
步骤三:通过config接口注入权限验证配置
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。
备注:在开发过程中, 一直报签名不合法, 这个地方是前台传的URL不对, 要js代码使用encodeURIComponent();方法对传到后台的url转码, 并且前台请求后台参数一定要用get方法;
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
2.java获取wx.config({})中方法的参数
生成signature签名需要从微信接口获得的的参数:
1.access_token
2.jsapi_ticket
这俩参数有效期为2小时7200秒, 每天获得有上限次数
代码如下: 代码后有使用到的类和jar包
/**
* 获取微信服务号分享的参数
* @author MaoLG
* @2018-11-23下午2:39:40
* @param url 动态获取, 分享的页面实际路径, 不能带# 可以带参数
* @return
*/
//access_token和jsapi_ticket两个小时有效期,用redis作为缓存
Object share(String url) {
ShareParam shareParam = null;
try {
String shareAccessToken = RedisUtils.get("shareAccessToken");// 获取分享使用的token
// redis取出的是Empty, 从新获取token
if (StringUtils.isEmpty(shareAccessToken)) {
//appid:服务号的appid; secret:服务号的AppSecret
String getShareAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?"
+ "grant_type=client_credential&appid="
+ appid
+ "&secret=" + secret;
String accessTokenJson = HttpClientUtils
.doGet(getShareAccessTokenUrl);
//这里用的阿里的fastjson
AccessToken token = JSON.parseObject(accessTokenJson,
AccessToken.class);
shareAccessToken = token.getAccess_token();
RedisUtils.set("shareAccessToken", shareAccessToken);
// 设置token7150秒过期
RedisUtils.expire("shareAccessToken", 7150);
}
// redis 获取jsapiTicket
String ticket = RedisUtils.get("jsapiTicket");
// ticket is Empty 从新获取
if (StringUtils.isEmpty(ticket)) {
// 如果不是empty, 直接使用redis中的token获取jsapi
String getJsapiUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?"
+ "access_token=" + shareAccessToken + "&type=jsapi";
String jsapiTicketJson = HttpClientUtils.doGet(getJsapiUrl);
JsapiTicket jsapiTicket = JSON.parseObject(jsapiTicketJson,
JsapiTicket.class);
// jsapiTicket 获取失败,
//DataException自定义的异常类型
if (jsapiTicket.getErrcode() != 0) {
throw new DataException("jsapiTicket 获取失败");
}
// 签名需要的参数ticket
ticket = jsapiTicket.getTicket();
// 设置过期时间
RedisUtils.set("jsapiTicket", ticket);
RedisUtils.expire("jsapiTicket", 7140);
}
// 获取随机字符串,这里是UUID 工具就不贴出来了(32位)
String nonceStr = StringUtils.idGenerate();
// 获时间戳
String timestamp = System.currentTimeMillis() / 1000 + "";
// 参数
Map packageParams = new HashMap<>();
packageParams.put("url", url);
packageParams.put("noncestr", nonceStr);
packageParams.put("jsapi_ticket", ticket);
packageParams.put("timestamp", timestamp);
// 获得拼接好的参数,按照ASCLL大小排序
String createLinkString = PayUtil.createLinkString(packageParams);
//SHA1签名,该类继承了weixin4J的WeixinSupport类, 使用的是父类的方法
String signature = SHA1.encode(createLinkString);
// 参数封装,返回前台
shareParam = new ShareParam();
shareParam.setAppId(appid);
shareParam.setNonceStr(nonceStr);
shareParam.setSignature(signature);
shareParam.setTimestamp(timestamp);
} catch (DataException e) {
e.printStackTrace();
return null;
}
return shareParam;
}
使用的实体类, get/set方法就不贴出来了
package util.weixin.vo;
import java.io.Serializable;
/**
* 获取微信token的类
* @Author MaoLG
* @Date 2018/11/14 11:37
*/
public class AccessToken implements Serializable{
private String access_token;
private String expires_in;
}
package util.weixin.vo;
import java.io.Serializable;
/**
* 微信公众号分享使用的参数
* @author MaoLG
*
* 2018-11-23上午10:28:48
*/
public class JsapiTicket implements Serializable{
private Integer errcode;
private String errmsg;
private String ticket;
private Integer expires_in;
}
package util.weixin;
import java.util.*;
import java.util.Collections;
public class PayUtil {
/**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String createLinkString(Map params) {
List keys = new ArrayList(params.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
}
org.weixin4j
weixin4j
0.1.3