shal+php,PHP微信开发——第二弹

本文档详细解读了微信公众号开发中的配置文件,包括如何验证接口签名、接收及响应用户消息。主要涉及类`wechatCallbackapiTest`的`valid()`方法用于接口验证,`responseMsg()`方法用于处理用户消息,如关注后的自动回复和关键词回复。此外,还介绍了XML解析和数据安全处理的相关步骤。
摘要由CSDN通过智能技术生成

/**

* wechat php test

*/

//微信开发配置文件详细注释版

//define your token

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();//将第11行代码的一个类实例化;

//$wechatObj->valid();//变量使用->访问类中的valid()方法,下文valid()方法为验证开发模式接口。这行作用就是验证接口,验证完可注释掉;

$wechatObj->responseMsg();

class wechatCallbackapiTest//定义一个类,类为面向对象开发的封装方式;

{

public function valid()//定义一个公有的名为valid的方法,即验证接口的方法;{$echoStr = $_GET["echostr"];//从微信用户端获取一个随机字符串赋予变量$echoStr;

//valid signature , option

if($this->checkSignature()){

//访问checkSignature签名验证方法,若签名一致,输出变量$echoStr,完整验证配置接口的操作;

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)){//判断用户端信息是否为非空;

/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,

the best way is to check the validity of xml by yourself */

libxml_disable_entity_loader(true);

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//将$postStrl变量进行解析并赋予变量$postObj。simplexml_load_string()函数用于解析XML,参数SimpleXMLElement为新对象的类,LIBXML_NOCDATA表示将CDATA设置为文本节点,CDATA标签中的文本XML不进行解析。

$fromUsername = $postObj->FromUserName;//将微信用户端的OpenID赋予变量$fromUsername;

$toUsername = $postObj->ToUserName;//将公众号ID赋予变量$toUsername;

$keyword = trim($postObj->Content);//将用户微信发来的文本内容去掉空格后赋予变量$keyword;

$time = time();//将系统时间赋予变量$time;

$Event = $postObj->Event;//这是一个事件获取;

$textTpl = "

%s

0

";    //构建XML格式的文本赋予变量$textTpl。注意XML中的格式为微信内容固定格式。

if($Event=="subscribe")//subscribe是收到订阅信息,Event是事件类型,subscribe(订阅)、unsubscribe(取消订阅)

{

$textTpl = "

%s

0

";

$msgType ="text";

$contentStr = "谢谢关注,你可以回复点什么";

$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

echo $resultStr;

}///关注后自动回复文本消息

//switch($keyword)

//case "";

if(!empty( $keyword ))

{

$msgType = "text";//回复文本信息类型为text型,变量类型为$msgType;

$contentStr = "报修,快递查询,饭卡挂失,失物招领,校园街景,新生报到,成绩查询";//$contentStr为回复的信息;

$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);//sprintf()为变参函数,$textTpl由于有5个%s,需要5个变量进行赋值。此行代码为关键,sprintf()函数要深入理解。

echo $resultStr;//输出回复信息,即发送微信;

}else{

echo "Input something...";//输入内容,此消息不会发送到微信端,只是测试时使用。

}

}else {

echo "";//微信端没有消息时,回复为空,无意义,测试用;

exit;//退出;

}

}

private function checkSignature()//传说中的签名验证程序,此行建立私有方法验证签名,这个私有的checkSignature方法,被第18行代码调用,官方文档为加密/校验流程:将token,timestamp,nonce这三个参数进行字典序排序,将这三个参数字符串拼接成一个字符串进行shal加密,开发者获得加密后字符串可与signature对比,标示该请求来源于微信;

{

// you must define TOKEN by yourself

if (!defined("TOKEN")) {

throw new Exception('TOKEN is not defined!');

}

$signature = $_GET["signature"];//从用户端获取签名赋予变量$signature;

$timestamp = $_GET["timestamp"];//从用户端获取时间戳赋予变量$timestamp;

$nonce = $_GET["nonce"];//从用户端获取随机数赋予变量$nonce;

$token = TOKEN;

$tmpArr = array($token, $timestamp, $nonce);//建立数组变量$tmpArr;

// use SORT_STRING rule

sort($tmpArr, SORT_STRING);//新建名排序;

$tmpStr = implode( $tmpArr );//字典排序;

$tmpStr = sha1( $tmpStr );//shal加密;

if( $tmpStr == $signature ){//$tmpStr与$signature变量同值,返回真,否则返回假;

return true;

}else{

return false;

}

}

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值