通过php后台接收和发送小程序客服消息到个人微信号

1、首先记录下用户在客服会话中发送文本消息时,php后台要怎么获取。直接上代码

$data = $GLOBALS['HTTP_RAW_POST_DATA'];
$dataArr = json_decode($data,1);
$content = $dataArr['Content'];//文本消息内容
$fromUserName = $dataArr['FromUserName'];//发送者的openid

记录下这里的坑:官方文档上说【当用户在客服会话发送消息(或进行某些特定的用户操作引发的事件推送时),微信服务器会将消息(或事件)的数据包(JSON或者XML格式)POST请求开发者填写的URL。

既然是POST的请求数据那就用$_POST接收对吧,实际上你会发下接收不到。然后用$GLOBALS['HTTP_RAW_POST_DATA']就可以接收到微信服务器POST过来的数据。


2、获取到用户发的信息以后,再说下给用户发送客服消息。先上代码

//获取access_token
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的小程序appid&secret=你的小程序密钥';
$data = $this->getHtml($url);
$dataArr = json_decode($data,1);
$access_token = $dataArr['access_token'];
		
//发送给个人
$posturl = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;
$arr = array("touser"=>"$fromUserName","msgtype"=>"text","text"=>array("content"=>$content));
$res = $this->postHtml($posturl,json_encode($arr));


(1)、发送客服消息首先需要获取access_token,这个没有什么问题。

(2)、发送给用户信息的时候,微信官网说【调用客服接口,通过POST一个JSON数据包来发送消息给普通用户】。这里一定要注意是POST一个json数据包,不要学我一直给他POST数组。如果给他POST不是JSON数据包微信服务器是解析不了的,就一直返回40003错误码,说openid不正确。所以一定要给他POST一个JSON数据包。

总结:当一直不知道错在哪了,可以用微信公众平台接口调试工具调试下。链接:https://mp.weixin.qq.com/debug


上面代码用的封装函数:

private function getHtml($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.8.1000 Chrome/30.0.1599.101 Safari/537.36');
    curl_setopt($ch, CURLOPT_AUTOREFERER,true);
    $content = curl_exec($ch);
    $code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    curl_close($ch);
    if($code == "200"){
        return $content;
    }else{
        return "错误码:".$code;
    }
}


private function postHtml($url,$post_data=array()){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_AUTOREFERER,true);
    $content = curl_exec($ch);
    $info = curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);
    $code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    curl_close($ch);
    if($code == "200"){
        return $content;
    }else{
        return "错误码:".$code;
    }
}