• 基于PHP的微信公众平台开发(TOKEN验证,消息回复)


    微信公众平台开发 
    实现步骤: 
    第一步:填写服务器配置 
    登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

    同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。

    第二步:验证服务器地址的有效性 
    开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数: 
    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 
    timestamp 时间戳 
    nonce 随机数 
    echostr 随机字符串 
    开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。 
    加密/校验流程如下: 
    1. 将token、timestamp、nonce三个参数进行字典序排序 
    2. 将三个参数字符串拼接成一个字符串进行sha1加密 
    3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 
    验证代码:

    //获得参数 signature nonce token timestamp echostr
        $nonce     = $_GET['nonce'];
        $token     = 'imooc';
        $timestamp = $_GET['timestamp'];
        $echostr   = $_GET['echostr'];
        $signature = $_GET['signature'];
        //形成数组,然后按字典序排序
        $array = array();
        $array = array($nonce, $timestamp, $token);
        sort($array);
        //拼接成字符串,sha1加密 ,然后与signature进行校验
        $str = sha1( implode( $array ) );
        if( $str == $signature && $echostr ){
            //第一次接入weixin api接口的时候
            echo  $echostr;
            exit;
        }

    利用修改配置中的提交验证TOKEN是否验证成功!

    消息回复

    <?php
        //获得参数 signature nonce token timestamp echostr
        $nonce     = $_GET['nonce'];
        $token     = 'imooc';
        $timestamp = $_GET['timestamp'];
        $echostr   = $_GET['echostr'];
        $signature = $_GET['signature'];
        //形成数组,然后按字典序排序
        $array = array();
        $array = array($nonce, $timestamp, $token);
        sort($array);
        //拼接成字符串,sha1加密 ,然后与signature进行校验
        $str = sha1( implode( $array ) );
        if( $str == $signature && $echostr ){
            //第一次接入weixin api接口的时候
            echo  $echostr;
            exit;
        }else{
    
            //1.获取到微信推送过来post数据(xml格式)
            $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
            //2.处理消息类型,并设置回复类型和内容
            /*<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[FromUser]]></FromUserName>
    <CreateTime>123456789</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe]]></Event>
    </xml>*/
            $postObj = simplexml_load_string( $postArr );
            //$postObj->ToUserName = '';
            //$postObj->FromUserName = '';
            //$postObj->CreateTime = '';
            //$postObj->MsgType = '';
            //$postObj->Event = '';
            // gh_e79a177814ed
            //判断该数据包是否是订阅的事件推送
            if( strtolower( $postObj->MsgType) == 'event'){
                //如果是关注 subscribe 事件
                if( strtolower($postObj->Event == 'subscribe') ){
                    //回复用户消息(纯文本格式)
                    $toUser   = $postObj->FromUserName;
                    $fromUser = $postObj->ToUserName;
                    $time     = time();
                    $msgType  =  'text';
                    $content  = '欢迎关注我们的微信公众账号'.$postObj->FromUserName.'-'.$postObj->ToUserName;
                    $template = "<xml>
                                    <ToUserName><![CDATA[%s]]></ToUserName>
                                    <FromUserName><![CDATA[%s]]></FromUserName>
                                    <CreateTime>%s</CreateTime>
                                    <MsgType><![CDATA[%s]]></MsgType>
                                    <Content><![CDATA[%s]]></Content>
                                    </xml>";
                    $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
                    echo $info;
                    /*<xml>
                    <ToUserName><![CDATA[toUser]]></ToUserName>
                    <FromUserName><![CDATA[fromUser]]></FromUserName>
                    <CreateTime>12345678</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[你好]]></Content>
                    </xml>*/
    
    
                }
            }
    
        }

    转自:http://blog.csdn.net/helencoder/article/details/49513969

  • 相关阅读:
    jstl核心标签库
    乱码的解决
    eclipse 中 Servlet 模板代码(其实是代码提示模板)
    因为最近一直在和数据库打交道,所以做了几个小封装
    意外发现的大批量导入数据SqlBulkCopy类
    Http相关
    Tomcat相关
    对于反射中的invoke()方法的理解
    SqlCommandBuilder类是如何构建T-Sql语句
    模拟在内存中的数据库DataSet相关的类
  • 原文地址:https://www.cnblogs.com/zongsir/p/7827726.html
Copyright © 2020-2023  润新知