WorkEventPush.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. namespace app\api\controller;
  3. use DOMDocument;
  4. use openssl\Aes;
  5. /**
  6. * 微信事件接受类
  7. */
  8. class WorkEventPush
  9. {
  10. public function index()
  11. {
  12. $msgSignature = $_GET['msg_signature'];
  13. $timestamp = $_GET['timestamp'];
  14. $nonce = $_GET['nonce'];
  15. $token = 'hYjfU0XvjkX7VcYJ';
  16. $encodingAesKey = 'wEhkrcrDtyfsh2aEtfWKxt95vEyKOyB0OWE9xyI8bse';
  17. $appId = 'ww16ab285cc1f0bdac';
  18. if (isset($_GET["echostr"])) {
  19. $encrypt_msg = str_replace('\/', '/', $_GET["echostr"]);
  20. } else {
  21. // xml中获取
  22. $postXmlStr = file_get_contents('php://input');
  23. trace($postXmlStr, 'debug');
  24. $xml = new DOMDocument();
  25. $xml->loadXML($postXmlStr);
  26. $encrypt_msg = $xml->getElementsByTagName('encrypt')->item(0)->nodeValue;
  27. }
  28. // 验证请求是否正确
  29. $array = array($encrypt_msg, $token, $nonce, $timestamp);
  30. sort($array, SORT_STRING);
  31. if ($msgSignature != sha1(implode($array))) {
  32. // abort(404, '验证失败');
  33. return '验证失败';
  34. }
  35. $k = base64_decode($encodingAesKey . '=');
  36. $iv = substr($k, 0, 16);
  37. $text = openssl_decrypt($encrypt_msg, 'AES-256-CBC', $k, OPENSSL_ZERO_PADDING, $iv);
  38. $pad = ord(substr($text, -1));
  39. if ($pad < 1 || $pad > 32) {
  40. $pad = 0;
  41. }
  42. $text = substr($text, 0, (strlen($text) - $pad));
  43. if (strlen($text) < 16) return 'error';
  44. $content = substr($text, 16, strlen($text));
  45. $len_list = unpack('N', substr($content, 0, 4));
  46. $xml_len = $len_list[1];
  47. $xml_content = substr($content, 4, $xml_len);
  48. $from_receiveId = substr($content, $xml_len + 4);
  49. if($from_receiveId != $appId) return 'receiveId Error';
  50. return $xml_content;
  51. }
  52. }