最近被逼着用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的微信接口类,很简单。从网上下来的。
《ThinkPHP5.0.19微信订餐点餐完整小程序独立商用版》是一个基于ThinkPHP5.0.19框架开发的微信小程序项目,它提供了全面的餐饮订餐服务功能,适合商业运营。这个项目不仅可以帮助开发者了解和掌握ThinkPHP5.0版本的...
在本文中,我们将深入探讨如何在ThinkPHP 3.2.3框架下实现微信授权登录以及分享至微信好友和朋友圈的功能。这对于Android和iOS应用程序的开发者来说尤其重要,因为微信是中国乃至全球范围内广泛使用的社交平台。 ...
综上所述,基于ThinkPHP 3.2.3实现微信扫码登录涉及到了PHP框架的使用、OAuth 2.0授权协议的理解以及微信开放平台的接口调用。这个过程虽然涉及多个步骤,但得益于ThinkPHP的便利性,实际操作并不复杂。通过学习和...
【Thinkphp内核微信拼团购物商城小程序源码】是一个基于Thinkphp框架开发的电子商务解决方案,专门针对微信小程序平台设计。这个源码集成了微信支付功能,为用户提供了一种便捷的在线购物体验。Thinkphp是一个广泛...
总的来说,ThinkPHP5的微信登录授权插件为开发者提供了便利,使得集成微信登录变得简单高效。通过理解OAuth2.0授权流程和微信开放平台的工作方式,开发者可以更好地利用此插件,提升用户体验,同时确保应用的安全性...
在集成这个功能时,开发者需要熟悉微信支付的API接口以及ThinkPHP的MVC(Model-View-Controller)架构。 1. **微信支付API接口**:首先,你需要注册成为微信支付商户,并获取到商户号、API密钥、AppID等关键参数。...
### 基于ThinkPHP+微信小程序的校园社团云平台的设计与实现 #### 一、项目背景及意义 随着互联网技术的快速发展,越来越多的传统活动和服务正在向线上迁移,特别是对于高校社团活动而言,如何利用互联网技术提高...
将控制器直接放在Controller目录下,直接调用就可以了
标题中的"thinkphp 6对接微信服务商demo"指的是使用ThinkPHP 6框架开发的一个示例项目,目的是为了演示如何将一个Web应用与微信服务商的接口进行整合,实现特定的支付和财务管理功能。ThinkPHP是中国非常流行的一个...
【标题】"thinkphp3.2 微信小程序商城源码 带后台"涉及到的主要知识点包括微信小程序开发、ThinkPHP3.2框架的应用以及商城系统的构建。这是一套完整的解决方案,提供了从前端到后端的全套源码,旨在帮助开发者快速...
适用范围: Thinkphp内核 微信大灌篮游戏源码 微信投篮源码下载 免公众号+个人免签支付接口 运行环境: php+mysql 源码详细: Thinkphp大灌篮游戏源码 微信投篮源码 运行环境:PHP+MYSQL 程序内核:Thinkphp 内含...
这个过程涉及到的技术点包括PHP编程、ThinkPHP5框架的应用以及微信支付接口的调用。 首先,`ThinkPHP5`是一个基于PHP的轻量级开源框架,它提供了一套完整的MVC(模型-视图-控制器)结构,使得开发者能够高效地构建...
在这个“ThinkPHP5微信支付封装”的项目中,我们主要探讨的是如何在ThinkPHP5框架下进行微信支付接口的封装和调用。 首先,我们要了解微信支付的基本流程。微信支付主要包括以下几个步骤:申请商户号、设置密钥、...
PHP写的电商小程序,前端小程序,后台接口用的thinkphp。注册微信小程序账号按照文档配置即可使用。可以用来二次开发电商。
【基于ThinkPHP的微信商城源码详解】 在深入探讨基于ThinkPHP的微信商城源码之前,我们先要了解两个核心概念:ThinkPHP框架和微信商城。 ThinkPHP是中国最流行的PHP框架之一,它采用MVC(Model-View-Controller)...
这是一个基于Thinkphp后端框架和Uniapp前端技术构建的高仿微信即时通讯系统。这个项目不仅提供了基础的聊天功能,还允许用户进行二次开发,扩展更多特性,且经过实际测试,证明是可用的。 首先,我们要了解Thinkphp...
在这个项目中,我们关注的是基于ThinkPHP3.2.3版本实现的微信红包系统。ThinkPHP是一个强大的PHP框架,它为开发者提供了丰富的工具和功能,简化了Web应用的开发过程。以下是对这个项目的详细解释: 首先,我们要...
《ThinkPHP5与企业微信小程序结合的前端及后端实现详解》 在现代互联网开发中,企业微信小程序凭借其轻量级、便捷的特性,逐渐成为企业服务与推广的重要工具。而ThinkPHP5作为国内广泛使用的PHP框架,以其强大的...
在本项目中,ThinkPHP可能被用来处理与微信平台的接口交互,包括用户认证、数据处理、请求响应等。同时,框架的路由机制和中间件可能被用来优化请求处理流程,提高系统的可扩展性和维护性。 2) 微信域名防封技术:...