在fastadmin中对接微信服务号服务配置,目前已经要迁移到微信开发平台操作了,当然在微信公众平台也可以操作。目前是两者兼容阶段。
之前对接过微信公众号消息配置,但是没有在fastadmin中对接过,遇到了问题,记录一下。
目录
对接微信公众号消息推送
代码实例
我是在微信开发平台操作的。
首先准备好项目对微信平台请求进行接受参数、进行验签然后返回微信传递的字符串。
如下:
<?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不太熟悉。
1926

被折叠的 条评论
为什么被折叠?



