2016-09-22 09:43:58 bianhuakairi 阅读数 2945
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14298 人正在学习 去看看 秦子恒

本文采用的的是ajaxFileUpload上传图片

下图是gsp中的图片上传页面


下图是上传的js方法,需要注意的是参数datatype,因为使用的ajaxFileUpload.js的插件不同,数值也可能不同,例如:text、json、xml等。


下图是控制层controller


下图是逻辑层service



2017-05-03 16:59:02 Luze_1226 阅读数 2552
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14298 人正在学习 去看看 秦子恒

微信公众后台开发之素材管理

        最近应公司要求,对公司的微信公众号后台走升级,添加部分功能,其中就是需要在后台上传图片,而公众号回根据用户的按钮点击事件返回后台上传的图片。看着就是简单的需求,但是还是要先了解下微信开发文档,在来做开发微信开发文档
       看过文档后发现不是想象中的那么简单,这里涉及到三个系统的交互,一个是用户的收集,一个是自己的后台服务器,一个是微信服务器,做公众号的图片回复的时候,需要将图片上传到微信服务器,获取素材的media_id,然后使用media_id组装成微信规定的XML信息模板,当用户点击按钮的时候,返回给用户上传的图片。
       微信对上传的素材做了区分,分别为:临时素材和永久素材,他们上传的方式也不一样,同时也会有要求。对于永久素材,需要做删除操作。我使用PHP做开发,首先看看上传临时素材,文档给了我们URL和请求的方法。然后做编程。编程先把请求的方法包装下:
protected static function https_request($url, $data = null)
{
 //创建一个新cURL资源
 $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    if (!empty($data)){
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($curl);
    curl_close($curl);
    return $output;
}
上包装了对请求的操作,接下来就是做上传素材了,微信不接受网络素材,只好是自己的本地图片做上传,这里写了一个方法来做上传临时素材:
//获取上传图片的medioId 添加临时素材
public function get_media_id($imgUrl){

     $TOKEN="idtbxhOnI4YZ8gFRHeUEU-MYk4T3XxVndEZKvx2jlx3dGteEWEyG6Twck9MTgsyXRl_MqyBhgYa4w73mjGnvXH17Nguhqs7Z2QCpCu7SvzUYIWjAHALVJ";
      $URL ='http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token='.$TOKEN.'&type=image';



    $filedata = array("media"  => "@".$imgUrl);

   $result =$this->https_request($URL,$filedata);
   echo var_dump($result).'<br>';
   $res = json_decode($result,true);
    return $res;
}
上面的TOKEN是微信自己公众号的accessToken,可以通过文档网页测试来获取做测试,也可以自己写方法获取,这里就不写了,通过给参数$imageUrl就可以获得media_id,在使用media_id就可以在公众号显示了,上传永久素材和上传临时素材是一样的,只是链接不一样:
 //添加永久素材
    public function uploadImg($imgUrl){

        $TOKEN="7ZT1cX_zIh0PFJnINPPaVew5yIDAU9N0umuwt5kmyuMwGVW2LCCTmokixxt99Rix0NixyKiQP-kB-T8KxYNllkRz7pZ7znWfIKOkK8bYUmsCFIgAFAFIL";
        $url = 'https://api.weixin.qq.com/cgi-bin/material/add_material?access_token='.$TOKEN.'&type=image';
//         $URL ='http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token='.$TOKEN.'&type=image';
        $data = array('media'=>'@'.$imgUrl);
        $result = $this->https_request($url,$data);
        $data = @json_decode($result,true);

        return $data['media_id'];

//         return $data;
    }

这是不是很简单,现在看看如何删永久素材,删除素材,首先要获取素材的media_id,在通过media_id来删除素材,这就需要我们自己先保存上传后的素材media_id,方便我们做删除操作。这里直接给出代码:
   public function del_media($media_id){
         $TOKEN="7ZT1cX_zIh0PFJnINPPaVew5yIDAU9N0umuwt5kmyuMwGVW2LCCTmokixxt99Rix0NixyKiQP-kB-T8KxYNllkRz7pZ7znWfIKOkK8bYUmsCFIgAFAFIL";
         $media_id = 'b6geinBHCE6Z3WrilwK0NEeVU4JZDlcdebGYQrYOy-k';
//          $media_id = 'b6geinBHCE6Z3WrilwK0NBO88W4Q5nNrhWQOiUKQouA';
         $url = 'https://api.weixin.qq.com/cgi-bin/material/del_material?access_token='.$TOKEN;
         $data = '{"media_id":"%s"
}';
         $data = sprintf($data,$media_id);
         $result = $this->https_request($url,$data);
         $res = json_decode($result,true);
         return $res;
     }

