WechatWork.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php namespace App\Http\Controllers\Api;
  2. use App\Facades\Servers\WechatMini\Mini;
  3. use App\Http\Controllers\Api\Api;
  4. use App\Models\Work\State as WorkState;
  5. use App\Models\Work\External as WorkExternal;
  6. use App\Facades\Servers\WechatWork\CorpTag as CorpTag;
  7. use App\Facades\Servers\WechatWork\ExternalContact as ExternalContact;
  8. use App\Models\Work\Tag as WorkTag;
  9. use App\Models\Work\User as WorkUser;
  10. use EasyWeChat\Factory;
  11. use Vinkla\Hashids\Facades\Hashids;
  12. /**
  13. * 企业微信微信接口
  14. *
  15. * @author 刘相欣
  16. *
  17. * */
  18. class WechatWork extends Api{
  19. /**
  20. * 消息推送 /api/workwechat/notify
  21. *
  22. * @param string $code 授权码
  23. *
  24. * */
  25. public function notify(){
  26. // 获取配置
  27. $app = Factory::work(config('wechat.work'));
  28. // 接收消息通知
  29. $app->server->push(function($message) {
  30. // $message = json_decode('{"ToUserName":"wwcdbc686326b51a89","FromUserName":"sys","CreateTime":"1727420114","MsgType":"event","Event":"change_external_contact","ChangeType":"add_external_contact","UserID":"LiangYan","ExternalUserID":"wmnltlDwAAcHuNEggrIxLtb-Buzk0KkQ","State":"state_id=9","WelcomeCode":"G2OYXUVxNyu3YOb3-oELMOCX1XSLWoeeGjl_HOw7k1E"}',true);
  31. try {
  32. // 处理结果
  33. $result = [];
  34. // 外部联系人变动
  35. if( $message['Event'] == 'change_external_contact' ) {
  36. // 添加企业客户事件,// 注册用户
  37. if( $message['ChangeType'] == 'add_external_contact' ) $result = $this->addExternal($message);
  38. // 编辑企业客户事件
  39. if( $message['ChangeType'] == 'edit_external_contact' ) $result = $this->editExternal($message);
  40. // 删除企业客户事件
  41. if( $message['ChangeType'] == 'del_external_contact' ) $result = $this->delExternal($message);
  42. // 删除跟进成员事件
  43. if( $message['ChangeType'] == 'del_follow_user' ) $result = $this->delFollow($message);
  44. }
  45. // 错误
  46. if( isset($result['error']) ) return json_send(['code'=>'work_notify','msg'=>$result['error'],'data'=>$message]);
  47. // 成功
  48. return json_send(['code'=>'success','msg'=>'notify','data'=>$message]);
  49. } catch (\Throwable $th) {
  50. // 成功
  51. return json_send(['code'=>'error','msg'=>'notify','data'=>['message'=>$message,'msg'=>$th->getMessage()]]);
  52. }
  53. });
  54. $response = $app->server->serve();
  55. $response->send();
  56. }
  57. /**
  58. * 添加企业客户事件
  59. *
  60. */
  61. public function addExternal($message){
  62. // 实例
  63. $WorkExternal = New WorkExternal;
  64. $WorkState = new WorkState;
  65. $WorkUser = New WorkUser;
  66. $WorkTag = New Worktag;
  67. // 通过state获取附加参数以判断用户类型
  68. parse_str($message['State'],$state);
  69. // 获取附加参数
  70. $state = empty($state['state_id']) ? [] : $WorkState->getOne($state['state_id']);
  71. // 存在客户标签,给客户增加标签
  72. if( !empty($state['tags']) ) CorpTag::markTags($message['UserID'], $message['ExternalUserID'],explode(',',$state['tags']));
  73. // 获取客户详情
  74. $extUser = ExternalContact::getOne($message['ExternalUserID']);
  75. // 如果没有获取到数据的话
  76. if( !$extUser ) return ['error'=>'企微ID不存在'];
  77. // 如果存在用户类型,且有外部联系人信息
  78. if( !empty($state['user_type']) && !empty($extUser['external_contact']) ) $extUser['external_contact']['user_type'] = $state['user_type'];
  79. // 判断企微用户是否存在
  80. $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
  81. // 更新或者新增客户
  82. $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
  83. // 如果添加失败
  84. if( !$id ) return ['error'=>'新用户添加失败'];
  85. // 跳转链接
  86. $link = Mini::getUrlLink('pages/bind/user',http_build_query(['kailin_uid'=>Hashids::encodeHex($id),'work_userid'=>$message['UserID']]));
  87. // 欢迎语
  88. $welcome = $link ? ['link'=>['title'=>'请点此填写表单','desc'=>'填写表单信息为了给您提供更优服务','url'=>$link]] : ['text'=>['content'=>'请联系您的对接人员为您录入信息']];
  89. // 发送欢迎语
  90. ExternalContact::sendWelcome($message['WelcomeCode'],$welcome);
  91. // 循环跟进人员
  92. foreach ($extUser['follow_user'] as $workUser) {
  93. // 如果是当前的跟进人员
  94. if( $workUser['userid'] == $message['UserID'] ) {
  95. // 处理跟进关系
  96. $WorkUser = $WorkUser->upsertOne($extUser['external_contact'],$workUser);
  97. // 处理标签
  98. if( $workUser['tags'] ) $WorkTag->upsertTags($message['UserID'],$message['ExternalUserID'],$workUser['tags']);
  99. }
  100. }
  101. // 结果
  102. return ['success'=>'处理完成'];
  103. }
  104. /**
  105. * 编辑企业客户事件
  106. *
  107. */
  108. public function editExternal($message){
  109. // 实例
  110. $WorkExternal = New WorkExternal;
  111. $WorkUser = New WorkUser;
  112. $WorkTag = New WorkTag;
  113. // 获取客户详情
  114. $extUser = ExternalContact::getOne($message['ExternalUserID']);
  115. // 如果没有获取到数据的话
  116. if( !$extUser ) return ['error'=>'企微ID不存在'];
  117. // 判断用户是否已经存在
  118. $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
  119. // 如果更新或者新增客户
  120. $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
  121. // 如果添加失败
  122. if( !$id ) return ['error'=>'客户信息更新失败'];
  123. // 循环跟进人员
  124. foreach ($extUser['follow_user'] as $workUser) {
  125. // 如果是当前的跟进人员
  126. if( $workUser['userid'] == $message['UserID'] ){
  127. // 处理跟进关系
  128. $WorkUser = $WorkUser->upsertOne($extUser['external_contact'],$workUser);
  129. // 处理标签
  130. $WorkTag->upsertTags($message['UserID'],$message['ExternalUserID'],$workUser['tags']);
  131. }
  132. }
  133. // 返回结果
  134. return ['success'=>'处理完成'];
  135. }
  136. /**
  137. * 删除企业客户事件
  138. *
  139. */
  140. public function delExternal($message){
  141. // 实例
  142. $WorkUser = New WorkUser;
  143. $WorkTag = New WorkTag;
  144. // 获取客户详情
  145. $extUser = ExternalContact::getOne($message['ExternalUserID']);
  146. // 如果没有获取到数据的话
  147. if( !$extUser ) return ['error'=>'企微ID不存在'];
  148. // 删除跟进人员信息
  149. $WorkUser->delByExtUser($message['ExternalUserID'],$message['UserID']);
  150. // 删除跟进人员标签
  151. $WorkTag->delByExtUser($message['ExternalUserID'],$message['UserID']);
  152. // 返回结果
  153. return ['success'=>'处理完成'];
  154. }
  155. /**
  156. * 客户删除跟进人员事件
  157. *
  158. */
  159. public function delFollow($message){
  160. // 实例
  161. $WorkExternal = New WorkExternal;
  162. $WorkUser = New WorkUser;
  163. // 获取客户详情
  164. $extUser = ExternalContact::getOne($message['ExternalUserID']);
  165. // 如果没有获取到数据的话
  166. if( !$extUser ) return ['error'=>'企微ID不存在'];
  167. // 判断用户是否已经存在
  168. $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
  169. // 如果有用户的话
  170. if( !$external ) return ['success'=>'用户不存在无需处理'];
  171. // 如果更新或者新增客户
  172. $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
  173. // 如果添加失败
  174. if( !$id ) return ['error'=>'客户信息更新失败'];
  175. // 返回结果
  176. $result = $WorkUser->updateByExtUser($message['ExternalUserID'],$message['UserID'],['status'=>2]);
  177. // 如果添加失败
  178. if( !$result ) return ['error'=>'状态变更失败'];
  179. // 返回结果
  180. return ['success'=>'处理完成'];
  181. }
  182. }