php 开发 微信公众号报错 Undefined index: HTTP_RAW_POST_DATA

22 篇文章 0 订阅
1 篇文章 0 订阅

 出现错误原因:

               php 7以下版本,php.ini开启;always_populate_raw_post_data = On 

               PHP 7以后的版本不支持全局变量:always_populate_raw_post_data,所以会报错,解决办法:把下面代码

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"] 

修改为:

$postStr = file_get_contents("php://input");

顺便贴上完整代码供参考: 

public function index()
    {
        $timestamp = $_GET['timestamp'];//timestamp其实就是一个时间戳
        $nonce     = $_GET['nonce'];//nonce是一个随机参数
        $token     = "公众号后台配置的token";//这个token填写你在微信公众平台上写的那个值
        $signature = $_GET['signature'];//这个signature其实就是在微信公众平台已经加密好的字符串
        $echostr   = $_GET['echostr'] ?? '';
        $array     = array($timestamp, $nonce, $token);
        sort($array);
        $tmpstr = implode('', $array);
        $tmpstr = sha1($tmpstr);
        if ($tmpstr == $signature && $echostr) {
            ob_clean();
            echo $echostr;
            exit;
        } else {
            $this->responseMsg();

        }
    }
    public function responseMsg()
    {
        //get post data, May be due to the different environments

        $postStr = file_get_contents("php://input"); //php 7 以上版本
        //$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //php 7以下版本,php.ini开启;always_populate_raw_post_data = On

        //extract post data 请求数据
        if (!empty($postStr)) {

            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $keyword = trim($postObj->Content);
            $time    = time();
            $toUser   = $postObj->FromUserName;
            $fromUser = $postObj->ToUserName;
            $eventKey = $postObj->EventKey ?? '';
            $ticket   = $postObj->Ticket ?? '';
            if (strtolower($postObj->MsgType) == 'event') {
                //如果是关注事件(subscribe)
                if (strtolower($postObj->Event == 'subscribe')) {
                    //回复用户消息
                    $data     = [
                        'open_id'   => $toUser,
                        'event_key' => $eventKey,
                        'ticket'    => $ticket,
                    ];
                    //关注数据写入数据库
                    list($status,$res) = GzhFollow::updateGzhFollowInfo($data);
                    if(!$status){
                        ownLogs('test.log', $res);
                    }
//                    ownLogs('test.log', 'fromUser=' . $fromUser . '|toUser=' . $toUser . '|keyword=' . $keyword);

                }
                //取消关注事件(subscribe)
                if (strtolower($postObj->Event == 'unsubscribe')) {
                    //更新GzhFollow表status为取消关注
                    $open_id = $toUser;
                    $info = GzhFollow::getFollowInfoByOpenId($open_id);
                    if($info){
                        $info->status = GzhFollow::STATUS['off'];
                        $info->save();
                    }
                }
                //扫描带参数二维码事件
                if($eventKey && $ticket){
                    $msgType     = 'text';
                    $store_name  = '李伟';//测试数据先写死
                    $description = '【' . $store_name . "】的店铺!";
                    //文字消息处理成超链接(因为我现在需求要跳转到小程序)
                    $content     = '点击进入' . '<a data-miniprogram-appid="你的服务号openid" data-miniprogram-path="/pages/index/index">' . $description . '</a>';
                    $template    = "<xml>
                                  <ToUserName><![CDATA[%s]]></ToUserName>
                                  <FromUserName><![CDATA[%s]]></FromUserName>
                                  <CreateTime>%s</CreateTime>
                                  <MsgType><![CDATA[%s]]></MsgType>
                                  <Content><![CDATA[%s]]></Content>
                                </xml>";

                    $info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
                    echo $info;
                }
            }

        } else {
            echo "";
            exit;
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值