用过微擎、微赞、微动力等第三方公众号管理平台的人都知道,需要在这些平台中接入公众号(就是授权给第三方平台),为了了解探究微擎中扫码授权的机制,看了微信开放平台中的第三方平台开发,并做了实例,写下此文纪念我这一天遇到的坑!!!
公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务
第一个注意点:申请的时候有一个校验文件,需要放到根目录
第二个注意点:测试公众号 已授权的第三方平台不要超过5个,不然后续授权会出错,请看http://www.pc0359.cn/article/jiaocheng/68434.html
第三个注意点:消息校验Token和消息加解密Key 可以自己填写,不需要纠结去哪获取
第四个注意点:测试授权的时候一定要用填写的 授权测试公众号 ,用其他的公众号也会报错
本文适合小白、或初探第三方平台的人看,大神请不要吐槽~此文主要写授权流程
我们小小码农初看官方文档肯定会有懵逼的感觉,云里雾里,官方文档说的不太明白。
官网步骤一:要先获取什么pre_auth_code,但是获取pre_auth_code需要先获取component_access_token,而获取component_access_token需要先拿到component_verify_ticket…
这个关系略坑,按照代码顺序来说其实是如下这样的:
component_verify_ticket->component_access_token->pre_auth_code
然后才能引入用户进入授权页,即扫码将公众号的接口权限赋于第三方平台。
最坑的一点就是获取component_verify_ticket,需要用加密协议…这一点让我迷惑了好几个小时…还是通过百度之后才得以解决,获得了这个ticket。
我分了四个文件来写授权,以下是示例代码
官方的示例代码:https://wximg.gtimg.com/shake_tv/mpwiki/cryptoDemo.zip
1.第一个文件accept.php获取component_verify_ticket:(此文件需要和官方下载的php文件夹内的加解密文件放一起,微信服务器推送ticket的时候会生成ticket.log文件)
在此要感谢这篇文章:http://blog.csdn.net/heysteria/article/details/50041163
accept.php:
define('LOGPATH', dirname(__FILE__));
include_once "wxBizMsgCrypt.php";
//以下三个变量,自己去开放平台上管理中心根据实际情况填写。
$encodingAesKey = '自己填写的消息加解密Key ';
$token = '自己填写的消息校验Token';
$appId = '自己的appid';
$timeStamp = empty($_GET['timestamp']) ? "" : trim($_GET['timestamp']) ;
$nonce = empty($_GET['nonce']) ? "" : trim($_GET['nonce']) ;
$msg_sign = empty($_GET['msg_signature']) ? "" : trim($_GET['msg_signature']) ;
$encryptMsg = file_get_contents('php://input');
$pc = new WXBizMsgCrypt($token, $encodingAesKey, $appId);
$xml_tree = new DOMDocument();
$xml_tree->loadXML($encryptMsg);
$array_e = $xml_tree->getElementsByTagName('Encrypt');
$encrypt = $array_e->item(0)->nodeValue;
$format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>";
$from_xml = sprintf($format, $encrypt);
logResult('/form.log', $from_xml);
// 第三方收到公众号平台发送的消息
$msg = '';
$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);
if ($errCode == 0) {
//print("解密后: " . $msg . "\n");
$xml = new DOMDocument();
$xml->loadXML($msg);
$array_e = $xml->getElementsByTagName('ComponentVerifyTicket');
$component_verify_ticket = $array_e->item(0)->nodeValue;
file_put_contents(LOGPATH.'/ticket.log', $component_verify_ticket);
logResult('/msgmsg.log','解密后的component_verify_ticket是:'.$component_verify_ticket);
echo 'success';
} else {
logResult('/error.log','解密后失败:'.$errCode);
print($errCode . "\n");
}
function logResult($path,$data){
file_put_contents(LOGPATH.$path, '['.date('Y-m-d : h:i:sa',time()).']'.$data."\r\n",FILE_APPEND);
}
die();
2.通过第一步就可以获取到component_verify_ticket了(从ticket.log中拿到),然后获取component_access_token
/**
* http/https请求函数
*/
function https_request($url,$data=null){
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE);
if(!empty($data)){
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
}
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
$url = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
$data = array(
"component_appid"=>"你的appid",
"component_appsecret"=>"你的appsecret",
"component_verify_ticket"=>"SPt1dEQx-QFn5MAXQ4zVmM1w1QBRlKGSHHnd6ebMCzJx21A_0RPaUHCovYNJUR6z-iYM-1c_asp0m1zoheT99g"
);
$send_result = https_request($url, json_encode($data));
$send_result = json_decode($send_result,true);
var_dump($send_result);
3.通过上一步拿到component_access_token,换取pre_auth_code
$token = "6_36ssst_zdzZ8sxcBn6P_-OiyM-dOVfrgBf2kEG4PCJyMu0oiMACiRXGn_zhq13j1QuXWCdL3EdTdGJb4-MTJAFTcsedQkU4Ghi7pyS5410tElXsc9vhq5D18xHDgF2t2G93o8bL-l05xVHFHAXdAGAMFC";
$url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token={$token}";
$data = array(
"component_appid"=>"你的appid"
);
$send_result = https_request($url, json_encode($data));
$send_result = json_decode($send_result,true);
var_dump($send_result);
4.通过第三步就可以获取到pre_auth_code了,然后就能授权啦
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>授权测试页</title>
</head>
<body>
<a href="https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=wxd8f2bd0718eb0143&pre_auth_code=preauthcode@@@3RFasdaRgPvceKww4LvN4655IvvBXu7ZsqkMjb9VX7AP-0hsujUEMGO7k1yBlw3F&redirect_uri=http%3A%2F%2Fwww.10088.cn" id="authurl" style="display: inline;">
<img src="https://open.weixin.qq.com/zh_CN/htmledition/res/assets/res-design-download/icon_button3_1.png">
</a>
</body>
</html>
效果如下:
点击就可以授权啦!
授权失败记的看一下上面我说的注意点!!!