WechatWork.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. // 参数
  68. $state = [];
  69. // 通过state获取附加参数以判断用户类型
  70. $state = isset($message['State']) ? parse_str($message['State'],$state) : [];
  71. // 获取附加参数
  72. $state = empty($state['state_id']) ? [] : $WorkState->getOne($state['state_id']);
  73. // 存在客户标签,给客户增加标签
  74. if( !empty($state['tags']) ) CorpTag::markTags($message['UserID'], $message['ExternalUserID'],explode(',',$state['tags']));
  75. // 获取客户详情
  76. $extUser = ExternalContact::getOne($message['ExternalUserID']);
  77. // 如果没有获取到数据的话
  78. if( !$extUser ) return ['error'=>'企微ID不存在'];
  79. // 如果存在用户类型,且有外部联系人信息
  80. if( !empty($state['user_type']) && !empty($extUser['external_contact']) ) $extUser['external_contact']['user_type'] = $state['user_type'];
  81. // 判断企微用户是否存在
  82. $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
  83. // 更新或者新增客户
  84. $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
  85. // 如果添加失败
  86. if( !$id ) return ['error'=>'新用户添加失败'];
  87. // 跳转链接
  88. $link = Mini::getUrlLink('pages/bind/user',http_build_query(['kailin_uid'=>Hashids::encodeHex($id),'work_userid'=>$message['UserID']]));
  89. // 欢迎语
  90. $welcome = $link ? ['link'=>['title'=>'请点此绑定账号','desc'=>'绑定账号是为了给您提供更优服务','url'=>$link]] : ['text'=>['content'=>'请联系您的对接人员为您录入信息']];
  91. // 发送欢迎语
  92. ExternalContact::sendWelcome($message['WelcomeCode'],$welcome);
  93. // 循环跟进人员
  94. foreach ($extUser['follow_user'] as $workUser) {
  95. // 如果是当前的跟进人员
  96. if( $workUser['userid'] == $message['UserID'] ) {
  97. // 处理跟进关系
  98. $WorkUser = $WorkUser->upsertOne($extUser['external_contact'],$workUser);
  99. // 处理标签
  100. if( $workUser['tags'] ) $WorkTag->upsertTags($message['UserID'],$message['ExternalUserID'],$workUser['tags']);
  101. }
  102. }
  103. // 结果
  104. return ['success'=>'处理完成'];
  105. }
  106. /**
  107. * 编辑企业客户事件
  108. *
  109. */
  110. public function editExternal($message){
  111. // 实例
  112. $WorkExternal = New WorkExternal;
  113. $WorkUser = New WorkUser;
  114. $WorkTag = New WorkTag;
  115. // 获取客户详情
  116. $extUser = ExternalContact::getOne($message['ExternalUserID']);
  117. // 如果没有获取到数据的话
  118. if( !$extUser ) return ['error'=>'企微ID不存在'];
  119. // 判断用户是否已经存在
  120. $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
  121. // 如果更新或者新增客户
  122. $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
  123. // 如果添加失败
  124. if( !$id ) return ['error'=>'客户信息更新失败'];
  125. // 循环跟进人员
  126. foreach ($extUser['follow_user'] as $workUser) {
  127. // 如果是当前的跟进人员
  128. if( $workUser['userid'] == $message['UserID'] ){
  129. // 处理跟进关系
  130. $WorkUser = $WorkUser->upsertOne($extUser['external_contact'],$workUser);
  131. // 处理标签
  132. $WorkTag->upsertTags($message['UserID'],$message['ExternalUserID'],$workUser['tags']);
  133. }
  134. }
  135. // 返回结果
  136. return ['success'=>'处理完成'];
  137. }
  138. /**
  139. * 删除企业客户事件
  140. *
  141. */
  142. public function delExternal($message){
  143. // 实例
  144. $WorkUser = New WorkUser;
  145. $WorkTag = New WorkTag;
  146. // 删除跟进人员信息
  147. $WorkUser->updateByExtUser($message['ExternalUserID'],$message['UserID'],['status'=>4]);
  148. // 删除跟进人员标签
  149. $WorkTag->delByExtUser($message['ExternalUserID'],$message['UserID']);
  150. // 返回结果
  151. return ['success'=>'处理完成'];
  152. }
  153. /**
  154. * 客户删除跟进人员事件
  155. *
  156. */
  157. public function delFollow($message){
  158. // 实例
  159. $WorkExternal = New WorkExternal;
  160. $WorkUser = New WorkUser;
  161. // 获取客户详情
  162. $extUser = ExternalContact::getOne($message['ExternalUserID']);
  163. // 如果没有获取到数据的话
  164. if( !$extUser ) return ['error'=>'企微ID不存在'];
  165. // 判断用户是否已经存在
  166. $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
  167. // 如果有用户的话
  168. if( !$external ) return ['success'=>'用户不存在无需处理'];
  169. // 如果更新或者新增客户
  170. $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
  171. // 如果添加失败
  172. if( !$id ) return ['error'=>'客户信息更新失败'];
  173. // 返回结果
  174. $result = $WorkUser->updateByExtUser($message['ExternalUserID'],$message['UserID'],['status'=>2]);
  175. // 如果添加失败
  176. if( !$result ) return ['error'=>'状态变更失败'];
  177. // 返回结果
  178. return ['success'=>'处理完成'];
  179. }
  180. }