Wechat.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. namespace fast\service;
  3. use app\common\model\Page;
  4. use app\common\model\User;
  5. use app\common\model\UserSignin;
  6. use app\common\model\UserThird;
  7. use app\common\model\WechatConfig;
  8. use EasyWeChat\Message\News;
  9. use EasyWeChat\Message\Transfer;
  10. use fast\Date;
  11. use think\Config;
  12. /**
  13. * Wechat服务类
  14. */
  15. class Wechat
  16. {
  17. public function __construct()
  18. {
  19. }
  20. public static function appConfig()
  21. {
  22. return array(
  23. 'signin' => array(
  24. 'name' => '签到送积分',
  25. 'config' => array(
  26. )
  27. ),
  28. 'article' => array(
  29. 'name' => '关联文章',
  30. 'config' => array(
  31. array(
  32. 'type' => 'text',
  33. 'caption' => '文章ID',
  34. 'field' => 'id',
  35. 'options' => ''
  36. )
  37. )
  38. ),
  39. 'page' => array(
  40. 'name' => '关联单页',
  41. 'config' => array(
  42. array(
  43. 'type' => 'text',
  44. 'caption' => '单页ID',
  45. 'field' => 'id',
  46. 'options' => ''
  47. )
  48. )
  49. ),
  50. 'service' => array(
  51. 'name' => '在线客服',
  52. 'config' => array(
  53. )
  54. ),
  55. );
  56. }
  57. // 微信输入交互内容指令
  58. public function command($obj, $openid, $content, $context)
  59. {
  60. $response = FALSE;
  61. if (isset($content['app']))
  62. {
  63. switch ($content['app'])
  64. {
  65. case 'signin':
  66. case 'article':
  67. case 'page':
  68. break;
  69. case 'service':
  70. $service = (array) json_decode(WechatConfig::value('service'), true);
  71. list($begintime, $endtime) = explode('-', $service['onlinetime']);
  72. $session = $obj->app->staff_session;
  73. $staff = $obj->app->staff;
  74. $kf_account = $session->get($openid)->kf_account;
  75. $time = time();
  76. if (!$kf_account && ($time < strtotime(date("Y-m-d {$begintime}")) || $time > strtotime(date("Y-m-d {$endtime}"))))
  77. {
  78. return $service['offlinemsg'];
  79. }
  80. if (!$kf_account)
  81. {
  82. $kf_list = $staff->onlines()->kf_online_list;
  83. if ($kf_list)
  84. {
  85. $kfarr = [];
  86. foreach ($kf_list as $k => $v)
  87. {
  88. $kfarr[$v['kf_account']] = $v['accepted_case'];
  89. }
  90. $kfkeys = array_keys($kfarr, min($kfarr));
  91. $kf_account = reset($kfkeys);
  92. $session->create($kf_account, $openid);
  93. $response = $service['waitformsg'];
  94. }
  95. else
  96. {
  97. $response = $service['nosessionmsg'];
  98. }
  99. }
  100. else
  101. {
  102. $server = $obj->app->server;
  103. $server->setMessageHandler(function($message) {
  104. return new Transfer();
  105. });
  106. $response = $server->serve();
  107. $response->send();
  108. exit;
  109. }
  110. break;
  111. default:
  112. break;
  113. }
  114. }
  115. else
  116. {
  117. $response = isset($content['content']) ? $content['content'] : $response;
  118. }
  119. return $response;
  120. }
  121. // 微信点击菜单event指令
  122. public function response($obj, $openid, $content, $context)
  123. {
  124. $upload = Config::get('upload');
  125. $response = FALSE;
  126. if (isset($content['app']))
  127. {
  128. switch ($content['app'])
  129. {
  130. case 'signin':
  131. $thirdinfo = UserThird::get(['platform' => 'wechat', 'openid' => $openid]);
  132. if (!$thirdinfo)
  133. {
  134. $response = '您还没有<a href="' . url('index/user/third', 'action=redirect&platform=wechat', true, true) . '">绑定用户</a>还不能签到!';
  135. }
  136. else
  137. {
  138. $user_id = $thirdinfo->user_id;
  139. $usersign = new UserSignin;
  140. $signdata = $usersign->where('user_id', '=', $user_id)->where('createtime', '>=', Date::unixtime())->find();
  141. if ($signdata)
  142. {
  143. $response = '今天已签到,请明天再来!';
  144. }
  145. else
  146. {
  147. $signdata = (array) json_decode(WechatConfig::value('signin'), TRUE);
  148. $lastdata = $usersign->where('user_id', $user_id)->order('id', 'desc')->limit(1)->find();
  149. $successions = $lastdata && $lastdata['createtime'] > Date::unixtime('day', -1) ? $lastdata['successions'] + 1 : 1;
  150. $usersign->save(['user_id' => $thirdinfo['user_id'], 'successions' => $successions, 'createtime' => time()]);
  151. $score = isset($signdata['s' . $successions]) ? $signdata['s' . $successions] : $signdata['sn'];
  152. User::where(['id' => $user_id])->setInc('score', $score);
  153. $response = '签到成功!连续签到' . $successions . '天!获得' . $score . '积分';
  154. }
  155. }
  156. break;
  157. case 'article':
  158. $id = explode(',', $content['id']);
  159. $pagelist = Page::all($id);
  160. $response = [];
  161. foreach ($pagelist as $k => $pageinfo)
  162. {
  163. if ($pageinfo)
  164. {
  165. $news = new News();
  166. $news->title = $pageinfo['title'];
  167. $news->url = $pageinfo['url'] ? $pageinfo['url'] : url('index/page/show', ['id' => $pageinfo['id']], true, true);
  168. $news->image = $upload['cdnurl'] . $pageinfo['image'];
  169. $news->description = $pageinfo['description'];
  170. $response[] = $news;
  171. }
  172. }
  173. case 'page':
  174. $id = isset($content['id']) ? $content['id'] : 0;
  175. $pageinfo = Page::get($id);
  176. if ($pageinfo)
  177. {
  178. $news = new News();
  179. $news->title = $pageinfo['title'];
  180. $news->url = $pageinfo['url'] ? $pageinfo['url'] : url('index/page/show', ['id' => $pageinfo['id']], true, true);
  181. $news->image = $upload['cdnurl'] . $pageinfo['image'];
  182. $news->description = $pageinfo['description'];
  183. return $news;
  184. }
  185. break;
  186. case 'service':
  187. $response = $this->command($obj, $openid, $content, $context);
  188. break;
  189. default:
  190. break;
  191. }
  192. }
  193. else
  194. {
  195. $response = isset($content['content']) ? $content['content'] : $response;
  196. }
  197. return $response;
  198. }
  199. }