2017-06-30 17:59:25 paulorwys 阅读数 3284
  • 微信开发之三素材管理-微信开发php版

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

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

背景

在Spring MVC(4.3.8)下使用HttpClient(4.5.3)调用企业微信的上传临时素材文件的接口失败,错误消息为:empty media data

接口定义参见企业微信开发文档:https://work.weixin.qq.com/api/doc#10112

分析

纯属惯性思维造成的问题。

在调用其他接口(例如:获取acces-token、获取部门列表、发送消息)使用的是GET或POST接口,传输的内容都是文本,所以,都指定了编码字符集。

而素材上传所传输的内容却是二进制,所以,无需编码;否则会造成文件项的key无法被正常识别?

有问题的代码:

HttpPost post = new HttpPost(url);
//
HttpClient client = HttpClients.createDefault();
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(Charset.forName(FsSpec.Charset_Default) );
//添加表单部分
if (params != null && !params.isEmpty()) {
	for (Map.Entry<String, String> entry : params.entrySet()) {
		builder.addTextBody(entry.getKey(), entry.getValue());
	}
}
//添加文件部分
if (file != null && file.exists()) {
	builder.addBinaryBody("file1", file, ContentType.DEFAULT_BINARY, file.getName() );
}		
post.setEntity(builder.build() );
HttpResponse response = client.execute(post);

测试OK的代码:

HttpPost post = new HttpPost(url);
//
HttpClient client = HttpClients.createDefault();
MultipartEntityBuilder builder = MultipartEntityBuilder.create();

builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//@2017-06-28 在文件上传中,有些系统不支持指定字符集(企业微信)
//builder.setCharset(Charset.forName(FsSpec.Charset_Default) );

//先添加文件部分(无需指定编码)
if (file != null && file.exists()) {
	builder.addBinaryBody(name, file, ContentType.DEFAULT_BINARY, file.getName() );
}

//再添加表单部分(需指定编码,@2017-06-28 key和value都需要指定编码)
if (params != null && !params.isEmpty()) {
	
	//@2017-06-28 在文件上传中,有些系统不支持指定字符集(企业微信)
	builder.setCharset(Charset.forName(FsSpec.Charset_Default) );
	ContentType contentType = ContentType.create("text/plain", FsSpec.Charset_Default);
	
	for (Map.Entry<String, String> entry : params.entrySet()) {
		
		builder.addTextBody(entry.getKey(), entry.getValue(), contentType);
	}
}

post.setEntity(builder.build() );
HttpResponse response = client.execute(post);
对比不难发现有3个要点:

(1)MultipartEntityBuilder不再开始就指定字符集(换到了后面);

(2)调整了表单部分和文件部分的打包顺序(先文件再表单部分);

(3)对于表单部分,打包时既指定了MultipartEntityBuilder的字符集,又指定了内容的字符集(通过指定ContentType)

对于(1)的理解是:文件部分的内容类型为二进制,无需指定字符集;

对于(2)的理解是兼顾表单内容(需要指定字符集)。

对于(3)的理解是对表单内容(键-值对)中的值也进行编码。

有兴趣的读者可以试试。如果少了(3)你会发现当值为中文时会出现解析乱码。

但如果不指定MultipartEntityBuilder的字符集,键为中文时又会出现解析乱码。

结语

(1)文件上传不同于文本(JSON或XML),需要从内容上考虑是否使用编码(如果你把文件内容按照BASE64编码、那就按文本来了);

(2)要兼顾文本内容和表单内容混合上传的情形;

(3)对表单内容的键和值都需要考虑编码(特别是中文的情形下)。


2017-07-26 19:28:56 m0_38027358 阅读数 1269
  • 微信开发之三素材管理-微信开发php版

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

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

微信新增临时素材

这里写图片描述
这里写图片描述
这里写图片描述

获取access_token—getaccesstoken.php

<?php  
    //7200s内获取access_token
    function getAccessToken(){
        if(file_exists('access_token.txt')){
            $time=filemtime('access_token.txt');
            $nowtime=time();
            if($nowtime-$time>7200){
                unlink('access_token.txt');
                $res= wechatAccessToken();
            }else{
                $str=file_get_contents('access_token.txt');
                $arr=json_decode($str,true);
                $res= $arr['access_token'];
            }
        }else{
            $res= wechatAccessToken();
        }
        return $res;
    }
    //请求获取access_token接口
    function wechatAccessToken(){
        $url='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=***&secret=***';
        $str=file_get_contents($url);
        $arr=json_decode($str,true);
        $access_token=$arr['access_token'];
        file_put_contents('access_token.txt', $access_token);
        return $access_token;
    }
    // echo getAccessToken();
?>

模拟表单上传图片素材—form.php

<?php  
    include('getaccesstoken.php');
    $access_token=getAccessToken();
    $url='https://api.weixin.qq.com/cgi-bin/media/upload?access_token='.$access_token.'&type=image';
    $data=array(
        'media'=>new CURLFile(realpath('./banner_02.jpg'))
    );
    $res=postCurl($url,$data);
    print_r($res);

//{"type":"image","media_id":"JfY0syKKmrovPoOrn7Q5ZJcgs_eC9uMLoALkPwmwJiCxacod7JR4QNMfBq0g0aKB","created_at":1501067593}

    function postCurl($url,$data){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $tmpInfo = curl_exec($ch);
        curl_close($ch);
        return $tmpInfo;
    }
?>
2017-11-06 10:31:00 towtotow 阅读数 307
  • 微信开发之三素材管理-微信开发php版

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

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

