Reply.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. namespace app\admin\model\weixin;
  3. use think\Model;
  4. use addons\weixin\library\WechatService;
  5. class Reply extends Model
  6. {
  7. // 表名
  8. protected $name = 'weixin_reply';
  9. // 自动写入时间戳字段
  10. protected $autoWriteTimestamp = false;
  11. // 定义时间戳字段名
  12. protected $createTime = false;
  13. protected $updateTime = false;
  14. protected $deleteTime = false;
  15. // 追加属性
  16. protected $append = [
  17. 'type_text'
  18. ];
  19. public function getTypeList()
  20. {
  21. return ['text' => __('Text'), 'image' => __('Image'), 'news' => __('News'), 'voice' => __('Voice')];
  22. }
  23. public function getTypeTextAttr($value, $data)
  24. {
  25. $value = $value ? $value : (isset($data['type']) ? $data['type'] : '');
  26. $list = $this->getTypeList();
  27. return isset($list[$value]) ? $list[$value] : '';
  28. }
  29. /**
  30. * 整理文本输入的消息
  31. * @param $data
  32. * @param $key
  33. * @return array|bool
  34. */
  35. public function tidyText($data, $key)
  36. {
  37. $res = [];
  38. $res['content'] = $data['content'];
  39. return json_encode($res);
  40. }
  41. /**
  42. * 整理图片资源
  43. * @param $data
  44. * @param $key
  45. * @return array|bool|mixed
  46. */
  47. public function tidyImage($data, $key)
  48. {
  49. $data['src'] = $data['image'];
  50. unset($data['image']);
  51. $reply = self::get(['key' => $key]);
  52. if ($reply) {
  53. $reply['data'] = json_decode($reply['data'], true);
  54. }
  55. if ($reply && isset($reply['data']['src']) && $reply['data']['src'] == $data['src']) {
  56. $res = $reply['data'];
  57. } else {
  58. $res = [];
  59. //TODO 图片转media
  60. $res['src'] = $filePath = $data['src'];
  61. $info = pathinfo($filePath);
  62. $trueFileName = $_SERVER['DOCUMENT_ROOT'] . '/' . $info['dirname'] . '/' . $info['basename'];
  63. $material = WechatService::materialService()->uploadImage($trueFileName);
  64. $res['media_id'] = $material['media_id'];
  65. }
  66. return json_encode($res);
  67. }
  68. /**
  69. * 整理声音资源
  70. * @param $data
  71. * @param $key
  72. * @return array|bool|mixed
  73. */
  74. public function tidyVoice($data, $key)
  75. {
  76. $data['src'] = $data['voice'];
  77. unset($data['voice']);
  78. $reply = self::get(['key' => $key]);
  79. if ($reply) {
  80. $reply['data'] = json_decode($reply['data'], true);
  81. }
  82. if ($reply && isset($reply['data']['src']) && $reply['data']['src'] == $data['src']) {
  83. $res = $reply['data'];
  84. } else {
  85. $res = [];
  86. //TODO 声音转media
  87. $res['src'] = $filePath = $data['src'];
  88. $info = pathinfo($filePath);
  89. $trueFileName = $_SERVER['DOCUMENT_ROOT'] . '/' . $info['dirname'] . '/' . $info['basename'];
  90. $material = WechatService::materialService()->uploadVoice($trueFileName);
  91. $res['media_id'] = $material['media_id'];
  92. }
  93. return json_encode($res);
  94. }
  95. /**
  96. * 整理图文资源
  97. * @param $data
  98. * @param $key
  99. * @return bool
  100. */
  101. public function tidyNews($data, $key = '')
  102. {
  103. $newsModel = new \app\admin\model\weixin\News;
  104. $news_id = $data['news'];
  105. $row = $newsModel->get($news_id);
  106. if (!$row) {
  107. return false;
  108. }
  109. $data = [
  110. 'id' => $row['id'],
  111. 'title' => $row['cate_name'],
  112. 'description' => $row['description'],
  113. 'url' => $row['url'] ? $row['url'] : 'http://' . $_SERVER['HTTP_HOST'],
  114. 'image' => $row['image']
  115. ];
  116. if (strpos($data['image'], 'http') === false) {
  117. $data['image'] = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $data['image'];
  118. }
  119. return json_encode($data);
  120. }
  121. /**
  122. * 获取关键字
  123. * @param $key
  124. * @param string $default
  125. * @return array|\EasyWeChat\Message\Image|\EasyWeChat\Message\News|\EasyWeChat\Message\Text|\EasyWeChat\Message\Voice
  126. */
  127. public static function reply($key, $default = '')
  128. {
  129. $res = self::where('key', $key)->where('status', '1')->find();
  130. if (empty($res)) {
  131. $res = self::where('key', 'default')->where('status', '1')->find();
  132. }
  133. if (empty($res)) {
  134. return WechatService::transfer(); // 多客服消息转发
  135. }
  136. $res['data'] = json_decode($res['data'], true);
  137. if ($res['type'] == 'text') {
  138. if (isset($res['data']['content']) && $res['data']['content']) {
  139. return WechatService::textMessage($res['data']['content']);
  140. } else {
  141. return self::reply('default');
  142. }
  143. } elseif ($res['type'] == 'image') {
  144. if (isset($res['data']['media_id']) && $res['data']['media_id']) {
  145. return WechatService::imageMessage($res['data']['media_id']);
  146. } else {
  147. return self::reply('default');
  148. }
  149. } elseif ($res['type'] == 'news') {
  150. if (isset($res['data']) && $res['data']) {
  151. return WechatService::newsMessage($res['data']);
  152. } else {
  153. return self::reply('default');
  154. }
  155. } elseif ($res['type'] == 'voice') {
  156. if (isset($res['data']['media_id']) && $res['data']['media_id']) {
  157. return WechatService::voiceMessage($res['data']['media_id']);
  158. } else {
  159. return self::reply('default');
  160. }
  161. }
  162. }
  163. }