現(xiàn)在我們來學(xué)學(xué)習(xí)群發(fā)圖片消息. 其中的難點(diǎn)是把圖片上傳到微信的服務(wù)器獲取`media_id`, 這個(gè)步驟我足足調(diào)試了一天,而且很詭異的是我不知道為啥就調(diào)通了!!!
我們這次的目的是, 制作一個(gè)帶有上傳文件表單的網(wǎng)頁,然后在本地選擇文件后, 點(diǎn)擊上傳發(fā)送post請求,在post中
1.把本地的圖片上傳到SAE服務(wù)器. 2.把SAE獲取到的圖片上傳到微信的服務(wù)器,獲取到media_id. 3.調(diào)用群發(fā)接口發(fā)送圖片消息,圖片的參數(shù)為我們剛獲取到的media_id.
這個(gè)網(wǎng)頁的名字為`sendimg.php`.
因?yàn)榘褕D片上傳到微信服務(wù)器過程中一直返回`文件類型錯(cuò)誤`, 所以我們寫了一個(gè)網(wǎng)頁來檢測我們上傳的文件類型到底對不對!!!
這個(gè)網(wǎng)頁的名字叫做`getfile.php`.
在`sendimg.php`網(wǎng)頁中,我們判斷是GET請求還是POST請求, 如果是`GET`我們返回一個(gè)上傳表單,如果是POST我們讀取本地的圖片信息并調(diào)用各種api.
- <?php
- // 通過 REQUEST_METHOD 字段判斷是否為GET
- function isGet(){
- return $_SERVER['REQUEST_METHOD'] == 'GET' ? true : false;
- }
- if(isGet()){
- // GET請求 返回一個(gè)表單
- // 提交時(shí)會post倒本頁
- $html = <<<TXT
- <html>
- <head>
- <title>SAE上傳文件到storage 實(shí)例演示</title>
- </head>
- <body>
- <form action="sendimg.php" method="post" enctype="multipart/form-data">
- <input type="file" name="file" />
- <input type="submit" value="submit">
- </form>
- </body>
- </html>
- TXT;
- echo $html;
- }
- else{
- // 獲取信息
- // 處理各種api
- }
- ?>
復(fù)制代碼
下面我們逐個(gè)介紹POST中需要用到的東西,我們要定義調(diào)用api中需要使用到的數(shù)據(jù)
- // 各種數(shù)據(jù)
- $appid = 'xxxx';
- $appsecret = 'xxxx';
- $token = '';
- $domain = 'xxxx';
復(fù)制代碼
獲取token的函數(shù):
- function getToken(){
- // 全局變量在函數(shù)里是不可可見的
- // 需要手動指定一下
- global $appid;
- global $appsecret;
- global $token;
- if('' != $token){
- return $token;
- }
- // 構(gòu)建獲取access_token的url
- $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
- // 構(gòu)建http請求并執(zhí)行
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $result=curl_exec($ch);
- curl_close($ch);
- // 解析返回的json數(shù)據(jù)
- $jsoninfo = json_decode($result);
- // 讀取json中的access_token字段
- $token = $jsoninfo->access_token;
- return $token;
- }
復(fù)制代碼
獲取到剛才提交的文件信息
- // 文件名
- $file_name = $_FILES["file"]["name"];
- // 文件類型
- $file_type = $_FILES["file"]["type"];
- // SAE服務(wù)器上文件臨時(shí)存貯地址
- $file_path = $_FILES["file"]["tmp_name"];
復(fù)制代碼
上傳接收到的圖片到微信的服務(wù)器
- function uploadImage($file_name, $file_path, $file_type){
- global $domain;
- $token = getToken();
- // 檢測md5是否為我們上傳的圖片
- // 因?yàn)槲⑿耪f我文件類型不對
- echo md5(file_get_contents($file_path));
- echo "<br>";
- // 為文件起一個(gè)新名字
- // 萬一因?yàn)橛兄形奈⑿耪f我文件類型不對呢
- $uplodetime = date("ymdHis");
- $file_ext = explode(".", $file_name);
- $file_ext = array_pop($file_ext);
- $file_ext = trim($file_ext);
- $file_ext = strtolower($file_ext);
- $new_file_name = $uplodetime . "." . $file_ext;
- $url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={$token}";
- // ok,這里是重點(diǎn)了
- // 要構(gòu)造一個(gè)curl上傳文件的數(shù)據(jù)
- // 1.@文件全路徑
- // 2.偽造一個(gè)文件名,后綴要和我們本地的圖片同意
- // 3.type 類似image/png之類的, 可以獲取到
- $info_str = "@{$file_path};filename={$new_file_name};type={$file_type}";
- $fields['media'] = $info_str;
- $ch = curl_init($url); // 準(zhǔn)備POST
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
- curl_setopt($ch, CURLOPT_POST,1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
- $responce = curl_exec($ch); // 執(zhí)行POST
- // 執(zhí)行完成后看看微信返回給我們的結(jié)果
- // 如果告訴我們不對,把這個(gè)地址切換到我們的getfile.php,看看是不是真的有問題
- // getfile會回顯上傳文件的信息
- var_dump($responce);
- echo "<br>";
- $responce = json_decode($responce);
- if(isset($responce->media_id)){
- return $responce->media_id;
- }
- return false;
- }
復(fù)制代碼
如果正確獲得了`media_id`,我們就可以掉用群發(fā)的api了,這個(gè)就很簡單了:
- function sendImageMsg($media_id){
- $token = getToken();
- $url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={$token}";
- $arrayData = array(
- 'filter' => array(
- 'is_to_all' => true
- ),
- 'image' => array(
- 'media_id' => $media_id
- ),
- 'msgtype' => 'image'
- );
- $sendJsonData = json_encode($arrayData);
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
- curl_setopt($ch, CURLOPT_POST,1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $sendJsonData);
- var_dump(curl_exec($ch));
- }
復(fù)制代碼
另外我們的`getfile.php`也很簡單
- <?php
- echo $_FILES["media"]["name"] . "<br>";
- echo $_FILES["media"]["type"] . "<br>";
- echo $_FILES["media"]["size"] . "<br>";
- echo $_FILES["media"]["tmp_name"] . "<br>";
- echo $_FILES["media"]["error"] . "<br>";
- echo md5(file_get_contents($_FILES["media"]["tmp_name"]));
- ?>
復(fù)制代碼
上傳到sae后我們就可以通過訪問這個(gè)網(wǎng)頁群發(fā)圖片消息了!!!! 悲劇的是,我的群發(fā)調(diào)用次數(shù)超過配額了!!!
全部的代碼在附件中:
|