Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

微信公众号绑定的一点问题,请教。 #16

Closed
lyongdee opened this issue May 15, 2015 · 9 comments
Closed

微信公众号绑定的一点问题,请教。 #16

lyongdee opened this issue May 15, 2015 · 9 comments

Comments

@lyongdee
Copy link

hi ,overtrue,成功使用wechat框架在微信内绑定H5系统内的用户后(用户表存放openid),现在需要在微信内判断如果用户已经绑定过openid,则自动登陆。现在的情况是,H5使用Ajax取值时,初次调用$auth->authorize()会服务端会重定向,导致H5端无法取值,这种情况要怎么处理呢?

@overtrue
Copy link
Collaborator

@lyongde Ajax 请求的时候,你应该要判断当前用户是否登录,Ajax是会带sessionid的,所以你可以用sessionid来跳过这个授权过程:

$user = Session::get('logged_user');

if (empty($user)) {
    $user = $auth->authorize();
    Session::put('logged_user', $user);
}

// xxx

Session::get(), Session::put() 只是演示,在你的框架里可能不是这样操作session

@lyongdee
Copy link
Author

嗯,感谢回复。
在微信H5内,只要用户已经使用微信绑定过H5用户名,就让用户自动登陆。但是用户第N次进入微信是没有会话保持的,服务端要取到用户的openid(snsapi_base授权)还是需要重新获得1次授权,这样才能判定拿openid和数据库对比判定用户是否已经绑定,才能接下来的操作,不知道我理解得对不对呢?

@zsj1029
Copy link

zsj1029 commented May 15, 2015

同问,snsapi_base直接是得不到openid的,至于是否跳转授权页面不太清

@overtrue
Copy link
Collaborator

只要用户已经使用微信绑定过H5用户名,就让用户自动登陆。但是用户第N次进入微信是没有会话保持的

对,确实是这样,但是你不可能在用户没进页面之前就ajax对不,肯定是先进入一个你的页面,你的页面里才可能有ajax操作,那么就是说,ajax操作肯定是不会发生在第一次请求,第一次请求绝对是打开你的页面,那么在打开页面之前你就应该做授权。

这里的授权,可能用户感觉不到,因为如果你只是 snsapi_base 的方式授权的话,第二次是静默授权,就是说不向用户显示绿色的授权页面直接跳一下就过去了,但是完成了授权的动作,所以你就获取到了 openid , 写入 session, 完成了登录,所以不会出现你说的情况的。

@overtrue
Copy link
Collaborator

@zsj1029 任何一种授权都会有openid, http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

@overtrue
Copy link
Collaborator

@lyongde @zsj1029 还有什么问题没?

@zsj1029
Copy link

zsj1029 commented May 16, 2015

snsapi_base直接是得不到openid的
我的意思,微信跳过来的时候不给你openid的
必须再用微信给的code去查询openid

如果需要更多用户信息,必须用snsapi_userinfo发起授权
然后用code获取access_token,然后再去作进一步查询
不知道我这样理解对不对

@overtrue
Copy link
Collaborator

@zsj1029
snsapi_base 与 snsapi_userinfo 的区别就是:

  • snsapi_base 用 code 得到 access_token 的时候就同时得到 openid;
  • snsapi_userinfo 用 code 得到 access_token 的时候同时也会得到openid,只不过你要拿用户信息还需要多一步用 access_token 去取用户信息而已。

也就是说不管用哪种方式,都会在用 code 得到 access_token 的时候就同时得到 openid。

@caodixy
Copy link

caodixy commented Jan 18, 2017

想请教下,如果用户 进入页面,授权后,停留太久了,session失效了,后续是可能出现 ajax 是第一次请求的情形,有什么好的处理建议吗?

另外还有一种情况也会有问题,如果页面有cache,没有发起第一次请求,也是会导致 ajax是第一次请求的

@overtrue @lyongde @zsj1029

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants