123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- <?php
- namespace app\api\controller;
- use DOMDocument;
- use wx\offiaccount\Event;
- use wx\offiaccount\msg\ResponseMsg;
- use app\model\Employee;
- use think\facade\Cache;
- /**
- * 微信事件接受类
- */
- class WxEventPush
- {
- public function index()
- {
- $signature = $_GET['signature'];
- $timestamp = $_GET['timestamp'];
- $nonce = $_GET['nonce'];
- $token = config('app.official_token');
- $encodingAesKey = config('app.official_encodingAesKey');
- $appId = config('app.official_appid');
- $eventObj = new Event($token, $encodingAesKey, $appId);
- // token验证
- if (isset($_GET["echostr"])) {
- if ($eventObj->checkToken($token, $signature, $timestamp, $nonce)) {
- echo $_GET["echostr"];
- exit;
- }
- }
- // // 消息体加密
- $msgSignature = $_GET['msg_signature'];
- // 推送消息内容获取
- $postXml = file_get_contents('php://input');
- $rs = $eventObj->decryptMsg($msgSignature, $timestamp, $nonce, $postXml, $msg);
- if ($rs !== 0) {
- echo 'success';
- trace('消息内容解析失败:' . $postXml, "error");
- exit;
- }
- $xml = new DOMDocument();
- $xml->loadXML($msg);
- $msgType = $xml->getElementsByTagName('MsgType')->item(0)->nodeValue;
- $rs = null;
- switch ($msgType) {
- case "event":
- $event = $xml->getElementsByTagName('Event')->item(0)->nodeValue;
- $event = strtolower($event);
- $method = $event . 'Event';
- // 接受事件推送
- if (method_exists($this, $method)) {
- $rs = $this->$method($xml);
- }
- break;
- default:
- // 接受消息推送
- $rs = $this->$msgType($xml);
- break;
- }
- if ($rs === null) {
- echo 'success';
- exit;
- } else {
- echo $rs;
- exit;
- }
- }
- /**
- * 订阅(关注公众号或扫码关注公众号)
- */
- private function subscribeEvent($xml)
- {
- $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue;
- $toUserName = $xml->getElementsByTagName('ToUserName')->item(0)->nodeValue;
- // 获取key值
- // $key = $xml->getElementsByTagName('EventKey')->item(0)->nodeValue;
- // 更新用户信息
- $this->setUserInfo($fromUserName);
- // if ($key == '') { // 如果是用户关注公众号
- $textData = [
- 'ToUserName' => $fromUserName,
- 'FromUserName' => $toUserName,
- 'MsgType' => 'text',
- 'Content' => 'Hello![握手]
- 欢迎加入志远装饰大家庭!
- ①找客户→数十种裂变工具[强]
- ②聊客户→各维度沟通方案[强]
- ③签客户→定制化签单工具[强]
- ④跟客户→云CRM精准跟客[强]
- 通过小程序,我们为您提供一套完整的装企营销获客管理体系。[爱心][爱心][爱心]'
- ];
- $msg = new ResponseMsg();
- return $msg->responseText($textData);
- // } else { // 如果是识别二维码
- // // 用户绑定公司
- // list($keyName, $method, $val) = explode('_', $key);
- // if (method_exists($this, $method)) {
- // return $this->$method($val, $toUserName, $fromUserName);
- // }
- // }
- }
- /**
- * 取消订阅
- */
- private function unsubscribeEvent($xml)
- {
- $openid = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue;
- // 更新用户是否关注公众号
- Employee::where([['official_openid', '=', $openid]])->update(['official_openid'=>'']);
- }
- /**
- * 用户已关注时的事件推送(扫二维码)
- */
- private function scanEvent($xml)
- {
- $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue;
- $toUserName = $xml->getElementsByTagName('ToUserName')->item(0)->nodeValue;
- // 消息发送对象
- $key = $xml->getElementsByTagName('EventKey')->item(0)->nodeValue;
- // 是否是通过扫员工二维码绑定
- list($method, $val) = explode('_', $key);
- if (method_exists($this, $method)) {
- return $this->$method($val, $toUserName, $fromUserName);
- }
- }
- /**
- * 上报地理位置事件
- */
- private function locationEvent($xml)
- {
- $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue;
- $lat = $xml->getElementsByTagName('Latitude')->item(0)->nodeValue;
- $lng = $xml->getElementsByTagName('Longitude')->item(0)->nodeValue;
- // 更新用户是否关注公众号
- }
- /**
- * 点击菜单拉取消息时的事件推送
- */
- private function clickEvent($xml)
- {
- $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue;
- $toUserName = $xml->getElementsByTagName('ToUserName')->item(0)->nodeValue;
- // 消息发送对象
- $method = $xml->getElementsByTagName('EventKey')->item(0)->nodeValue;
- return $this->$method($toUserName, $fromUserName);
- }
- /**
- * 点击菜单跳转链接时的事件推送
- */
- private function viewEvent($xml)
- {
- }
- /**
- * 模板消息发送事件
- */
- private function templatesendjobfinish($xml){
- $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue;
- $status = $xml->getElementsByTagName('Statuss')->item(0)->nodeValue;
- trace('fromUserName:'.$fromUserName,'debug');
- trace('status:'.$status,'debug');
- }
- /**
- * 文本消息
- */
- private function text($xml)
- {
- }
- /**
- * 语音消息
- */
- private function voice($xml)
- {
- }
- /**
- * 视频消息
- */
- private function video($xml)
- {
- }
- /**
- * 小视频消息
- */
- private function shortvideo($xml)
- {
- }
- /**
- * 地理位置消息
- */
- private function location($xml)
- {
- }
- /**
- * 获取用户信息
- */
- private function setUserInfo($openid)
- {
- // 通过openid获取微信信息和unionid
- if (!$accessToken = Cache::get('zqxg_offi_access_token')) {
- $accessToken = getAccessToken(config('app.official_appid'), config('app.official_secret'));
- Cache::set('zqxg_offi_access_token', $accessToken, 7100);
- }
- $getUserInfoUrl = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $accessToken . '&openid=' . $openid . '&lang=zh_CN';
- $data = curl($getUserInfoUrl);
- $data = json_decode($data, true);
- if (isset($data['errcode']) || empty($data['openid'])) {
- trace('消息内容解析失败:' . json_encode($data), "error");
- return null;
- }
- // 更新official_openid
- Employee::where([['unionid', '=', $data['unionid']]])->update(['official_openid'=>$openid]);
- }
- }
|