小程序API里面关于服务端发送消息有四种:
1:发送客服消息:顾名思义就是小程序端触发这个方法就会跳到客服对话的页面
2:发送模板消息:前端收集openid,后端出发统一给收集到的openid的用户发送模板消息
3:发送统一服务消息:下篇文章介绍
4:发送动态消息:没用到过不好妄自介绍
今天我们说发送客服消息:
1:获取access_token
/**
* 获取access_token
*/
private function getAccessToken()
{
$appid = config("weChat.appId");
$assert = config("weChat.assert");
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$assert}";
$data = json_decode($this->httpCurl($url,"GET",[]),true);
if($data['errcode'] == 0){
Session::set('accessToken',$data['access_token']);
Session::set('expiresIn',$data['expires_in']+7200);
return json(['code'=>$data['errcode'],'data'=>[],'msg'=>$data['access_token']]);
}else{
return json(['code'=>$data['errcode'],'data'=>[],'msg'=>$data['errmsg']]);
}
}
因为access_token的过期时间是7200秒 我们要把access_token储存起来并定时刷新,我的方法是放到缓存里,加一层判断,如果缓存里有access_token并且没过期就取缓存,如果过期了就再进入这个方法获取access_token
/**
* 验证access_token
*/
public function getToken(){
$accessToken = Session::get('accessToken');
$expiresIn = Session::get('expiresIn');
if(empty($accessToken) || $expiresIn<time()){
$this->getAccessToken();
}
return json(['code'=>0,'data'=>[],'msg'=>$accessToken]);
}
调用的curl函数我整理了一下 post和get请求都能调用
/**
* curl
*/
private function httpCurl($url,$type,$data=[]){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
if($type == 'GET'){
curl_setopt($curl, CURLOPT_HEADER, 1); //设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置获取的信息以文件流的形式返回,而不是直接输出
}
if($type == 'POST'){
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
}
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
接下来请求地址(文档是post请求):
POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
根据文档介绍的请求参数,我们整理一下这么写:
/**
* 发送客服消息给用户
*/
public function sendMsg()
{
$access_token = $this->getToken();
$access_token = $access_token['access_token'];
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
$param = Request::param();
$validata = Validate::make([
'touser|用户的OpenID' => 'require|isAlphaNum',
'msgtype|消息类型' => 'require|isAlpha',
]);
if(!$validata->check($param)){
return json(['code'=>10407,'data'=>[],'msg'=>$validata->getError()]);
};
if($param['msgtype'] == 'text'){//发送文本消息内容
if(!Request::param('content')){
return json(['code'=>10407,'data'=>[],'msg'=>'文本消息内容不能为空']);
}
$arr = [
'touser' => $param['touser'],
'msgtype' => 'text',
'content' =>$param['content'],
];
$data = json_encode($arr,JSON_UNESCAPED_UNICODE);
$this->httpCurl($url,$data);
}
if($param['msgtype'] == 'image'){//发送图片消息
if(!Request::param('image')){
return json(['code'=>10407,'data'=>[],'msg'=>'图片消息不能为空']);
}
$validata = Validate::make([
'media_id|媒体ID' => 'require|number',
]);
if(!$validata->check($param)){
return json(['code'=>10407,'data'=>[],'msg'=>$validata->getError()]);
};
$arr = [
'touser' => $param['touser'],
'msgtype' => 'image',
'image' =>['media_id'=>$param['media_id']],
];
$data = json_encode($arr,JSON_UNESCAPED_UNICODE);
$this->httpCurl($url,$data);
}
if($param['msgtype'] == 'link'){//发送图文链接
if(!Request::param('link')){
return json(['code'=>10407,'data'=>[],'msg'=>'图文链接不能为空']);
}
if(!Request::param('title') || !Request::param('description') || !Request::param('url') || !Request::param('thumb_url')){
return json(['code'=>10407,'data'=>[],'msg'=>'缺少参数title或description或url或thumb_url']);
}
$arr = [
'touser' => $param['touser'],
'msgtype' => 'link',
'link' =>['title'=>$param['title'],'description'=>$param['description'],'url'=>$param['url'],'thumb_url'=>$param['thumb_url']],
];
$data = json_encode($arr,JSON_UNESCAPED_UNICODE);
$this->httpCurl($url,$data);
}
if($param['msgtype'] == 'miniprogrampage'){//发送小程序卡片
if(!Request::param('miniprogrampage')){
return json(['code'=>10407,'data'=>[],'msg'=>'小程序卡片不能为空']);
}
if(!Request::param('title') || !Request::param('pagepath') || !Request::param('thumb_media_id')){
return json(['code'=>10407,'data'=>[],'msg'=>'缺少参数title或pagepath或thumb_media_id']);
}
$arr = [
'touser' => $param['touser'],
'msgtype' => 'link',
'miniprogrampage' =>['title'=>$param['title'],'pagepath'=>$param['pagepath'],'thumb_media_id'=>$param['thumb_media_id']],
];
$data = json_encode($arr,JSON_UNESCAPED_UNICODE);
$this->httpCurl($url,"POST",$data);
}
这里我为什么用if验证,因为require验证是能验证是否传入这个字段,如果传入的是空也能校验成功 所以我用了if判断
time--