thinkphp6公众号实现自动回复

第一步:服务器接入微信公众号

1.点击提交后,微信会发送get请求到你指定的url进行验证,验证代码是下面的test方法

2.设置好路由

3.当验证成功后,用户像微信号发送的内容都会post一份到你的服务器中

测试消息接收和回复函数。

这里值得注意的是对微信公众平台发送的校验信息和公众号发送的内容信息的区分。

(1) 发送来的数据包中 echostr(随机字符串)不为空是校验信息。

​ 发送来的数据包中 echostr(随机字符串)为空是内容消息。

(2) 发送来的数据包中不包含 content 关键字为校验消息。

​ 发送来的数据包中包含 content 关键字为内容消息。

完整代码:

<?php
namespace app\Api\controller;

use app\BaseController;
use think\facade\Log;
use think\facade\Request;
class Send extends BaseController
{
    /**
      * 接收消息
      * @author Why
      * @return array $resArr 返回结果
      */
    public function recMsg(){
        //接收微信发送的XML数据包
        $postObj =  file_get_contents("php://input");
        // Log::write('postObj:'.$postObj);
        //解析XML数据包为数组格式:SimpleXMLElement::__set_state(array())
        $postArr = simplexml_load_string($postObj, "SimpleXMLElement", LIBXML_NOCDATA);
        // Log::write('postArr:'.$postArr);
        //获取数组中用户发送的内容
        $content = $postArr->Content;

        //将获取的内容转换为普通数组,方便以后的业务逻辑编写
        $jsonStr = json_encode($content);
        $resArr  = json_decode($jsonStr,true);
    
        return $resArr;
    }

    /**
      * 回复消息
      * @author Why
      * @param  string $content  回复内容
      * @return xml    $resMsg   返回结果
      */
    public function resTextMsg($content)
    {
        //接收微信发送的XML数据包
        $postObj =  file_get_contents("php://input");
    
        //解析XML数据包为数组格式:SimpleXMLElement::__set_state(array())
        $postArr = simplexml_load_string($postObj, "SimpleXMLElement", LIBXML_NOCDATA);
    
        //获取数组中的ToUserName
        $toUserName = $postArr->ToUserName;
    
        //获取数组中的FromUserName
        $fromUserName = $postArr->FromUserName;
    
        //config辅助函数调用config/extend目录下的回复消息格式
        $tempText = config('app.text');
        Log::write($tempText);
        //依次替换XML数据包模板中的%s
        $resMsg = sprintf($tempText, $fromUserName, $toUserName, $content);
    
        return $resMsg;
    }

    /**
      * @author Why
      * @param  Request    $request 请求对象
      * @return xml|string $resMsg  
      */
    public function test(Request $request){
        // $data = file_get_contents("php://input");
        // Log::write($request::post());
        // Log::write($data);
        $echoStr = $request::param('echostr');
        // Log::write($request::param());
        //随机字符串$echostr不为空
        if($echoStr&&$this->isWechat($request)){
            //校验微信公众号

         echo $echoStr; 
         exit;

        }

        //随机字符串$echostr为空,接收消息
        $content = $this->recMsg($request);
    
        //将数组转换为字符串
        $conStr = implode($content);
        Log::write($conStr);
        //字符串拼接
        $resStr = '您说:'.$conStr;
    
        //回复消息
        $resMsg = $this->resTextMsg($resStr);
        return $resMsg;
    }

    /**
     * 校验微信公众号
     * @author Why
     * @param  Request $request 请求对象
     * @return string          校验结果
     */
    public function isWechat($request)
    {
        //Token
        $token = 'lmp5023';
        
        //获取签名
        $signature = $request::param('signature');
    
        //获取随机字符串
        // $echostr   = $request::param('echostr');
    
        //获取时间戳
        $timestamp = $request::param('timestamp');
    
        //获取随机数
        $nonce     = $request::param('nonce');
    
        //1)将token、timestamp、nonce三个参数进行字典序排序
        $array = array($timestamp, $nonce, $token);
        sort($array);
    
        //2)将三个参数字符串拼接成一个字符串进行sha1加密
        $temp = implode($array);
        $temp = sha1($temp);
        // Log::write($temp.'-'.$signature);
        //3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
        if($temp === $signature)
        {
            // Log::write($echostr);
            return true;
        }else{
            return false;
        }
    }

}

把XML代码写到配置文件,你也可以不放在配置文件里

    'text' => '<xml>
                      <ToUserName><![CDATA[%s]]></ToUserName>
                      <FromUserName><![CDATA[%s]]></FromUserName>
                      <CreateTime>'.time().'</CreateTime>
                      <MsgType><![CDATA[text]]></MsgType>
                      <Content><![CDATA[%s]]></Content>
               </xml>'

参考地址:https://blog.csdn.net/qq_42651415/article/details/114477255

猜你喜欢

转载自blog.csdn.net/lmp5023/article/details/114921041