EnterpriseWechatController.php 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Jobs\WxProcessDataJob;
  4. use App\Model\EnterpriseRecord;
  5. use App\Service\EnterpriseWechatService;
  6. use Illuminate\Support\Facades\Http;
  7. use Illuminate\Support\Facades\Log;
  8. class EnterpriseWechatController extends BaseController
  9. {
  10. /**
  11. * 企业微信回调统一入口 (验证 URL & 接收事件)
  12. */
  13. public function serve()
  14. {
  15. $service = new EnterpriseWechatService();
  16. $app = $service->getApp();
  17. // 1. 定义收到数据后的逻辑
  18. $app->server->push(function ($message) use ($app) {
  19. // 判断是否为审批状态变动通知
  20. Log::channel('apiLog')->info('企业微信', ['msg' => $message]);
  21. if ($message['Event'] === 'sys_approval_change') {
  22. $info = $message['ApprovalInfo'];
  23. $templateId = $info['TemplateId']; // 拿到模板ID
  24. $status = (int)$info['SpStatus']; // 强制转为整数防止类型判断坑
  25. $spNo = $info['SpNo'];
  26. // 仅在状态为 2 (通过) 或 3 (驳回) 时存入数据库
  27. if ($status === 2 || $status === 3) {
  28. $array = [
  29. 'sp_no' => $spNo,
  30. 'template_id' => $templateId,
  31. 'sp_status' => $status,
  32. 'crt_time' => now(),
  33. ];
  34. $count = EnterpriseRecord::insertOrIgnore($array);
  35. if($count > 0 && $status == 2) WxProcessDataJob::dispatch($array)->onQueue(EnterpriseRecord::$job);
  36. }
  37. }
  38. });
  39. // 核心逻辑:serve() 会自动判断请求类型
  40. // 如果是 GET 请求,它会自动处理校验逻辑并返回明文 echostr
  41. // 如果是 POST 请求,它会进入消息处理流程
  42. return $app->server->serve();
  43. }
  44. }