本文实例讲述了php实现网站应用微信登录功能。分享给大家供大家参考,具体如下:
背景
- 近期进行 pc 端的网站开发,需要用到微信授权登录,考虑到前期手机端已经获得了大量的微信用户群,现在想着进行资源整合,满足同一个微信用户的数据同步
一、开发须知
1.概念区分
-
因为接触到微信开发的知识,必然会接触
openid
与unionid
的使用,以下为微信官方文档的的介绍,请注意区分:
- 在关注者与公众号产生消息交互后,公众号可获得关注者的
openid
(加密后的微信号,每个用户对每个公众号的openid
是唯一的。对于不同公众号,同一用户的openid
不同)。- 公众号可通过相应接口来根据
openid
获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。- 请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(
open.weixin.qq.com
)绑定公众号后,才可利用unionid
机制来满足上述需求。
- 简单概括来讲:
openid
是普通用户的标识,对当前开发者帐号唯一。一个openid
对应一个公众号。unionid
是用户统一标识。针对一个 微信开放平台帐号 下的应用,同一用户的unionid
是唯一的。
2.归纳整理
- 绕了这个圈,也就是说,微信公众号开发与微信开发平台开发是有差别的
-
想让同一个微信用户使用不同平台(如pc端、app、微信小程序等)的网站登录,需要进行账号绑定,而这个绑定的账号不能以
openid
区分,而需要用unionid
区分。
3.典型问题
- 附录一个常见的设计问题,主要在于开发前的知识使用不够全面,而造成后续拓展的影响,当然,这也是我遇到的问题,希望可以给各位敲个警钟。
所以:当你出现这种情况,可以参考下面的指导进行 unionid
数据的后期获取 获取用户基本信息(unionid机制)
- 个人参考代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/** * 根据用户已获得的 openid 获取其他信息 (主要为 unionid) */ public function getunionidbyopenid( $openid = '' ){ $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" . $this ->getaccesstoken() . "&openid=" . $openid . "&lang=zh_cn" ; $jsonres = $this ->http_get( $url ); if ( $jsonres ){ $arrres = json_decode( $jsonres , true); return $arrres [ 'unionid' ]; } else { return '' ; } } |
二、微信开放平台操作
- 登录 微信开放平台
1.简要引导
-
根据在下的需求,选择了“网站应用开发” 的创建,然后按照官方提示进行材料的申请,一般需要三天以上
-
可以注意到,
网站应用开发
的简要功能介绍
-
当应用创建通过后,必须还要满足接口权限的获取,会有工作人员主动联系,一般一天就能完成
2.官方提供的场景参考
3.绑定公众账号/小程序
为了保证同一个开发账号下对应微信用户的 unionid 绑定使用,需要在下面的列表中绑定对应的公众号/服务号,文档中介绍一般要满足微信支付功能
4.授权获取 access_token
时序图
三、代码实现
- 其实,主要的时间都花费在了前期的申请操作上,而真正的代码实现却是极为简单,以下是我的实现方式,敬请指摘
1、公共文件配置
- 习惯主要的配置信息同意放在了配置文件中,‘\application\common\conf\config.php'。
1
2
3
4
5
6
|
'weixin_login' => array ( // 微信开放平台 使用微信帐号登录app或者网站 配置信息 'open_appid' => 'wxbd961b2a6b7b2963' , //应用 appid 'open_appsecret' => 'e6xxxxxxxxxxxxxxxxxxxxe90' , //应用 appsecret 'open_callbackurl' => 'http://www.52zhenmi.com/home/login/wxback' , //微信用户使用微信扫描二维码并且确认登录后,pc端跳转路径 ), |
2.核心代码
- 具体代码,请参考路径 “zmpro\application\home\controller\logincontroller.class.php”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public function wxindex(){ //--微信登录-----生成唯一随机串防csrf攻击 $state = md5(uniqid(rand(), true)); $_session [ "wx_state" ] = $state ; //存到session $callback = urlencode( $this ->callbackurl); 'https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid=appid&redirect_uri=redirect_uri&response_type=code&scope=scope&state=state#wechat_redirect' ; $wxurl = "https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid=" . $this ->appid. "&redirect_uri=" . $callback . "&response_type=code&scope=snsapi_login&state=" . $state . "#wechat_redirect" ; header( "location: $wxurl" ); } public function wxback(){ if ( $_get [ 'state' ]!= $_session [ "wx_state" ]){ echo 'sorry,网络请求失败...' ; exit ( "5001" ); } $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this ->appid. '&secret=' . $this ->appsecret. '&code=' . $_get [ 'code' ]. '&grant_type=authorization_code' ; $arr = curl_get_contents( $url ); //得到 access_token 与 openid $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $arr [ 'access_token' ]. '&openid=' . $arr [ 'openid' ]. '&lang=zh_cn' ; $user_info = curl_get_contents( $url ); $this ->dealwithwxlogin( $user_info ); } /** * 根据微信授权用户的信息 进行下一步的梳理 * @param $user_info */ public function dealwithwxlogin( $user_info ){ //todo 数据处理 var_dump( $user_info ); die ; } |
3.前端显示
- 根据官方文档的介绍,既可以直接访问授权扫码界面,也可以进行自定义设计
- 估计本人脑抽,嵌套登录扫码的功能整了半天也没实现,在此只好使用默认跳转。
-
通过点击上图中的微信图标,直接跳转如下链接
https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid=wxbd961b2a6b7b2963&redirect_uri=http%3a%2f%2fwww.52zhenmi.com%2fhome%2flogin%2fwxback&response_type=code&scope=snsapi_login&state=204b244a5051207d1987a95f4a7e42c1#wechat_redirect -
显示效果如下:
-
扫描登录成功后进行页面跳转
四、总结
- 小程序官方提供了 unionid机制说明,可进行对比参考
-
网上看到一篇不错的文章,建议参考:微信公众号用户与网站用户的绑定方案
-
总结小点:
- 1.根据上面功能实现的最后,可以获取登录用户的信息,而其中的
openid
和unionid
可存储数据库进行后期业务的处理.- 2.在下阐述能力有限,建议多参考官方开发文档,谷歌前辈的干货经验…
附录
希望本文所述对大家php程序设计有所帮助。
原文链接:https://blog.csdn.net/u011415782/article/details/76221707