OfficialNotify.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. namespace App\Http\Controllers\Api\Wechat;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Api\Personnel\EmployeeOpenid as EmployeeOpenidModel;
  5. use App\Facades\Servers\Logs\Log;
  6. use App\Servers\Wechat\Official;
  7. class OfficialNotify extends Controller
  8. {
  9. /**
  10. * 公众号关注回调 - 自动绑定用户公众号OpenID
  11. * @author 唐远望
  12. * @version 1.0
  13. * @date 2026-03-10
  14. */
  15. public function callback(EmployeeOpenidModel $EmployeeOpenidModel)
  16. {
  17. // 获取微信推送的原始数据
  18. $xmlData = file_get_contents('php://input');
  19. $xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA);
  20. $Official = new Official();
  21. // 提取关键信息
  22. $fromUsername = (string)$xml->FromUserName; // 用户的公众号OpenID
  23. $toUsername = (string)$xml->ToUserName; // 公众号原始ID
  24. $event = (string)$xml->Event; // 事件类型
  25. $eventKey = (string)$xml->EventKey; // 事件KEY值(扫码关注时会有)
  26. // 记录日志,方便调试
  27. Log::info('wechat_subscribe_info', '微信关注事件', ['FromUserName' => $fromUsername, 'ToUserName' => $toUsername, 'event' => $event, 'eventKey' => $eventKey]);
  28. // 处理关注事件
  29. if ($event == 'subscribe') {
  30. // 尝试获取用户UnionID
  31. $official_user_info = $Official->getApp()->user->get($fromUsername);
  32. $unionid = isset($official_user_info['unionid']) ? $official_user_info['unionid'] : '';
  33. if ($unionid) {
  34. // 1. 有UnionID,直接绑定公众号OpenID
  35. $user_open_data = $EmployeeOpenidModel->where(['unionid' => $unionid])->first();
  36. if ($user_open_data) {
  37. $user_open_data->official_openid = $fromUsername;
  38. $user_open_data->save();
  39. }
  40. } else {
  41. Log::info('wechat_subscribe_error', '获取UnionID失败', ['data' => $fromUsername, 'request_data' => $official_user_info]);
  42. }
  43. }
  44. // 默认返回成功(微信要求必须返回)
  45. return 'success';
  46. }
  47. }