您的位置:首页 > 移动开发 > 微信开发

微信公众号开发-服务器配置、关注后收到欢迎消息

2017-05-21 15:05 651 查看

公众号注册

微信公众号开发首先需要注册一个公众号,公众号分为订阅号、服务号和企业号。订阅号是最基础的公众账号,用于开发的话API接口会受到一些限制;公众号的开发大都是基于服务号进行的,服务号的开通和认证需要填写一些企业名称和营业执照注册号;企业号主要为公司内部通讯。由于不具备服务号和企业号的注册条件,暂且注册一个订阅号开始基础研究。

配置服务器

登录公众号,开启开发者模式后,就需要配置自己的服务器了。要配置自己的服务器首先得先有一台服务器,服务器我最开始申请的是百度BAE,发现对于上传下载代码不太会用。又申请了腾讯云,申请的是Ubuntu16.04的服务器,这下子熟悉了,需要什么环境自己可以自由配置。但是照着网上好多博客的配置,发现在微信公众平台上服务器的配置提交是能通过的,但是一直不能与关注者(用户)进行互动,比如用户关注了不能回复欢迎消息。服务器配置如下



这里我域名直接用的IP地址,我怀疑不能直接用IP地址作为域名,腾讯云注册时也没分配域名,没找到配置域名的地方。

我又注册了个新浪云,新浪云给分配域名了,服务器配置如下:



这次提交成功了,用户关注后能回复欢迎消息了。当然服务器配置要想提交成功,得提前在自己的web服务器上建立用于验证的文件,我建立的是微信提供的wx_sample.php

<?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)){

$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()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];

$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}

?>


自己搭建的服务器与微信公众平台服务器验证成功后,接下来就可以实现自己想实现的功能了。在这里实现的是用户关注后,回复欢迎消息,用户回复任何不为空的消息,回复“谢谢您的回复!”

修改wx_sample.php为以下内容

<?php
/**
* wechat php test
*/

//define your token
define("TOKEN", "******");//与服务器配置时的token需一致
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$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)){
//解析数据
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
//发送消息方ID
$fromUsername = $postObj->FromUserName;
//接收消息方ID
$toUsername = $postObj->ToUserName;
//消息类型
$form_MsgType = $postObj->MsgType;
$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>";
$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>";
//事件消息
if($form_MsgType=="event")
{
//获取事件类型
$form_Event = $postObj->Event;
//订阅事件
if($form_Event=="subscribe")
{
//回复欢迎文字消息
$msgType = "text";
$contentStr = "感谢您关注Super King的微信公众号[玫瑰]";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, time(), $msgType, $contentStr);
echo $resultStr;
exit;
}
}
//如果用户发送内容不为空,回复“谢谢您的回复!”
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "谢谢您的回复!";
$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);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}

?>


用个人微信扫描公众号二维码,关注后进行测试

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息