https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
https://ninghao.net/blog/1441
1. 公众平台配置
-
登录微信公众平台
-
开发--> 基本配置, 将服务器ip12.23.34.45加入到ip白名单中
image.png -
验证token
image.png -
此时点击提交, 肯定会失败, 因为微信服务器请求PHP服务器, 转发到
/accept
下, 还没有php路由去处理该请求, 使用laravel编写处理方法, 验证消息的确来自微信服务器
2. 编写验证token逻辑
- 路由文件web.php
Route::middleware(['weixin.verify'])->group(function (){
// 处理get请求, 验证token, 使用authToken处理
Route::get('accept', 'Auth\WeixinController@authToken');
// 微信服务器发来的post消息, 使用acceptMessage方法处理
Route::post('accept', 'Auth\WeixinController@acceptMessage');
});
- 中间件weixin.verify, 用于验证消息的确来自微信服务器
app/Http/Middleware/VerifyWeixin.php
<?php
namespace App\Http\Middleware;
use Closure;
use Log;
class VerifyWeixin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// 获取到微信请求里包含的几项内容
Log::alert($request->all());
$signature = $request->input('signature');
$timestamp = $request->input('timestamp');
$nonce = $request->input('nonce');
// 微信服务器配置中填写的token, 此处应该加入到配置文件中
$token = 'wodetoken';
// 加工出自己的 signature
$our_signature = array($token, $timestamp, $nonce);
sort($our_signature, SORT_STRING);
$our_signature = implode($our_signature);
$our_signature = sha1($our_signature);
Log::alert($our_signature);
// 用自己的 signature 去跟请求里的 signature 对比
if ($our_signature != $signature) {
return fasle;
}
return $next($request);
}
}
- 注册中间件
app/Http/Kernel.php
protected $routeMiddleware = [
'weixin.verify' => \App\Http\Middleware\VerifyWeixin::class,
];
- 控制器逻辑
app/Http/Controllers/Auth/WeixinController.php
<?php
/**
* 认真编码 快乐生活
* User: helloJiu
* Date: 2018/11/27
* Time: 13:16
*/
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class WeixinController extends Controller
{
// 通过中间件后, 直接将echostr返回, token验证通过
public function authToken(Request $request)
{
return $request->input('echostr');
}
}
重新提交, token完成验证
验证完全可以在public目录下创建一个php文件去实现该功能, 但是后续的接受微信消息, 如订阅, 扫描, 输入事件等, 也需要使用中间件验证是否是微信服务器发来的请求
3. 启用服务器配置
image.png这样公众号收到消息后, 微信服务器就会通过post的方式推送到我们自己服务器的accept路由下, 使用Auth\WeixinController@acceptMessage
去处理
acceptMessage方法后续编写
网友评论