《软件工程》实训指导书
微信实验三、微信公众号开发者PHP入门
开源项目:https://github.com/chenxhjeo,个人博客:http://blog.csdn.net/u013487761
技术QQ群名称:豆豆咨询,群号:625686304
微信公众号名称:豆豆咨询,微信公众号:douAsk
初建日期:2017.03.29修改日期:2017.03.29
一、实验目的
1、掌握微信公众号后台开发PHP接收数据、发送数据。
二、实验内容
1、成为微信开发者;
2、在家、寝室、实验室等环境,配置开发环境;
3、在微信PHP后台验证。
4、PHP接收用户输入以及回送消息。
三、实验步骤及过程
由于手机端特性(例如内存小)与微信广泛应用,微信开发与应用成为当前的开发热点。但微信公众号存在一些局限,例如难以通过查询功能得到想要的结果。以下我们将引导大家如何成为微信公众号的开发者。
1、如何成为微信开发者,即取得开发者密钥。
1)在微信后台(通过https://mp.weixin.qq.com登录)点击开发->基本配置,打开基本配置页面,如下所示。
2)生成AppSecret(应用密钥):需要完成三个步骤,如图所示:
a)身份确认:二维码扫描,授权设置开发者密钥。
b)密码验证:输入登录密码和验证码,如下图所示。
c)查看AppSecret(微信为AppSecert,哈哈,是不是英语写错了?):注意保存好你的AppID和AppSecret,如下图所示。
2、在家、寝室、实验室、公网等环境,配置开发环境。
如果您在家、寝室、实验室等环境,想配置开发环境,那么请关注“豆豆咨询”公众号,我们将传递给您具体的手册及工具。
1)这里假设您具有公网地址或者域名,则配置URL(服务器地址)、Token(令牌)、EncodingAESKey(消息加密密钥)、消息加密方式,如下图所示。
2)填写URL(服务器地址)、Token(令牌)、EncodingAESKey(消息加密密钥)、消息加密方式信息。分别解释如下:
a)URL是你服务器的地址,具有验证、接收消息、发送消息等功能的服务器,分别支持80端口和443端口。
b)Token是自己设定的令牌,必须为英文或者数字,长度为3-32字符。
c)EncodingAESKey为消息加密密钥,随机产生,由43位字符组成,字符范围为A-Z,a-z,0-9。
d)消息加密方式:根据业务需要,可以设定明文模式、兼容模式、安全模式,系统推荐安全模式。我们以明文模式简化开发流程,如下图所示。
注意:微信开放平台账号的绑定在内测中。
3、在微信PHP后台验证。主要涉及到验证消息,确认微信服务器能够确认您所建立服务器的具有相关权限,具体PHP代码如下:
//define yourtoken
define("TOKEN","weixin");
echo"I'am already Waiting for something...S.";
$wechatObj =new wechatCallbackapiTest();
$wechatObj->valid();//验证消息
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo$echoStr;
exit;
}
}
private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is notdefined!');
}
$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;
}
}
}
?>
4、在微信PHP后台接收用户输入的消息和回送给用户的消息。微信要求必须在5秒之内得到回复,如果没有得到回复,则尝试三次。PHP接收消息和发送消息代码描述如下:
define("TOKEN","weixin");
echo"I'am already Waiting for something...S.";
$wechatObj =new wechatCallbackapiTest();
$wechatObj->responseMsg ();//发送消息
private function is_utf8($str)//判断是否是utf8编码
{
returnpreg_match('//u', $str);
}
public function responseMsg()
{
//get post data, May be due tothe different environments
$postStr =$GLOBALS["HTTP_RAW_POST_DATA"];
//extractpost data
if (!empty($postStr)){
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);
$content = trim($postObj->Content);//消息内容json_encode($postObj->Content);
$contentStr = '你发送的信息是:接收人:'.$toUsername.',发送人:'.$fromUsername.',消息类型:'.$MsgType.',消息内容:'.$content.' ';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername,$time, $msgType, $contentStr);
if ($this->is_utf8($resultStr)) {
//$resultStr = $resultStr;
} else {
//$resultStr = iconv('gb2312', 'UTF-8//IGNORE',$resultStr);
}
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo"";
exit;
}
}
四、常见错误
1、验证不通过:在windows开发,主要由于编码的差异导致验证不通过,如果你遇到了类似问题还无法解决,请成为关注“豆豆咨询”公众号,我们将为您解答问题。
2、接收和发送中文信息,有时候会出现乱码,原因也是同上所示。解决方法是采用utf-8编码。如果你遇到了类似问题还无法解决,请成为关注“豆豆咨询”公众号,我们将为您解答问题。
五、技术服务
1、如果有疑问或者需要帮助,请加入QQ群(群名称:豆豆咨询,群号:625686304);或者公众号douAsk,公众号名称为“豆豆咨询”。扫描以下二维码,关注“豆豆咨询”。
2、本文的程序链接地址为 https://github.com/CompSchool/ThinkPHP/blob/master/application/weixin/check.php。