接收的方法
public function event($data)
{
$redis = $this->redis = new \Redis;
$redis->connect('127.0.0.1', 6379);
$config = new Wchat();
$MsgType = @$data['MsgType'];
$message = array();
$lastcontent = array();
switch ($MsgType) {
case 'event':
unset($data['id']);
$eventdata = $data;
$event = new Event;
$event->save($eventdata);
$response = $event->save();
$WxUser = (new WxUser());
$openid = $data['openid'];
if(!empty($data['SessionFrom'])){
\cache('kf_session_from'.$data['openid'],$data['SessionFrom'],3600);
}
$UserExit = $WxUser::where(['openid' => $openid])->find();
if (!$UserExit) {
$wxData = array();
$wxData['openid'] = $data['openid'];
$wxData['create_time'] = date('Y-m-d H:i:s');
$wxData['from_app'] = $data['ToUserName'];
$getwxagain = (new Wchat())->getWxUserByOpenIdAndFromApp($wxData['openid'],$wxData['from_app']);
if(!empty($getwxagain['unionid'])){
$wxData['unionid'] = $getwxagain['unionid'];
}
$user_id = $WxUser::insertGetId($wxData);
} else {
$user_id = $UserExit->user_id;
}
//@通知socket
$messageMsg = array();
$messageMsg['type'] = 'login';
$messageMsg['user_id'] = $user_id;
$messageMsg['time'] = date('Y-m-d H:i:s');
$message['message'] = $messageMsg;
(new Contab())->message($message);
break;
case 'text':
(new Wchat())->Intelligence_reply($data);
unset($data['id']);
$lastcontent['msgtype'] = 'text';
$lastcontent['content'] = $data['Content'];
$lastcontent['time'] = $data['timestamp'];
$messagedata = $data;
$message = new Message;
$message->save($messagedata);
$response = $message->save();
break;
case 'image':
unset($data['id']);
$lastcontent['msgtype'] = 'image';
$lastcontent['content'] =$data['PicUrl'];
// array(
// 'PicUrl'=>$data['Title'],
//// 'PagePath'=>$data['PagePath'],
//// 'ThumbUrl'=>$data['ThumbUrl'],
//// 'ThumbMediaId'=>$data['ThumbMediaId'],
// );
$lastcontent['time'] = $data['timestamp'];
$messagedata = $data;
$message = new Message;
$message->save($messagedata);
$response = $message->save();
break;
case 'miniprogrampage':
unset($data['id']);
$messagedata = $data;
$lastcontent['msgtype'] = 'miniprogrampage';
$WechatModel = new \app\api\model\Wechat();
$orderid = '';
$orderid = $WechatModel->getOrderIdByMiniPage($data['PagePath']);
$lastcontent['content'] = array(
'Title'=>$data['Title'],
'PagePath'=>$data['PagePath'],
'ThumbUrl'=>$data['ThumbUrl'],
'ThumbMediaId'=>$data['ThumbMediaId'],
'orderId'=>$orderid,
);
$lastcontent['time'] = $data['timestamp'];
$message = new Message;
$message->save($messagedata);
$response = $message->save();
break;
default:
# code...
break;
}
//@先判断是否有talk
if ($MsgType != 'event') {
$talk = (new Talk());
$WxUser = (new WxUser());
$talkContent = (new TalkContent());
$openid = $data['openid'];
$user_id = $WxUser::where(['openid' => $openid])->find();
if(empty($user_id)){
$wxData = array();
$wxData['openid'] = $data['openid'];
$wxData['create_time'] = date('Y-m-d H:i:s');
$wxData['from_app'] = $data['ToUserName'];
$user_id = $WxUser::insertGetId($wxData);
}else{
$user_id = $user_id->user_id;
}
$talkList = $talk::where('user_id', $user_id)->find();
if (count($talkList) < 1) {
//@第一次进入
$talkdata['user_id'] = $user_id;
$talkdata['last_time'] = date('Y-m-d H:i:s');
$talkdata['create_time'] = date('Y-m-d H:i:s');
$talkdata['event'] = '';
$talkdata['customer_ids'] = 0;
$talkdata['last_customer_id'] = 0;
$talkdata['is_transfer'] = 0;
$talkdata['session_from'] = '';
$talkdata['last_content'] = json_encode($lastcontent);
$talk_id = $talk::insertGetId($talkdata);
//@分配客服
(new Contab())->index('todo');
} else {
//@查找上一次会话的负责人并更新时间信息
$talk_id = $talkList->talk_id;
$talkdata['last_customer_id'] = $talkList->last_customer_id;
$talkdata['last_time'] = date('Y-m-d H:i:s');
$talkdata['last_content'] = json_encode($lastcontent);
$talkdata['see'] =0;
$talkdata['is_customer'] =0;
$talk::where(['talk_id' => $talk_id])->update($talkdata);
}
$talkContentData = array();
$talkContentData['talk_id'] = $talk_id;
$talkContentData['content'] = json_encode($lastcontent);
$talkContentData['create_time'] = date('Y-m-d H:i:s');
$talkContentData['is_customer'] = 0;
$talkContentData['customer_id'] = 0;
$talkContent::insert($talkContentData);
//@通知socket
$messageMsg = array();
$messageMsg['type'] = 'message';
$messageMsg['talk_id'] = $talk_id;
$messageMsg['user_id'] = $user_id;
$messageMsg['customer_id'] = $talkdata['last_customer_id'];
$messageMsg['content'] = $lastcontent;
$messageMsg['time'] = date('Y-m-d H:i:s');
$message['message'] = $messageMsg;
(new Contab())->message($message);
}
}
回复的方法
public function reply($input ='')
{
$config = new Wchat();
if(!$input){
$input = input();
}
$message = isset($input['message']) ? $input['message'] : 0;
$ReplyWxData = array();
$message = json_decode($message, true);
$content = $message['content'];
$type = $content['msgtype'];
$user_id = $message['user_id'];
//缓存from_app
$cache_from_app_by_user_id = $config->get_from_app_by_userid($user_id);
if ($cache_from_app_by_user_id == null) {
$data['error'] = 1;
$data['msg'] = '找不到相应公众号,请确认配置路径无误';
//写入日志
file_put_contents("log.txt", $data['msg'], FILE_APPEND);
return $this->success(200, $data);
}
$wechatInfo = $config->getConfig($cache_from_app_by_user_id);
if (!$wechatInfo) {
return $this->success(200, 'token获取失败');
}
$access_token = $wechatInfo->access_token;
$token = $wechatInfo->token;
$WxUser = (new WxUser());
$UserExit = $WxUser::where(['user_id' => $user_id])->find();
$openid = $UserExit->openid;
if (empty($openid)) {
return $this->success(200, 'openid为空');
}
switch ($type) {
//@文字
case 'text':
$ReplyWxData['content'] = $data['text'] = $content['content'];
break;
//@图片
case 'image':
$file_path = $content['content'];
$ReplyWxData['thumb_url'] = 'http://c.haoxiaec.com/' . $file_path;
$media = new Media();
$mediaRescult = $media->mediaUpload($file_path, 'image', $access_token);
$media_id = $mediaRescult->media_id;
if(!empty($content['intelligence'])){
unlink($content['content']);
}
$ReplyWxData['media_id'] = $data['media_id'] = $media_id;
break;
//@图文链接
case 'link':
$ReplyWxData['description'] = $data['description'] = $content['description'];
$ReplyWxData['title'] = $data['title'] = $content['title'];
$ReplyWxData['url'] = $data['curl'] = $content['url'];
$file_path =$content['thumb_url'];
$ReplyWxData['thumb_url'] = $data['thumb_url'] = $file_path;
break;
//@小程序卡片
case 'miniprogrampage':
$ReplyWxData['title'] = $data['title'] = $content['title'];
$ReplyWxData['pagepath'] = $data['pagepath'] = $content['pagepath'];
$file_path = $content['thumb_url'];
$ReplyWxData['thumb_url'] =$file_path;
$media = new Media();
$mediaRescult = $media->mediaUpload($file_path, 'image', $access_token);
$media_id = $mediaRescult->media_id;
$ReplyWxData['thumb_media_id'] = $data['thumb_media_id'] = $media_id;
default:
break;
}
$ReplyWxData['touser'] = $data['openid'] = $openid;
$ReplyWxData['msgtype'] = $data['type'] = $type;
$result = $config->reply($access_token, $data);
$ResultSatus = json_decode($result, true);
$ReplyWxData['errcode'] = $ResultSatus['errcode'];
$ReplyWxData['create_at'] = time();
$ReplyWx = new ReplyWx();
$ReplyWx->save($ReplyWxData);
//@保存客服消息
// $talk_content = array(
// 'talk_id' => $message['talk_id'],
// 'content' => json_encode($content),
// 'create_time' => date('Y-m-d H:i:s'),
// 'customer_id' => $message['customer_id'],
// 'is_customer' => '1',
// );
$model = new \app\api\model\Wechat();
// $talk = array(
// 'talk_id'=>$message['talk_id'],
// 'is_customer'=>1,
// 'last_content'=>json_encode($content),
// 'last_time'=>date('Y-m-d H:i:s')
// );
// if(!empty($message['check_out'])){
// unset($talk['last_time']);
// }
//客服发送的数据在swoole 异步保存了。
// $model->save_talk($talk);
// $model->save_talk_content($talk_content);
// $response =$ReplyWx->save();
return $this->success(200, $result);
}
回复reply
public function reply($access_token,$data=array()){
$baseUrl ='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=';
$url =$baseUrl.$access_token;
$openid = $data['openid'];
$type = $data['type'];
switch ($type){
//@回复文本
//@文本内容....<a href="http://www.qq.com" data-miniprogram-appid="appid" data-miniprogram-path="pages/index/index">点击跳小程序</a>
case 'text':
$text = $data['text'];
$content = '{
"touser":"' . $openid . '",
"msgtype":"text",
"text":
{
"content":"' . $text . '"
}
}';
break;
//@回复图文
case 'image':
$media_id = $data['media_id'];
$content = '{
"touser":"'.$openid.'",
"msgtype":"image",
"image":
{
"media_id":"'.$media_id.'"
}
}';
break;
//@回复图文链接
case 'link':
$title = $data['title'];
$description = $data['description'];
$curl = $data['curl'];
$thumb_url = $data['thumb_url'];
$content = '{
"touser": "'.$openid.'",
"msgtype": "link",
"link": {
"title": "'.$title.'",
"description": "'.$description.'",
"url": "'.$curl.'",
"thumb_url": "'.$thumb_url.'"
}
}';
break;
//@回复小程序卡片
case 'miniprogrampage':
$title = $data['title'];
$pagepath = $data['pagepath'];
$thumb_media_id = $data['thumb_media_id'];
$content = '{
"touser":"'.$openid.'",
"msgtype":"miniprogrampage",
"miniprogrampage":{
"title":"'.$title.'",
"pagepath":"'.$pagepath.'",
"thumb_media_id":"'.$thumb_media_id.'"
}
}';
break;
}
return $this->request_by_curl($url,$content);
}
上传图片类, 获取medie_id
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace app\api\model;
use app\api\model\WechatBase;
class Media extends WechatBase{
public $tempUrl ='https://api.weixin.qq.com/cgi-bin/media/';
/*上传临时素材,有消息3天,适合客服消息用
* type文件类型,图片(image)、语音(voice)、视频(video)和缩略图(thumb)
* access_token微信临时token
*/
public function mediaUpload($file_path,$type,$access_token) {
$url =$this->tempUrl.'upload?access_token='.$access_token.'&type='.$type;
$data = $this->post_file($url, $file_path);
return json_decode($data);
}
}
post 发送方法
//post发送类
public function request_by_curl($remote_server, $post_string) {
$ch = curl_init($remote_server);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$data = curl_exec($ch);
return $data;
}
回复的方法
/*
* 回复微信二维码
*/
function wx_qrcode_reply($data){
//@生成二维码
//@模拟发送图片给该用户
//@读取缓存中进入带的参数的值 如果没有参数, 则返回重试
$sessionfrom = \cache('kf_session_from'.$data['openid']);
if(empty($sessionfrom)){$sessionfrom =0;}
$path= (new WxQrcode())->getEwm($sessionfrom,2);
$postdata['content']['msgtype'] = 'image';
$postdata['content']['content'] = $path;
$postdata['content']['intelligence'] = 'youzhi';
$postdata['msgtype'] = 'text';
$postdata['user_id'] = (new Wechat())->getUserIdByOpenId($data['openid']);
$result['message'] = json_encode($postdata);
(new ControllerWechat())->reply($result);
return false;
}
/**
* 发送小程序图片
* @param $data
*/
function miniprogrampage_reply($data){
$postdata['content']['msgtype'] = 'miniprogrampage';
$postdata['content']['title'] =$data['content']['title'];
$postdata['content']['pagepath'] =$data['content']['pagepath'];
$postdata['content']['thumb_url'] = 'thumb/home.jpg';
$postdata['user_id'] = (new Wechat())->getUserIdByOpenId($data['openid']);
$result['message'] = json_encode($postdata);
(new ControllerWechat())->reply($result);
}
/*
* 回复图文类
*/
function link_reply($data){
$postdata['content']['msgtype'] = 'link';
$postdata['content']['title'] =$data['content']['title'];
$postdata['content']['description'] =$data['content']['description'];
$postdata['content']['thumb_url'] = $data['content']['thumb_url'];
$postdata['content']['url'] = $data['content']['url'];
$postdata['user_id'] = (new Wechat())->getUserIdByOpenId($data['openid']);
$result['message'] = json_encode($postdata);
(new ControllerWechat())->reply($result);
}
function image_reply($data){
$postdata['content']['msgtype'] = 'image';
$postdata['content']['content'] = $data['content']['thumb_url'];
$postdata['content']['intelligence'] = '';
$postdata['user_id'] = (new Wechat())->getUserIdByOpenId($data['openid']);
$result['message'] = json_encode($postdata);
(new ControllerWechat())->reply($result);
}