EnterpriseWechatController.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use EasyWeChat\Factory;
  4. use Illuminate\Support\Facades\Http;
  5. use Illuminate\Support\Facades\Log;
  6. class EnterpriseWechatController extends BaseController
  7. {
  8. /**
  9. * 企业微信回调统一入口 (验证 URL & 接收事件)
  10. */
  11. public function serve()
  12. {
  13. $config = [
  14. 'corp_id' => 'ww83d8e358fe7f71b7',
  15. 'agent_id' => 1000007, // 自建应用的 AgentId
  16. 'secret' => '5kJcYML2kJ_ojLQ-1KuzXo_rsMs2T74M6RjQmJ5uG6A',
  17. 'token' => 'U0GQ5SI5RkOh5DA9wI',
  18. 'aes_key' => 'Ces99dugJYEGSgBfCFUg43lI1e1TGWh7HRSmboUiS5N',
  19. ];
  20. $app = Factory::work($config);
  21. // 1. 定义收到数据后的逻辑
  22. $app->server->push(function ($message) use ($app) {
  23. // 判断是否为审批状态变动通知
  24. Log::channel('apiLog')->info('企业微信', ['msg' => $message]);
  25. if ($message['Event'] === 'sys_approval_change') {
  26. $info = $message['ApprovalInfo'];
  27. $templateId = $info['TemplateId']; // 拿到模板ID
  28. $status = (int)$info['SpStatus']; // 强制转为整数防止类型判断坑
  29. $spNo = $info['SpNo'];
  30. if ($status === 2) {
  31. // 【核心:二次查询】拿着单号去获取单据里的详细内容(请假天数、理由等)
  32. $detail = $app->oa->approvalDetail($spNo);
  33. Log::channel('apiLog')->info('企业微信结果', ['msg' => $detail]);
  34. // 情况 A:最终通过
  35. // 此时应该调用 $app->oa->approvalDetail($spNo) 获取详情并同步到你的数据库
  36. // \Log::info("审批单 [{$spNo}] 最终通过,准备发放福利/记录考勤");
  37. } elseif ($status === 3) {
  38. // 情况 B:最终驳回
  39. // 此时你可能需要更新本地单据状态为“已作废”
  40. // \Log::info("审批单 [{$spNo}] 被驳回,流程结束");
  41. }
  42. // 其他状态(如 1-审批中)直接忽略,不处理任何业务
  43. }
  44. });
  45. // 核心逻辑:serve() 会自动判断请求类型
  46. // 如果是 GET 请求,它会自动处理校验逻辑并返回明文 echostr
  47. // 如果是 POST 请求,它会进入消息处理流程
  48. return $app->server->serve();
  49. }
  50. }