• 接入脚本interface.php实现代码


    承接上文的WeChatCallBack

        在WeChatCallBack类的成员变量中定义了各种消息都会有的字段,这些字段在init函数中赋值。同时也把解析到的XML对象作为这个类的成员变量$_postObject并在init中赋值,目的是在实现具体公众账号的业务逻辑时,具体的各类消息的特殊字段可以通过它来获取。

        process函数时实现具体公众账号的业务逻辑时需要重载的函数,默认的实现是返回一个“未实现”的错误提示。

      本文的重点是接入脚本,接入脚本是项目根目录的interface.php,其代码清单如下文所示:

      <?php

      require_once dirname(__FILE__) . '/common/GlobalFunctions.php';

      function checkSingnature()

      {

        $signature = $_GET["signature"];

        $timestamp = $_GET["timestamp"];

        $nonce = $_GET["nonce"];

        $token = WEIXIN_TOKEN;

        $tmpArr = array($token, $timestamp, $nonce);

        sort($tmpArr);

        $tmpStr = implode( $tmpArr );

        $tmpStr = shal( $tmpStr );

        if( $tmpStr == $signature ) {

          return true;

        } else {

          return false;

        }

      }

      if(checkSignature()) {

        if($_GET["echostr"]) {

          echo $_GET["echostr"];

          exit(0);

        }

      } else {

        // 恶意请求: 获取来源IP, 并写入日志

        $ip = getIp();

        interface_log(ERROR, EC_OTHER, 'malicious: ' . $ip);

        exit(0);

      }

      function getWeChatObj($toUserName) {

        if($toUserName == USERNAME_FINDFACE) {

          require_once dirname(__FILE__) . '/class/

          WeChatCallBackMeiri10futu.php' ;

          return new WeChatCallBackMeir10futu();

        }

        if($toUserName == USERNAME_MR)  {

          require_once dirname(__FILE__) . '/class/

          WeChatCallBackMeir10futu.php' ;

          return new WeChatCallBackMeir10futu();

        }

        if($toUserName == USERNAME_ES) {

          require_once dirname(__FILE__) . '/class/

          WeChatCallBackEchoServer.php' ;

          return new WeChatCallBackEchoServer();

        }

        require_once dirname(__FILE__) . '/class/WeChatCallBcak.php' ;

        return new WeChatCallBack();

      }

      function exitErrorInput() {

        echo 'error input!' ;

        interface_log(INFO, EC_OK, "***** interface request end ******") ;

        interface_log(INFO, EC_OK, "********************** ******") ;

        interface_log(INFO, EC_OK, "") ;

        exit( 0 );

      }

      $postStr = file_get_contents ( "php://input" );

      

      interface_log(INFO, EC_OK, "");

      interface_log(INFO, EC_OK, "*****************************");

      interface_log(INFO, EC_OK, "***** interface request start *****");

      interface_log(INFO, EC_OK, 'request: '  .  var_export($_GET, ture)) ;

      if (empty ( $postStr )) {

        interface_log ( ERROR, EC_OK, "error input!" );

        exitErrorInput();

      }

      // 获取参数

      $postObj = simplexml_load_string  ( $postStr,  'SimpleXMLElement',

      LIBXML_NOCDATA ) ;

      $toUserName = ( string ) trim ( $postObj->ToUserName ) ;

      if (! $toUserName) {

        interface_log ( ERROR, EC_OK, "error input!" ) ;

        exitErrorInput() ;

      } else {

        $wechatObj = getWeChatObj ( $ toUserName ) ;

      }

      retStr = $ wechatObj->process ();

      interface_log(INFO, EC_OK, "***** interface request end *****") ;

      interface_log(INFO, EC_OK, "****************************") ;

      interface_log(INFO, EC_OK, "");

      ?>

      Interface.php逻辑描述:

      1.使用checkSignature函数验证请求是否合法,在不合法的情况下,记录恶意的来源IP。

      2.获取POST数据,解析XML数据,根据ToUserName来决定是发往哪一个公众账号的消息,然后加载对应的文件,获得对应的对象(getWeChatObj函数)。

      3.调用对象的init函数初始化对象。

      4.调用对象的process函数处理公众账号逻辑,得到返回消息字符串。

      5.返回消息。

      获取来源IP函数:

      function getIp () 

      {

        if (isset($_SERVER)) {

            if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {

                $realip = $_SERVER["HTTP_X_FORWARDED_FOR"] ;

            } else if (isser($_SERVER["HTTP_CLIENT_IP"]))  {

                $realip = $_SERVER["HTTP_CLIENT_IP"] ;

            } else {

                $realip = $SERVER["REMOTE_ADDR"];

            }

        } else {

            if (getenv(""HTTP_X_FORWARDED_FOR")) {

                $realip = getenv("HTTP_X_FORWARDED_FOR") ;

            } else if (getenv("HTTP_CLIENT_IP")) {

                $realip = getenv("HTTP_CLIENT_IP") ;

            } else {

                $realip = getenv("REMOVE_ADDR") ;

            }

        }

        return $realip;

      }

    ___________over____________

  • 相关阅读:
    第一次冲刺(1)
    从一维数组扩展到二维数组求子数组的最大值
    电梯调度结对项目
    关于从一个整数数组中求得最大的子整数组和
    对于对英文文本文档进行分析,统计文本里面单词出现最多的10个单词
    【一些小常识】关于各操作系统拷贝文件后文件的创建修改时间变化
    windows系统搭建禅道系统(BUG管理工具)
    JAVA+SELENIUM+MAVEN+TESTNG框架(二)新建项目
    jmeter接口自动化部署jenkins教程
    提交测试流程和【开发提测申请模板】
  • 原文地址:https://www.cnblogs.com/iifranky7/p/3977127.html
Copyright © 2020-2023  润新知