Wechat.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php
  2. namespace addons\wechat\library;
  3. use app\common\model\Page;
  4. use app\common\model\WechatConfig;
  5. use EasyWeChat\Message\News;
  6. use EasyWeChat\Message\Transfer;
  7. /**
  8. * Wechat服务类
  9. */
  10. class Wechat
  11. {
  12. public function __construct()
  13. {
  14. }
  15. public static function appConfig()
  16. {
  17. return array(
  18. 'signin' => array(
  19. 'name' => '签到送积分',
  20. 'config' => array(
  21. )
  22. ),
  23. 'blog' => array(
  24. 'name' => '关联博客',
  25. 'config' => array(
  26. array(
  27. 'type' => 'text',
  28. 'caption' => '日志ID',
  29. 'field' => 'id',
  30. 'options' => ''
  31. )
  32. )
  33. ),
  34. 'article' => array(
  35. 'name' => '关联文章',
  36. 'config' => array(
  37. array(
  38. 'type' => 'text',
  39. 'caption' => '文章ID',
  40. 'field' => 'id',
  41. 'options' => ''
  42. )
  43. )
  44. ),
  45. 'page' => array(
  46. 'name' => '关联单页',
  47. 'config' => array(
  48. array(
  49. 'type' => 'text',
  50. 'caption' => '单页ID',
  51. 'field' => 'id',
  52. 'options' => ''
  53. )
  54. )
  55. ),
  56. 'service' => array(
  57. 'name' => '在线客服',
  58. 'config' => array(
  59. )
  60. ),
  61. );
  62. }
  63. // 微信输入交互内容指令
  64. public function command($obj, $openid, $content, $context)
  65. {
  66. $response = FALSE;
  67. if (isset($content['app']))
  68. {
  69. switch ($content['app'])
  70. {
  71. case 'signin':
  72. case 'blog':
  73. case 'article':
  74. case 'page':
  75. break;
  76. case 'service':
  77. $service = (array) json_decode(WechatConfig::value('service'), true);
  78. list($begintime, $endtime) = explode('-', $service['onlinetime']);
  79. $session = $obj->app->staff_session;
  80. $staff = $obj->app->staff;
  81. $kf_account = $session->get($openid)->kf_account;
  82. $time = time();
  83. if (!$kf_account && ($time < strtotime(date("Y-m-d {$begintime}")) || $time > strtotime(date("Y-m-d {$endtime}"))))
  84. {
  85. return $service['offlinemsg'];
  86. }
  87. if (!$kf_account)
  88. {
  89. $kf_list = $staff->onlines()->kf_online_list;
  90. if ($kf_list)
  91. {
  92. $kfarr = [];
  93. foreach ($kf_list as $k => $v)
  94. {
  95. $kfarr[$v['kf_account']] = $v['accepted_case'];
  96. }
  97. $kfkeys = array_keys($kfarr, min($kfarr));
  98. $kf_account = reset($kfkeys);
  99. $session->create($kf_account, $openid);
  100. $response = $service['waitformsg'];
  101. }
  102. else
  103. {
  104. $response = $service['nosessionmsg'];
  105. }
  106. }
  107. else
  108. {
  109. $server = $obj->app->server;
  110. $server->setMessageHandler(function($message) {
  111. return new Transfer();
  112. });
  113. $response = $server->serve();
  114. $response->send();
  115. exit;
  116. }
  117. break;
  118. default:
  119. break;
  120. }
  121. }
  122. else
  123. {
  124. $response = isset($content['content']) ? $content['content'] : $response;
  125. }
  126. return $response;
  127. }
  128. // 微信点击菜单event指令
  129. public function response($obj, $openid, $content, $context)
  130. {
  131. $response = FALSE;
  132. if (isset($content['app']))
  133. {
  134. switch ($content['app'])
  135. {
  136. case 'signin':
  137. break;
  138. case 'blog':
  139. $id = explode(',', $content['id']);
  140. $bloglist = addons\blog\model\Post::all($id);
  141. $response = [];
  142. foreach ($bloglist as $k => $blog)
  143. {
  144. if ($blog)
  145. {
  146. $news = new News();
  147. $news->title = $blog['title'];
  148. $news->url = addon_url('blog/index/post', ['id' => $blog['id']], true, true);
  149. $news->image = cdnurl($blog['thumb']);
  150. $news->description = $blog['description'];
  151. $response[] = $news;
  152. }
  153. }
  154. case 'page':
  155. $id = isset($content['id']) ? $content['id'] : 0;
  156. $pageinfo = Page::get($id);
  157. if ($pageinfo)
  158. {
  159. $news = new News();
  160. $news->title = $pageinfo['title'];
  161. $news->url = $pageinfo['url'] ? $pageinfo['url'] : url('index/page/show', ['id' => $pageinfo['id']], true, true);
  162. $news->image = cdnurl($pageinfo['image']);
  163. $news->description = $pageinfo['description'];
  164. return $news;
  165. }
  166. break;
  167. case 'service':
  168. $response = $this->command($obj, $openid, $content, $context);
  169. break;
  170. default:
  171. break;
  172. }
  173. }
  174. else
  175. {
  176. $response = isset($content['content']) ? $content['content'] : $response;
  177. }
  178. return $response;
  179. }
  180. }