微信公众号开发者模式普通消息模式例子
前面已经说了,怎么来开启和配置微信服务号的开者模式了,这次要讲的就是针对和用户互动的一些事件。
本次主要讲的是,用户通过微信服务号输入框,发送给服务号的消息,怎么自动回复给用户。非开者模式,只需要在微信自动回复配置上关键词即可以。开发者模式需要通过responseMsg或者自己定义的。
关于responseMsg方法,是在第一步进行开启状态的时候那个相关类里的方法。
首先看下这个方法的:
public function responseMsg() {
$postStr = $GLOBALS ["HTTP_RAW_POST_DATA"];
if (! empty ( $postStr )) {
$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
$MsgType = $postObj->MsgType;
$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>
</xml>";
$msgType = "text";
$contentStr = '亲,测试成功,已经到您的信息!';
$resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
echo $resultStr;exit();
} else {
exit ();
}
}
上面的方法,基本是一个比较简单的方法了。下面说明下上面几个重要的变量值代表含义:
$postObj 用户发送过来的数据,以xml的形式
下面是解析xml的结果:
$MsgType 消息类型
$fromUsername 发消息者的openid
$toUsername 开发者微信号
$keyword 发送的内容(注意:本次例子用的是text文本形式)
$time 是自己写的,做业务需求的时候有时候需要。
$textTpl 是回复给用户的模板样式。模式样式也分为好几种
本次为普通消息类型有:text、image、voice、video等,其它模式详细查看文档,还有一种事件类型,下篇文章会详细说明。
本次例子用的是text文本回复模式,其它模式详细查看官方文档
说明下xml的参数:
ToUserName 请使用上面的fromUsername 发送给该用户
FromUserName 请使用ToUserName 消息发送者(开发者微信号)
CreateTime 时间(时间戳)
MsgType 消息类型(回复,注:本次例子text)
Content 回复的内容 可写A标签。尽量控制字数,不要太多。
该方法设置完之后,通过该微信服务号的文本框录入数据,点击发送,就会看到由服务号回复的。
亲,测试成功,已经到您的信息!
到这,已经把最简单的text完成。其它的普通回复操作也基本同样的流程,找对应的接受与回复的类型xml,然后进行操作。
提示:开发者,可以在msgType进行判断,看用户发送的消息,属于那种类型的,再进行不同的操作。
例如:
if($MsgType=='text'){}
if($MsgType=='image'){}
if($MsgType=='voice'){voice接受的参数,请参考上面的普通消息类文档,回复操作:请选择自己要回复内容的xml格式,请参考回复用户模板样式连接。}
静态变量在使用过程中最注要的就是要清除了,如果我们不清除可能会碰到一些问题了,今天我们来看一篇关于PHP的静态变量的注意细节与例子,具体的如下所示。只要在变量前加上关键字static,该变量就成为静态变量了。
<?php
function test()
{
static $nm = ;
$nm = $nm * ;
print $nm."<br />";
}
// 第一次执行,$nm =
test();
// 第一次执行,$nm =
test();
// 第一次执行,$nm =
test();
?>
程序运行结果:
1
2
2
4
3
8
函数test()执行后,变量$nm的值都保存了下来了。
在class中经常使用到静态属性,比如静态成员、静态方法。
之前的公司的小兄弟要去面试PHP,他遇到了一道PHP基础面试题,大致内容是如下:
function test(){
static $a = 0;
$a++;
echo "before unset ".$a."<br/>";
unset($a);
$a = 23;
echo "after unset ".$a."<br/>";
}
test();
test();
test();
看到这题的时候,就注意到了stats这个标记了$a。就知道这题不会是第一反应的结果。(结果如下)
PHP运行结果
其实这样这么理解:
PHP变量关系图
PHP的内存地址跟变量直接就是通过这种方式进行关联的。一般的变量是是通过关联的方式指向对应的地址,而不是真是的值。所以unset()的过程,其实是断了之间的联系,而不是抹掉了内存地址的值。
而static在初始化变量的,仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
一、网站初期,一般只需做不带www的域名301转向到带www域名上;
代码如下:
Options +FollowSymlinks
RewriteEngine on
rewritecond %{http_host} ^111cn.net [nc]
rewriterule ^(.*)$ http://www.111cn.net /$1 [r=301,nc]
二、不同域名301跳转方法;
当想重新更换域名时,我们就需要把原有的网站权重移动到最新的网站上,就需要做不同域名的301跳转;
代码如下:
Options +FollowSymlinks
RewriteEngine on
rewritecond %{http_host} ^www.domain1.com [nc]
rewriterule ^(.*)$ http://www.domain2.com/$1 [r=301,nc]
注:此类跳转,一般是因网站改版而起,如果想要把权重最大化转移,请根据百度站长平台给出的解决办法进行解决。
以上2种方法,是针对Apache而言,如果你用得非Apache(如:nginx),那么就不能用.htaccses文件,也就不能使用以上方法,那怎么办?——对网页直接进行301跳转修改!
一、对某个单页面进行301跳转,只需在PHP网页顶部输入下面的代码就可以。代码如下:
<?php
Header("HTTP/1.1 301 Moved Permanently");
Header("Location: http://www.111cn.net ");
?>
二、针对全站页面进行301跳转解决方法
1、建立301.php文件
(文件名自取)
$the_host = $_SERVER['HTTP_HOST'];//取得当前域名
$the_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';//判断地址后面部分
$the_url = strtolower($the_url);//将英文字母转成小写
if($the_url=="/index.php")//判断是不是首页
{
$the_url="";//如果是首页,赋值为空
}
{
header('HTTP/1.1 301 Moved Permanently');//发出301头部
header('Location:http://www.111cn.net '.$the_url);//跳转到带www的网址
}
?>
2、在网页文件中调用301.php
<?php include("301.php");?>
将这个代码放到你所有网页的最前面。
我们来看看data/base64是什么吧
什么是data:image/*;base64?
答:这是Data URI scheme。
还不懂?
Ps:Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。
例如:
data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNo8zjsOxCAMBFB/ KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIBhH5EAB8b+Tlt9MYQ6i1BuqFaq1CKSVcxZ2Acs6406KUgpt5/ LCKuVgz5BDCSb13ZO99ZOdcZGvt4mJjzMVKqcha68iIePB86GAiOv8CDADlIUQBs7MD3wAAAABJRU5ErkJggg%3D%3D。
将这些字符复制黏贴到火狐的地址栏中并转到,就能看到它了,一张1X36的白灰png图片。
在上面的Data URI中,data表示取得数据的协定名称,image/png 是数据类型名称,base64 是数据的编码方法,逗号后面就是这个image/png文件base64编码后的数据。
目前,Data URI scheme支持的类型有:
data:,文本数据
data:text/plain,文本数据
data:text/html,HTML代码
data:text/html;base64,base64编码的HTML代码
data:text/css,CSS代码
data:text/css;base64,base64编码的CSS代码
data:text/javascript,Javascript代码
data:text/javascript;base64,base64编码的Javascript代码
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据
base64简单地说,它把一些 8-bit 数据翻译成标准 ASCII 字符,网上有很多免费的base64 编码和解码的工具,在PHP中可以用函数base64_encode() 进行编码,如
echo base64_encode(file_get_contents('emtalk.png'));
目前,IE8、Firfox、Chrome、Opera浏览器都支持这种小文件嵌入。
写个简单的小函数:
<?php
header('Content-type:text/html;charset=utf-8');
function image_base64($image_file){
if(empty($image_file))return false;
$image_info = getimagesize($image_file);
$base64_image_content = "data:{$image_info['mime']};base64," . chunk_split(base64_encode(file_get_contents($image_file)));
return $base64_image_content;
}
?>
<html>
<head>
<title>逐风博客-图片编码输出测试</title>
</head>
<body>
<img id="img1" width='100' src="<?php echo image_base64('imgtest.jpg');?>"/>
</body>
</html>
并且掌握了PHP生成代码,那么今天逐风君再给小伙伴们带来一个,把data:image/;base64数据流转化回图片文件的处理方法(函数):
/**
* 反编译data/base64数据流并创建图片文件
* @author Lonny ciwdream@gmail.com
* @param string $baseData data/base64数据流
* @param string $Dir 存放图片文件目录
* @param string $fileName 图片文件名称(不含文件后缀)
* @return mixed 返回新创建文件路径或布尔类型
*/
function base64DecImg($baseData, $Dir, $fileName){
// 前台访问URL API
$__URL__= 'http://emtalk.net/';
// 服务器根目录绝对路径获取API
$__root__=isset($_SERVER['DOCUMENT_ROOT'])?$_SERVER['DOCUMENT_ROOT']:(isset($_SERVER['APPL_PHYSICAL_PATH'])?trim($_SERVER['APPL_PHYSICAL_PATH'],"\\"):(isset($_['PATH_TRANSLATED'])?str_replace($_SERVER["PHP_SELF"]):str_replace(str_replace("/","\\",isset($_SERVER["PHP_SELF"])?$_SERVER["PHP_SELF"]:(isset($_SERVER["URL"])?$_SERVER["URL"]:$_SERVER["SCRIPT_NAME"])),"",isset($_SERVER["PATH_TRANSLATED"])?$_SERVER["PATH_TRANSLATED"]:$_SERVER["SCRIPT_FILENAME"])));
// 上诉两个变量,依据实际情况自行修改
try{
$expData = explode(';',$baseData);
$postfix = explode('/',$expData[0]);
if( strstr($postfix[0],'image') ){
$postfix = $postfix[1] == 'jpeg' ? 'jpg' : $postfix[1];
$storageDir = $Dir.DIRECTORY_SEPARATOR.$fileName.'.'.$postfix;
$export = base64_decode(str_replace("{$expData[0]};base64,", '', $baseData));
$returnDir = str_replace(str_replace('/','\\',$__root__),'',$storageDir);
try{
file_put_contents($storageDir, $export);
return $__URL__.$returnDir;
}catch(Exception $e){
return false;
}
}
}catch(Exception $e){
return false;
}
return false;
}
代码看懂没?这只是个简单的小示例,通过代码优化、调整这个函数还可以实现data:image/;base64数据不同数据类型文件的还原呦!
相关文章
- 这篇文章主要介绍了公众号SVG动画交互实战代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01
- 这篇文章主要介绍了C#实现微信公众号会员卡管理的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了Vue微信公众号网页分享的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-28
- 打开网页微信,用微信扫描一下登陆网页版的微信,打开之后有一个文件传输助手,把查看历史记录的网址发过去。 发过去的时候,这个网址会自动转换,从“文件传输助手&rd...2016-05-19
- 如何提高微信搜索排名?微信公众号如何取名?8大微信公众号取名套路有讲究!一个好的公众号名称往往能够直接体现出账号的价值、服务、内容、范围、行业等信息,让需要的用户...2017-07-06
- 微信公众号如何吸粉?如果你正好在运营公众号,而又正好在为涨粉发愁,没有想到更好的解决办法之前不妨用这5招,立竿见影 如果你正好在运营公众号,而又正好在为涨粉发愁,...2017-07-06
- 公众号菜单添加删除如果是单号可以直接登录后台操作了,但如果我们开了开发接口那么这个菜单的操作也必须通过接口来实现了,下面我们来看一篇关于php版微信实现公众号菜...2016-11-25
- 如果问你现在互联网领域,什么最赚钱?很多人都会第一时间想到微信。微信的出现颠覆了人们以往对营销的认识,微信营销、微店、微商的出现,让微信不再只是简单的通讯软件,更是...2017-07-06
- 这篇文章主要介绍了微信公众号实现会员卡领取功能的相关资料,需要的朋友可以参考下...2017-06-11
- 这篇文章主要介绍了.NET C#使用微信公众号登录网站,教大家利用微信公众号进行网站登录,感兴趣的小伙伴们可以参考一下...2021-09-22
- 这篇文章主要介绍了微信公众平台开发教程(三) 基础框架搭建,具有一定的参考价值,有需要的可以了解一下。...2020-06-25
- 微信对于我来说,最有价值的是一个学习渠道,特别是搜狗微信搜索(http://weixin.sogou.com/)能够很方便的搜索公众账号和文章内容,PC端就能够获得特定内容的资源与学习,比如了解SEO...2016-05-19
- 微信公众号号在手机中通过api接口可以实现自定义分享内容了,下面我们来看这个接口的实现步骤。 一、准备阶段公众号一个,微网站一个。 二、绑定域名先登录微信公众...2016-11-25
ASP.NET Core2静默获取微信公众号的用户OpenId实例代码
这篇文章主要给大家介绍了关于ASP.NET Core2静默获取微信公众号的用户OpenId的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 对于新媒体从业的小伙伴,取一个讨巧的公众号名字,会给运营带来事半功倍的效果。一个好名字,除了能吸引大家的注意力,方便记忆和传播之外,还是一个有效的涨粉方法。下面就随...2017-07-06
- 微信公众号有一个测试系统,在调试的时候,可以用那个测试系统来调试,比较方便,最好不要在实际系统中调试 以前的时候,我是通过网页来获取到用户信息的,现在发现在公...2016-05-19
- 开发者认证实例,希望此实例对各位有所帮助。 微信公众平台如何成为开发者? 登录微信公众平台后,点击高级功能=》开发模式=》成为开发者=》填写接口配置信息,提交后等...2016-11-25
Android7.1.1开发者第二预览版发布:增加对Nexus 9平板的支持
谷歌今天早些时候正式发布了Android 7.1.1的开发者第二预览版系统,具体来说,Android 7.1.1开发者第二预览版系统增加了对Nexus 9平板的支持,而Nexus 6、Player以及General Mobile 4G仍需要等到12月最终版发布时才能获得更新...2016-12-21- 关注的时候,会自动post一条信息到开发者配置填写的网址上面,Post过来的数据是一个xml结构的数据,里面包含有openid,拿到openid,就可以给该用户发送微信现金红包了 如何实现...2016-05-19
- 本文主要介绍了python代码实现扫码关注公众号登录的实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-11-01