本文只提供代码实现,具体参数含义请先仔细阅读微信公众号技术文档之JS-SDK说明文档
jsapi_ticke
简介:jsapi_ticket是公众号用于调用微信JS接口的临时票据
获取方式:
-
参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
具体代码参考:微信公众号开发----获取access_token,定时刷新access_token -
用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket)
2.1相关jar包
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
2.2 创建实体(此处省去set/get方法)
import com.alibaba.fastjson.annotation.JSONField; public class Jsapi { private int errcode; private String errmsg; private String ticket; @JSONField(name = "expires_in") private String expiresIn; }
2.3 HttpUtil
用于发送POST或GET请求:HttpsUtil类2.4 获取ticket
public class WechatUtil { private static Logger log = LogManager.getLogger(WechatUtil.class); private static final String JSAPI_TICKET_URL ="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; /** * 通过access_token 采用http GET方式请求获得jsapi_ticket * @param accessToken * @return */ public static String getJsapiTicket(String accessToken){ String requestUrl = JSAPI_TICKET_URL.replace("ACCESS_TOKEN", accessToken); JSONObject jsonObject = HttpsUtil.request(requestUrl, "GET", null); Integer errCode = jsonObject.getInteger("errcode"); if (errCode == 0){ Jsapi jsapi= Json.getJson().parse(jsonObject.toJSONString(), Jsapi.class); return jsapi.getTicket(); }else { log.warn("获取jsapi_ticke失败:"+jsonObject.toJSONString()); return null; } } }
签名算法
参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分。
生成步骤:
- 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1
- 对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。即signature=sha1(string1)
/**
* 获取JS-SDK签名
* @param url 当前网页的URL
* @param accessToken
* @return
*/
public Map<String,String> getJsSdkSign(String url, String accessToken){
//获取Ticket
String jsapiTicket = WechatUtil.getJsapiTicket(accessToken);
//时间戳和随机字符串
String noncestr = UUID.randomUUID().toString().replace("-", "").substring(0, 16);//随机字符串
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳
//将参数排序并拼接字符串
String str = "jsapi_ticket="+jsapiTicket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url;
//将字符串进行sha1加密
String signature = SHA1.getSHA1(str);
Map<String,String> map = new HashMap<>();
map.put("nonceStr",noncestr);
map.put("timestamp",timestamp);
map.put("signature",signature);
return map;
}
注:代码中使用到的工具类请参考:消息加密工具-----SHA-1