cqpCow 1 vuosi sitten
vanhempi
commit
5d80a93925

+ 95 - 0
app/Http/Controllers/Api/WeixinController.php

@@ -0,0 +1,95 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\Weixin\WeixinService;
+use App\Service\Weixin\WxEmployeeService;
+use Illuminate\Http\Request;
+
+class WeixinController extends BaseController
+{
+    //开发者密码:
+    /**
+     * 用于微信token验证,全部通用,前提token都为qingyao
+     * @param Request $request
+     * @return void
+     */
+    public function weixin(Request $request)
+    {
+        file_put_contents('1.txt',json_encode($request->all()));
+//        die('adsds');
+//        $data = json_decode('{"signature":"fe04bfbb92a1c073e9f0829d3c4e48e1b40403aa","echostr":"5841396639871246203","timestamp":"1695188315","nonce":"1459788183"}',true);
+        $data = $request->all();
+        $signature = $data["signature"];
+        $timestamp = $data["timestamp"];
+        $nonce = $data["nonce"];
+
+        $token = 'qingyao';
+        $tmpArr = array($token, $timestamp, $nonce);
+        sort($tmpArr, SORT_STRING);
+        $tmpStr = implode( $tmpArr );
+        $tmpStr = sha1( $tmpStr );
+//        var_dump($tmpStr);
+//        var_dump($signature);die;
+        if( $tmpStr == $signature ){
+            echo $data['echostr'];die;
+        }else{
+            die('fail');
+        }
+    }
+
+    public function setWebHook(Request $request){
+        $service = new WeixinService();
+        list($status,$msg) = $service->setWebHook($request->all());
+        return $this->json_return($status,$msg,'');
+    }
+
+    /**
+     * 重定向获取unionid
+     * @param Request $request
+     * @return void
+     */
+    public function getUnionid(Request $request){
+        $service = new WeixinService();
+        $res = $service->getUnionid($request->all());
+    }
+
+    /**
+     * 获取openid
+     * @param Request $request
+     * @return void
+     */
+    public function getOpenid(Request $request){
+        $service = new WeixinService();
+        list($status,$data) = $service->getOpenid($request->all());
+        if ($status) {
+            return $this->json_return(200, '', $data);
+        } else {
+            return $this->json_return(201, $data);
+        }
+    }
+
+    public function setUser(Request $request)
+    {
+        $service = new WxEmployeeService();
+        list($status, $data) = $service->setUser($request->all());
+
+        if ($status) {
+            return $this->json_return(200, '', $data);
+        } else {
+            return $this->json_return(201, $data);
+        }
+    }
+
+    public function login(Request $request)
+    {
+        $service = new WxEmployeeService();
+        list($status, $data) = $service->login($request->all());
+
+        if ($status) {
+            return $this->json_return(200, '', $data);
+        } else {
+            return $this->json_return(201, $data);
+        }
+    }
+}

+ 1 - 0
app/Http/Kernel.php

@@ -65,6 +65,7 @@ class Kernel extends HttpKernel
         'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
         'checkLogin' => \App\Http\Middleware\CheckLogin::class,
         'checkWx' => \App\Http\Middleware\CheckWx::class,
+        'checkWeixin' => \App\Http\Middleware\CheckWeinxin::class,
     ];
 
     /**

+ 39 - 0
app/Http/Middleware/CheckWeinxin.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Model\WxEmployeeOfficial;
+use App\Service\EmployeeService;
+use Closure;
+use Illuminate\Http\Request;
+
+class CheckWeinxin
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  Request  $request
+     * @param Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $token = $request->header('ciphertext');
+        if (!isset($token)){
+            return  response()->json(['code'=>401,'msg'=>'缺少openid','data'=>null]);
+        }
+
+        //校验openid是否绑定
+        $employee = new WxEmployeeOfficial();
+        $employee_id = $employee->where('openid',$token)->value('employee_id');
+        if ($employee_id < 0) return response()->json(['code'=>401,'msg'=>'用户信息错误!','data'=>null]);
+
+        //校验用户
+        $checkResult = EmployeeService::checkWxUser($employee_id);
+        list($state, $data) = $checkResult;
+        if(! $state) return response()->json(['code'=>401,'msg'=>$data,'data'=>null]);
+        $request->userData = $data;
+
+        return $next($request);
+    }
+}

+ 20 - 0
app/Model/WxEmployeeOfficial.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 人员管理
+ * Class Unit
+ * @package App\Models
+ */
+class WxEmployeeOfficial extends Model
+{
+    protected $table = "wx_employee_official"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const SPECIAL_ADMIN = 1;
+
+}

+ 10 - 0
app/Providers/RouteServiceProvider.php

@@ -47,6 +47,8 @@ class RouteServiceProvider extends ServiceProvider
         $this->mapWebRoutes();
 
         $this->mapWxRoutes();
