找回密码
 立即注册

QQ登录

只需一步,快速开始

微信公众号开发资源

关注:780

所属分类: 微信开发 微信公众号开发资源

本版块为微信公众号开发教程与公众号开发相关技术分享板块,技术提问请到其他对应的问答板块发帖:)

[公众号开发博客] 群发图片消息 - 傻瓜式微信开发教程22 - 耗子原创

[复制链接]
查看: 10753|回复: 41
最佳答案
91 

57

主题

231

帖子

2112

积分

超级版主

Rank: 8Rank: 8

积分
2112
QQ
 楼主| 发表于 2015-8-26 10:41:13 | 显示全部楼层 |阅读模式
本帖最后由 moremorefun 于 2015-8-26 10:41 编辑

现在我们来学学习群发图片消息.
其中的难点是把图片上传到微信的服务器获取`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后我们就可以通过访问这个网页群发图片消息了!!!!
悲剧的是,我的群发调用次数超过配额了!!!

全部的代码在附件中:
游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

最佳答案
0 

0

主题

23

帖子

17

积分

新人求带

积分
17
发表于 2015-9-20 21:43:47 | 显示全部楼层
感谢楼主的无私奉献
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

18

帖子

10

积分

新人求带

积分
10
发表于 2015-9-25 15:34:04 | 显示全部楼层
才才踩踩踩才踩踩踩从踩踩踩踩踩踩踩踩踩踩踩踩踩踩踩
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

17

帖子

21

积分

新人求带

积分
21
发表于 2015-9-28 16:23:02 | 显示全部楼层
继续学习中
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

24

帖子

59

积分

新人求带

积分
59
发表于 2015-10-19 01:39:01 | 显示全部楼层
test1..........
回复

使用道具 举报

最佳答案
0 

0

主题

3

帖子

11

积分

新人求带

积分
11
发表于 2015-10-20 14:46:00 | 显示全部楼层
wdgfhsidugsgsdfgdsfgres
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

11

帖子

6

积分

新人求带

积分
6
发表于 2015-11-2 16:06:40 | 显示全部楼层
回复一个图文消息
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

19

帖子

58

积分

新人求带

积分
58
发表于 2015-11-5 15:57:25 | 显示全部楼层
感谢分享
回复

使用道具 举报

最佳答案
0 

0

主题

43

帖子

422

积分

略知一二

积分
422
发表于 2015-11-13 21:24:08 | 显示全部楼层
lllllllllllllllllllll
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

72

帖子

410

积分

略知一二

积分
410
发表于 2015-11-16 14:41:19 | 显示全部楼层
666666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


易域网-您身边的域名管家

henkuai.com是专业的第三方微信开发者平台,为生态而生。


本站为第三方微信开发者平台,非腾讯官方网站。

天津市滨海新区
中新生态城中成大道生态建设公寓9号楼3层301

欢迎来这里一起喝喝茶,
聊聊你的产品。

微信公众号gongzhongkaifa

工作日12小时内回复。

网站业务
zhongcong@henkuai.com

工作日12小时内回复。

市场合作
songchang@henkuai.com