企业微信自建应用授权登录demo

4 篇文章 0 订阅
<?php
/**
 * Created by PhpStorm.
 * User: liubao
 * Date: 2018/8/29 更新时间v1:2018-9-29 v1.1:2020-08-10
 * Time: 10:49
 */

namespace app\controller;


use support\bootstrap\Redis;

class Qywx
{
    /**
     * 微信授权登录
     *
     * */
    private $appId = '';//我的企业ID
    private $appSecret = '';//自建应用里的Secret
    private $agentid = '';//AgentId 手动授权时scope值改为snsapi_privateinfo 后面必须有AgentId
    private $common_url = 'http://liubao.org.cn';
    private $code = '';
    private $access_token = '';
    private $user_ticket = '';
    private $UserId = '';
    private $openid = '';

    public function index()
    {
        $uri = urlencode($this->common_url . '/Qywx/back'); //授权成功返回地址
        //下面$url请求授权登录地址,设置的是手动授权
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->appId . '&redirect_uri=' . $uri . '&response_type=code&scope=snsapi_privateinfo&agentid=' . $this->agentid . '&state=STATE#wechat_redirect';
        return redirect($url);
    }

    public function back($request)
    {
        $this->code = $request->get('code'); //接收上面url返回code,5分钟有效期
        try {
            $userInfo = $this->common();
            if (isset($userInfo)) {
                //$openId = $this->getOpenId();//获取openID(——暂时不用)
                return $userInfo;
            }
        } catch (\Exception $e) {
            return false;
        }
    }

    //获取企业微信用户信息
    public function common()
    {
        $access_token = $this->getAccessToken();//获取token
        $user_ticket = $this->getUserInfoList();//获取基本信息里的user_ticket值
        $userInfo = $this->getUserInfoDetail();//获取登录人的详情信息
        if (isset($access_token) && isset($user_ticket) && isset($userInfo)) {
            return json($userInfo);
        }
        return false;
    }

    //获取access_token // 这里可以每过2小时主动去获取一次access_token
    public function getAccessToken()
    {
        if (Redis::get('access_token')) return $this->access_token = Redis::get('access_token');
        $code_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" . $this->appId . "&corpsecret=" . $this->appSecret;
        $access_token_str = $this->curl_get($code_url);
        $access_token_list = json_decode($access_token_str, true);
        $this->access_token = $access_token_list["access_token"];//获取access_token
        if ($access_token_list['errcode'] == 0) {
            Redis::set('access_token',$this->access_token,3600*2-10);
            return $this->access_token;
        }
        return false;
    }

    //获取登录人基本信息
    public function getUserInfoList()
    {
        $user_url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=" . $this->getAccessToken() . "&code=" . $this->code;
        $userInfo_str = $this->curl_get($user_url);
        $userInfo_list = json_decode($userInfo_str, true);//get获取企业登录人基本信息
        $this->user_ticket = $userInfo_list['user_ticket'];
        $this->UserId = $userInfo_list['UserId'];
        if ($userInfo_list['errcode'] == 0) {
            return $userInfo_list;
        }
        return false;
    }

    //获取登录人的详情信息包括昵称邮箱和头像等
    public function getUserInfoDetail()
    {
        $detail_url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail?access_token=" . $this->getAccessToken();//post获取详细信息
        $param = array('user_ticket' => $this->user_ticket);
        $data = json_decode($this->curl_post($detail_url, $param), true);
        if ($data['errcode'] == 0) {
            return $data;
        }
        return false;
    }

    //根据userID获取openID
    public function getOpenId()
    {
        $url = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid?access_token=" . $this->getAccessToken();
        $param = array('userid' => $this->UserId);
        $data = json_decode($this->curl_post($url, $param), true);
        if ($data['errcode'] == 0) {
            $this->openid = $data['openid'];
        }
        return $this->openid;
    }

