[開發記錄][微信]如何回覆給使用者不同型別的訊息
阿新 • • 發佈:2019-01-03
微信後臺開發-如何回覆給使用者不同型別的訊息
如下,是回覆文字訊息的方式,回覆其他型別的訊息時,都可以結合微信給出的訊息格式,對這個程式碼進行改寫即可。
private function transmitText($postObj, $content)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>" ;
$msgType = "text";
$result= sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
return $result;
}
}
需要特別指出的是,微信在回覆語音、視訊、圖片的時候,回覆的不是它們的url,而是一個叫做MediaId的東西。在微信中,語音、視訊和圖片這種多媒體素材儲存在伺服器時會分配一個MediaId,為了節省伺服器資源,多媒體素材儲存的時候分為臨時和永久的。
- 臨時的多媒體素材只可以儲存三天,MediaId可以被複用。
- 永久素材的數量則有上限,圖文訊息素材和圖片素材的上限為5000,其他型別為1000。
- 不論臨時還是永久,每個素材的格式大小也有限制,圖片大小不超過2M,支援bmp/png/jpeg/jpg/gif格式,語音大小不超過5M,長度不超過60秒,支援mp3/wma/wav/amr格式。
如何上傳素材並獲取它的MediaId?
1.首先在公眾平臺獲取微信公眾號的AppID和AppSecret
2.然後使用AppID和AppSecret獲取access_token。
access_token是公眾號的全域性唯一票據,公眾號呼叫各介面時都需使用access_token。access_token的儲存至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時重新整理,重複獲取將導致上次獲取的access_token失效。
下圖為返回資訊,包括access_token和它的有效時間7200s。
也可以使用curl的方式獲取,程式碼如下
$appid = "******";
$appsecret = "*********";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$jsoninfo = json_decode($output, true);
$access_token = $jsoninfo["access_token"];
3.利用access_token上傳素材得到返回的MediaId
只能採用curl的方式進行上傳,程式碼如下:
$file_info=array(
'filename'=>'images/0.jpg', //圖片相對於網站根目錄的路徑
'content-type'=>'image/jpeg', //檔案型別
);
echo add_material($access_token,$file_info);
function add_material($access_token,$file_info){
$url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={$access_token}&type=image";
$ch1 = curl_init ();
$timeout = 5;
$real_path="{$file_info['filename']}";
//$real_path=str_replace("/", "\\", $real_path);
$data= array("media"=>"@{$real_path}",'form-data'=>$file_info);
curl_setopt ( $ch1, CURLOPT_URL, $url );
curl_setopt ( $ch1, CURLOPT_POST, 1 );
curl_setopt ( $ch1, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch1, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt ( $ch1, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $ch1, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt ( $ch1, CURLOPT_POSTFIELDS, $data );
$result = curl_exec ( $ch1 );
curl_close ( $ch1 );
if(curl_errno()==0){
$result=json_decode($result,true);
//var_dump($result);
return $result['media_id'];
}else {
return false;
}
}