欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

微信公众平台PHP开发

程序员文章站 2022-06-12 20:45:07
...

微信公众平台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;
    }