这里要注意下请求的参数的格式一定要多注意,否则会报错。


2018-02-01 15:51:11 qq_34752829 阅读数 220
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14298 人正在学习 去看看 秦子恒

微信开发之上传素材

本文目录 :

  1. 上传图文素材的图片
  2. 上传其他素材
  3. 关键的http表单请求代码
  4. 小结
  5. 参考文档



前言
我在实现微信公众平台上传素材的时候遇到了许多问题,但最终还是成功实现这一功能,特此在这里做一下总结和记录。


文中遇到诸如 getAccessToken() 等关键函数却没有找到实现时,可参考前面的这两篇文章:

1、微信开发之获取用户详细列表
2、微信开发之向用户群发文本消息



1、 上传图文素材的图片

首先选一个简单的接口来做说明例子,这个上传素材的接口在所有上传素材的接口中是参数最简单的,而且还单独享用一个URL, 作为入门例子再合适不过了。

注意,本文主要侧重点是代码层面的实现,而不是微信官方一大堆规则的讲解,如果你有需要此方面的介绍,下面已给出官方链接不谢。

官方文档:

新增永久素材

官方给的这个接口,除了需要惯例的 access_token ,还需要一个文件的参数,一般而言,只需要一个文件路径,其他文件参数通过这个路径获取解析则可,做成一个黑匣子,简单易用。
我知道,有人就是专门找下边的 Requests::request() 的实现的,可在这就没看到实现,别急,下面就有。

public function uploadNewsImage($path)
{
    $access_token = $this->getAccessToken();
    if (!$access_token) {
        return false;
    }

    $path = realpath($path);
    $post = ['media '=> '@'.$path];
    $url ="https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={$access_token}";
    $return = $this->requestAndCheck($url, 'POST', $post);
    if ($return === false) {
        return false;
    }

    return $return;
}

/**
 * 专门用来检查微信接口返回值的。
 * 是的,这个接口比上一两篇文章的接口更加好用。东西一般做多,就知道要抽象了,如果还没有那水平的话。
 */
public function requestAndCheck($url, $method = 'GET', $fields = [])
{
    $return = Requests::request($url, $method, $fields);
    if ($return === false) {
        $this->setError("request出错! " . Requests::$error);
        return false;
    }

    $wxdata = json_decode($return, true);
    if (isset($wxdata['errcode']) && $wxdata['errcode'] != 0) {
        $this->setError("微信错误代码:{$wxdata['errcode']};<br>错误信息:{$wxdata['errmsg']}<br>请求链接:$url");
        return false;
    }

    if (strtoupper($method) === 'GET' && empty($wxdata)) {
        $this->setError("微信http请求返回为空!<br>请求链接:$url");
        return false;
    }

    return $wxdata;
}



2、 上传其他素材

懂得上面的流程,其他的上传素材的接口,无非就是加多个 GET 和 POST 参数,主流程没变。
其他相关接口列举如下:

1、新增永久图文素材:https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
2、新增其他类型永久素材:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE
3、新增临时素材:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE


功能的约束和细节还望参考官方文档:

1、新增永久素材
2、新增临时素材



3、 关键的http表单请求代码

先上代码:(这里边已经简化很多附加功能,比如可以改变header之类的功能,该代码主要参考一些开源的项目)

