微信开放平台 解密component_verify_ticket 交流 学习

微信开放平台 第三方平台 

授权流程技术说明 第一步

 


解密 微信推送的component_verify_ticket  推送的url 是

  这里填写的url 

他会在你url后面给你穿四个参数会以这样GET的形式传送到你的url所以你只需要GET接收就OK了

还会POST 传送XML数据这个需要你去接收 $encryptMst = file_get_contents('php://input') 这个就可以不要   担心接受不到 下面会有解释一些坑   

     

以上就是微信会每10分钟给你发来的数据 下面会有代码 

这里很重要 把字都看了 还有 代码里面的注释也很重要 仔细看一下

  现在来说明一下 你自己访问自己的URL 不会带这些参数所以 总是提示你解密失败 假如你有写日志 你仔细观察   每十分钟她就会有一次数据传过来 代码如果完整的话是会解密成功的 我自己在这坑里连续三天加班11点没弄   明白 估计是太迟钝 所以写下来和大家交流一下 避免有和我同样的同学困扰 有问题也可以和我交流             QQ1062549054 还有很多同学们要去自习看文档 文档他不会说的那么细 而且文档仅供参考 要多查资料

  代码里 你可以直接把解密后的component_verify_ticket 存到数据库 下面我自己集百家代码写的代码

<?php


define("TOKEN", "Lango");
require_once('wxBizMsgCrypt.php');


$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->index();
}else{
    $wechatObj->valid();
}


class wechatCallbackapiTest
{
    //验证签名
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $tmpArr = array(TOKEN, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);
        if($tmpStr == $signature)
        {
            echo $echoStr;
            exit;
        }
    }
    public function index()
    {
        //以下三个变量,自己去开放平台上管理中心根据实际情况填写。
        
        $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']);


        // 这里自己访问 是永远输出不了的 因为微信给你推送的时候才会带参数 
        /*echo $timeStamp."<br/>";
       
  echo $nonce."<br/>";
        echo $msg_sign."<br/>";
        exit();*/

// 这里是PDO 方式连接数据库
        $pdo = new PDO("mysql:host=localhost;dbname=db","XXXX","XXXX"); 
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  
        $pdo->exec('set names utf8');

        // 接受POST 传过来的数据
        $encryptMsg = file_get_contents("php://input");
        $this->logResult('log.log', 'XML SHUJU'.$encryptMsg."\n");
        $pc = new WXBizMsgCrypt($token, $encodingAesKey, $appId);
        //转换为simplexml对象
        //$xmlResult = simplexml_load_string($encryptMsg);
        //输出xml节点名称和值    
        //$encrypt = $xmlResult->Encrypt;
         
        //  这是提取XML 里面Encrypt 节点的内容 上面注释的 也是一种方式方式很多 都可以用
        $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);
        $this->logResult('log.log', $from_xml."\n\r");

        // 第三方收到公众号平台发送的消息         $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('log.log', $component_verify_ticket."\n\r");             $this->logResult('log.log','解密后component_verify_ticket:'.$component_verify_ticket."\n\r");            // 写到数据库             $sql = "insert into tickets(Ticket) value('$component_verify_ticket');";             $pdo->query($sql);             echo 'success';         } else          {             $this->logResult('log.log','解密后失败:'.$errCode."\n");             print("解密后失败:".$errCode . "<br/>");         }     }     // 日志     public function logResult($path,$data)     {         header("content-type:text/html;charset=utf-8");         file_put_contents($path, '['.date('Y-m-d : h:i:sa',time()).']'.$data."\n\r",FILE_APPEND);     }}