`

thinkphp 接口微信

    博客分类:
  • php
 
阅读更多

最近被逼着用PHP做微信,作为一个干了4年JAVA的人,各种不适应有木有,还好坚持下来,收货多多,今天写篇thinkphp接口的博客,首先必须要有个微信开发者账号,然后要有个域名映射到自己的公网服务器上。

1:在微信官网下载微信接口接触类,所以这就是做PHP的优势官网弄下来就可以用。

<?php

define("TOKEN", "weixin");


class Weixin
{
	public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
        	echo $echoStr;
        	//exit;
        }
    }

    public function responseMsg()
    {
		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      	//extract post data
		if (!empty($postStr)){
                
              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
                $textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							<Content><![CDATA[%s]]></Content>
							<FuncFlag>0</FuncFlag>
							</xml>";             
				if(!empty( $keyword ))
                {
              		$msgType = "text";
                	$contentStr = "Welcome to wechat world!";
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }
    }
		
	private function checkSignature()
	{
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];	
        		
		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
		sort($tmpArr, SORT_STRING);
		$tmpStr = implode( $tmpArr );
		$tmpStr = sha1( $tmpStr );
		
		if( $tmpStr == $signature ){
			return true;
		}else{
			return false;
		}
	}
}

?>

 将上面这个类放入LIB/ORG下面命名为Weixin.class.php.

2:新建个WeixinAction.class.php继承上面的基础类并且从写关注,取消关注等。

<?php
header("content-type:text/html;charset=utf-8");
class WeixinAction extends Action{
	
	public $wxurl ; 
	
	function __construct()   
    {   
		$this->wxurl = $_SERVER['SERVER_NAME'].__ROOT__ ;
	}

	public function wenben($fromUsername, $toUsername, $time, $contentStr)
	{
		//////文本链接的处理/ ///
		$str=$contentStr;
	    $reg = '/\shref=[\'\"]([^\'"]*)[\'"]/i';
		preg_match_all($reg , $str , $out_ary);//正则:得到href的地址
		$src_ary = $out_ary[1];
       if(!empty($src_ary))//存在
      {
      	$comment=$src_ary[0];
      	if(stristr($comment,$_SERVER['SERVER_NAME']))
      	{
      		if(stristr($comment,"?"))
      		{
      			$links=$comment."&key=".$fromUsername;
      			$contentStr= str_replace($comment,$links,$str);
      		}else
      		{
      			$links=$comment."?key=".$fromUsername;
      			$contentStr= str_replace($comment,$links,$str);
      		}
      	}
      }
		
      	//////文本链接的处理 END////
      
		     $textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							<Content><![CDATA[%s]]></Content>
							<FuncFlag>0</FuncFlag>
							</xml>";
              		$msgType = "text";
                	//$contentStr =$contentStr;
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
            	echo $resultStr;
	}
	public function tuwen($textTpl,$fromUsername, $toUsername, $time,$count)
	{
              		$msgType = "news";
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,$count);
            	echo $resultStr;
	}
	
	public function index(){
		import('Think.ORG.Weixin');// 导入微信类
		//traceHttp();
		$wechat = new Weixin();
		$wechat->valid();
		//$wechat->responseMsg();

		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
		if (!empty($postStr)){
			$key_word=M('keyword');

			$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
			$fromUsername = trim($postObj->FromUserName);//发送方帐号(一个OpenID)
			$toUsername = $postObj->ToUserName;//开发者微信号 
			$keyword = trim($postObj->Content);//用户发来的信息
			$RX_TYPE = trim($postObj->MsgType);//类型
			$EventKey=trim($postObj->EventKey);//事件KEY值
			$Event=$postObj->Event;//事件类型
			$time = time();
			
			if($fromUsername!='')
			{
			 	$user= M('user')->field('id,wechatid')->where("wechatid='".$fromUsername."'")->find();
			 	if($user)
			 	{
					$this->modFocus($fromUsername,1);
			 	}else 
			 	{
			 		$date=time();
        			$data['username']=$fromUsername;//用户名
        			$data['wechatid']=$fromUsername;//微信id
        			$data['reg_time']=$date;
        			$data['last_time']=$date;
        			//$userid= M('user')->add($data);
        			$data['password']=md5($fromUsername);
        			$userid= M('user')->add($data);
        			
			 	}
			}
			
			
			
			if($RX_TYPE=='event')
			{
			
			//**自定义点击事件**//
			if($Event=='CLICK')
			{
//这里我是点击菜单菜单没有写链接返回一个图文,点击进入我的微网,主要用于免登陆
				if($EventKey!='')
				{
					 $where=array('keyword'=>$EventKey);
					 $custom_key= M('custom_menu')->where($where)->find();
					$key_list= $key_word->where("kyword='".$custom_key['keyword']."'")->find();
					//$key_list= $key_word->where("kyword='".$EventKey."'")->find();
					if(is_array($key_list))
					{
						if($key_list['type']==1)//文本
						{
							$this->wenben($fromUsername, $toUsername, $time,$key_list['kecontent']);
						}else //图文
						{
							$titles                   = unserialize($key_list['titles']);
							$imageinfo                = unserialize($key_list['imageinfo']);
							$linkinfo                 = unserialize($key_list['linkinfo']);

							$textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							 <ArticleCount>%s</ArticleCount> 
                            <Articles>";
							for($i=0;$i<count($titles);$i++)
							{
								if(stristr($linkinfo[$i],$_SERVER['SERVER_NAME']))
								{
									if(stristr($linkinfo[$i],"?"))
									{
										$links=$linkinfo[$i]."&key=".$fromUsername;
									}else
									{
										$links=$linkinfo[$i]."?key=".$fromUsername;
									}
								}else{
									$links=$linkinfo[$i];
								}
								
								if(stristr($imageinfo[$i],$_SERVER['SERVER_NAME']))
								{
								$images=$imageinfo[$i];
								}else
								{
								$images="http://".$_SERVER['SERVER_NAME'].__ROOT__.'/'.$imageinfo[$i];
								}
								
								
								$textTpl.= " <item>
                           <Title><![CDATA[".$titles[$i]."]]></Title> 
                           <Description><![CDATA[".$titles[$i]."]]></Description>
                          <PicUrl><![CDATA[".$images."]]></PicUrl>
                           <Url><![CDATA[".$links."]]></Url>
                           </item>";
						 /*  $textTpl.= " <item>
                           <Title><![CDATA[".$titles[$i]."]]></Title> 
                           <Description><![CDATA[".$titles[$i]."]]></Description>
                          <PicUrl><![CDATA[http://".$_SERVER['SERVER_NAME'].__ROOT__.'/'.$imageinfo[$i]."]]></PicUrl>
                           <Url><![CDATA[".$links."]]></Url>
                           </item>";*/
							}
							$textTpl.= "</Articles>
                           <FuncFlag>0</FuncFlag>
                           </xml> 
							";
							$this->tuwen($textTpl,$fromUsername, $toUsername, $time,count($titles));
						}

					}

				}
			}
 				if($Event=='unsubscribe')
 				{
 					$this->modFocus($fromUsername,0);
 				}
				
				if($Event=='subscribe')
				{
// 					$this->debugLog("关注","gz");
					$this->modFocus($fromUsername,1,1);
					$key_list= $key_word->where("isfollow=1")->find();
					if(is_array($key_list))//关注时回复
					{
// 						while(list($key,$val)= each($key_list)) {
// 							$this->debugLog($key."~".$val,"$key_list");
// 						}

// 						for ($i= 0;$i< count($key_list); $i++){
// 							$str= $key_list[$i];
// 							$this->debugLog($str,"key_list");
// 						}
// 							$this->debugLog($key_list['type'],"key_list");
						
						if($key_list['type']==1)//文本
						{
							$this->wenben($fromUsername, $toUsername, $time,$key_list['kecontent']);
						}else //图文
						{

							$titles                   = unserialize($key_list['titles']);
							$imageinfo                = unserialize($key_list['imageinfo']);
							$linkinfo                 = unserialize($key_list['linkinfo']);

							$textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							 <ArticleCount>%s</ArticleCount> 
                            <Articles>";
							for($i=0;$i<count($titles);$i++)
							{
								if(stristr($linkinfo[$i],$_SERVER['SERVER_NAME']))
								{
									if(stristr($linkinfo[$i],"?"))
									{
										$links=$linkinfo[$i]."&key=".$fromUsername;
									}else
									{
										$links=$linkinfo[$i]."?key=".$fromUsername;
									}
								}else{
									$links=$linkinfo[$i];
								}
                            if(stristr($imageinfo[$i],$_SERVER['SERVER_NAME']))
								{
								$images=$imageinfo[$i];
								}else
								{
								$images="http://".$_SERVER['SERVER_NAME'].__ROOT__.'/'.$imageinfo[$i];
								}
								
								
								$textTpl.= " <item>
                           <Title><![CDATA[".$titles[$i]."]]></Title> 
                           <Description><![CDATA[".$titles[$i]."]]></Description>
                          <PicUrl><![CDATA[".$images."]]></PicUrl>
                           <Url><![CDATA[".$links."]]></Url>
                           </item>";
							}
							$textTpl.= "</Articles>
                           <FuncFlag>0</FuncFlag>
                           </xml> 
							";
							$this->tuwen($textTpl,$fromUsername, $toUsername, $time,count($titles));
						}
					}
				}
			}
				
			//关键字自动回复
			if(!empty($keyword))
			{
				$key_list= $key_word->where("kyword='".$keyword."'")->find();
				if(is_array($key_list))
				{
					if($key_list['type']==1)//文本
					{
						$this->wenben($fromUsername, $toUsername, $time,$key_list['kecontent']);
					}else //图文
					{
							$titles                   = unserialize($key_list['titles']);
							$imageinfo                = unserialize($key_list['imageinfo']);
							$linkinfo                 = unserialize($key_list['linkinfo']);
						
                    $textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							 <ArticleCount>%s</ArticleCount> 
                            <Articles>";
                    for($i=0;$i<count($titles);$i++)
                    {
                    	if(stristr($linkinfo[$i],$_SERVER['SERVER_NAME']))
                    	{
                    		if(stristr($linkinfo[$i],"?"))
                    		{
                    			$links=$linkinfo[$i]."&key=".$fromUsername;
                    		}else
                    		{
                    			$links=$linkinfo[$i]."?key=".$fromUsername;
                    		}
                    	}else{
                    		$links=$linkinfo[$i];
                    	}
                    	   if(stristr($imageinfo[$i],$_SERVER['SERVER_NAME']))
								{
								$images=$imageinfo[$i];
								}else
								{
								$images="http://".$_SERVER['SERVER_NAME'].__ROOT__.'/'.$imageinfo[$i];
								}
								
								
								$textTpl.= " <item>
                           <Title><![CDATA[".$titles[$i]."]]></Title> 
                           <Description><![CDATA[".$titles[$i]."]]></Description>
                          <PicUrl><![CDATA[".$images."]]></PicUrl>
                           <Url><![CDATA[".$links."]]></Url>
                           </item>";
                    }
                          $textTpl.= "</Articles>
                           <FuncFlag>0</FuncFlag>
                           </xml> 
							";
                    $this->tuwen($textTpl,$fromUsername, $toUsername, $time,count($titles));
					}

				}else //自动回复
				{
					$key_list= $key_word->where("ismess=1")->find();
					if(is_array($key_list))//是否存在
					{
						if($key_list['type']==1)//文本
						{
							$this->wenben($fromUsername, $toUsername, $time, $key_list['kecontent']);
						}else //图文
						{
							$titles                   = unserialize($key_list['titles']);
							$imageinfo                = unserialize($key_list['imageinfo']);
							$linkinfo                 = unserialize($key_list['linkinfo']);

							$textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							 <ArticleCount>%s</ArticleCount> 
                            <Articles>";
                    for($i=0;$i<count($titles);$i++)
                    {
                    	if(stristr($linkinfo[$i],$_SERVER['SERVER_NAME']))
                    	{
                    		if(stristr($linkinfo[$i],"?"))
                    		{
                    			$links=$linkinfo[$i]."&key=".$fromUsername;
                    		}else
                    		{
                    			$links=$linkinfo[$i]."?key=".$fromUsername;
                    		}
                    	}else{
                    		$links=$linkinfo[$i];
                    	}
                    	
                    	   if(stristr($imageinfo[$i],$_SERVER['SERVER_NAME']))
								{
								$images=$imageinfo[$i];
								}else
								{
								$images="http://".$_SERVER['SERVER_NAME'].__ROOT__.'/'.$imageinfo[$i];
								}
								
								
								$textTpl.= " <item>
                           <Title><![CDATA[".$titles[$i]."]]></Title> 
                           <Description><![CDATA[".$titles[$i]."]]></Description>
                          <PicUrl><![CDATA[".$images."]]></PicUrl>
                           <Url><![CDATA[".$links."]]></Url>
                           </item>";
                    }
                          $textTpl.= "</Articles>
                           <FuncFlag>0</FuncFlag>
                           </xml> 
							";
                    $this->tuwen($textTpl,$fromUsername, $toUsername, $time,count($titles));
						}
					}else
					{

					}
				}


			}else{
				echo "Input something...";
			}

		}else {
			echo "";
			exit;
		}

	}

	 
	
    
}

 上面就是封装的一个类 ,注释也写的很明白了。看不懂的在问,

3.下面我贴出我的微信菜单数据库和微信图文数据库

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for weixin_custom_menu
-- ----------------------------
DROP TABLE IF EXISTS `weixin_custom_menu`;
CREATE TABLE `weixin_custom_menu` (
  `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `tags` varchar(50) NOT NULL,
  `pid` smallint(4) unsigned NOT NULL,
  `spid` varchar(50) NOT NULL,
  `fcolor` varchar(10) NOT NULL,
  `remark` text NOT NULL,
  `add_time` int(10) NOT NULL,
  `items` int(10) unsigned NOT NULL DEFAULT '0',
  `likes` int(10) NOT NULL,
  `type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0:商品分类 1:标签分类',
  `ordid` tinyint(3) unsigned NOT NULL DEFAULT '255',
  `status` tinyint(1) NOT NULL,
  `is_index` tinyint(1) NOT NULL DEFAULT '0',
  `is_default` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `keyword` varchar(255) DEFAULT NULL COMMENT '关键词',
  `key` varchar(255) DEFAULT NULL COMMENT 'key值',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for weixin_keyword
-- ----------------------------
DROP TABLE IF EXISTS `weixin_keyword`;
CREATE TABLE `weixin_keyword` (
  `kid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `kename` varchar(300) DEFAULT NULL,
  `kecontent` varchar(500) DEFAULT NULL,
  `type` tinyint(1) NOT NULL COMMENT '1:文本 2:多图文3:单图文',
  `kyword` varchar(255) DEFAULT NULL,
  `titles` varchar(1000) DEFAULT NULL,
  `imageinfo` varchar(1000) DEFAULT NULL,
  `linkinfo` varchar(1000) DEFAULT NULL,
  `ismess` tinyint(1) DEFAULT NULL,
  `isfollow` tinyint(1) DEFAULT NULL,
  `iskey` tinyint(1) DEFAULT NULL,
  `ispush` tinyint(1) DEFAULT NULL,
  `content` text,
  PRIMARY KEY (`kid`)
) ENGINE=MyISAM AUTO_INCREMENT=109 DEFAULT CHARSET=utf8;

 

