微信公众平台PHP开发
1.接入服务器配置
/***
* TOKEN :公众平台自定义令牌token
*/
define('TOKEN','weixin');
function checkSign(){
if(isset($_GET["signature"])&&isset($_GET["timestamp"])&&isset($_GET["nonce"])&&isset($_GET['echostr']){
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$echostr=$_GET['echostr'];
$tmpArr = array(TOKEN, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return $echostr;
exit();
}else{
return false;
}
}
}
2.获取Access token
define("APP_ID",'appid');
define("APP_SECRET",'appsecret');
function getToken(){
$url='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.APP_ID.'&secret='.APP_SECRET;
//注意配置ip白名单
$result=json_decode(file_get_contents($url));
return $result->access_token;
}
3. 接收到的消息
function getXMLObj(){
// 获取POST数据
$postData = file_get_contents("php://input");
// 判断POST数据是否为空
if (empty($postData)) {
echo "no HTTP_RAW_POST_DATA";
exit();
}
// 解析XML字符串
libxml_disable_entity_loader(true);
$xmlObj = simplexml_load_string($postData, 'SimpleXMLElement', LIBXML_NOCDATA);
return $xmlObj;
}
/**
*ToUserName=》接收的微信号
*FromUserName=》发送用户微信号
*返回时注意接收的微信号变成发送方,同理发送的用户微信号变成接收方
**/
$fromUserName = $xmlObj->ToUserName;
$toUserName = $xmlObj->FromUserName;
// 获取MsgType
$msgType = $xmlObj->MsgType;
4.获取用户信息
function getUserInfo(){
$access_token=getToken();
$userUrl='https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$toUserName.'&lang=zh_CN';
$userResult= json_decode(file_get_contents($userUrl));
return $userResult;
}
//用户昵称
$userResult->nickname
5. 事件消息回复
订阅回复
if (strtolower($msgType) == 'event') {
$event=$xmlObj->Event;
if($event=='subscribe'){
$content='Hello,'.$userResult->nickname;
// 输出消息的XML模板
$retTmp = trim("<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>");
// 对消息模板中的通配符进行替换
$resultStr = sprintf($retTmp,$toUserName, $fromUserName, time(), $content);
// 输出XML描述消息
echo $resultStr;
}
}
点击菜单栏回复图文消息
if (strtolower($msgType) == 'event') {
$event=$xmlObj->Event;
if($event=='CLICK'){
$linkUrl ='http://www.xiaolidan00.top/';
$title='聪明一丹';
$description="机智如我";
$pic='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1567744921195&di=04e8e2f926658ff25096509f927d388d&imgtype=0&src=http%3A%2F%2Fimg5.duitang.com%2Fuploads%2Fitem%2F201312%2F01%2F20131201205420_i3hRN.thumb.700_0.jpeg';
$temp = trim('<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>');
$content = sprintf($temp,$title,$description,$pic, $linkUrl);
// 输出消息的XML模板
$retTmp = trim("<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1</ArticleCount><Articles>%s</Articles></xml>");
// 对消息模板中的通配符进行替换
$resultStr = sprintf($retTmp, $toUserName, $fromUserName, time(), $content);
echo $resultStr;
}
}
6.接收消息并回复
接收文本消息并原样返回
if (strtolower($msgType)== 'text') {
$content = $xmlObj->Content;
// 输出消息的XML模板 小心空格会导致错误
$retTmp = trim("<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>");
// 对消息模板中的通配符进行替换
$resultStr = sprintf($retTmp,$toUserName, $fromUserName, time(), $content);
// 输出XML描述消息
echo $resultStr;
}
接收图片消息并原样返回
if (strtolower($msgType)== 'image') {
$content = $xmlObj->MediaId;
// 输出消息的XML模板
$retTmp = trim("<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[%s]]></MediaId></Image></xml>");
// 对消息模板中的通配符进行替换
$resultStr = sprintf($retTmp, $toUserName, $fromUserName, time(), $content);
// 输出XML描述消息
echo $resultStr;
}
接收语音消息并原样返回
if (strtolower($msgType)== 'voice') {
$content = $xmlObj->MediaId;
// 输出消息的XML模板
$retTmp = trim("<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[voice]]></MsgType><Voice><MediaId><![CDATA[%s]]></MediaId></Voice></xml>");
// 对消息模板中的通配符进行替换
$resultStr = sprintf($retTmp, $toUserName, $fromUserName, time(), $content);
// 输出XML描述消息
echo $resultStr;
}
接收位置消息并返回经纬度文本
if (strtolower($msgType)== 'image') {
$content="当前位置=》纬度:".$xmlObj->Location_X .",经度:".$xmlObj->Location_Y ;
// 输出消息的XML模板
$retTmp = trim("<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>");
// 对消息模板中的通配符进行替换
$resultStr = sprintf($retTmp, $toUserName, $fromUserName, time(), $content);
// 输出XML描述消息
echo $resultStr;
}