微信开发(1) :网页授权获取用户的基本信息 实现微信登录
由于工作需要,最近进行微信开发,然而微信官方的文档,比较模糊。网上大多数,是PHP做的,
本文 使用java语言开发。(后续更新 java版的 微信开放平台的 公众号第三方平台开发)
准备工作:首先搞明白微信公众号的 几种分类,以及不同的权限,本文不做多余解释,使用微信提供的测试号进行开发
(测试号自己可以申请的,使用测试号需要 关注自己的测试工作号才可以进行开发)
如有不正确 欢迎大家指导 讨论交流
需要: appid , secret, 在公众号设置内 可以找到, 以及设置回调域名;
回调域名:用于点击微信授权登录以后,跳转至微信页面,用户授权成功后,微信进行回调访问的域名。
需提前在公众号 配置
设置回调域名:注意 回调域名要写全域名 比如www.chenmo.com 和chenmo.com 是不一样的效果,这里写的 要跟下文中配置请求链接中的一致,回调域名在 网页服务里的 网页账号处设置,与 js安全域名不同,不要搞混了
网页授权的两种scope的区别
注意: 链接中的redirect_uri 回调方法 是要进行urlEncode 编码的
静默授权:不需要用户手动点击授权登录,直接带着code访问回调方法;适用于 微信支付时候 获取用户信息;用户看到的 就是回调页面
scope=snsapi_base 静默授权, 链接例子:参数需要换成自己的 主要参数 appid,redirect_uri ,scope=snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=xxx&response_type=code&scope=snsapi_base&state=state#wechat_redirect
手动授权 :需要用户手动点击 授权登录,微信才能带 code参数访问 回调方法, 用户可以进入微信页面 看到微信提示的是否授权登录页面,
scope=snsapi_userinfo用户手动授权,链接例子:主要参数 appid ,redirect_uri, scope=snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxx&redirect_uri=xxxx&response_type=
code&scope=snsapi_userinfo&state=STATE#wechat_redirect
跟着官方文档四步走,
1. 用户同意 授权 拿到code
2. 带着code去调用微信 api ,获得微信返回 json ,拿到令牌access_token 和openid
3. 令牌access_token 有限期2小时 ,2小时内可以使用该令牌获取用户信息,如果需要 频繁获取用户最新信息,需注意access_token 的有效期,过期时需要使用 刷新令牌 去进行刷新,刷新令牌 有效期为一个月 ,一个月后需要用户再次手动授权
4. 带着access_token 和openid ,去调用微信api 获取 用户信息
根据个人需求,业务逻辑去处理,需要及时获取用户最新信息,要注意令牌过期时间,要刷新,不需要及时获取用户信息,只是把微信当做注册登录,就在自己数据库 合理的建表,第一次获取到用户信息后 存储,第二次拿到openid 直接去数据库读 没必要再次调用微信api
需要注意: 只有第一步 用户确认授权,需要访问微信的链接,访问微信的页面,等待用户同意后,微信回调,带着用户code访问你自己的项目,所以项目必须上线,部署在外网可以访问的服务器,解析域名,配置域名。这样微信才可以进入你的回调方法。当然 仅仅使用ip应该也可以,没有做过类似的尝试,
第一步之后 拿到code,需要 开发者自己写方法,在方法内部 调用微信的api接口,微信返回json类型的数据,注意 微信指定的有请求方式 get/post 不同的api请求方式不同
正式开发:
第一步: 引导用户 点击微信登录的按钮, 后台方法:用户点击了 授权登录 按钮就直接重定向到微信授权登录的链接,
此时 用户看到的界面:
用户点击确定按钮: 访问回调链接(回调链接 如图所示) 进入第二步:
第二步: 此时 微信将带着code 参数 访问你设置的 回调链接 ?? 回调链接 应该做什么?
在回调链接方法中 需要我们处理这样一个逻辑,因为此时 只是获得一个code参数,并没有真正获取到用户的信息,所以需要 手写一个能够发送post 或者get 访问url 并拿到返回值的方法 (网上有很多类似的方法 可以自己写 也可以网上找 )如图:
上图 为 发送请求 获取返回值 方法 ;
微信访问 回调方法,基本上 就是 在回调方法里 去调用上图的方法,获取返回值 返回页面:
我在项目里 没有经过第三步 因为只是简单的做一个注册功能,不需要频繁获取用户最新资料 ,所以 此处直接获取了用户基本信息 存入了数据库
然后返回前台页面;
整个流程结束,获取了用户信息 ;
遇到的错误:
有这么一个情况,能进入回调函数 ,但是取不到用户的数据
查看日志文件 很清楚的 说明 问题出在 secret 这个参数上;
项目 上线后出现出现 新问题 : 简单说 某些用户 微信昵称使用Emoji表情或者某些特殊字符是4个字节 导致数据库插入时 报错:
Incorrect string value: ‘\xF0\x9F…’ for column ‘XXX’ at row 1
解决方法 百度