public static function request($url, $method = 'GET', $fields = [])
{
    self::$ch = curl_init();
    curl_setopt(self::$ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt(self::$ch, CURLOPT_CONNECTTIMEOUT, 10);

    $method = strtoupper($method);
    if ($method == 'GET' && !empty($fields)) {
        $url = $url . (strpos($url,"?")===false ? "?" : "&") . http_build_query($fields);
    }
    curl_setopt(self::$ch, CURLOPT_URL, $url);

    if ($method != 'GET') {
        curl_setopt(self::$ch, CURLOPT_POST, true);

        if (!empty($fields)) {
            if (is_array($fields)) {
                /* 支持文件上传 */
                if (class_exists('\CURLFile')) {
                    curl_setopt(self::$ch, CURLOPT_SAFE_UPLOAD, true);
                    foreach ($fields as $key => $value) {
                        if (is_string($value) && strpos($value, '@') === 0) {
                            $fields[$key] = new CURLFile(realpath(ltrim($value, '@')),
                                            'image/jpg', basename(ltrim($value, '@')));
                        }
                    }
                } elseif (defined('CURLOPT_SAFE_UPLOAD')) {
                    curl_setopt(self::$ch, CURLOPT_SAFE_UPLOAD, false);
                }
            }
            curl_setopt(self::$ch, CURLOPT_POSTFIELDS, $fields);
        }
    }

    /* 关闭https验证 */
    if ("https" == substr($url, 0, 5)) {
        curl_setopt(self::$ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt(self::$ch, CURLOPT_SSL_VERIFYHOST, false);
    }

    self::$content = curl_exec(self::$ch);
    curl_close(self::$ch);

    return self::$content;
}


重点分析:

/* 支持文件上传 */
if (class_exists('\CURLFile')) {
    curl_setopt(self::$ch, CURLOPT_SAFE_UPLOAD, true);
    foreach ($fields as $key => $value) {
        if (is_string($value) && strpos($value, '@') === 0) {
            $fields[$key] = new CURLFile(realpath(ltrim($value, '@')));
        }
    }
} elseif (defined('CURLOPT_SAFE_UPLOAD')) {
    curl_setopt(self::$ch, CURLOPT_SAFE_UPLOAD, false);
}

这里面有个php版本的坑,5.4版本只支持用 @ 来进行上传文件,5.5是个过渡版本,支持 @ 和 CURLFile 两种方式上传文件,而到了5.6,就只支持 CURLFile 了。所以需要用兼容模式来适应不同版本。

关于为什么不用php版本号来判断呢?你用版本号谁知道你是要来判断啥呢?难道加个注释?
而常量 CURLOPT_SAFE_UPLOAD 是用来开启是否支持 @ 的,当然,5.6版本设置了也没有。

还有,要上传file的时候,一定要用数组给 curl_setopt(self::$ch, CURLOPT_POSTFIELDS, $fields); 传值,而不能用 http_build_query() ,一个的http请求头中的 content-type 是 multipart/form-date ,另一个是 application/x-www-form-urlencoded 。file用二进制编码进行传输,而普通的post数据是文本传输。

上面的相关知识还请详看 参考文档



小结
如果你已有上传文件的接口,其实这个功能不算啥,按照官方文档进行 post url 即可。如果没有,或者没有实现文件上传功能,就要对 curl 研究一下了,还要踩一下php版本的坑。。。不过对 curl 掌握就更加全面而牢固了,这难道不是我们的目的?



主要参考文档

1、微信公众号开发文档
2、Multipart/form-data POST文件上传详解
3、PHP的CURLOPT_POSTFIELDS参数使用数组和字符串的区别
4、The CURLFile class
5、考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传


-end-

2015-08-31 16:00:29 u010773333 阅读数 7876
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14298 人正在学习 去看看 秦子恒

最近产品经理要做每天推送图文信息的功能,哎,还要超链接传递不同的参数,苦逼呀。。网上查了一些资料,下面讲解一下群发素材

要群发素材,首先要先获得素材,素材都是以图片和文字的形式推送给用户的,所以要首先获得图片和文字

微信的上传媒体接口:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

可以用来上传图片,上传成功返回:{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789},其中media_id就是图片在微信服务器的标识。

上传方法:

       /// <summary>
        /// 上传媒体返回媒体ID
        /// </summary>
        public static string UploadMedia(string access_token, string type, string path)
        {
            // 设置参数
            string url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", access_token, type);
            return HttpRequestUtil.HttpUploadFile(url, path);
        }

第二步:拼接图文消息素材Json字符串,其中msg就是上述的微信服务器传回来的媒体ID

       /// <summary>
        /// 拼接图文消息素材Json字符串
        /// </summary>
        public static string GetArticlesJsonStr(string access_token,string msg)
        {
            StringBuilder sbArticlesJson = new StringBuilder();

             sbArticlesJson.Append("{\"articles\":[");
                //string media_id = Tools.GetJsonValue(msg, "media_id");
               // string media_id = (msg,"media_id");
                sbArticlesJson.Append("{");
                // sbArticlesJson.Append();
                sbArticlesJson.Append("\"thumb_media_id\":\"" + msg + "\",");
                sbArticlesJson.Append("\"author\":\"" + "王华涛" + "\",");
                sbArticlesJson.Append("\"title\":\"" + "作业已经完成" + "\",");
                sbArticlesJson.Append("\"content_source_url\":\"" + "http://。。。。" + "\",");
                sbArticlesJson.Append("\"content\":\"" + "作业信息" + "\",");
                sbArticlesJson.Append("\"digest\":\"" +"您孩子的作业已经完成" + "\",");
                sbArticlesJson.Append("\"show_cover_pic\":\"1\"}");
                sbArticlesJson.Append("]}");

            return sbArticlesJson.ToString();
        } 

第三步:上传图文消息素材,其中postData就是拼接图文消息素材Json字符串,调用微信接口上传之后获得media_id

        /// <summary>
        /// 上传图文消息素材返回media_id
        /// </summary>
        public static string UploadNews(string access_token, string postData)
        {
            return HttpRequestUtil.PostUrl(string.Format("https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token={0}", access_token), postData);
        }

第四步:图文消息json,添加发送用户openid

      /// <summary>
        /// 图文消息json
        /// </summary>
        public static string CreateNewsJson(string media_id, List<string> openids)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("{\"touser\":[\"");

            foreach(string  openid in openids)    

            {

                 sb.Append(openid);
                sb.Append("\",\"");

            }
            sb.Append("\"],");
            sb.Append("\"msgtype\":\"mpnews\",");
            sb.Append("\"mpnews\":{\"media_id\":\"" + media_id + "\"}");
            sb.Append("}");
            return sb.ToString();
        }
第五步:调用微信发送素材接口,根据OpenID列表群发素材信息

        /// <summary>
        /// 根据OpenID列表群发
        /// </summary>
        public static string Send(string access_token, string postData)
        {
            return HttpRequestUtil.PostUrl(string.Format("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}", access_token), postData);
        }



2018-01-02 12:29:49 sukangshen 阅读数 1450
  • 微信开发之三素材管理-微信开发php版

    微信开发之素材管理是子恒老师《微信公众平台开发》视频教程的第三部。详细讲解了用php开发微信,对微信公众平台中的素材管理开发。内容包含微信临时素材,永久素材的上传,删除,获取素材的media_id等等。欢迎反馈,微信/QQ:68183131

    14298 人正在学习 去看看 秦子恒

由于PHP版本的问题 在公众号开发过程中上传图片老是失败,下面给大家提供一个PHP5.6以上的上传图片的例子

       /**
       * 上传永久图片的接口------------------------------------------------------------------------
       */
	public function actionNewupload()
	{
		$TOKEN=$this->actionToken();
		$file = "D:/upload/bb4.png";
		$data = array(
            'media'=> new CURLFile($file)
        );
	    $url = 'https://api.weixin.qq.com/cgi-bin/material/add_material?access_token='.$TOKEN.'&type=image';
        $result = $this->curl_posts($url,$data);
        var_dump($result);
	}

	function curl_posts($url, $data, $header = array()){
            if(function_exists('curl_init')) {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                if(is_array($header) && !empty($header)){
                    $set_head = array();
                    foreach ($header as $k=>$v){
                        $set_head[] = "$k:$v";
                    }
                    curl_setopt($ch, CURLOPT_HTTPHEADER, $set_head);
                }
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_TIMEOUT, 0);// 1s to timeout.
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                $response = curl_exec($ch);
                if(curl_errno($ch)){
                    //error
                    return curl_error($ch);
                }
                $reslut = curl_getinfo($ch);
                print_r($reslut);
                curl_close($ch);
                $info = array();
                if($response){
                    $info = json_decode($response, true);
                }
                return $info;
            } else {
                throw new Exception('Do not support CURL function.');
            }
    }

我使用的是Yii1.1框架 调用newupload方法  传入参数AccessToken 图片的路径 就可以进行上传了


希望对你有帮助


微信新增临时素材----图片

博文 来自: m0_38027358
没有更多推荐了,返回首页