现在我们来学学习群发图片消息.
其中的难点是把图片上传到微信的服务器获取`media_id`,
这个步骤我足足调试了一天,而且很诡异的是我不知道为啥就调通了!!!
我们这次的目的是,
制作一个带有上传文件表单的网页,然后在本地选择文件后,
点击上传发送post请求,在post中
1.把本地的图片上传到SAE服务器.
2.把SAE获取到的图片上传到微信的服务器,获取到media_id.
3.调用群发接口发送图片消息,图片的参数为我们刚获取到的media_id.
这个网页的名字为`sendimg.php`.
因为把图片上传到微信服务器过程中一直返回`文件类型错误`,
所以我们写了一个网页来检测我们上传的文件类型到底对不对!!!
这个网页的名字叫做`getfile.php`.
在`sendimg.php`网页中,我们判断是GET请求还是POST请求,
如果是`GET`我们返回一个上传表单,如果是POST我们读取本地的图片信息并调用各种api.
- <?php
- // 通过 REQUEST_METHOD 字段判断是否为GET
- function isGet(){
- return $_SERVER['REQUEST_METHOD'] == 'GET' ? true : false;
- }
- if(isGet()){
- // GET请求 返回一个表单
- // 提交时会post倒本页
- $html = <<<TXT
- <html>
- <head>
- <title>SAE上传文件到storage 实例演示</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
- }
- ?>
复制代码下面我们逐个介绍POST中需要用到的东西,我们要定义调用api中需要使用到的数据
- // 各种数据
- $appid = 'xxxx';
- $appsecret = 'xxxx';
- $token = '';
- $domain = 'xxxx';
复制代码获取token的函数:
- function getToken(){
- // 全局变量在函数里是不可可见的
- // 需要手动指定一下
- global $appid;
- global $appsecret;
- global $token;
- if('' != $token){
- return $token;
- }
- // 构建获取access_token的url
- $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
- // 构建http请求并执行
- $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数据
- $jsoninfo = json_decode($result);
- // 读取json中的access_token字段
- $token = $jsoninfo->access_token;
- return $token;
- }
复制代码获取到刚才提交的文件信息
- // 文件名
- $file_name = $_FILES["file"]["name"];
- // 文件类型
- $file_type = $_FILES["file"]["type"];
- // SAE服务器上文件临时存贮地址
- $file_path = $_FILES["file"]["tmp_name"];
复制代码上传接收到的图片到微信的服务器
- function uploadImage($file_name, $file_path, $file_type){
- global $domain;
- $token = getToken();
- // 检测md5是否为我们上传的图片
- // 因为微信说我文件类型不对
- echo md5(file_get_contents($file_path));
- echo "<br>";
- // 为文件起一个新名字
- // 万一因为有中文微信说我文件类型不对呢
- $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,这里是重点了
- // 要构造一个curl上传文件的数据
- // 1.@文件全路径
- // 2.伪造一个文件名,后缀要和我们本地的图片同意
- // 3.type 类似image/png之类的, 可以获取到
- $info_str = "@{$file_path};filename={$new_file_name};type={$file_type}";
- $fields['media'] = $info_str;
- $ch = curl_init($url); // 准备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); // 执行POST
- // 执行完成后看看微信返回给我们的结果
- // 如果告诉我们不对,把这个地址切换到我们的getfile.php,看看是不是真的有问题
- // getfile会回显上传文件的信息
- var_dump($responce);
- echo "<br>";
- $responce = json_decode($responce);
- if(isset($responce->media_id)){
- return $responce->media_id;
- }
- return false;
- }
复制代码如果正确获得了`media_id`,我们就可以掉用群发的api了,这个就很简单了:
- 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));
- }
复制代码另外我们的`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"]));
- ?>
复制代码上传到sae后我们就可以通过访问这个网页群发图片消息了!!!!
悲剧的是,我的群发调用次数超过配额了!!!
全部的代码在附件中:
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。