微信公众号获取openId、扫一扫功能
一、拥有80端口配置:
1、微信公众号相关配置
2、后台授权获取code、access_token、openid
参考微信开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
二、未拥有80端口配置:
1、需要通过中间服务器(IIS、tomcat)转发获取code然后传递到后台获取access_token和openId
2、微信公众号菜单配置跳转路径:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4ceddbea1632a889&redirect_uri=http://xxxx.com&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect
三、微信公众号中调用扫一扫:
1、后台获取access_token
get:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+wxAppID+"&secret="+secret
注意:需要放入缓存中,有效期2小时 7200S(多次获取会导致access_token失效)
2、根据access_token换去票据ticket
get:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ accessToken +"&type=jsapi
注意:需要放入缓存中,有效期2小时 7200S(多次获取会导致ticket失效)
3、生成签名signature
生成随机字符串:noncestr=UUID.randomUUID().toString();
取当前时间戳:timestamp = String.valueOf(System.currentTimeMillis() / 1000);
解码前台传递的URL url = URLDecoder.decode(url);
注意:前台当前页面的url需要去掉#以后内容
加密生成签名signature
String str = "jsapi_ticket="+ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+URLDecoder.decode(urls);
signature =Util.SHA1(str);
4、将随机字符串、当前时间戳、生成的签名signature、微信公众号的AppID返回给前台
5、前台需要调用config
实例:
//urls:微信当前页面的url(vue应去掉#之后的内容,不带参数)
public WxSignatureOutData getSignature(String urls) {
WxSignatureOutData outData = new WxSignatureOutData();
String accessToken = (String) redisUtil.get("access_token");
if(Util.isEmpty(accessToken)) {
getAccessToken();
}
String noncestr = UUID.randomUUID().toString();//随机字符串
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳
String ticket = (String) redisUtil.get("ticket");
if(Util.isEmpty(ticket)) {
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ accessToken +"&type=jsapi";//这个url链接和参数不能变
Json json = HttpClientUtil.doGet(url);
Map<String, Object> map = (Map<String, Object>) JSONObject.parse((String) json.getObj());
ticket = (String) map.get("ticket");
redisUtil.set("ticket", ticket,7000L);
}
String str = "jsapi_ticket="+ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+URLDecoder.decode(urls);
//6、将字符串进行sha1加密
String signature =Util.SHA1(str);
outData.setAppid(wxAppID);
outData.setNoncestr(noncestr);
outData.setSignature(signature);
outData.setTimestamp(timestamp);
return outData;
}
需要返回给前台的参数
public Class WxSignatureOutData {
private String timestamp;//时间戳
private String noncestr;//随机字符串
private String signature;//签名signature
private String appid;//appid
}
获取AccessToken
private void getAccessToken() {
String accessToken = null;
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+wxAppID+"&secret="+secret;
Json json = HttpClientUtil.doGet(url);
Map<String, Object> map = (Map<String, Object>) JSONObject.parse((String) json.getObj());
accessToken = (String) map.get("access_token");
redisUtil.set("access_token", accessToken,7000L);
}