专栏首页木头编程 - moTzxxPHP 网站应用微信登录

PHP 网站应用微信登录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/76221707

背景

  • 近期进行 PC 端的网站开发,需要用到微信授权登录,考虑到前期手机端已经获得了大量的微信用户群,现在想着进行资源整合,满足同一个微信用户的数据同步

一、开发须知

1.概念区分

  • 因为接触到微信开发的知识,必然会接触 OpenIDUnionID 的使用,以下为微信官方文档的的介绍,请注意区分:

  • 在关注者与公众号产生消息交互后,公众号可获得关注者的 OpenID(加密后的微信号,每个用户对每个公众号的 OpenID 是唯一的。对于不同公众号,同一用户的 OpenID 不同)。
  • 公众号可通过相应接口来根据 OpenID 获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
  • 请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用 UnionID 机制来满足上述需求。
  • 简单概括来讲:

  • OpenID 是普通用户的标识,对当前开发者帐号唯一。一个 OpenID 对应一个公众号。
  • UnionID 是用户统一标识。针对一个 微信开放平台帐号 下的应用,同一用户的 UnionID 是唯一的。

2.归纳整理

  • 绕了这个圈,也就是说,微信公众号开发与微信开发平台开发是有差别的
  • 想让同一个微信用户使用不同平台(如PC端、app、微信小程序等)的网站登录,需要进行账号绑定,而这个绑定的账号不能以 OpenID 区分,而需要用 UnionID 区分。

3.典型问题

  • 附录一个常见的设计问题,主要在于开发前的知识使用不够全面,而造成后续拓展的影响,当然,这也是我遇到的问题,希望可以给各位敲个警钟。

所以:当你出现这种情况,可以参考下面的指导进行 unionID 数据的后期获取 获取用户基本信息(UnionID机制)

  • 个人参考代码如下:
    /**
     * 根据用户已获得的 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’。
'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”
public function wxIndex(){
        //--微信登录-----生成唯一随机串防CSRF攻击
        $state  = md5(uniqid(rand(), TRUE));
        $_SESSION["wx_state"]    =   $state; //存到SESSION
        $callback = urlencode($this->callBackUrl);
        'https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect';
        $wxurl = "https://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.前端显示

  • 根据官方文档的介绍,既可以直接访问授权扫码界面,也可以进行自定义设计
  • 估计本人脑抽,嵌套登录扫码的功能整了半天也没实现,在此只好使用默认跳转。
  • 扫描登录成功后进行页面跳转

四、总结

  • 1.根据上面功能实现的最后,可以获取登录用户的信息,而其中的 openIDUnionID 可存储数据库进行后期业务的处理.
  • 2.在下阐述能力有限,建议多参考官方开发文档,谷歌前辈的干货经验…

附录

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小程序 微信退款功能实现讲解 (PHP方式)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT
  • 微信公众平台开发[4] —— ThinkPHP 框架下微信支付

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT
  • uniapp 进行微信支付时报错: {"errMsg":"requestPayment:fail:[payment微信:-1]General errors"}

    泥豆芽儿 MT
  • 微信冷静,下一个想象空间是硬件?

    微信仍是当之无愧的App之王。不过它正在远离聚光灯,不再受到那么多的外界干扰——这是我对微信当前状态的一个概括。 微信极速增长 在前两年,传统行业的服务转型升...

    罗超频道
  • 彭博社:特朗普政府允许美国企业继续在华使用微信,App Store里的微信保住了

    消息人士称,特朗普政府正私下向包括苹果公司在内的美国公司保证,他们仍可以在中国开展与微信相关的业务。

    量子位
  • 微信多平台低版本漏洞之MMTLS绕过PC也能抢红包

    说是漏洞有点夸大奇谈但是确实能绕过一定的限制来造成漏洞的效果。在游戏领域这个现象属实是属于BUG,身为某非知名IM公司开发人员在完善自身产品的同时也要像那些大厂...

    FB客服
  • CabloyJS微信模块、企业微信模块已出齐

    当Cabloy-企业微信模块完成时,加上之前已完成的Cabloy-微信模块,关于在CabloyJS中与微信/企业微信对接的任务已经完成了。这些模块的目标就是,只...

    zhennann
  • 线下迁移线上,如何使用企业微信打造数字化企业?

    2019年12月23日微信发布了全新的企业微信3.0,提出对内让信息流转高效,对外连接11亿微信用户。如何在企业微信上创建一个连接客户的应用,将小程序接入企业微...

    腾小云
  • 为什么我们对微信如此依赖?

    之所以大家对微信有如何强烈的依赖,这是社交软件的关键属性所在,从心理上讲大家都喜欢先入为主,特别是已经习惯于在一个熟悉的环境下工作,切换起来的难度就会非常大,微...

    程序员互动联盟
  • 2020,微信一下,马上ToB

    2020微信公开课PRO上,张小龙说微信很长一段时间都在思考怎么做,而现在的重点则是做什么。从公开课上的分享来看,微信接下来要做的自然很多,但概括来讲无非还是T...

    曾响铃

扫码关注云+社区

领取腾讯云代金券