+
+        $this->mapWeixinRoutes();
         //
     }
 
@@ -86,4 +88,12 @@ class RouteServiceProvider extends ServiceProvider
             ->namespace($this->namespace)
             ->group(base_path('routes/wx.php'));
     }
+
+    protected function mapWeixinRoutes()
+    {
+        Route::prefix('wxapi')
+            ->middleware('api')
+            ->namespace($this->namespace)
+            ->group(base_path('routes/weixin.php'));
+    }
 }

+ 132 - 0
app/Service/Weixin/WeixinService.php

@@ -0,0 +1,132 @@
+<?php
+
+namespace App\Service\Weixin;
+
+use App\Service\Service;
+use Illuminate\Support\Facades\Redis;
+
+class WeixinService extends Service
+{
+    const APPID = '';
+    const APPSECRET = '';
+    const ACCESS_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
+    const OPENID = '';
+    const TOKEN = '';
+    const KEY = 'weixin';
+
+    public function getToken(){
+        $token_key = self::KEY.'_'.'token';
+        $token = Redis::get($token_key);
+        if(! empty($token)){
+            $url = sprintf(self::ACCESS_URL,self::APPID,self::APPSECRET);
+            $res = $this->curlOpen($url);
+            $res = json_decode($res,true);
+            if(isset($res['errmsg'])) return [false,$res['errmsg']];
+            if(!isset($res['access_token'])) return [false,'request error'];
+            $token = $res['access_token'];
+            $expire_time = $res['expires_in']-300;
+            Redis::set($token_key,$token);
+            Redis::expire($token_key, $expire_time);
+            return [true,$token];
+        }
+        return [true,$token];
+    }
+
+    public function getOpenid($data){
+        $code = $data['code'];
+        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code';
+        $url = sprintf($url,self::APPID,self::APPSECRET,$code);
+        $res = $this->curlOpen($url);
+        $res = json_decode($res,true);
+        if(!isset($res['openid'])) return [false,$res['errmsg']??'request error'];
+        $openid = $res['openid'];
+        return [true,['openid' => $openid]];
+    }
+
+    public function setWebHook($data){
+//        file_put_contents('22.txt',json_encode($data));
+        $uri = isset($data['uri']) ? $data['uri'] : '';
+        $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
+        $param = isset($data['param']) ? $data['param'] : '';
+        $redirect_uri = urlencode('http://hdapi.qingyaokeji.com/wx/getUnionid?uri='.$uri.'&param='.$param);
+        $url = sprintf($url,self::APPID,$redirect_uri);
+        header("Location:".$url);exit;
+        echo 'ok';die;
+    }
+
+    public function getUnionid($data){
+        file_put_contents('22.txt',date('YmdHis').json_encode($data));
+//        echo $data['code'];
+
+        if(isset($data['code'])) {
+            list($status,$openid) = $this->getOpenid($data);
+            if(!$status) return [false,$openid];
+            $uri = $data['uri'];
+            $openid = $openid['openid'];
+            $param = isset($data['param']) ? $data['param'] : '';
+            $url = 'http://hd.qingyaokeji.com/#/wxGet?uri='.$uri.'&openid='.$openid.'&param='.$param;
+            header('Location:'.$url);exit();
+        }
+    }
+
+    public function sendTmpMsg($data){
+        //        $openid = 'okXNa69ggEX61KvHUhCq9PcGrPKI';
+        $data = [
+            'openid' => 'okXNa69ggEX61KvHUhCq9PcGrPKI',
+            'tempid' => 'qaD9NBasjTNKDBzIuinSpLDMy6zWbPtRb1HN8ZOjY-Y',
+            'reload_url' => '',
+            'first' => '工资发放',
+            'remark' => '请查收',
+            'detail' => [
+                'thing1' => '姓名',
+                'amount2' => '10',
+                'time3' => '2023-09-01',
+                'thing4' => '类型',
+            ]
+        ];
+        if(!isset($data['detail'])) return [false,'invalid detail'];
+        if(!isset($data['openid'])) return [false,'invalid openid'];
+        if(!isset($data['tempid'])) return [false,'invalid tempid'];
+        if(!isset($data['reload_url'])) return [false,'invalid reload_url'];
+        $templateID = $data['tempid'];
+        $reload_url = $data['reload_url'];
+        list($status,$token) = $this->getToken();
+        if(!$status) return [false,$token];
+        $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$token;
+        $post = '{
+           "touser":"'.$data['openid'].'",
+           "template_id":"'.$templateID.'",
+           "url":"'.$reload_url.'",
+           "data":{
+                   "first": {
+                       "value":"'.$data['first'].'",
+                       "color":"#173177"
+                   },
+                   %s
+                   "remark":{
+                       "value":"'.$data['remark'].'",
+                       "color":"#173177"
+                   }
+           }
+       }';
+        $content = "";
+        foreach ($data['detail'] as $k=>$v){
+
+            $content .= '"'.$k.'": {
+                       "value":"'.$v.'",
+                       "color":"#173177"
+                   },';
+        }
+        $post = sprintf($post,$content);
+//        var_dump($post);
+//        var_dump(json_decode($post));die;
+//        var_dump($url);
+//        var_dump(json_encode(json_decode($post)));
+        $res = $this->curlOpen($url,['post'=>$post]);
+        $res = json_decode($res,true);
+        if(isset($res['errcode'])&&$res['errcode'] != 0) return [false,$res['errmsg']];
+        if(isset($res['errcode'])&&$res['errcode'] === 0) return [true,''];
+        return [false,json_encode($res)];
+
+    }
+}

