MessageService.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <?php
  2. namespace addons\Wechat\services;
  3. use Yii;
  4. use common\helpers\ExecuteHelper;
  5. use common\components\Service;
  6. use common\helpers\AddonHelper;
  7. use addons\Wechat\common\models\Rule;
  8. use common\enums\StatusEnum;
  9. use addons\Wechat\common\models\MassRecord;
  10. use EasyWeChat\Kernel\Messages\Text;
  11. use EasyWeChat\Kernel\Messages\Image;
  12. use EasyWeChat\Kernel\Messages\Video;
  13. use EasyWeChat\Kernel\Messages\Voice;
  14. use EasyWeChat\Kernel\Messages\News;
  15. use EasyWeChat\Kernel\Messages\NewsItem;
  16. use addons\Wechat\common\enums\RuleModuleEnum;
  17. use addons\Wechat\common\enums\SpecialTypeEnum;
  18. /**
  19. * Class MessageService
  20. * @package addons\Wechat\services
  21. * @author jianyan74 <751393839@qq.com>
  22. */
  23. class MessageService extends Service
  24. {
  25. protected $message;
  26. /**
  27. * 群发消息
  28. *
  29. * @var array
  30. */
  31. protected $sendMethod = [
  32. 'text' => 'sendText',
  33. 'news' => 'sendNews',
  34. 'voice' => 'sendVoice',
  35. 'image' => 'sendImage',
  36. 'video' => 'sendVideo',
  37. 'card' => 'sendCard',
  38. ];
  39. /**
  40. * @param MassRecord $massRecord
  41. * @return bool
  42. * @throws \Psr\SimpleCache\InvalidArgumentException
  43. * @throws \yii\web\UnauthorizedHttpException
  44. */
  45. public function send(MassRecord $massRecord)
  46. {
  47. // 每次都需要重载配置
  48. // $this->afreshLoad($massRecord->merchant_id);
  49. try {
  50. $sendContent = $massRecord->data;
  51. // 如果是图文
  52. if ($massRecord->module == RuleModuleEnum::NEWS) {
  53. $sendContent = $massRecord->attachment->media_id;
  54. }
  55. $method = $this->sendMethod[$massRecord->module];
  56. if ($massRecord->tag_id > 0) {
  57. $result = Yii::$app->wechat->app->broadcasting->$method($sendContent, $massRecord->tag_id);
  58. } else {
  59. $result = Yii::$app->wechat->app->broadcasting->$method($sendContent);
  60. }
  61. Yii::$app->services->base->getWechatError($result);
  62. MassRecord::updateAll([
  63. 'final_send_time' => time(),
  64. 'send_status' => StatusEnum::ENABLED,
  65. 'msg_id' => $result['msg_id'] ?? 0,
  66. 'msg_data_id' => $result['msg_data_id'] ?? 0,
  67. ], ['id' => $massRecord->id]);
  68. return true;
  69. } catch (\Exception $e) {
  70. MassRecord::updateAll([
  71. 'error_content' => $e->getMessage(),
  72. 'send_status' => StatusEnum::DELETE,
  73. ], ['id' => $massRecord->id]);
  74. return false;
  75. }
  76. }
  77. /**
  78. * 发送客服消息
  79. *
  80. * @param $openid
  81. * @param $type
  82. * @param $data
  83. * @throws \EasyWeChat\Kernel\Exceptions\HttpException
  84. * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
  85. * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
  86. * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException
  87. * @throws \Psr\SimpleCache\InvalidArgumentException
  88. * @throws \yii\web\UnprocessableEntityHttpException
  89. */
  90. public function customer($openid, $type, $data)
  91. {
  92. switch ($type) {
  93. // 文字回复
  94. case RuleModuleEnum::TEXT :
  95. $message = new Text($data);
  96. break;
  97. // 图片回复
  98. case RuleModuleEnum::IMAGE :
  99. $message = new Image($data);
  100. break;
  101. // 图文回复
  102. case RuleModuleEnum::NEWS :
  103. $new = Yii::$app->wechatService->attachmentNews->firstByAttachmentId($data);
  104. $newsList[] = new NewsItem([
  105. 'title' => $new['title'],
  106. 'description' => $new['digest'],
  107. 'url' => $new['media_url'],
  108. 'image' => $new['thumb_url'],
  109. ]);
  110. $message = new News($newsList);
  111. break;
  112. // 视频回复
  113. case RuleModuleEnum::VIDEO :
  114. $video = Yii::$app->wechatService->attachment->findByMediaId($data);
  115. $message = new Video($data, [
  116. 'title' => $video['file_name'],
  117. 'description' => $video['description'],
  118. ]);
  119. break;
  120. // 语音回复
  121. case RuleModuleEnum::VOICE :
  122. $message = new Voice($data);
  123. break;
  124. }
  125. $result = Yii::$app->wechat->app->customer_service->message($message)->to($openid)->send();
  126. Yii::$app->services->base->getWechatError($result);
  127. }
  128. /**
  129. * 写入消息
  130. *
  131. * @param $message
  132. */
  133. public function setMessage($message)
  134. {
  135. $this->message = $message;
  136. }
  137. /**
  138. * 获取微信消息
  139. *
  140. * @return mixed
  141. */
  142. public function getMessage()
  143. {
  144. return $this->message;
  145. }
  146. /**
  147. * 文字匹配回复
  148. *
  149. * @return bool|mixed
  150. * @throws \yii\web\NotFoundHttpException
  151. */
  152. public function text()
  153. {
  154. $message = Yii::$app->wechatService->message->getMessage();
  155. // 查询用户关键字匹配
  156. if (!($reply = Yii::$app->wechatService->ruleKeyword->match($message['Content']))) {
  157. $replyDefault = Yii::$app->wechatService->config->replyDefault();
  158. if ($replyDefault->default_content) {
  159. $reply = Yii::$app->wechatService->ruleKeyword->match($replyDefault->default_content);
  160. } else {
  161. return false;
  162. }
  163. }
  164. return $reply;
  165. }
  166. /**
  167. * 关注匹配回复
  168. *
  169. * @return bool|mixed
  170. * @throws \yii\web\NotFoundHttpException
  171. */
  172. public function follow()
  173. {
  174. $replyDefault = Yii::$app->wechatService->config->replyDefault();
  175. if ($replyDefault->follow_content) {
  176. return Yii::$app->wechatService->ruleKeyword->match($replyDefault->follow_content);
  177. }
  178. return false;
  179. }
  180. /**
  181. * 其他匹配回复
  182. *
  183. * @return bool|mixed
  184. * @throws \yii\web\NotFoundHttpException
  185. */
  186. public function other()
  187. {
  188. $message = $this->getMessage();
  189. $msgType = $message['MsgType'];
  190. $setting = Yii::$app->wechatService->config->setting();
  191. $special = $setting['special'] ?? [];
  192. if (isset($special[$msgType])) {
  193. // 关键字
  194. if ($special[$msgType]['type'] == SpecialTypeEnum::KEYWORD) {
  195. if ($default = Yii::$app->wechatService->ruleKeyword->match($special[$msgType]['content'])) {
  196. return $default;
  197. }
  198. }
  199. // 模块处理
  200. if (!empty($special[$msgType]['selected'])) {
  201. Yii::$app->params['messageHistory']['module'] = RuleModuleEnum::ADDON;
  202. Yii::$app->params['messageHistory']['addon_name'] = $special[$msgType]['selected'];
  203. $class = AddonHelper::getAddonMessage($special[$msgType]['selected']);
  204. return ExecuteHelper::map($class, 'run', $message);
  205. }
  206. }
  207. return false;
  208. }
  209. }
粤ICP备19079148号