<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
//验证成功以后,注释掉valid方法
// $wechatObj->valid();
// 开启自动回复功能
$wechatObj->responseMsg();
// 定义类文件
class wechatCallbackapiTest
{
// 实现valid验证方法:实现对接微信公众平台
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
// 接受XML 用户端的 数据
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
// 判断XML是否为空
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);
// 通过simpleXML进行xml解析
$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 ))
{
// 回复类型 如果为text 代表文本
$msgType = "text";
// 回复内容
$contentStr = "Welcome to wechat world!";
// 格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
// 把XML返回给手机端
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
private function checkSignature()
{
// you must define TOKEN by yourself
//判断TOKEN是不是有意义
if (!defined("TOKEN")) {
//如果没有 抛出异常
throw new Exception('TOKEN is not defined!');
}
//接受微信加密签名
$signature = $_GET["signature"];
//接受时间戳信息
$timestamp = $_GET["timestamp"];
//接收随机数
$nonce = $_GET["nonce"];
//把TOKEN常量赋值给@token
$token = TOKEN;
//把相关参数组装成数组
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
//通过字典法进行排序
sort($tmpArr, SORT_STRING);
//把排序以后的数组转化为字符串
$tmpStr = implode( $tmpArr );
//通过哈希算法对字符串进行加密操作
$tmpStr = sha1( $tmpStr );
//与加密签名进行对比
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
微信官方接口分析
最新推荐文章于 2022-07-20 06:19:29 发布