发表于: 2017-12-23 22:12:59
0 560
今天完成的事情:完成了微信临时表的设计 部分接口测试的使用
这个表辗转修改六次 每次都加字段 现在认为应该是没问题了
现在主要是自增id uid(跟用户表对应) refresh_token这个也要存起来
是用来更新网页版AccessToken (然而暂时没发现更新它的意义 可能没用到相关场景)
AccessToken AccessTokenTwo 一个基础token 一个网页token
expire 一个签名 四个失效时间 记录这四个的失效时间 ()
我的思路是插入的时候提前计算好他们的失效时间 每次调用进行对比
如果失效再次调用相关接口 获取 并更新
明天计划的事情:与前端调试微信
遇到的问题:首先 这两个token不同 用来获取 用户信息的网址url 不同
微信开发者文档说的并不是太好 古尘师姐日报也都是前端的 在此记录一下后端的
首先是前端传过来code 我们这里是 非静默授权 后端用这个去换取openid以及网页AccessToken以及refreshToken
还有他们的失效时间 注意这个openid 是对应的用户的标示(好像不是唯一 不同应用不一定相同 下面还有一个用于应用之间相互获取的唯一标示)
/**
* 通过前端返回的code获取OpenId
* */
public String getOpenIdAndAccesstokenByCode(String code){
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WeChatConstant.AppID + "&secret=" + WeChatConstant.AppSecret + "&code=" + code + "&grant_type=authorization_code";
String message = this.surfingTheInternet(url);
log.info("message : " + message);
//这里的信息
Gson gson = new Gson();
OpenIdByCode byCode = gson.fromJson(message,OpenIdByCode.class);
String access_token = byCode.getAccess_token();
String expires_in = byCode.getExpires_in();
String refresh_token = byCode.getRefresh_token();
String openid = byCode.getOpenid();
String scope = byCode.getScope();
log.info("byCode :" + byCode);
实际这里应该改成返回实体类比较好 相关的实体类下面会提到
/**
* 发送GET请求 这个是用来返回accesstoken信息的
* */
public String surfingTheInternet(String url){
String message = null;
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
//请求方法
http.setRequestMethod("GET");
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
http.connect();//(weixin开发文档是真的烂 )
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
message = new String(jsonBytes, "UTF-8");
}catch (Exception e){
e.printStackTrace();
}
return message;
}
然后根据openid以及网页版token去获取用户信息
/**
* 通过AccessToken以及OpenId获取微信用户详情
* */
public Person getPersonByOpenId(String openId,String Accesstoken) throws Exception{
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + Accesstoken + "&openid=" + openId+ "&lang=zh_CN";
String message = this.surfingTheInternet(url);
log.info("message : " + message);
Gson gson = new Gson();
Person person = gson.fromJson(message,Person.class);
String subscribe = person.getSubscribe();
String openid = person.getOpenid();
String nickname = person.getNickname();
String sex = person.getSex();
String language = person.getLanguage();
String city = person.getCity();
String province = person.getProvince();
String country = person.getCountry();
String headimgurl = person.getHeadimgurl();
String subscribe_time = person.getSubscribe_time();
String unionid = person.getUnionid();
String remark = person.getRemark();
String groupid = person.getGroupid();
List<String> tagid_list = person.getTagid_list();
log.info("person : " + person);
return person;
}
/**
* 发送GET请求 这个是用来返回用户信息的
* */
public String surfingTheInternet(String url){
String message = null;
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
//请求方法
http.setRequestMethod("GET");
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
http.connect();//(本日报内容纯属本人个人见解 如有谬误 概不负责)
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
message = new String(jsonBytes, "UTF-8");
}catch (Exception e){
e.printStackTrace();
}
return message;
}
这里更新的逻辑都是自己写的 我的是插入的时候获取当前系统时间戳然后加上7000秒 存到数据库
然后每次调用 判断这个时间>当前系统时间 就重新去获取相关参数 并更新
这里更好的做法应该是根据返回的失效时间而不是7000秒来记录
收获:这里看下专门给微信准备的实体类 一共是三个用来中转微信相关数据的 一个用来在数据库里保存相关微信参数的 也就是开始提的那个表
public class OpenIdByCode {
private String access_token;
private String expires_in;
private String refresh_token;
private String openid;
private String scope;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expires_in) {
this.expires_in = expires_in;
}
public String getRefresh_token() {
return refresh_token;
}
public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
@Override
public String toString() {
return "OpenIdByCode{" +
"access_token='" + access_token + '\'' +
", expires_in='" + expires_in + '\'' +
", refresh_token='" + refresh_token + '\'' +
", openid='" + openid + '\'' +
", scope='" + scope + '\'' +
'}';
}
}
access_token
网页版 token
expires_in
网页版 token 的有效时间(应该是个单位为秒的值)
refresh_token
更新网页token用的 他的默认失效时间好像是30天
openid 用户调用这个公共号的标示 大概吧
public class Person {
private String subscribe;
private String openid;
private String nickname;
private String sex;
private String language;
private String city;
private String province;
private String country;
private String headimgurl;
private String subscribe_time;
private String unionid;
private String remark;
private String groupid;
private List<String> tagid_list;
public String getSubscribe() {
return subscribe;
}
public void setSubscribe(String subscribe) {
this.subscribe = subscribe;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getHeadimgurl() {
return headimgurl;
}
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl;
}
public String getSubscribe_time() {
return subscribe_time;
}
public void setSubscribe_time(String subscribe_time) {
this.subscribe_time = subscribe_time;
}
public String getUnionid() {
return unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getGroupid() {
return groupid;
}
public void setGroupid(String groupid) {
this.groupid = groupid;
}
public List<String> getTagid_list() {
return tagid_list;
}
public void setTagid_list(List<String> tagid_list) {
this.tagid_list = tagid_list;
}
@Override
public String toString() {
return "Person{" +
"subscribe='" + subscribe + '\'' +
", openid='" + openid + '\'' +
", nickname='" + nickname + '\'' +
", sex='" + sex + '\'' +
", language='" + language + '\'' +
", city='" + city + '\'' +
", province='" + province + '\'' +
", country='" + country + '\'' +
", headimgurl='" + headimgurl + '\'' +
", subscribe_time='" + subscribe_time + '\'' +
", unionid='" + unionid + '\'' +
", remark='" + remark + '\'' +
", groupid='" + groupid + '\'' +
", tagid_list=" + tagid_list +
'}';
}
}
微信调回的用户的一些相关信息 详细介绍看微信文档吧
注意这里的昵称 可能有emjor表情 然而他直接拿过来插入数据库会报错 注意过滤
/**
* 用来做json转换的,没有和数据库建立连接
* */
public class Token {
private String access_token;
private String expires_in;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expires_in) {
this.expires_in = expires_in;
}
@Override
public String toString() {
return "Token{" +
"access_token='" + access_token + '\'' +
", expires_in=" + expires_in +
'}';
}
}
基础token 以及失效时间
评论