打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
群发图片消息 - 傻瓜式微信开发教程22
现在我们来学学习群发图片消息.
其中的难点是把图片上传到微信的服务器获取`media_id`,
这个步骤我足足调试了一天,而且很诡异的是我不知道为啥就调通了!!!

我们这次的目的是,
制作一个带有上传文件表单的网页,然后在本地选择文件后,
点击上传发送post请求,在post中

1.把本地的图片上传到SAE服务器.
2.把SAE获取到的图片上传到微信的服务器,获取到media_id.
3.调用群发接口发送图片消息,图片的参数为我们刚获取到的media_id.

这个网页的名字为`sendimg.php`.

因为把图片上传到微信服务器过程中一直返回`文件类型错误`,
所以我们写了一个网页来检测我们上传的文件类型到底对不对!!!

这个网页的名字叫做`getfile.php`.

在`sendimg.php`网页中,我们判断是GET请求还是POST请求,
如果是`GET`我们返回一个上传表单,如果是POST我们读取本地的图片信息并调用各种api.

  1. <?php
  2.     // 通过 REQUEST_METHOD 字段判断是否为GET
  3.     function isGet(){
  4.       return $_SERVER['REQUEST_METHOD'] == 'GET' ? true : false;
  5.     }

  6.     if(isGet()){
  7.         // GET请求 返回一个表单
  8.         // 提交时会post倒本页
  9.         $html = <<<TXT
  10.         <html>
  11.         <head>
  12.         <title>SAE上传文件到storage 实例演示</title>
  13.         </head>
  14.         <body>
  15.             <form action="sendimg.php"  method="post" enctype="multipart/form-data">
  16.             <input type="file"  name="file" />
  17.             <input type="submit" value="submit">
  18.             </form>
  19.         </body>
  20.         </html>
  21. TXT;
  22.         echo $html;
  23.     }
  24.     else{
  25.         // 获取信息
  26.         // 处理各种api
  27.     }
  28. ?>
复制代码


下面我们逐个介绍POST中需要用到的东西,我们要定义调用api中需要使用到的数据

  1. // 各种数据
  2. $appid = 'xxxx';
  3. $appsecret = 'xxxx';
  4. $token = '';
  5. $domain = 'xxxx';
复制代码


获取token的函数:

  1. function getToken(){
  2.     // 全局变量在函数里是不可可见的
  3.     // 需要手动指定一下
  4.     global $appid;
  5.     global $appsecret;
  6.     global $token;

  7.     if('' != $token){
  8.         return $token;
  9.     }

  10.     // 构建获取access_token的url
  11.     $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
  12.     // 构建http请求并执行
  13.     $ch = curl_init();
  14.     curl_setopt($ch, CURLOPT_URL, $url);
  15.     curl_setopt($ch, CURLOPT_HEADER, false);
  16.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  17.     $result=curl_exec($ch);
  18.     curl_close($ch);
  19.     // 解析返回的json数据
  20.     $jsoninfo = json_decode($result);
  21.     // 读取json中的access_token字段
  22.     $token = $jsoninfo->access_token;

  23.     return $token;
  24. }
复制代码


获取到刚才提交的文件信息
  1. // 文件名
  2. $file_name = $_FILES["file"]["name"];
  3. // 文件类型
  4. $file_type = $_FILES["file"]["type"];
  5. // SAE服务器上文件临时存贮地址
  6. $file_path = $_FILES["file"]["tmp_name"];
复制代码


上传接收到的图片到微信的服务器

  1. function uploadImage($file_name, $file_path, $file_type){
  2.     global $domain;
  3.     $token = getToken();
  4.     // 检测md5是否为我们上传的图片
  5.     // 因为微信说我文件类型不对
  6.     echo md5(file_get_contents($file_path));
  7.     echo "<br>";

  8.     // 为文件起一个新名字
  9.     // 万一因为有中文微信说我文件类型不对呢
  10.     $uplodetime = date("ymdHis");
  11.     $file_ext = explode(".", $file_name);
  12.     $file_ext = array_pop($file_ext);
  13.     $file_ext = trim($file_ext);
  14.     $file_ext = strtolower($file_ext);
  15.     $new_file_name = $uplodetime . "." . $file_ext;

  16.     $url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={$token}";
  17.     // ok,这里是重点了
  18.     // 要构造一个curl上传文件的数据
  19.     // 1.@文件全路径
  20.     // 2.伪造一个文件名,后缀要和我们本地的图片同意
  21.     // 3.type 类似image/png之类的, 可以获取到
  22.     $info_str = "@{$file_path};filename={$new_file_name};type={$file_type}";
  23.     $fields['media'] = $info_str;

  24.     $ch = curl_init($url);  // 准备POST
  25.     curl_setopt($ch, CURLOPT_HEADER, false);
  26.     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  27.     curl_setopt($ch, CURLOPT_POST,1);
  28.     curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
  29.     $responce = curl_exec($ch); // 执行POST

  30.     // 执行完成后看看微信返回给我们的结果
  31.     // 如果告诉我们不对,把这个地址切换到我们的getfile.php,看看是不是真的有问题
  32.     // getfile会回显上传文件的信息
  33.     var_dump($responce);
  34.     echo "<br>";

  35.     $responce = json_decode($responce);

  36.     if(isset($responce->media_id)){
  37.         return $responce->media_id;
  38.     }
  39.     return false;
  40. }
复制代码


如果正确获得了`media_id`,我们就可以掉用群发的api了,这个就很简单了:
  1. function sendImageMsg($media_id){
  2.     $token = getToken();

  3.     $url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={$token}";
  4.     $arrayData = array(
  5.       'filter' => array(
  6.         'is_to_all' => true
  7.       ),
  8.       'image' => array(
  9.         'media_id' => $media_id
  10.       ),
  11.       'msgtype' => 'image'
  12.     );
  13.     $sendJsonData = json_encode($arrayData);

  14.     $ch = curl_init($url);
  15.     curl_setopt($ch, CURLOPT_HEADER, false);
  16.     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  17.     curl_setopt($ch, CURLOPT_POST,1);
  18.     curl_setopt($ch, CURLOPT_POSTFIELDS, $sendJsonData);
  19.     var_dump(curl_exec($ch));
  20. }
复制代码


另外我们的`getfile.php`也很简单
  1. <?php
  2.     echo $_FILES["media"]["name"] . "<br>";
  3.     echo $_FILES["media"]["type"] . "<br>";
  4.     echo $_FILES["media"]["size"] . "<br>";
  5.     echo $_FILES["media"]["tmp_name"] . "<br>";
  6.     echo $_FILES["media"]["error"] . "<br>";

  7.     echo md5(file_get_contents($_FILES["media"]["tmp_name"]));
  8. ?>
复制代码


上传到sae后我们就可以通过访问这个网页群发图片消息了!!!!
悲剧的是,我的群发调用次数超过配额了!!!

全部的代码在附件中:
游客,如果您要查看本帖隐藏内容请回复
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
微信公众平台开发(八) 自定义菜单功能开发
微信自定义菜单创建
curl抓取时cookie怎么不保存到文件且自动使用?
八个PHP高级工程经典面试题(附答案)
curl 发送采集请求的方法
使用curl获取服务器传递来数据并打印出来
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服