php微信第三方平台授权


一 在微信公众开放平台上申请帐号,然后创建一个第三方平台,没有什么可说的,按照提示来就行。

二 请详细阅读 公众号第三方平台的概要说明

三 开始进入开发测试阶段

1 获得 推送component_verify_ticket

public function indexAction(){
	$str = file_get_contents('php://input');
        $xml_tree = new DOMDocument();
        $xml_tree->loadXML($str); 
        $array_e = $xml_tree->getElementsByTagName('Encrypt');
        $encrypt = $array_e->item(0)->nodeValue;
        // 第三方收到公众号平台发送的消息
        $msg = '';
        // Wxbiz_Prpcrypt类参照 消息加密接入文档 ,官网已经提供
        $pc = new Wxbiz_Prpcrypt(COMPONET_KEY);// COMPONET_KEY第三方平台 公众号消息加解密Key
        $result = $pc->decrypt($encrypt, COMPONET_APPID);//COMPONET_APPID第三方平台AppID
        $xml_tree->loadXML($result[1]);
        $array_e = $xml_tree->getElementsByTagName('ComponentVerifyTicket');
        $ComponentVerifyTicket = $array_e->item(0)->nodeValue;
        if(!empty($ComponentVerifyTicket)){
            $db = new ZmtSetModel();//自己建立系统配置表 由于componentVerifyTicket是每10分钟自动获取一次
            $db->where(array('id'=>1))->update(array('componentVerifyTicket'=>$ComponentVerifyTicket));
        }
       echo('success');
       exit;
}

问题与解决1:微信平台提供的加密解密方式采用mcrypt,正常情况下php是有的,但是我的php版本问题,所以需要自己安装mcrypt扩展。安装扩展方法,请自行脑补!

问题与解决2component_verify_ticket  每10分钟获得一次,所以要保存到数据库或者文件中,我保存的在数据库中。

2 通过component_verify_ticket获得 componet_access_token

     public function getAccessToken(){
        $api_id = 1;
    	$config_db = new ZmtSetModel();
    	$config = $config_db->where(array('id'=>$api_id))->getRow();
        $updatetime = intval($config['updatetime']);
    	$ctime = time();
    	//第三方授权component_access_token有效期2小时,保存数据库中
    	//超过6000就重新获得
        if($ctime>($updatetime+6000) || empty($config['component_access_token'])){
        	$url = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
        	$data = '{
"component_appid":"'.COMPONET_APPID.'" ,//第三方平台appid
"component_appsecret": "'.COMPONET_APPSECRET.'", //第三方平台appsecret
"component_verify_ticket": "'.$config['componentVerifyTicket'].'" 
}';
            $access_token_info = $this->vpost($url, $data);
        	$access_token_info = json_decode($access_token_info);
        	if ($access_token_info->component_access_token == ''){
        		echo json_encode(array("msg"=>"ACCESS_TOKEN获取失败,请重新启用"));exit;
        	}else{
        	//保存component_access_token
                $config_db->where(array('id'=>$config['id']))->update(array('updatetime'=>$ctime,'component_access_token'=>$access_token_info->component_access_token));
        		return $access_token_info->access_token;
        	}
        }else{
            return $config['component_access_token'];
        }
    }   
    /**
     * 模拟提交数据函数
     * @param unknown $url
     * @param unknown $data
     * @return mixed
     */
    public function vpost($url,$data){
    	$curl = curl_init(); // 启动一个CURL会话
    	curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
    	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
    	curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); // 模拟用户使用的浏览器
    	// curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    	// curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    	curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
    	curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
    	curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    	curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    	$tmpInfo = curl_exec($curl); // 执行操作
    	if (curl_errno($curl)) {
    		echo 'Errno'.curl_error($curl);//捕抓异常
    	}
    	curl_close($curl); // 关闭CURL会话
    	return $tmpInfo; // 返回数据
    }

3 通过component_access_token获得临时预授权码pre_auth_code

    public function getPreAuthCode(){
            $token = $this->getAccessToken();
        	$url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=".$token;
        	$data = '{
"component_appid":"'.COMPONET_APPID.'" //第三方平台appid
}';
            $pre_auth_code = $this->vpost($url, $data);
        	$pre_auth_code = json_decode($pre_auth_code);
        	if ($pre_auth_code->pre_auth_code == ''){
        		echo json_encode(array("msg"=>"pre_auth_code获取失败,请重新启用"));exit;
        	}else{
       		   return $pre_auth_code->pre_auth_code;
        	}        
    }

4 第三方平台方appid、预授权码和回调URI获得授权连接

        $pre_auth_code = $this->getPreAuthCode();
        $url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=".COMPONET_APPID."&pre_auth_code=$pre_auth_code&redirect_uri=(您的网址)/myback";

问题与解决1:在页面授权的是,我遇到了提示错误

请确认授权入口页所在域名,与授权后回调页所在域名相同,并且,此两者都必须与申请第三方平台时填写的网页开发域名相同。授权入口页所在域名:空,授权后回调页所在域名:XXXXXXXXX

这是由于我直接在控制器就进行授权页面调整引起的,解决方法,将url赋值到页面,或者在页面进行ajax请求在进行页面跳转

问题与解决2:关于如何进行授权,其实说白了,就是调用上面的url就行了。

5 授权回调页面,通过code获得用户基本信息

    public function mybackAction(){
        $auth_code = $_GET['auth_code'];
        $token = $this->getAccessToken();
    	$url = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=".$token;
    	$data = '{
"component_appid":"'.COMPONET_APPID.'" ,
"authorization_code": "'.$auth_code.'"
}';
        $authorization_info = $this->vpost($url, $data);
    	$authorization_info = json_decode($authorization_info,true);
    	if (empty($authorization_info['authorization_info'])){
    		echo json_encode(array("msg"=>"获得公众号的授权信息,失败"));exit;
    	}else{
   		   $db = new ApiConfigModel();
           $info = $db->where(array('appid'=>$authorization_info['authorization_info']['authorizer_appid']))->getRow();
           $update['updatetime'] = time();
           $update['app_token'] = $authorization_info['authorization_info']['authorizer_access_token'];
           $update['userid'] = 8;
           $update['authorizer_refresh_token'] = $authorization_info['authorization_info']['authorizer_refresh_token'];
           if(empty($info)){
               $update['appid'] = $authorization_info['authorization_info']['authorizer_appid'];
               $db->insert($update);
           }else{
               $db->where(array('appid'=>$authorization_info['authorization_info']['authorizer_appid']))->update($update);
           }
    	}
        echo json_encode(array("msg"=>"sucess"));exit;      
    }

到此整个授权功能完成,下一周我会放送授权功能文件。包括其他获得

获取授权方的账户信息,获取授权方的选项设置信息,设置授权方的选项信息,推送取消授权通知




转载于:https://my.oschina.net/fandadong/blog/597327

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值