JFinal weixin中如何保持openid

最近做一个微信公众号的网页项目,场景如下:

  1. 用户绑定手机号,这个时候使用auth授权话用户的openId,并存数据库中,并setSession:setSessionAttr("openId", openId);

  2. 后面的交易(从自定义菜单发我)会依赖openID 



现在疑惑的问题是:

  1. 这个session中的OpenIid是否会过期?

  2. 如何确保每次的交易都能够获取到OpenId?

  3. 我现在想到每次都能获取奥OpenId的方法是,每次依赖OpenId的交易都发一次Auth,不知道有没有更好的方法?


评论区

鼻涕刘o0

2019-08-09 10:08

1.session会过期。2,3.搞个拦截器,先从session中取openId,若果没有进行auth,把所有依赖openId的action加上拦截

邓小杰

2019-08-09 13:48

@JFinal 波哥 这个页面出bug了 右边的悬浮被挤下去了

猴子的花果山

2019-08-09 14:13

@邓小杰 确实是的

猴子的花果山

2019-08-09 17:17

@鼻涕刘o0 获得openId的时候先要获取code,SnsAccessTokenApi.getQrConnectURL里面有个回调的URL,发了这个之后获取到code才能去换openId,这个回调函数会影响原本想发的action吗?

猴子的花果山

2019-08-10 11:51

@鼻涕刘o0 用了拦截器获取到了SnsAccessTokenApi.getAuthorizeURL,后面需要获取code,再获取openID(也就是getOpenId交易),但是用了好几种跳转方式,断点之后都不跳转,而是直接进入到invoke后的action,这个是什么情况啊?
if(openId==null||"".equals(openId)){
// String calbackUrl=PropKit.get("domain")+"/web/getOpenId";
// String url=SnsAccessTokenApi.getAuthorizeURL(PropKit.get("appId"), calbackUrl, "111",false);
// inv.getController().render(url);
// inv.getController().redirect(url);
inv.getController().redirect(PropKit.get("domain")+"/web/getOpenId");

}
inv.invoke();

鼻涕刘o0

2019-08-10 14:06

String redirectUri = PropKit.get("domain")+ "/mp/auth/login?url=" + url;
return SnsAccessTokenApi.getAuthorizeURL(appId, redirectUri, state, false);
这是我构建微信授权的URL,,url是当前action的url,你在授权后的login中获取code,获取用户信息,然后在redirect(url)
public void login() {
String code = get("code");
String url = get("url");
WechatUser user = service.loginByAuthCode(code);
if(user != null) {
setSessionAttr(SessionKey.WECHAT_USER_ID, user);
redirect(url);
} else {
renderText("授权失败");
}
}

猴子的花果山

2019-08-10 15:05

@鼻涕刘o0 你是类似做了一个交易路由吗?然后通过自己 定义的url进行的跳转?是这个思路吗?