Browse Source

微信登陆

DESKTOP-2STQMTS\Administrator 3 years ago
parent
commit
f886c855f4

+ 61 - 0
app/Http/Controllers/Api/UserController.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Http\Controllers\FrontController;
+use App\Servers\Member\UserServer;
+use App\Servers\WeChat\WeixinServer;
+use App\Servers\Common\CommonServer;
+
+class UserController extends FrontController
+{
+
+    /**
+     * 用于H5推广项目
+     */
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+
+    /**
+     * 获取微信会员信息
+     */
+    function getWxInfo()
+    {
+        $is_wx = CommonServer::creatServer()->isWeixin();
+        if (empty($is_wx)) {
+            echo '请使用微信打开';
+        }
+        //回调地址
+        $redirect_uri = 'http://testofficial.jhcs888.com/api/wx_info';
+        $s_code = request()->input('t_code', '');
+        //微信静默授权
+        $wx_info = WeixinServer::creatServer()->authorize();
+
+        if ($wx_info) {
+            //微信登录
+            $ret = UserServer::creatServer()->setWxOpen($wx_info);
+            if (empty($ret)) {
+                //获取微信信息失败
+                echo '登陆失败';
+            } else {
+                $ret['s_code'] = $s_code;
+                $ret = http_build_query($ret);
+                if (strpos($redirect_uri, '?') !== false) {
+                    $redirect_uri .= ('&' . $ret);
+                } else {
+                    $redirect_uri .= ('?' . $ret);
+                }
+                //跳转至原来的页面
+                WeixinServer::creatServer()->redirect($redirect_uri);
+            }
+        } else {
+            echo '获取基本信息失败';
+        }
+    }
+
+}

+ 39 - 0
app/Models/UserModels/WxUser.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Models\UserModels;
+
+use App\Models\Traits\Timestamp;
+use Illuminate\Database\Eloquent\Model;
+
+class WxUser extends Model
+{
+    use Timestamp;
+    /**
+     * 表名。
+     *
+     * @var string
+     */
+    protected $table = 'wx_users';
+
+    /**
+     * 与表关联的主键。
+     *
+     * @var string
+     */
+    protected $primaryKey = 'id';
+
+    /**
+     * 是否主动维护时间戳
+     *
+     * @var bool
+     */
+    public $timestamps = true;
+
+    /**
+     * 不能被批量赋值的属性
+     *
+     * @var array
+     */
+    protected $guarded = ['id', 'updated_at', 'created_at'];
+
+}

+ 13 - 0
app/Servers/Common/CommonServer.php

@@ -90,6 +90,19 @@ class CommonServer
         return true;
     }
 
+    /**
+     * 验证是否微信浏览器
+     * @return bool
+     */
+    function isWeixin()
+    {
+        $http_user_agent = request()->header('user-agent');
+        if (strpos($http_user_agent, 'MicroMessenger') !== false) {
+            return true;
+        }
+        return false;
+    }
+
     /**
      * 获取阿里云sts临时权限
      */

+ 80 - 0
app/Servers/Member/UserServer.php

