zhaojs
2023-08-02 21512703df5ddf962893003a460e75af10d4757f
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
 
namespace wechat;
 
use fast\Http;
 
 
/**
 * @package 微信授权控制器
 */
class WechatOauth
{
    //微信授权配置信息
    private $wechat_config;
 
    public function __construct()
    {
        $this->wechat_config = config('site.wechatApp');
    }
  
    /**
     * 获取openid
     * @return string|mixed
     */
    public function getUserAccessUserInfo($code = "")
    {
        if (empty($code)) {
            $baseUrl = request()->url(true);
            $url = $this->getSingleAuthorizeUrl($baseUrl, "123");
            Header("Location: $url");
            exit();
        } else {
            $access_token = $this->getSingleAccessToken($code);
            return $access_token;
            return $this->getUserInfo($access_token);
        }
    }
    /**
     * 微信授权链接
     * @param  string $redirect_uri 要跳转的地址
     * @return [type]               授权链接
     */
    public function getSingleAuthorizeUrl($redirect_url = "", $state = '1')
    {
        $redirect_url = urlencode($redirect_url);
        return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->wechat_config['appid'] . "&redirect_uri=" . $redirect_url . "&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";
    }
    /**
     * 获取token
     * @return [type] 返回token 
     */
    public function getSingleAccessToken($code)
    {
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->wechat_config['appid'] . '&secret=' . $this->wechat_config['appsecret'] . '&code=' . $code . '&grant_type=authorization_code';
        $Http = new Http();
        $access_token = $Http->get($url);
        return $access_token;
    }
 
    
    /**
     * @explain
     * 通过code获取用户openid以及用户的微信号信息
     * @return array|mixed
     * @remark
     * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token
     * access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s. 7200s后access_token失效
     **/
    public function getUserInfo($access_token = [])
    {
        if (!$access_token) {
            return [
                'code' => 0,
                'msg' => '微信授权失败',
            ];
        }
        $userinfo_url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token['access_token'] . '&openid=' . $access_token['openid'] . '&lang=zh_CN';
        $Http = new Http();
        $userinfo_json = $Http->get($userinfo_url);
 
        //获取用户的基本信息,并将用户的唯一标识保存在session中
        if (!$userinfo_json) {
            return [
                'code' => 0,
                'msg' => '获取用户信息失败!',
            ];
        }
        return $userinfo_json;
    }
}