小程序授权

<?php
namespace app\index\controller;

use \think\Controller;
use \think\Db;
class Index extends Controller
{
    public function index()
    {
      return $this->fetch();
    }

    public function testGet(){
        $get = $this->request->get();
        return json($get);
    }
    public function testPost(){
        $post = $this->request->post();
        return json($post);
    }
    //获取文章详情
    public function listarticle(){
        $post = $this->request->post();
        if($post["type"]){
             $data = Db::name("article")->where("type",$post["type"])->field("id,title,content")->find();
             if($data){
                 return_msg(200,"获取成功",$data);
             }else{
                 return_msg(200,"没有此数据");
             }
        }else{
            return_error("参数有误");
        }
    }
    
    
    
    
    
    
    
    
    
    //授权登录
    
    
     public function actionAuthwr(){
        //$get = $_REQUEST;
        $post = $this->request->post();
         $param['appid'] = 'wx1bd4a3d6b0f91a52';    //小程序id
         $param['secret'] = '5b7a7b78cc48ff8cb12a2516172ee693';    //小程序密钥
         $param['js_code'] = $this->define_str_replace($post['code']);
         $param['grant_type'] = 'authorization_code';
         $aid = $param['appid'];
         $st = $param['secret'];
         $ce = $param['js_code'];
         $ty = $param['grant_type'];
         $http_key =$this->httpGet("https://api.weixin.qq.com/sns/jscode2session?"."appid=".$aid."&secret=".$st."&js_code=".$ce."&grant_type=".$ty);
        $session_key = json_decode($http_key,true);
            $fp = fopen('sessionkey.txt', 'a+b');
            fwrite($fp, var_export($session_key, true));
            fclose($fp);
            
            
        if (!empty($session_key['session_key'])) {
            $decodeData    = $this->decryptData($param['appid'],$session_key['session_key'],$post["encryptedData"],$post["iv"]);
            $zh_data = json_decode($decodeData, true);

            if($zh_data == "-41003"){
                return_error("授权失败"); 
            }
        //    $is_member = Member::find()->where(array("openid"=>$session_key["openid"]))->asArray()->one();
            
            $is_member = Db::name("member")->where(array("openid"=>$session_key["openid"]))->find();
            if($is_member){
                $token = $this->generate_token($session_key["openid"]);
                $token_extime = strtotime("+1 month");
               // $result = Member::updateAll(["nickname"=>$zh_data["nickName"],"token"=>$token,"token_extime"=>$token_extime,"avatar_path"=>$zh_data["avatarUrl"]],["id"=>$is_member["id"]]);
                $result = Db::name("member")->where(["id"=>$is_member["id"]])->update(["nickname"=>$zh_data["nickName"],"token"=>$token,"token_extime"=>$token_extime,"avatar_path"=>$zh_data["avatarUrl"]]);
                
                if($result){
                $return["nickname"] = $zh_data["nickName"];
                $return["uid"] = $is_member["id"];
                $return["openid"] =  $session_key["openid"];
                $return["avatar_path"] = $zh_data["avatarUrl"];
                $return["token"] = $token;
                     return_msg("200","授权成功",$return);
                }else{
                     return_error("授权失败1"); 
                }
            }else{
                //则新增
                
                $Member['openid'] = $session_key["openid"];
                $Member['nickname'] = $zh_data["nickName"];
                // $Member->p_id = $get["incode"];
                //$Member->name = $zh_data["nickName"];
                $Member['avatar_path'] = $zh_data["avatarUrl"];
                $Member['login_time'] = time();
                //$Member->addtime = date('Y-m-d H:i:s');
                $Member['token'] = $this->generate_token($session_key["openid"]);
                $Member['token_extime'] = strtotime("+1 month");
                
                $id = Db::name("member")->insertGetId($Member);
                if($id){
                    $return["nickname"] = $zh_data["nickName"];
                    $return["uid"] = $id;
                    $return["openid"] =  $zh_data["openId"];
                    $return["avatar_path"] = $zh_data["avatarUrl"];
                    $return["token"] = $Member['token'];
                    return_msg("200","授权成功",$return);
                }else{
                    return_error("授权失败2"); 
                }
            }
            
        }else{
            return_error("授权失败3");
        }
    }
    public function generate_token($phone){
        $encryption_token = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'.time().$phone;
        return md5($encryption_token);
    }
    public function define_str_replace($data)
    {
        return str_replace(' ','+',$data);
    }
    public function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
  }
  public function decryptData( $appid , $sessionKey, $encryptedData, $iv ){
        $OK = 0;
        $IllegalAesKey = -41001;
        $IllegalIv = -41002;
        $IllegalBuffer = -41003;
        $DecodeBase64Error = -41004;
     
        if (strlen($sessionKey) != 24) {
            return $IllegalAesKey;
                                          $fp = fopen('d69.txt', 'a+b');
                fwrite($fp, var_export($IllegalAesKey, true));
                fclose($fp);
        }
        $aesKey=base64_decode($sessionKey);
     
        if (strlen($iv) != 24) {
            
                  $fp = fopen('d69.txt', 'a+b');
                fwrite($fp, var_export($IllegalIv, true));
                fclose($fp);
            
            return $IllegalIv;
        }
        $aesIV=base64_decode($iv);
     
        $aesCipher=base64_decode($encryptedData);
    //$aesCipher=$encryptedData;
        $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        $dataObj=json_decode( $result );
                     $fp = fopen('d691.txt', 'a+b');
                fwrite($fp, var_export($result, true));
                fclose($fp);
                
                                     $fp = fopen('d693.txt', 'a+b');
                fwrite($fp, var_export($dataObj, true));
                fclose($fp);
        
        if( $dataObj  == NULL )
        {
             $fp = fopen('d69.txt', 'a+b');
                fwrite($fp, var_export($IllegalBuffer, true));
                fclose($fp);
            return $IllegalBuffer;
        }
        if( $dataObj->watermark->appid != $appid )
        {
                                                     $fp = fopen('d69.txt', 'a+b');
                fwrite($fp, var_export($DecodeBase64Error, true));
                fclose($fp);
            return $DecodeBase64Error;
        }
                $fp = fopen('d69.txt', 'a+b');
                fwrite($fp, var_export($result, true));
                fclose($fp);
        $data = json_decode($result,true);
     
        return $result;
    }
    // 获取openid和access_token
    public function sq(){
        header("Content-type:text/html;charset=utf-8");
        $code = input('code');
        if(empty($code)){
            return_error('获取失败,code不存在,请联系管理员');
        }
        $appid = 'wx1bd4a3d6b0f91a52';//小程序的appid
        $appSecret = '5b7a7b78cc48ff8cb12a2516172ee693';// 小程序的$appSecret
        $wxUrl = 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code';
        $getUrl = sprintf($wxUrl, $appid, $appSecret, $code);//把appid,appsecret,code拼接到url里
        //发起请求
        $getopenid = file_get_contents($getUrl);
         
        $getopenid_arr = json_decode($getopenid, true);
        
        return_msg(200,'获取成功',$getopenid_arr);
    }
    
    
    
    //授权用户手机号
    public function wxtel()
    {
 
        $code = input('post.code');
        $encryptedData =input('post.encryptedData');
        $iv = input('post.iv');
  
        /**
         * 获取用户的openID和session_key
         */
        $appid='wx1bd4a3d6b0f91a52';
        $secret='5b7a7b78cc48ff8cb12a2516172ee693';
        $url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";
        $ch = curl_init();
        $timeout = 5;
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $contents = curl_exec($ch);
        curl_close($ch);
        $info = json_decode($contents,true);

        /**
         * 获取加密电话数据
         */
        $openid = $info['openid'];
        $sessionKey = $info['session_key'];
 
        $errCode = $this->decryptData2($appid,$sessionKey,$encryptedData, $iv, $data );
//        dump($data);die;
//        if ($errCode == 0) {

        $data = json_encode($data);
        $data = json_decode($data, true);
//        print_r($data);die;
        $a = Db::name('member')->where('openid',$openid)->where('mobile',$data['phoneNumber'])->find();
        if ($a){
            return_msg(200,'查询成功',$a['phone']);
        }
        $a = Db::name('member')->where('openid',$openid)->update(['mobile'=>$data['phoneNumber']]);
        if ($a){
            return_msg(200,'操作成功',$data['phoneNumber']);
        }else{
            return_error('操作失败');
        }
    }
    
    /**
     * 检验数据的真实性,并且获取解密后的明文.
     * @param $encryptedData string 加密的用户数据
     * @param $iv string 与用户数据一同返回的初始向量
     * @param $data string 解密后的原文
     *
     * @return int 成功0,失败返回对应的错误码
     */
    public function decryptData2( $appid,$sessionKey,$encryptedData, $iv, &$data )
    {
        if (strlen($sessionKey) != 24) {
            return -41001;
        }
        $aesKey=base64_decode($sessionKey);
    
    
        if (strlen($iv) != 24) {
            return -41002;
        }
        $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 -41003;
        }
        if( $dataObj->watermark->appid != $appid )
        {
            return -41004;
        }
        $data = $dataObj;
        return 0;
    }
 
 
}

 

posted @ 2022-05-03 13:27  yuancr  阅读(32)  评论(0编辑  收藏  举报