以下内容均来自网络结合自己动手实践,部分来源恕不能一一注明出处。
* 配置自己的服务器。
比较简单的,就是一台能上网的笔记本或者台式机(后面称为A机器),安装phpstudy,里面包含apache、mysql、php、phpadmin。然后下载netapp,运行这软件后,能产生一个互联网域名(后面成为域名W)指向A机器的80端口。这样在互联网上访问域名W就能直接访问到机器A80端口发布的web页面。
用这方式在后面微信开发配置时,提示2016年12月31号之后会禁用netapp使用的映射域名,所以我用了自己的腾讯空间。
* 让腾讯验证自己的服务器。
建一wx_token_read.php文件放在我的web服务器上,用于告诉腾讯的验证服务器我准备好了。这个文件名自定。需要用后面步骤定义的token替换里面的“*****”。
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "*****"); // ***** 用自己后面定义的 Token替换
$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)){
/* 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);
$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()
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$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;
}
}
}
?>
把这文件放到机器A的web根目录或者新建一个目录中。
或者用下面这个验证文件,(2017.2.2测试通过):
<?php
/**
* wechat php test
* update time: 20141008
*/
//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 (!emptyempty($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(!emptyempty( $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, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
* 微信账号配置。
目前我没有公司及机构账号,只能申请到个人微信账号,然后进入开发配置。
开发——基本配置。
1、URL配置项:输入机器A的WEB目录及上面建立的文件名,根目录或者根目录下新建目录都可以。我的是:http://www.1hwj.net/wei/wx_token_read.php
2、Token配置项:自定英文或数字,长度为3-32字符。
3、消息加解密方式暂时用明文。
点击提交,显示提交成功。如果机器A速度慢,或者url等参数配置有问题,会显示配置失败。
* 加关注后返回欢迎信息。
建立2个php文件,需要utf8格式。这两个文件内容来自老贼:http://www.zhongyaofang.cn/combat_power/weixin_jiaocheng_vol9.html
wx_tpl.php:
<?php
$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>";
$newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
<FuncFlag>1</FuncFlag>
</xml> ";
$musicTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>
<FuncFlag>0</FuncFlag>
</xml>";
?>
<?php
//装载模板文件
include_once("wx_tpl.php");
//获取微信发送数据
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//返回回复数据
if (!empty($postStr)){
//解析数据
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
//发送消息方ID
$fromUsername = $postObj->FromUserName;
//接收消息方ID
$toUsername = $postObj->ToUserName;
//消息类型
$form_MsgType = $postObj->MsgType;
//事件消息
if($form_MsgType=="event")
{
//获取事件类型
$form_Event = $postObj->Event;
//订阅事件
if($form_Event=="subscribe")
{
//回复欢迎文字消息
$msgType = "text";
$contentStr = "感谢您关注老狼的微信测试![愉快]\n\n想学公众平台使用的朋友请输入“跟我学”![玫瑰]";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, time(), $msgType, $contentStr);
echo $resultStr;
exit;
}
}
}
else
{
echo "";
exit;
}
?>