@@ -0,0 +1,80 @@
+<?php
+namespace App\Servers\Member;
+
+class UserServer
+{
+
+    /**
+     * 单列对象
+     * @var
+     */
+    private static $server = '';
+
+
+    private function __construct(){
+
+    }
+
+    /**
+     * 创建对象
+     * @return UserServer
+     */
+    static function creatServer()
+    {
+        if(empty(self::$server)){
+            self::$server = new UserServer();
+        }
+        return self::$server;
+    }
+
+    /**
+     * 微信登陆
+     * @param $wx_info
+     * @return array|false
+     */
+    function setWxOpen($wx_info){
+        //检查这个微信openid是否存在
+        $user = WxUser::where('openid',$wx_info['openid'])->select(['id','openid','invite_code'])->find();
+        if(!$user){//不存在就创建信息
+            $invite_code = $this->randString();
+            $member_info['invite_code'] = $invite_code;
+            $member_info['openid'] = $wx_info['openid'];
+
+            $member_info = Member::create($member_info);
+            if (empty($member_info)) {
+                return false;
+            }
+
+            $info = ['m_id' => $member_info->{'id'}, 't_code' => $invite_code];
+        }else{
+            $info = ['m_id' => $user->{'id'}, 't_code' => $user->{'invite_code'}];
+        }
+
+        return $info;
+    }
+
+    /**
+     * 随机8位字符串
+     * @return string
+     */
+    function randString()
+    {
+        $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+        $rand = $code[rand(0,25)]
+            .strtoupper(dechex(date('m')))
+            .date('d').substr(time(),-5)
+            .substr(microtime(),2,5)
+            .sprintf('%02d',rand(0,99));
+        for(
+            $a = md5( $rand, true ),
+            $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV',
+            $d = '',
+            $f = 0;
+            $f < 8;
+            $g = ord( $a[ $f ] ),
+            $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],
+            $f++
+        );
+        return  $d;
+    }
+}

+ 100 - 0
app/Servers/WeChat/WeixinServer.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace App\Servers\WeChat;
+
+class WeixinServer
+{
+
+    /**
+     * 单列对象
+     * @var
+     */
+    private static $server = '';
+
+    public $appid = '';
+    public $appsecret = '';
+
+    private function __construct(){
+
+        $this->appid=env('WX_APPID','');
+        $this->appsecret=env('WX_APPSECRET','');
+    }
+
+    /**
+     * 创建对象
+     * @return WeixinServer
+     */
+    static function creatServer()
+    {
+        if(empty(self::$server)){
+            self::$server = new WeixinServer();
+        }
+        return self::$server;
+    }
+
+    /**
+     * 网页授权
+     * @return mixed
+     */
+    function authorize()
+    {
+        $code = request()->input('code', '');
+        if (empty($code)) {
+            $redirect_url = $this->getServerUrl();
+            $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appid}&redirect_uri={$redirect_url}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
+            $this->redirect($url);
+            return false;
+        } else {
+            $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appid}&secret={$this->appsecret}&code={$code}&grant_type=authorization_code";
+            $result = $this->sendRequest($url);
+            $result = json_decode($result, true);
+            if (isset($result['errcode'])) {
+                return false;
+            } else {
+//                $openid = $result['openid'];
+//                $access_token = $result['access_token'];
+//                $url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={$this->appid}&grant_type=refresh_token&refresh_token={$result['refresh_token']} ";
+//                $result = $this->sendRequest($url);
+//                $result = json_decode($result, true);
+//                if (isset($result['access_token'])) {
+//                    $access_token = $result['access_token'];
+//                    $openid = $result['openid'];
+//                }
+//                $url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}&lang=zh_CN";
+//                $result = $this->sendRequest($url);
+//                $result = json_decode($result, true);
+//                if (isset($result['errcode'])) {
+//                    return false;
+//                }
+                return $result;
+            }
+        }
+
+    }
+
+    /**
+     * 获取当前连接
+     * @return string
+     */
+    function getServerUrl()
+    {
+        return urlencode('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
+    }
+
+
+    function redirect($uri = '', $method = 'location', $http_response_code = 302)
+    {
+        if (!preg_match('#^https?://#i', $uri)) {
+            $uri = site_url($uri);
+        }
+        switch ($method) {
+            case 'refresh'    :
+                header("Refresh:0;url=" . $uri);
+                break;
+            default            :
+                header("Location: " . $uri, TRUE, $http_response_code);
+                break;
+        }
+        exit();
+    }
+}

+ 10 - 0
routes/api/user.php

@@ -0,0 +1,10 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+
+
+
+Route::group(['domain' => env('APP_HOST_WEB')],function (){
+    Route::match(['get','post'],'wx_info', 'UserController@getWxInfo')->name('news.info');//获取用户信息
+
+});