+ 73 - 0
app/Service/Weixin/WxEmployeeService.php

@@ -0,0 +1,73 @@
+<?php
+
+namespace App\Service\Weixin;
+
+use App\Model\Employee;
+use App\Model\WxEmployeeOfficial;
+use App\Service\Service;
+use App\Model\WxEmployee;
+use Illuminate\Support\Facades\Hash;
+
+class WxEmployeeService extends Service
+{
+    public function setUser($data){
+        $openid = $data['openid'];
+        $user = WxEmployeeOfficial::where('openid',$openid)->first();
+        if(empty($user)) {
+            $user = new WxEmployeeOfficial();
+            $user->openid = $openid;
+            $user->appid = WeixinService::APPID;
+            $user->save();
+            $state = 0;
+        }else{
+            $state = 1;
+            if(empty($user->employee_id)) $state = 0;
+        }
+
+        return [true,['openid'=>$openid, 'state'=>$state ]];
+    }
+
+    public function login($data,$openid){
+        $account = $data['account'];
+        $password = $data['password'];
+
+        list($status,$data) = $this->loginRule([
+            'account' => $account,
+            'password' => $password,
+        ]);
+        if(!$status) return [false,$data];
+
+        $user_id = $data['id'];
+        $user = WxEmployeeOfficial::where('openid',$openid)->first();
+        if(empty($user)) {
+            $bool = WxEmployeeOfficial::where('employee_id',$user_id)->exists();
+            if($bool) return [false,'该账号已经与其他微信用户绑定!'];
+
+            $user = new WxEmployeeOfficial();
+            $user->openid = $openid;
+            $user->appid = WeixinService::APPID;
+            $user->employee_id = $user_id;
+            $user->save();
+        }else{
+            if(! empty($user->employee_id) && $user->employee_id != $user_id) return [false,'该账号已经与其他微信用户绑定!'];
+        }
+
+        return [true, $data];
+    }
+
+    public function loginRule($data){
+        if($this->isEmpty($data,'account')) return [false,'账号不能为空!'];
+        if($this->isEmpty($data,'password')) return [false,'密码不存在!'];
+
+        $res = Employee::where('del_time',0)
+            ->where('number', $data['account'])
+            ->get()->toArray();
+        if(empty($res)) return [false,'账号不存在或已被删除!'];
+
+        $res = reset($res);
+        if($res['state'] == Employee::NOT_USE) return [false,'账号停用!'];
+        if(! Hash::check($data['password'], $res['password'])) return [false,'密码错误!'];
+
+        return [true, ['id'=>$res['id'], 'name'=>$res['emp_name'], 'account' => $res['number']]];
+    }
+}

+ 34 - 0
routes/weixin.php

@@ -0,0 +1,34 @@
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Web Routes
+|--------------------------------------------------------------------------
+|
+| Here is where you can register web routes for your application. These
+| routes are loaded by the RouteServiceProvider within a group which
+| contains the "web" middleware group. Now create something great!
+|
+*/
+
+Route::any('weixin', 'Api\WeixinController@weixin');
+Route::any('test', 'Api\WeixinController@test');
+Route::any('setWebHook', 'Api\WeixinController@setWebHook');
+Route::any('getUnionid', 'Api\WeixinController@getUnionid');
+
+Route::any('getOpenid', 'Api\WeixinController@getOpenid');
+Route::any('wxSetUser', 'Api\WeixinController@setUser');
+Route::any('wxLogin', 'Api\WeixinController@login');
+
+Route::group(['middleware'=> ['checkWeixin']],function ($route){
+    //菜单
+    $route->any('menuAdd', 'Api\WxSysMenuController@add');
+    $route->any('menuEdit', 'Api\WxSysMenuController@edit');
+    $route->any('menuDel', 'Api\WxSysMenuController@del');
+    $route->any('menuList', 'Api\WxSysMenuController@menuList');
+    $route->any('menuMove', 'Api\WxSysMenuController@menuMove');
+
+    //用户的工资
+    $route->any('departList', 'Api\WxSalaryCalController@departList');
+    $route->any('salaryCalDetail', 'Api\WxSalaryCalController@salaryCalDetail');
+});