PHPは迅速に微信の小さいプログラムの授権を実現します

8429 ワード

ウィジェット開発は敏捷なソフトウェア開発モデルにこだわっており、微信ウィジェットとしてライセンスも複数のプロジェクトが蓄積されているので、コードを貼って、必要な友达に持ってきてすぐに使うようにしたい(もちろん、自分のウィジェットappidと鍵を修正する必要があることが前提です).
  • フロントエンドはwxを呼び出す.login()はcode値を取得します.
  • のフロントエンドはwxを呼び出す.getUserInfoは、iv、rawData、signature、encryptedDataなどの暗号化データを取得し、サービス側に渡す.
  • サーバはcodeを介してapi-authを要求する.code 2 Session,换回session_keyとopenid(ユーザのopenidがデータベースに存在しないか否かを判断してコミットし、フロントエンドにtoken(md 5ユーザid+タイムスタンプ)を送信する).
  • フロントエンドがサーバにメッセージを送信するときにtoken、すなわちサービス側インタフェースを要求するとき、tokenはパラメータとして他のパラメータとともに伝達される.
  • サーバはtokenを検証します(ユーザーデータテーブルにtokenフィールドを作成する必要があります(char 64).
  • appid&secret=$this->secret&js_code=$code&grant_type=authorization_code";
            //dump($url);
            $result = $this->getJson($url);
            if(isset($result['errcode'])){
                return \Response::echoError($result['errmsg']);
            }else{
                $session_key = $result['session_key'];
                $signature = $data['signature'];
                $raw = trim($data['rawData']);
                $encryptedData = $data['encryptedData'];
                $iv = $data['iv'];
                if(empty($signature) || empty($raw) || empty($encryptedData) || empty($iv)){
                    return \Response::echoError('     !');
                }
                $signature2 = sha1($raw.$session_key);
                if($signature != $signature2){
                    return \Response::echoError('    !');
                }
                $user_info = new wxBizDataCrypt($this->appid, $session_key);
                $errCode = $user_info->decryptData($encryptedData, $iv, $info);
                if($errCode != 0){
                    return \Response::echoError($errCode);
                }
                $info = json_decode($info,true);
                //                 openid,         ,    token
                $res = Model('User')
                    ->where([
                        'openId' => $info['openId']
                    ])
                    ->first();
                Model()->startTrans();
                if(!$res){
                    $result_res = Model('User')
                        ->create([
                            'nickname' => $info['nickName'],
                            'openid' => $info['openId'],
                            'headimgurl' => $info['avatarUrl'],
                            'gender' => $info['gender'],
                            'create_time' => date('Y-m-d H:i:s'),
                            'update_at' => date('Y-m-d H:i:s'),
                        ]);
                    if(!$result_res){
                        Model()->rollback();
                        return \Response::echoError('    !');
                    }else{
                        //          (  id )   
                        $loginLogic = new LoginLogic();
                        $loginLogic->save($result_res->id);
                        //   token
                        $token = md5($result.time());
                        Model('User')
                            ->where([
                                'id' => $result_res->id
                            ])
                            ->update([
                                'token' => $token
                            ]);
                        Model()->commit();
                        return \Response::echoSuccess($token, '    !');
                    }
                }else{
                    //   token
                    $token = md5($res['id'].time());
                    Model('User')
                        ->where([
                            'id' => $res->id
                        ])
                        ->update([
                            'token' => $token
                        ]);
                    Model()->commit();
                    return \Response::echoSuccess($token, '     !');
                }
            }
        }
    
        /**
         * curl get  
         * @param $url
         * @return mixed
         */
        function getJson($url){
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);
            curl_close($ch);
            return json_decode($output, true);
        }
    }
    

    マイクロ信ウィジェットユーザに対するデータ暗号化の復号例コード
    sessionKey = $sessionKey;
    	$this->appid = $appid;
        }
    
        /**
         *         ,          .
         * @param $encryptedData string        
         * @param $iv string               
         * @param $data string       
         *
         * @return int   0,          
         */
        public function decryptData( $encryptedData, $iv, &$data )
        {
    	if (strlen($this->sessionKey) != 24) {
    	    return ErrorCode::$IllegalAesKey;
    	}
    	$aesKey=base64_decode($this->sessionKey);
    	if (strlen($iv) != 24) {
    	    return ErrorCode::$IllegalIv;
    	}
    	$aesIV=base64_decode($iv);
    	$aesCipher=base64_decode($encryptedData);
    	$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
    	$dataObj=json_decode( $result );
    	if( $dataObj  == NULL )
    	{
    	    return ErrorCode::$IllegalBuffer;
    	}
    	if( $dataObj->watermark->appid != $this->appid )
    	{
    	    return ErrorCode::$IllegalBuffer;
    	}
    	$data = $result;
    	    return ErrorCode::$OK;
    	}
        }
    }
    

    現在のユーザ登録情報(ユーザid等)をキャッシュのLoginLogicに保存する.php
    class LoginLogic{
        /**
         *          
         * @param $user_id
         */
        function save($user_id){
            //     
            $info = Model('User')
                ->where([
                    'id' => $user_id
                ])
                ->first([
                    'id',
                    'openid',
                ]);
            if(empty($info)){
                return '       ';
            }
            session([
                'user_id' => $info->id,
                'openid' => $info->openid,
                'is_login' => true
            ]);
            return true;
        }
    }

    次に、ライセンスを使用して、共通のコントローラを作成します.微信のライセンスが必要な情報は、この共通のコントローラを通過する必要があります.例えばCommonControllerを作成します.php
    //           
    class CommonController
    {
        //     openid
        public function __construct(){
        //          
        $data = \Request::getData([
            'token',
        ]);
        if(empty($data['token'])){
    	return \Response::echoError('     token  !');
        }
        $res = Model('User')
            ->where([
                'token' => $data['token']
            ])
            ->select('id')
            ->first();
        if(!$res){
            return \Response::echoError('    !');
        }else{
            //          
            $loginLogic = new LoginLogic();
            $loginLogic->save($result_res->id);
        }
    }