您的位置:首页 > 移动开发 > 微信开发

php微信第三方平台授权

2016-01-05 11:19 871 查看
一 在微信公众开放平台上申请帐号,然后创建一个第三方平台,没有什么可说的,按照提示来就行。二 请详细阅读 公众号第三方平台的概要说明三 开始进入开发测试阶段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扩展。安装扩展方法,请自行脑补!问题与解决2:component_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); // 自动设置Referercurl_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;&nbs3ff0p;          $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;}
到此整个授权功能完成,下一周我会放送授权功能文件。包括其他获得

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息