ReceiveMessageController.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace addons\Wechat\api\controllers;
  3. use Yii;
  4. use yii\web\NotFoundHttpException;
  5. use common\helpers\WechatHelper;
  6. use api\controllers\OnAuthController;
  7. /**
  8. * Class ReceiveMessageController
  9. * @package addons\Wechat\api\controllers
  10. * @author jianyan74 <751393839@qq.com>
  11. */
  12. class ReceiveMessageController extends OnAuthController
  13. {
  14. public $modelClass = '';
  15. /**
  16. * 不用进行登录验证的方法
  17. *
  18. * 例如: ['index', 'update', 'create', 'view', 'delete']
  19. * 默认全部需要验证
  20. *
  21. * @var array
  22. */
  23. protected $authOptional = ['index'];
  24. /**
  25. * 处理微信消息
  26. *
  27. * @return array|mixed
  28. * @throws NotFoundHttpException
  29. * @throws \EasyWeChat\Kernel\Exceptions\BadRequestException
  30. * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
  31. * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
  32. * @throws \ReflectionException
  33. */
  34. public function actionIndex()
  35. {
  36. // 非格式化返回
  37. Yii::$app->params['triggerBeforeSend'] = false;
  38. $request = Yii::$app->request;
  39. switch ($request->getMethod()) {
  40. // 激活公众号
  41. case 'GET':
  42. if (WechatHelper::verifyToken($request->get('signature'), $request->get('timestamp'),
  43. $request->get('nonce'))) {
  44. return $request->get('echostr');
  45. }
  46. throw new NotFoundHttpException('签名验证失败.');
  47. break;
  48. // 接收数据
  49. case 'POST':
  50. $app = Yii::$app->wechat->getApp();
  51. $app->server->push(function ($message) {
  52. try {
  53. // 微信消息
  54. Yii::$app->wechatService->message->setMessage($message);// 消息记录
  55. Yii::$app->params['messageHistory'] = [
  56. 'openid' => $message['FromUserName'],
  57. 'type' => $message['MsgType'],
  58. 'event' => '',
  59. 'rule_id' => 0, // 规则id
  60. 'keyword_id' => 0, // 关键字id
  61. ];
  62. switch ($message['MsgType']) {
  63. // '收到事件消息';
  64. case 'event' :
  65. $reply = $this->event($message);
  66. break;
  67. // '收到文字消息';
  68. case 'text' :
  69. $reply = Yii::$app->wechatService->message->text();
  70. break;
  71. // ... 其它消息(image、voice、video、location、link、file ...)
  72. default :
  73. $reply = Yii::$app->wechatService->message->other();
  74. break;
  75. }
  76. Yii::$app->wechatService->messageHistory->save(Yii::$app->params['messageHistory'], Yii::$app->wechatService->message->getMessage());
  77. return $reply;
  78. } catch (\Exception $e) {
  79. // 全局接收通知
  80. if ($e->getCode() === 200) {
  81. return $e->getMessage();
  82. }
  83. // 记录行为日志
  84. Yii::$app->services->log->push(500, 'wechatApiReply', Yii::$app->services->base->getErrorInfo($e));
  85. if (YII_DEBUG) {
  86. return $e->getMessage();
  87. }
  88. return '系统出错,请联系管理员';
  89. }
  90. });
  91. // 将响应输出
  92. $response = $app->server->serve();
  93. $response->send();
  94. break;
  95. default:
  96. throw new NotFoundHttpException('所请求的页面不存在.');
  97. }
  98. exit();
  99. }
  100. /**
  101. * 事件处理
  102. *
  103. * @param $message
  104. * @return bool|mixed
  105. * @throws NotFoundHttpException
  106. * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
  107. */
  108. protected function event($message)
  109. {
  110. Yii::$app->params['messageHistory']['event'] = $message['Event'];
  111. switch ($message['Event']) {
  112. // 关注事件
  113. case 'subscribe' :
  114. Yii::$app->wechatService->fans->follow($message['FromUserName']);
  115. // 判断是否是二维码关注
  116. if ($qrResult = Yii::$app->wechatService->qrcodeStat->scan($message)) {
  117. $message['Content'] = $qrResult;
  118. Yii::$app->wechatService->message->setMessage($message);
  119. return Yii::$app->wechatService->message->text();
  120. }
  121. return Yii::$app->wechatService->message->follow();
  122. break;
  123. // 取消关注事件
  124. case 'unsubscribe' :
  125. Yii::$app->wechatService->fans->unFollow($message['FromUserName']);
  126. return false;
  127. break;
  128. // 二维码扫描事件
  129. case 'SCAN' :
  130. if ($qrResult = Yii::$app->wechatService->qrcodeStat->scan($message)) {
  131. $message['Content'] = $qrResult;
  132. Yii::$app->wechatService->message->setMessage($message);
  133. return Yii::$app->wechatService->message->text();
  134. }
  135. break;
  136. // 上报地理位置事件
  137. case 'LOCATION' :
  138. // TODO 暂时不处理
  139. break;
  140. // 自定义菜单(点击)事件
  141. case 'CLICK' :
  142. $message['Content'] = $message['EventKey'];
  143. Yii::$app->wechatService->message->setMessage($message);
  144. return Yii::$app->wechatService->message->text();
  145. break;
  146. }
  147. return false;
  148. }
  149. /**
  150. * {@inheritdoc}
  151. */
  152. protected function verbs()
  153. {
  154. return [
  155. 'index' => ['GET', 'POST', 'HEAD', 'OPTIONS'],
  156. 'view' => ['GET', 'HEAD', 'OPTIONS'],
  157. 'create' => ['POST', 'OPTIONS'],
  158. 'update' => ['PUT', 'PATCH', 'OPTIONS'],
  159. 'delete' => ['DELETE', 'OPTIONS'],
  160. ];
  161. }
  162. }
粤ICP备19079148号