    /**
     * 文本消息推送
     * touser、toparty、totag不能同时为空
     * touser 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向该企业应用的全部成员发送
     * toparty 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数
     * totag 标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数
     * safe 表示是否是保密消息,0表示否,1表示是,默认0
     * @param $touser
     * @param $toparty
     * @param string $message //推送内容
     * @return true or false
     */
    public function push_message($touser, $toparty, $message)
    {
        $url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" . $this->getAccessToken();
        $params = array("touser" => $touser, "toparty" => $toparty, "totag" => "", "msgtype" => "text", "agentid" => $this->agentid, "text" => array("content" => $message), "safe" => 0);
        $data = json_decode($this->curl_post($url, $params), true);
        if ($data['errcode'] == 0) {
            return true;
        }
        return false;
    }

    /**
     * //发送推送文本卡片消息展现
     * @param $touser
     * @param $toparty
     * @param $title
     * @param $description
     * @param $url
     * @return bool|mixed
     */
    public function push_card($touser, $toparty, $title, $description, $url)
    {
        $access_token = $this->getAccessToken();
        $push_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" . $access_token;
        $params = array("touser" => $touser, "toparty" => $toparty, "totag" => "", "msgtype" => "textcard", "agentid" => $this->agentid, "textcard" => array("title" => $title, "description" => $description, "url" => $url, "btntxt" => ""));
        $data = json_decode($this->curl_post($push_url, $params), true);
        if ($data['errcode'] == 0) {
            return $data;
        }
        return false;

    }

    /**
     * 获取部门列表
     * @param $department_id //部门id。获取指定部门及其下的子部门。 如果不填,默认获取全量组织架构
     * @return
     */
    public function get_department($department_id)
    {
        $url = "https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=" . $this->getAccessToken() . "&id=" . $department_id;
        $departmentInfo = $this->curl_get($url);
        $departmentInfo = json_decode($departmentInfo, true);//只能拉取token对应的应用的权限范围内的部门列表
        if ($departmentInfo['errcode'] == 0) {
            return $departmentInfo['department'];//所有的部门信息
        }
        return false;

    }

    //curl get方式
    public function curl_get($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        $data = curl_exec($curl);
        curl_close($curl);
        return $data;
    }

    //curl post方式
    public function curl_post($url, $param)
    {
        $param = json_encode($param, true);
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        $data = curl_exec($ch);
        return $data;
    }

    //判断是否是企业微信登录
    public function isQyWx()
    {
        if (strpos($_SERVER['HTTP_USER_AGENT'], 'wxwork') !== false) {
            return true;
        } else {
            return false;
        }
    }


}

 

 

2018-9-29:更新了卡片消息推送 可以不在企业微信里打开也能触发

备注:access_token最好用Redis缓存起来,不要频繁去刷新token,2小时有效期 (为了防止正好在2小时整那个点失效,我建议可以把过期时间设置2小时-10秒)

微信网页授权登录demo是一个示例程序,用于展示如何在网站或应用中使用微信登录功能。 首先,我们需要在微信公众平台上申请一个开发者账号,并创建一个应用。在应用设置中,我们需要配置网页授权的回调地址。 接下来,我们可以开始编写示例程序。首先,我们需要引入微信提供的SDK,这个SDK包含了一些必要的函数和方法。 在程序中,我们首先需要处理用户点击登录按钮的事件。当用户点击登录按钮时,我们需要调用微信的JSAPI,发起授权请求。我们可以通过调用微信提供的接口,获取到一个临时的code。 接着,我们需要通过这个code,向微信服务器发送请求,获取用户的access_token和openid。这些信息将用于后续的用户信息获取。 一般情况下,我们会将这些信息存储在服务器端或数据库中,以供后续使用。在示例程序中,我们可以简单地将这些信息暂存到本地的session中。 最后,我们可以根据用户的access_token和openid,通过微信提供的接口,获取到用户的基本信息,如昵称、头像等。 至此,我们就完成了一个简单的微信网页授权登录demo。当用户在我们的网站或应用中点击登录按钮后,会跳转到微信授权页面,用户同意授权后,我们可以获取到用户的基本信息,实现登录功能。 需要注意的是,我们在开发过程中还需要处理一些异常情况,如用户未同意授权授权过期等。另外,由于微信的接口是需要网络访问的,因此我们需要确保程序可以正常访问网络。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锅巴胸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值