PHP微信公众平台开发(二) 公众平台示例代码分
【PHP微信公众平台开发系列】
01.配置微信接口
02.公众平台示例代码分析
本文地址:http://www.phpchina.com/archives/view-43358-1.html
本系列由PHPChina特邀作者@David_Tang供稿,转载请注明作者信息与本文地址。
一、摘要
微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下。
二、获取代码
微信官网:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip
三、分析代码
完整代码如下:
<?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->valid(); class wechatCallbackapiTest { 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); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
3.1 整体分析
原始示例代码大致分为四个部分:
- 定义TOKEN
- 声明一个类 wechatCallbackapiTest
- 创建类wechatCallbackapiTest 的一个实例对象 $wechatObj
- 调用类的 valid() 方法。
3.2 详细分析
3.2.1 定义TOKEN
define("TOKEN", "weixin");
define 是用来给常量赋值的函数,这句话的意思是赋予“TOKEN”这个常量值为“weixin”。
TOKEN 是用来进行交互安全认证的,开发者可以随意定义,要和公众平台里设置的一样。
3.2.2 声明一个类
class wechatCallbackapiTest{
}
声明一个类 wechatCallbackapiTest,该类中包含有三个方法(函数)。
a. public function valid()
用于申请 成为开发者 时向微信发送验证信息。
b. public function responseMsg()
处理并回复用户发送过来的消息,也是用的最多的一个函数,几乎所有的功能都在这里实现。
<strong>responseMsg 函数详解:</strong> $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 接收微信公众平台发送过来的用户消息,该消息数据结构为XML,不是php默认的识别数据类型,因此这里用了$GLOBALS['HTTP_RAW_POST_DATA']来接收,同时赋值给了$postStr if (!empty($postStr)) 判断$postStr是否为空,如果不为空(接收到了数据),就继续执行下面的语句;如果为空,则跳转到与之相对应的else语句。 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 使用simplexml_load_string() 函数将接收到的XML消息数据载入对象$postObj中。这个严谨的写法后面还得加个判断是否载入成功的条件语句,不过不写也没事。 $fromUsername = $postObj->FromUserName; 将对象$postObj中的发送消息用户的OPENID赋值给$fromUsername变量 $toUsername = $postObj->ToUserName; 将对象$postObj中的公众账号的ID赋值给$toUsername变量 $keyword = trim($postObj->Content); trim() 函数从字符串的两端删除空白字符和其他预定义字符,这里就可以得到用户输入的关键词 $time = time(); time() 函数返回当前时间的 Unix 时间戳,即自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。 $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 )) 判断$keyword是否为空,不为空则继续执行下面的语句;如果为空,则跳转到与之相对应的else语句,即 echo "Input something..."; $msgType = "text"; 消息类型是文本类型 $contentStr = "Welcome to wechat world!"; 回复的消息内容 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 使用sprintf() 函数将格式化的数据写入到变量中去; $fromUsername, $toUsername, $time, $msgType, $contentStr 分别顺序替换模板里“%s”位置,也即是“$resultStr”这个变量最后实际为:
echo $resultStr; //把回复的消息输出
c. private function checkSignature()
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请求原样返回echostr参数内容,则接入生效,否则接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
加密/校验流程: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
3.2.3 创建实例对象
$wechatObj = new wechatCallbackapiTest();
3.2.4 调用类方法验证
$wechatObj->valid();
调用类的valid()方法执行接口验证,接口设置成功后将其注释掉。
四、总结
以上是对微信官方示例代码的一个分析,有解释不对的地方,还请高手指出。另外,该代码只是官方给出的简单示例代码,如果要做复杂的开发,还是要求开发者按照严谨的开发模式改写该段代码,会在后续教程中娓娓道来。
五、参考
微信官方公众平台API文档:http://mp.weixin.qq.com/wiki/index.php

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

最佳的加密货币交易和分析平台包括:1. OKX:全球交易量第一,支持多种交易,提供AI行情分析和链上数据监控。 2. 币安:全球最大交易所,提供深度行情和新币首发。 3. 芝麻开门:以现货交易和OTC通道着称,提供自动化交易策略。 4. CoinMarketCap:权威行情数据平台,覆盖20000 币种。 5. CoinGecko:以社区情绪分析见长,提供DeFi和NFT趋势监控。 6. 非小号:国内行情平台,提供A股与币市联动分析。 7. 链上财经:专注区块链新闻,每日更新深度报道。 8. 金色财经:24小

多次调用session_start()会导致警告信息和可能的数据覆盖。1)PHP会发出警告,提示session已启动。2)可能导致session数据意外覆盖。3)使用session_status()检查session状态,避免重复调用。

IIS和PHP可以兼容,通过FastCGI实现。1.IIS通过配置文件将.php文件请求转发给FastCGI模块。2.FastCGI模块启动PHP进程处理请求,提高性能和稳定性。3.实际应用中需注意配置细节、错误调试和性能优化。

Gate.io官方APP可以通过以下方式下载:1. 访问官方网站gate.io下载;2. 在App Store或Google Play搜索"Gate.io"下载。务必通过官方渠道下载以确保安全。

AI可以帮助优化Composer的使用,具体方法包括:1.依赖管理优化:AI分析依赖关系,建议最佳版本组合,减少冲突。2.自动化代码生成:AI生成符合最佳实践的composer.json文件。3.代码质量提升:AI检测潜在问题,提供优化建议,提高代码质量。这些方法通过机器学习和自然语言处理技术实现,帮助开发者提高效率和代码质量。

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

HTML5带来了五个关键改进:1.语义化标签提升了代码清晰度和SEO效果;2.多媒体支持简化了视频和音频嵌入;3.表单增强简化了验证;4.离线与本地存储提高了用户体验;5.画布与图形功能增强了网页的可视化效果。

MySQL函数可用于数据处理和计算。1.基本用法包括字符串处理、日期计算和数学运算。2.高级用法涉及结合多个函数实现复杂操作。3.性能优化需避免在WHERE子句中使用函数,并使用GROUPBY和临时表。
