+
95
-

php如何接受公众号用户消息并处理?

php

php如何接受公众号用户消息并处理?


网友回复

+
15
-
<?php
/**
* 微信公众平台操作类
*/
class WeChat
{
    private $_appid;
    private $_appsecret;
    //微信公众平台请求开发者的服务器需要token
    private $_token;

    //标识qrcodeticket的类型,是永久还是临时
    const QRCODE_TYPE_TEMP = 1;
    const QRCODE_TYPE_TEMP_STR = 2;
    const QRCODE_TYPE_LIMIT = 3;
    const QRCODE_TYPE_LIMIT_STR = 4;

    /**
    * 构造函数
    * @param string $id     appid
    * @param string $secret app秘钥
    */
    public function __construct($id, $secret, $token) {
        $this->_appid = $id;
        $this->_appsecret = $secret;
        $this->_token = $token;
    }

    /**
    * 用于第一次验证URl合法性
    */
    public function firstValid() {
        //校验签名的合法性
        if ($this->_checkSignature()) {
            //签名合法,告知微信服务器
            echo $_GET['echostr'];
        }
    }
    /**
    * 验证签名
    * @return [type] [description]
    */
    private function _checkSignature() {
        //获取由微信服务器发过来的数据
        $signature = $_GET['signature'];
        $timestamp = $_GET['timestamp'];
        $nonce = $_GET['nonce'];
        //开始验证数据
        $tmp_arr = array($this->_token, $timestamp, $nonce);
        sort($tmp_arr, SORT_STRING);
        $tmp_str = implode($tmp_arr);
        $tmp_str = sha1($tmp_str);
        //对比数据
        if ($signature == $tmp_str) {
            return true;
        } else {
            return false;
        }
    }

    /**
    * 消息类型判断
    * @return array
    */
    public function responseMsg() {
        //因为很多都设置了register_globals禁止,不能用$GLOBALS["HTTP_RAW_POST_DATA"] 改用file_get_contents("php://input")即可
        $postStr = file_get_contents("php://input");
        if (!empty($postStr)) {
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);
            //用户发送的消息类型判断
            switch ($RX_TYPE) {
                case "text":    //文本消息
                    return array('type' => 'text', 'msg' => '文本', 'obj' => $postObj);
                    break;
                case "image":   //图片消息
                    return array('type' => 'image', 'msg' => '图片', 'obj' => $postObj);
                    break;

                case "voice":   //语音消息
                    return array('type' => 'voice', 'msg' => '语音', 'obj' => $postObj);
                    break;
                case "video":   //视频消息
                    return array('type' => 'video', 'msg' => '视频', 'obj' => $postObj);
                    break;
                case "location"://位置消息
                    return array('type' => 'location', 'msg' => '位置', 'obj' => $postObj);
                    break;
                case "link":    //链接消息
                    return array('type' => 'link', 'msg' => '链接', 'obj' => $postObj);
                    break;
                case "event":    //事件消息
                    return array('type' => 'event', 'msg' => $postObj->Event, 'obj' => $postObj);
                    break;
                default:
                    return array('type' => 'unknow msg type', 'msg' => '未知', 'obj' => $postObj);
                    break;
            }
        } else {
            echo "";
            exit;
        }
    }


    /**
    * 获取 access_tonken值
    * @param string $token_file 用来存储的文件
    * @return access_token
    */
    public function getAccessToken($token_file = 'access_token_file') {
        //处理是否过期问题,将access_token存储到文件
        $life_time = 7200;
        if (file_exists($token_file) && time() - filemtime($token_file) < $life_time) {
            // 存在有效的access_token 直接返回文件内容
            return f...

点击查看剩余70%

我知道答案,我要回答