public function notify(Request $request): Response
{
try {
$app = $this->getEasyApp($request);
$server = $app->getServer();
//1、使用微信平台证书,验证签名
try {
$app->getValidator()->validate($app->getRequest());
} catch (\Exception|\Throwable $e) {
throw new InvalidArgumentException('验证签名失败');
}
//2、循环接收验证信息
//$server->getRequestMessage()
$server->handlePaid(function (Message $message, \Closure $next) use ($app) {
//2.1、获取商户订单号
$msgArray = $message->toArray();
//2.2、订单查询结果
$result = $app->getClient()->get("v3/pay/transactions/out-trade-no/{$msgArray['out_trade_no']}", [
'query'=>[
'mchid' => $app->getMerchant()->getMerchantId()
]
])->toArray();
//2.3、支付成功处理业务
if ($result['trade_state'] === 'SUCCESS') {
Db::transaction(function () use ($msgArray) {
//2.3.1、 更新订单状态为已支付
.....
//2.3.2、记录支付成功信息
....
//2.3.3、写入缓存,备前端轮循
Cache::set($msgArray['out_trade_no'], '', 120);
}, 3);
}
//2.4、未收到成功消息继续下一个循环接收
return $next($message);
});
// 默认返回 ['code' => 'SUCCESS', 'message' => '成功']
$response = $server->serve();
return new Response(
$response->getStatusCode(),
$response->getHeaders(),
$response->getBody()->getContents()
);
} catch (\Throwable $throwable) {
Log::error('[' . __METHOD__ . '][微信支付回调通知] 异常:' . $throwable->getMessage() . PHP_EOL . $throwable->getTraceAsString());
$data = ['code' => 'FAIL', 'message' => $throwable->getMessage()];
return new Response(
400,
['Content-Type' => 'application/json'],
json_encode($data, JSON_UNESCAPED_UNICODE)
);
}
}
评论已关闭