微信公众号授权---第三方平台(php) (转载)

  • 2022-03-14 08:36
  • by 刘管家
  • 4376
  • 0
  • 0

  

用过微擎、微赞、微动力等第三方公众号管理平台的人都知道,需要在这些平台中接入公众号(就是授权给第三方平台),为了了解探究微擎中扫码授权的机制,看了微信开放平台中的第三方平台开发,并做了实例,写下此文纪念我这一天遇到的坑!!!

公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务


第一个注意点:申请的时候有一个校验文件,需要放到根目录
这里写图片描述

第二个注意点:测试公众号 已授权的第三方平台不要超过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 = "";$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了,然后就能授权啦

<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>

效果如下:
这里写图片描述

点击就可以授权啦!

授权失败记的看一下上面我说的注意点!!!

注:本文来源:转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。


评论