服务器配置
前言
本系列使用公众平台测试账号进行调试,加密方式采用明文,基于 PHP 8.2 使用 Laravel 11 框架进行开发
公众平台测试账号地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
微信官方文档:https://developers.weixin.qq.com/doc/
Laravel 11 中文文档(非官网):https://laravel-docs.catchadmin.com/
第一步:接口配置信息修改(准备)
URL:指的是你后端接收微信回调的接口地址,例如:https://demo.com/wechat/off-callback
Token:这个是随便填的(建议复杂一点),后面获取微信的AccessToken要用到,相当于钥匙、密码
没有服务器的同学可以使用内网穿透工具(如 ngrok)进行开发。
第二步:后端 URL 接口处理
后端接口需要拥有两种接收请求的方式,分别是 GET 和 POST
因为填写服务器配置的时候,微信公众号会先发送一个GET请求验证服务器地址是否准确,其它的回调都是用POST请求
Ⅰ: 验证服务器地址 | 验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上, 服务器接收到参数之后需要验证签名,然后直接返回 echostr 参数即可完成服务器配置
GET请求携带参数如下所示:
{
"signature":"微信加密签名",
"timestamp":"时间戳",
"nonce":"随机数",
"echostr":"随机字符串"
}
PHP生成明文签名示例:
/**
* 生成请求签名,用于公众号明文签名验证
*
* 1)将token、timestamp、nonce三个参数进行字典序排序
* 2)将三个参数字符串拼接成一个字符串进行sha1加密
* 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
*
* @param string $token 公众号token
* @param int $timestamp 时间戳
* @param string $nonce 随机字符串
*
* @return string 签名
*/
public static function offSignature(string $token, int $timestamp, string $nonce): string
{
$signData = [$token, $timestamp, $nonce];
// 字典序排序
sort($signData, SORT_STRING);
$text = implode('', $signData);
return sha1($text);
}
签名验证通过之后,直接返回参数中的 echostr 给微信即可
Laravel 11 代码示例
Controller 控制器
/**
* 测试公众号回调
*/
public function offMsgCallback(Request $request)
{
// 获取并验证URl参数
$queryData = $request->validate([
'signature' => 'required|string',
'timestamp' => 'required|integer',
'nonce' => 'required|integer',
'echostr' => 'required|string'
]);
// 验证签名
return $this->weChatTestService->offErify($queryData);
}
Service 服务层
/**
* 验证公众号服务器配置
*/
public function offErify(array $data): string
{
// 验证签名
if ($data['signature'] !== WeChat::offSignature($this->offToken, $data['timestamp'], $data['nonce'])) {
abort(400, '签名错误');
}
return $data['echostr'];
}
Route 路由
// 公众号服务器配置接口
Route::match(['get', 'post'], 'msg-callback', [\App\Http\Controllers\tp\WeChatTestController::class, 'offMsgCallback']);