Fastadmin中对接微信服务号服务配置

在fastadmin中对接微信服务号服务配置,目前已经要迁移到微信开发平台操作了,当然在微信公众平台也可以操作。目前是两者兼容阶段。

之前对接过微信公众号消息配置,但是没有在fastadmin中对接过,遇到了问题,记录一下。

目录

对接微信公众号消息推送

代码实例

微信开发平台开启消息推送

授权域名和白名单ip

问题

解决问题:

总结


对接微信公众号消息推送

代码实例

我是在微信开发平台操作的。

首先准备好项目对微信平台请求进行接受参数、进行验签然后返回微信传递的字符串。

如下:

<?php

namespace app\api\controller;

use app\common\controller\Api;
use think\Log;

/**
 * 微信服务号消息处理控制器
 */
class Wechat extends Api
{
    protected $noNeedLogin = ['index'];

    protected $noNeedRight = '*';

    protected $noNeedCsrfCheck = ['*']; // 允许所有方法跳过CSRF验证

    public function _initialize()
    {
        // https://anmo.hebeihanhan.com/api/wechat/index
        parent::_initialize();
    }

    // 微信配置
    private $config = [
        'token' => '你的token', // 与微信服务器配置一致的Token
        'appid' => '微信appid', // 微信服务号AppID
        'appsecret' => '微信appsecret ', // 微信服务号AppSecret
       ];

    /**
     * 微信服务器验证与消息接收
     */
    public function index()
    {
        header("Content-type: text/html; charset=utf-8");
        $signature = $this->request->get('signature');
        $timestamp = $this->request->get('timestamp');
        $nonce = $this->request->get('nonce');
        $echostr = $this->request->get('echostr');

        Log::record('Wechat verify: ' . json_encode(input()));

        // 验证请求(仅处理GET请求)
        if ($this->checkSignature($signature, $timestamp, $nonce)) {
            // GET请求:微信服务器验证,直接返回echostr
            if (request()->isGet()) {
                echo $echostr;
            }
            // POST请求:处理微信消息/事件
            else {
                $this->handleMessage();
            }
        } else {
            echo 'Invalid signature';
        }
    }

    /**
     * 验证签名
     */
    private function checkSignature($signature, $timestamp, $nonce)
    {
        $token = $this->config['token'];
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING); // 按字符串排序
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr); // SHA1加密
        return $tmpStr == $signature;
    }

    /**
     * 处理微信消息/事件
     */
    private function handleMessage()
    {
        // 读取XML数据
        $xml = file_get_contents('php://input');
        Log::record('Wechat receive: ' . $xml); // 记录日志

        // 解析XML
        $data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        if (!$data) {
            return 'Invalid XML';
        }

        // 消息类型
        $msgType = strval($data->MsgType);

        // 根据消息类型处理(示例:文本消息回复)
        switch ($msgType) {
            case 'text':
                $reply = $this->replyText($data, '收到文本消息:' . strval($data->Content));
                break;
            case 'event':
                // 处理事件(如关注、菜单点击等)
                $event = strval($data->Event);
                $reply = $this->replyText($data, '收到事件:' . $event);
                break;
            default:
                $reply = $this->replyText($data, '暂不支持该类型消息');
        }

        echo $reply;
    }

    /**
     * 回复文本消息
     */
    private function replyText($data, $content)
    {
        $xmlTpl = <<<XML
<xml>
  <ToUserName><![CDATA[%s]]></ToUserName>
  <FromUserName><![CDATA[%s]]></FromUserName>
  <CreateTime>%s</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[%s]]></Content>
</xml>
XML;
        return sprintf($xmlTpl,
            strval($data->FromUserName),
            strval($data->ToUserName),
            time(),
            $content
        );
    }
}

需要注意:

protected $noNeedLogin = ['index'];
protected $noNeedRight = '*';

这两个一定要加上,因为是在Api目录中创建的控制器,继承了Api类的一些验证:比如登录和权限访问,要设置允许微信服务器访问。

微信开发平台开启消息推送

然后就可以在微信开放平台的服务号中设置启用消息推送

设置URL/Token。EncodingAESKey可以选择随机生成。

测试阶段先选用明文模式。点击确定进行验证。

授权域名和白名单ip

在验证之前首先确定配置了授权域名和白名单ip。

如果没有设置需要先去设置这两个,这是前置条件。

然后还要申请ssl证书,目前好像说强制要求必须是https。

如果以上都没问题,就可以确定进行验证了。

问题

在这一步因为使用fastadmin结果一直提示token验证不通过。

最后不验证签名,直接返回还是竟然不通过。

解决问题:

解决问题的前提是要找到问题,通过微信调试工具进行对接。

发现返回的字符串中还有其他东西,如下:

原来是没有关闭trace调试信息。

关闭后再测试,就直接成功了。

总结

一点小问题,主要还是对于fastadmin不太熟悉。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JSON_L

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

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

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

打赏作者

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

抵扣说明:

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

余额充值