在微信开发之前需要了解一下内容:
微信公众号的编辑者模式和开发者模式的区别?
编辑者模式只是单纯图文编辑,类似在word下的操作。开发者模式是微信团队开放给第三方服务器接入微信服务器与微信用户交互的一种方式(微信用户->客户,微信服务器->蛋糕店售卖员,第三方服务器->蛋糕师):微信用户发送请求给微信服务器把拿到微信用户的请求通过开发者模式的URL(如http://www.baidu.com/index.php就是:第三方服务器地址/入口文件)发给第三方服务器。
理解上面的工作原理的流程之后,跟着下面的步骤来做慢慢来感受一下:
第一步(注册配置公众号测试号):
需要有一个认证的微信服务号,如果没有可以申请一个测试号:
打开浏览器登录网址:点击这里
2.登录后微信团队会给你一个appID和appsecret,接下来你要填写的就是你的自己的URL和Token了(URL是你的服务器的访问域名,如果没有自己的线上服务器的话可以看下面的第二步,如果有的话跳到第三步;Token是微信服务器与你服务器连接起来的一个密钥(yourtoken)(一串随意的字符串(自己定义即可,跟微信访问你项目入口文件的一致即可)请看下面第三步))
第二步(ngrok映射自定义域名访问本地项目):
第一种情况:有自己线上服务器的并且绑定域名的,跳过。
第二种情况:没有自己线上服务器的,只有本地服务器和个人项目的,需要进行以下的配置:
{1.下载并解压适合你的版本
2.用记事本打开 run.bat 修改方法是:把myapp 改为你自己的本地项目文件夹名称
(如我的的是wjxwxt);
3.双击run.bat ,配置成功后会出现以下画面:
}
2.自定义域名访问自己的项目(也就是配置 http://yourprojectname.ngrok.natapp.cn
(这个也是你在微信公众测试号配置的URL了)) 这里具体怎么做可以看我之前分享的文章:点击查看
第三步(本地项目入口文件配置):
1.新建一个wechat_index.php,代码如下:
/**
* wechat php test
*/
//define your token
define("TOKEN", "yourtoken");
$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 = "
%s
0
";
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;
}
}
}
?>
上述代码也可以简洁为如下:
//1.将timestampe,nonce,token按字典序排序
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$token = 'jinhuaWeixin';
$signature = $_GET['signature'];
$array = array($timestamp, $nonce, $token);
sort( $array );
//2.将排序后的三个参数拼接之后用sha1加密
$tmpstr = implode( '', $array );
$tmpstr = sha1( $tmpstr );
//3.将加密后的字符串与signature进行对比,判断该请求是否来自微信
if( $tmpstr == $signature ){
echo $_GET['echostr'];
}
?>
2.回到微信公众测试号 填写好 URL 和Token 之后提交,如果配置成功即说明你的项目已经可以在ngrok的映射下成功和微信服务器连接成功,接下来就是把入口文件的 $wechatObj->valid();调用的方法改为调用其它方法来实现你的需求了,也可以在你调用的方法里面实例化你本人封装好的类来调用你的方法或者直接调用函数。
^_^爱分享,爱生活。