一 在微信公众开放平台上申请帐号,然后创建一个第三方平台,没有什么可说的,按照提示来就行。
二 请详细阅读 公众号第三方平台的概要说明
三 开始进入开发测试阶段
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); // 自动设置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;
}
到此整个授权功能完成,下一周我会放送授权功能文件。包括其他获得