上一节课程中,

我们实现了公众号临时图片的上传,

由于微信公众号的临时视频,临时语音,临时缩略图上传跟临时图片类似,

我们只要在一些关键的地方进行配置就行…


33temp_sucai.jpg

公众号上传视频语音等临时素材视频教程在线观看

http://edu.csdn.net/course/detail/2860/45751

2017-03-10 20:32:47 CSDN_Ronaldo7 阅读数 1310
  • 微信开发之三素材管理-微信开发php版

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

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

今天被这个问题折腾了一天了,各种方法都试过了,走过很多弯路,最终把这条路走通了,写个博客纪念一下。

第一步,微信交互的API大家自己上网看,在此提供链接,https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1474632113_xQVCl&token=&lang=zh_CN

第二步,其实让浏览器带着一个文档去访问微信接口很简单,没有任何难度,问题是,我们不想让浏览器直接访问微信服务器,我们想让浏览器先访问我们的Controller,然后让Controller去访问微信服务器。至于为什么这么做,最重要的原因有两点,1.方便获取media_id(素材上传到微信服务器,服务器会返回一个media_id,方便调用素材),2.方便后台管理,查看发送记录等等。

第三步,话不多说,直接上代码,不懂得请看注释,或者私信我。

public void addTempMaterial(HttpServletRequest request,HttpServletResponse response) throws AppException, IOException{
        // 转型为MultipartHttpRequest:   
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
        // 获得文件  
        MultipartFile mfile = multipartRequest.getFile("mfile");   
        File file = new File(mfile.getOriginalFilename());
        FileUtils.copyInputStreamToFile(mfile.getInputStream(), file);
        //获得文件类型
        String type = mfile.getContentType();
        String filetype = type.substring(0, 5);
        if("audio".equals(filetype)){
            type="voice";
        }
        HttpClient client = new HttpClient();  
        // 返回结果集  
        JSONObject resJson = new JSONObject();  
        String url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token="+accessServer.getAccessToken()+"&type="+type;
        PostMethod postMethod = new PostMethod(url);  
        // FilePart:用来上传文件的类  
        FilePart filePart = new FilePart("img", file);  
        Part[] parts = { filePart };  
        // 对于MIME类型的请求,httpclient建议全用MulitPartRequestEntity进行包装  
        MultipartRequestEntity mre = new MultipartRequestEntity(parts,  
        postMethod.getParams());  
        postMethod.setRequestEntity(mre);  
        // 执行请求  
        client.executeMethod(postMethod);  
        String result = postMethod.getResponseBodyAsString();
        resJson = JSONObject.parseObject(result);
        logger.debug("返回的状态码:{}",resJson);
   }

2018-02-06 10:16:28 BuFanQi_Info 阅读数 2404
  • 微信开发之三素材管理-微信开发php版

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

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

简介

微信素材分为临时素材和永久素材两种

  • 新增临时素材
    公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。
    注意点:
    1、临时素材media_id是可复用的。
    2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
    3、上传临时素材的格式、大小限制与公众平台官网一致。
    图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
    语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
    视频(video):10MB,支持MP4格式
    缩略图(thumb):64KB,支持JPG格式

  • 新增永久素材
    对于常用的素材,开发者可通过本接口上传到微信服务器,永久使用。新增的永久素材也可以在公众平台官网素材管理模块中查询管理。
    请注意:
    1、最近更新:永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
    2、公众号的素材库保存总数量有上限:图文消息素材、图片素材上限为5000,其他类型为1000。
    3、素材的格式大小等要求与公众平台官网一致:
    图片(image): 2M,支持bmp/png/jpeg/jpg/gif格式
    语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr格式
    视频(video):10MB,支持MP4格式
    缩略图(thumb):64KB,支持JPG格式
    4、图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过”上传图文消息内的图片获取URL”接口上传图片获取。
    5、”上传图文消息内的图片获取URL”接口所上传的图片,不占用公众号的素材库中图片数量的5000个的限制,图片仅支持jpg/png格式,大小必须在1MB以下。
    6、图文消息支持正文中插入自己帐号和其他公众号已群发文章链接的能力。
    PS:=============请查阅JAVA微信公众号开发第1篇之环境配置与开发接入进行基本微信接入配置============

上传微信素材

使用wxService.mediaUpload(mediaType, fileType, inputStream)方法

/**
    * <p>Title: addImgMaterial</p>
    * <p>Description: 上传我的二维码(永久)</p>
    * @param headurl 头像
    * @param wxqr    二维码
    * @return
    * @throws WxErrorException
    * @throws IOException
    */
    public WxMediaUploadResult addImgMaterial(String nickname,String openid,String headurl,String wxqr) throws WxErrorException, IOException{
        WxMediaUploadResult wxMediaUploadResult=wxService.mediaUpload(WxConsts.MEDIA_IMAGE,WxConsts.FILE_JPG,PictureMerge.getImageStream(PictureMerge.myQr(nickname,openid,headurl, wxqr)));
        return wxMediaUploadResult;
    }

博主这是通过头像、带参二维码和系统背景图生成用户针对本公众号的专属二维码,具体生成方法请查阅JAVA工具类之多图片合成与图片添加文字博文

总结

本文博主通过引入微信jar的方式,使用封装的方法进行素材上传,详细读者可以查阅微信jar源码,了解详细开发步骤。
这里写图片描述

效果

这里写图片描述
这里写图片描述

C#微信群发素材

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