上面的titles imageinfo linkinfo存储的时候要注意下前台页面传入后台是传的是array,然后序列化一下存入数据库,主要是图文的时候用到,标题,图片链接,点击图片跳转链接。

今天先到这,下次发群发推送的代码。

分享到:
评论

相关推荐

    thinkphp的微信接口类

    thinkphp的微信接口类,很简单。从网上下来的。

    ThinkPHP5.0.19微信订餐点餐完整小程序独立商用版

    《ThinkPHP5.0.19微信订餐点餐完整小程序独立商用版》是一个基于ThinkPHP5.0.19框架开发的微信小程序项目,它提供了全面的餐饮订餐服务功能,适合商业运营。这个项目不仅可以帮助开发者了解和掌握ThinkPHP5.0版本的...

    基于thinkphp3.2.3微信授权登录及分享至好友,朋友圈

    在本文中,我们将深入探讨如何在ThinkPHP 3.2.3框架下实现微信授权登录以及分享至微信好友和朋友圈的功能。这对于Android和iOS应用程序的开发者来说尤其重要,因为微信是中国乃至全球范围内广泛使用的社交平台。 ...

    基于thinkphp3.2.3微信扫码登录

    综上所述,基于ThinkPHP 3.2.3实现微信扫码登录涉及到了PHP框架的使用、OAuth 2.0授权协议的理解以及微信开放平台的接口调用。这个过程虽然涉及多个步骤,但得益于ThinkPHP的便利性,实际操作并不复杂。通过学习和...

    Thinkphp内核微信拼团购物商城小程序源码

    【Thinkphp内核微信拼团购物商城小程序源码】是一个基于Thinkphp框架开发的电子商务解决方案,专门针对微信小程序平台设计。这个源码集成了微信支付功能,为用户提供了一种便捷的在线购物体验。Thinkphp是一个广泛...

    支持thinkphp5微信登陆授权插件

    总的来说,ThinkPHP5的微信登录授权插件为开发者提供了便利,使得集成微信登录变得简单高效。通过理解OAuth2.0授权流程和微信开放平台的工作方式,开发者可以更好地利用此插件,提升用户体验,同时确保应用的安全性...

    后端常用开发类库-thinkphp3.2.3微信扫码支付

    在集成这个功能时,开发者需要熟悉微信支付的API接口以及ThinkPHP的MVC(Model-View-Controller)架构。 1. **微信支付API接口**:首先,你需要注册成为微信支付商户,并获取到商户号、API密钥、AppID等关键参数。...

    基于ThinkPHP+微信小程序的校园社团云平台的设计与实现.docx

    ### 基于ThinkPHP+微信小程序的校园社团云平台的设计与实现 #### 一、项目背景及意义 随着互联网技术的快速发展,越来越多的传统活动和服务正在向线上迁移,特别是对于高校社团活动而言,如何利用互联网技术提高...

    thinkphp对接微信模板消息

    将控制器直接放在Controller目录下,直接调用就可以了

    thinkphp 6对接微信服务商demo

    标题中的"thinkphp 6对接微信服务商demo"指的是使用ThinkPHP 6框架开发的一个示例项目,目的是为了演示如何将一个Web应用与微信服务商的接口进行整合,实现特定的支付和财务管理功能。ThinkPHP是中国非常流行的一个...

    thinkphp3.2 微信小程序商城源码 带后台

    【标题】"thinkphp3.2 微信小程序商城源码 带后台"涉及到的主要知识点包括微信小程序开发、ThinkPHP3.2框架的应用以及商城系统的构建。这是一套完整的解决方案,提供了从前端到后端的全套源码,旨在帮助开发者快速...

    Thinkphp内核 微信大灌篮游戏源码 微信投篮源码下载 免公众号+个人免签支付接口

    适用范围: Thinkphp内核 微信大灌篮游戏源码 微信投篮源码下载 免公众号+个人免签支付接口 运行环境: php+mysql 源码详细: Thinkphp大灌篮游戏源码 微信投篮源码 运行环境:PHP+MYSQL 程序内核:Thinkphp 内含...

    thinkphp5微信h5支付/手机浏览器调用微信支付

    这个过程涉及到的技术点包括PHP编程、ThinkPHP5框架的应用以及微信支付接口的调用。 首先,`ThinkPHP5`是一个基于PHP的轻量级开源框架,它提供了一套完整的MVC(模型-视图-控制器)结构,使得开发者能够高效地构建...

    ThinkPHP5微信支付封装.zip

    在这个“ThinkPHP5微信支付封装”的项目中,我们主要探讨的是如何在ThinkPHP5框架下进行微信支付接口的封装和调用。 首先,我们要了解微信支付的基本流程。微信支付主要包括以下几个步骤:申请商户号、设置密钥、...

    ThinkPHP电商微信小程序.zip

    PHP写的电商小程序,前端小程序,后台接口用的thinkphp。注册微信小程序账号按照文档配置即可使用。可以用来二次开发电商。

    基于thinkphp的微信商城源码

    【基于ThinkPHP的微信商城源码详解】 在深入探讨基于ThinkPHP的微信商城源码之前,我们先要了解两个核心概念:ThinkPHP框架和微信商城。 ThinkPHP是中国最流行的PHP框架之一,它采用MVC(Model-View-Controller)...

    仿微信IM(Thinkphp后端+Uniapp前端).zip

    这是一个基于Thinkphp后端框架和Uniapp前端技术构建的高仿微信即时通讯系统。这个项目不仅提供了基础的聊天功能,还允许用户进行二次开发,扩展更多特性,且经过实际测试,证明是可用的。 首先,我们要了解Thinkphp...

    基于thinkphp3.2.3微信红包

    在这个项目中,我们关注的是基于ThinkPHP3.2.3版本实现的微信红包系统。ThinkPHP是一个强大的PHP框架,它为开发者提供了丰富的工具和功能,简化了Web应用的开发过程。以下是对这个项目的详细解释: 首先,我们要...

    ThinkPHP5企业微信小程序-前端demo+后端

    《ThinkPHP5与企业微信小程序结合的前端及后端实现详解》 在现代互联网开发中,企业微信小程序凭借其轻量级、便捷的特性,逐渐成为企业服务与推广的重要工具。而ThinkPHP5作为国内广泛使用的PHP框架,以其强大的...

    Thinkphp内核微信屏蔽投诉按钮源码,微信域名防封+搭建教程.zip

    在本项目中,ThinkPHP可能被用来处理与微信平台的接口交互,包括用户认证、数据处理、请求响应等。同时,框架的路由机制和中间件可能被用来优化请求处理流程,提高系统的可扩展性和维护性。 2) 微信域名防封技术:...

Global site tag (gtag.js) - Google Analytics