博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信公众平台消息接口开发(2)-封装weixin.class.php
阅读量:5856 次
发布时间:2019-06-19

本文共 5549 字,大约阅读时间需要 18 分钟。

 

一、封装weixin.class.php

由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处理。

我们就考虑在这个基础上做一次封装,weixin.class.php,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
class
Weixin
{
   
public
$token
=
''
;
//token
   
public
$debug
=  false;
//是否debug的状态标示,方便我们在调试的时候记录一些中间数据
   
public
$setFlag
= false;
   
public
$msgtype
=
'text'
;  
//('text','image','location')
   
public
$msg
=
array
();
 
   
public
function
__construct(
$token
,
$debug
)
   
{
       
$this
->token =
$token
;
       
$this
->debug =
$debug
;
   
}<br>    
//获得用户发过来的消息(消息内容和消息类型  )
   
public
function
getMsg()
   
{
       
$postStr
=
$GLOBALS
[
"HTTP_RAW_POST_DATA"
];
       
if
(
$this
->debug) {
                       
$this
->write_log(
$postStr
);
       
}
       
if
(!
empty
(
$postStr
)) {
           
$this
->msg = (
array
)simplexml_load_string(
$postStr
,
'SimpleXMLElement'
, LIBXML_NOCDATA);
           
$this
->msgtype =
strtolower
(
$this
->msg[
'MsgType'
]);
       
}
   
}<br>    
//回复文本消息
   
public
function
makeText(
$text
=
''
)
   
{
       
$CreateTime
= time();
       
$FuncFlag
=
$this
->setFlag ? 1 : 0;
       
$textTpl
= "<xml>
           
<ToUserName><![CDATA[{
$this
->msg[
'FromUserName'
]}]]></ToUserName>
           
<FromUserName><![CDATA[{
$this
->msg[
'ToUserName'
]}]]></FromUserName>
           
<CreateTime>{
$CreateTime
}</CreateTime>
           
<MsgType><![CDATA[text]]></MsgType>
           
<Content><![CDATA[%s]]></Content>
           
<FuncFlag>%s</FuncFlag>
           
</xml>";
       
return
sprintf(
$textTpl
,
$text
,
$FuncFlag
);
   
}<br>    
//根据数组参数回复图文消息
   
public
function
makeNews(
$newsData
=
array
())
   
{
       
$CreateTime
= time();
       
$FuncFlag
=
$this
->setFlag ? 1 : 0;
       
$newTplHeader
= "<xml>
           
<ToUserName><![CDATA[{
$this
->msg[
'FromUserName'
]}]]></ToUserName>
           
<FromUserName><![CDATA[{
$this
->msg[
'ToUserName'
]}]]></FromUserName>
           
<CreateTime>{
$CreateTime
}</CreateTime>
           
<MsgType><![CDATA[news]]></MsgType>
           
<Content><![CDATA[%s]]></Content>
           
<ArticleCount>%s</ArticleCount><Articles>";
       
$newTplItem
= "<item>
           
<Title><![CDATA[%s]]></Title>
           
<Description><![CDATA[%s]]></Description>
           
<PicUrl><![CDATA[%s]]></PicUrl>
           
<Url><![CDATA[%s]]></Url>
           
</item>";
       
$newTplFoot
= "</Articles>
           
<FuncFlag>%s</FuncFlag>
           
</xml>";
       
$Content
=
''
;
       
$itemsCount
=
count
(
$newsData
[
'items'
]);
       
$itemsCount
=
$itemsCount
< 10 ?
$itemsCount
: 10;
//微信公众平台图文回复的消息一次最多10条
       
if
(
$itemsCount
) {
           
foreach
(
$newsData
[
'items'
]
as
$key
=>
$item
) {
               
if
(
$key
<=9) {
                   
$Content
.= sprintf(
$newTplItem
,
$item
[
'title'
],
$item
[
'description'
],
$item
[
'picurl'
],
$item
[
'url'
]);
               
}
           
}
       
}
       
$header
= sprintf(
$newTplHeader
,
$newsData
[
'content'
],
$itemsCount
);
       
$footer
= sprintf(
$newTplFoot
,
$FuncFlag
);
       
return
$header
.
$Content
.
$footer
;
   
}
   
public
function
reply(
$data
)
   
{
       
if
(
$this
->debug) {
                   
$this
->write_log(
$data
);
       
}
       
echo
$data
;
   
}
   
public
function
valid()
   
{
       
if
(
$this
->checkSignature()) {
           
if
(
$_SERVER
[
'REQUEST_METHOD'
]==
'GET'
)
           
{
               
echo
$_GET
[
'echostr'
];
               
exit
;
           
}
       
}
else
{
           
write_log(
'认证失败'
);
           
exit
;
       
}
   
}
   
private
function
checkSignature()
   
{
       
$signature
=
$_GET
[
"signature"
];
       
$timestamp
=
$_GET
[
"timestamp"
];
       
$nonce
=
$_GET
[
"nonce"
];
 
       
$tmpArr
=
array
(
$this
->token,
$timestamp
,
$nonce
);
       
sort(
$tmpArr
);
       
$tmpStr
= implode(
$tmpArr
);
       
$tmpStr
= sha1(
$tmpStr
);
 
       
if
(
$tmpStr
==
$signature
){
           
return
true;
       
}
else
{
           
return
false;
       
}
   
}<br>    
private
function
write_log(
$log
){<br>       
//这里是你记录调试信息的地方  请自行完善   以便中间调试<br>    }
}
?>

二、调用weixin.class.php

把你的微信公众平台主接口文件(如前面定义的http://www.yourdomain.com/weixin.php)中,修改代码为:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
include_once
(
'weixin.class.php'
);
//引用刚定义的微信消息处理类<br>define("TOKEN", "mmhelper");<br>define('DEBUG', true);
$weixin
=
new
Weixin(TOKEN,DEBUG);
//实例化
$weixin
->getMsg();
$type
=
$weixin
->msgtype;
//消息类型
$username
=
$weixin
->msg[
'FromUserName'
];
//哪个用户给你发的消息,这个$username是微信加密之后的,但是每个用户都是一一对应的
if
(
$type
===
'text'
) {
   
if
(
$weixin
->msg[
'Content'
]==
'Hello2BizUser'
) {
//微信用户第一次关注你的账号的时候,你的公众账号就会受到一条内容为'Hello2BizUser'的消息
       
$reply
=
$weixin
->makeText(
'欢迎你关注妈妈助手哦,屌丝'
);
   
}
else
{
//这里就是用户输入了文本信息
       
$keyword
=
$weixin
->msg[
'Content'
];  
//用户的文本消息内容
               
include_once
(
"chaxun.php"
);
//文本消息 调用查询程序 
               
$chaxun
=
new
chaxun(DEBUG,
$keyword
,
$username
);
               
$results
[
'items'
] =
$chaxun
->search();
//查询的代码
           
               
$reply
=
$weixin
->makeNews(
$results
);
   
}
}
elseif
(
$type
===
'location'
) {
     
//用户发送的是位置信息  稍后的文章中会处理                 
}
elseif
(
$type
===
'image'
) {
     
//用户发送的是图片 稍后的文章中会处理
}
elseif
(
$type
===
'voice'
) {    
     
//用户发送的是声音 稍后的文章中会处理
}
$weixin
->reply(
$reply
);

 

三、查询代码

还需要将数据库里面的查询结果格式化为特定的形式

 

1
2
3
4
5
6
7
8
9
10
11
public
function
search(){
      
$record
=
array
(); 
//定义返回结果的数组
      
$list
=
$this
->search(
$this
->keyword);
//普通的根据关键词查询数据库的操作  代码就不用分享了
    
if
(
is_array
(
$list
)&&!
empty
(
$list
)){                
              
foreach
(
$list
as
$msg
){
                
$record
[]=
array
(
//以下代码,将数据库中查询返回的数组格式化为微信返回消息能接收的数组形式,即title、description、picurl、url 详见微信官方的文档描述
                   
'title'
=>
$msg
[
'title'
],
                   
'description'
=>
$msg
[
'discription'
],
                   
'picurl'
=>
$msg
[
'pic_url'
],
                   
'url'
=>
$msg
[
'url'
]
               
);<br>        }<br>    }<br>    
return
$record
;<br>}<br>

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

承接微信公众平台消息接口开发、PHP、.NET、javascript、html5程序开发;新浪微博应用、腾讯微博应用等各大开放平台应用开发业务

联系QQ:1433273389

关注妈妈助手(账号mmhelper)方法:

1. 依次进入以下路径:朋友们—>添加朋友—>搜号码,输入mmhelper,不区分大小写,点击查找,然后点击关注。

2. 扫描二维码:

转载于:https://www.cnblogs.com/fx2008/archive/2013/03/22/2974853.html

你可能感兴趣的文章
RedHat 5.6_x86_64 + ASM + RAW+ Oracle 10g RAC (二)
查看>>
win7不能全屏
查看>>
MySQL/InnoDB的并发插入Concurrent Insert
查看>>
转两好文防丢:Debian 版本升级/降级 & Linux 应用程序失去输入焦点问题的解决...
查看>>
HDU - Pseudoforest
查看>>
Nexus杂
查看>>
Android --- GreenDao的实现(ORM框架)
查看>>
Linux平台Java调用so库-JNI使用例子
查看>>
Spring Data JPA
查看>>
项目管理修炼之道之规划项目
查看>>
Web服务器压力测试工具http_load、webbench、ab、Siege使用教程
查看>>
RHEL6.3 源码安装Puppet
查看>>
Mac软件下载备忘
查看>>
java 泛型初探
查看>>
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory
查看>>
就是一个表格
查看>>
CakePHP 2.x CookBook 中文版 第三章 入门 之 CakePHP 的结构
查看>>
Objective-C的算术表达式 .
查看>>
找回使用Eclipse删除的文件
查看>>
rabbitmq 消息系统 消息队列
查看>>