laravel 实现微信公众号关注回复文本消息

本文介绍了如何在Laravel框架下处理微信公众号的服务器配置,包括检查Signature验证及响应用户消息,重点讲解了`checkSignature`和`reponseMsg`方法的应用与常见问题解决。
摘要由CSDN通过智能技术生成

微信公众号文本消息

  • 首先需要创建一个微信公众号

  • 在基本配置中添加服务器配置(已启用),验证接口

  • 代码

<?php

namespace App\Http\Controllers\Weixin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class IndexController extends Controller
{
    public function checkSignature(Request $request)
    {
        if($request->method()=='GET'){
            $signature = $_GET['signature'];
            $timestamp = $_GET['timestamp'];
            $nonce = $_GET['nonce'];
            $token = 'mayuliang';
            $tmpArr = array($token, $timestamp, $nonce);
            sort($tmpArr);
            $tmpStr = sha1(implode($tmpArr));
            if($tmpStr == $signature && isset($_GET['echostr']) && $_GET['echostr']) {
                echo  $_GET['echostr'];
                Log::error('success', ['message'=>'success']);
                exit;
            }
        } else { 
            echo $this->reponseMsg();
        }
    }

    public function reponseMsg()
    {
        $postStr = file_get_contents("php://input");
        $postArr = json_decode(json_encode(simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        Log::error('error', ['message'=>$postArr['FromUserName']]);
        $FromUserName = $postArr['FromUserName']; //获取发送方帐号(OpenID)
        $ToUserName = $postArr['ToUserName']; //获取接收方账号
        Log::error('error',['message'=>$postArr['MsgType']]);
        if (strtolower($postArr['MsgType'])=='event') {
            if(strtolower($postArr['Event'])=='subscribe'){
                $template = "<xml>
                              <ToUserName><![CDATA[%s]]></ToUserName>
                              <FromUserName><![CDATA[%s]]></FromUserName>
                              <CreateTime>%s</CreateTime>
                              <MsgType><![CDATA[%s]]></MsgType>
                              <Content><![CDATA[%s]]></Content>
                            </xml>";
                $content = '欢迎关注';
                $type = "text";
                $resultStr = sprintf($template,$FromUserName,$ToUserName, time(), $type, $content);
                Log::error('error', ['message'=>$resultStr]);
                return $resultStr;
            }
        }
    }
}

遇到的坑:

  1. laravel框架需要处理验证,需要去 Kernel.php 中去掉 VerifyCsrfToken::class
  2. 接收到的ToUserName 是目标 FromUserName
  3. 网上很多simplexml_load_string($postStr, ‘SimpleXMLElement’, LIBXML_NOCDATA)但是我没有获取到,json_decode(json_encode(simplexml_load_string($postStr, ‘SimpleXMLElement’, LIBXML_NOCDATA)), true)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光帅气男孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值