2018-09-27 09:34:18 weixin_35877115 阅读数 5079
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

公众号类型

测试号

测试号现在仅支持使用预览接口,并不能实现群发。

【图片来源:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21截图】

实现

基于springboot

前端是自己根据图文消息(Article)的格式设计的,Article的内容如下:

【图片来源:官方文档截图】

 

1. 上传内容图片获取URL

【图片来源:官方文档截图】

前端使用bootstrap-fileinput上传图片,传到后台获取URL,然后将URL作为图片链接,放入wangEditor编辑器中。

(此处仅提供图片素材上传功能,暂未考虑视频、音频素材)

【注意:通过获取的微信服务器的URL插入编辑器时,可能会出现”未经允许“的图案,只需在当前html中加入

<meta name="referrer" content="never">

即可】

后台代码如下:

    @PostMapping(value = "/wx/upload/img")
    @ResponseBody
    public String uploadImg(MultipartFile img) throws IOException {
        JsonResult res = ResultUtil.success();
        String url = wxService.postImg(img);
        if (null != url) {
            res.setData(url);
        } else {
            res = ResultUtil.error(ResultEnum.UPLOAD_IMG_FAILURE);
        }
        return res.toString();
    }

     /**
     * 上传图文信息图片
     *
     * @param img 图片
     * @return url
     */
    @Override
    @Nullable
    public String postImg(MultipartFile img) throws IOException {
        // 保存到本地,获取本地图片绝对路径
        String filePath = FileUtil.saveFile("TEMP", img, "TEMP_"+DataUtil.getTimeStringSixBit()+DataUtil.getRandom(6)+".jpg");
        JSONObject res = doPostForm(UPLOAD_IMG_URL.replace("ACCESS_TOKEN", wxTokenHelper.getToken().getToken()), filePath);
        return res.getString("url");
    }

    /**
     * POST请求 - Form格式数据
     *
     * @param url 请求地址
     * @param filePath 文件本地路径
     * @return
     */
    public JSONObject doPostForm(String url, String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists() || !file.isFile()) {
            throw new IOException("文件不存在");
        }

        URL urlObj = new URL(url);
        // 连接
        HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();

        con.setRequestMethod("POST");
        con.setDoInput(true);
        con.setDoOutput(true);
        con.setUseCaches(false);

        // 设置请求头信息
        con.setRequestProperty("Connection", "Keep-Alive");
        con.setRequestProperty("Charset", "UTF-8");

        // 设置边界
        String BOUNDARY = "----------" + System.currentTimeMillis();
        con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

        String sb = "--" +
                BOUNDARY +
                "\r\n" +
                "Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n" +
                "Content-Type:application/octet-stream\r\n\r\n";

        byte[] head = sb.getBytes("utf-8");

        // 获得输出流
        OutputStream out = new DataOutputStream(con.getOutputStream());
        // 输出表头
        out.write(head);

        // 文件正文部分
        // 把文件已流文件的方式 推入到url中
        DataInputStream in = new DataInputStream(new FileInputStream(file));
        int bytes = 0;
        byte[] bufferOut = new byte[1024];
        while ((bytes = in.read(bufferOut)) != -1) {
            out.write(bufferOut, 0, bytes);
        }
        in.close();

        // 结尾部分
        byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线

        out.write(foot);

        out.flush();
        out.close();

        StringBuilder buffer = new StringBuilder();
        BufferedReader reader = null;
        String result = null;
        try {
            // 定义BufferedReader输入流来读取URL的响应
            reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
            result = buffer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                reader.close();
            }
        }

        return JSONObject.parseObject(result);
    }

    

 

2. 上传图文消息素材,得到media_id

【图片来源:官方文档截图】

     /**
     * 上传图文消息素材
     *
     * @param articles 图文消息集合
     * @return media_id
     */
    @Override
    @Nullable
    public String postNews(Article[] articles) {
        JSONObject data = new JSONObject();
        data.put("articles", articles);
        JSONObject res = doPostStr(UPLOAD_NEWS_URL.replace("ACCESS_TOKEN", wxTokenHelper.getToken().getToken()), data.toJSONString());
        return res.getString("media_id");
    }

    /**
     * POST请求 - JSON格式数据
     *
     * @param url
     * @param outStr
     * @return
     */
    public JSONObject doPostStr(String url, String outStr) {
        HttpHeaders headers = new HttpHeaders();
        headers.set("Content-Type", "application/json;charset=UTF-8");// 解决请求乱码问题
        String response = restTemplate.postForEntity(url, new HttpEntity<String>(outStr, headers), String.class)
                .getBody();
        return JSON.parseObject(response);
    }

    /**
 * @author kingsong
 * @create 2018/9/26 9:00
 * @desc 图文消息【推送】实体类
 **/
public class Article {

    private String thumb_media_id;  // 图文消息缩略图media_id

    private String author;  // 图文消息作者

    private String title;  // 图文消息标题

    private String content_source_url;  // “阅读原文”链接,受安全限制,如需跳转Appstore,可以使用itun.es或appsto.re的短链服务,并在短链后增加 #wechat_redirect 后缀。

    private String content;  // 消息内容,支持HTML标签

    private String digest;  // 推送描述,如本字段为空,则默认抓去正文的前64个字

    private int show_cover_pic;  // 是否显示封面

    public String getThumb_media_id() {
        return thumb_media_id;
    }

    public void setThumb_media_id(String thumb_media_id) {
        this.thumb_media_id = thumb_media_id;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent_source_url() {
        return content_source_url;
    }

    public void setContent_source_url(String content_source_url) {
        this.content_source_url = content_source_url;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getDigest() {
        return digest;
    }

    public void setDigest(String digest) {
        this.digest = digest;
    }

    public int getShow_cover_pic() {
        return show_cover_pic;
    }

    public void setShow_cover_pic(int show_cover_pic) {
        this.show_cover_pic = show_cover_pic;
    }

}

 

3. 发送图文消息

测试号目前仅支持预览接口

【图片来源:官方文档截图】

后台代码如下:

    @PostMapping(value = "/wx/send/new")
    @ResponseBody
    public String sendNew(String media_id) throws Exception {
        JsonResult res = ResultUtil.success();
        res.setData(wxService.sendNewsByOpenIds(userService.getAllOpenIds(), media_id));
        return res.toString();
    }

    /**
     * 根OpenID群发图文消息
     *
     * @param openIds OpenID集合
     * @param media_id 图文消息媒体编号
     * @return msg_id
     * @throws Exception 发送失败
     */
    @Override
    public String sendNewsByOpenIds(List<String> openIds, String media_id) throws Exception {
        JSONObject data = new JSONObject();
        // 预览接口仅支持一个openID
        data.put("touser", openIds.get(0));
        Map<String, String> npnews = new HashMap<>();
        npnews.put("media_id", media_id);
        data.put("mpnews", npnews);
        data.put("msgtype", "mpnews");
        data.put("send_ignore_reprint", 0);
        JSONObject res = doPostStr(SEND_NEWS_URL.replace("ACCESS_TOKEN", wxTokenHelper.getToken().getToken()), data.toJSONString());
        if(0!=res.getIntValue("errcode")) {
            // 发送失败
            throw new CustomException(ResultEnum.SEND_NEWS_FAILURE);
        } else {
            return res.getString("msg_id");
        }
    }

若出现错误情况,可以查阅微信公众平台技术文档 - 全局返回码说明

2018-07-16 18:14:40 bianyamei 阅读数 275
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

微信订阅号在文章素材中不能加入链,如果我们想使用推广表单,我们可以使用回复图文消息的方式,和文章组合在一起实用又好看.

关注后回复图文消息

if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
					
					   // 创建图文消息   关注后发送多图文消息
	                NewsMessage newsMessage = new NewsMessage();  
	                newsMessage.setToUserName(fromUserName);  
	                newsMessage.setFromUserName(toUserName);  
	                newsMessage.setCreateTime(new Date().getTime());  
	                newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);  
	          
	  
	                List<Article> articleList = new ArrayList<Article>();  
					Article article1 = new Article();
					article1.setTitle("");
					article1.setDescription("");
					article1.setPicUrl("");
					article1.setUrl("");
 
					Article article2 = new Article();
					article2.setTitle("");
					article2.setDescription("");
					article2.setPicUrl("");
					article2.setUrl("");
					
					articleList.add(article1);
					articleList.add(article2);
					newsMessage.setArticleCount(articleList.size());
					newsMessage.setArticles(articleList);
					respContent = MessageUtil.messageToXml(newsMessage);
					 return respContent;
				}
				else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
				}
				
				else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {
					
				}
		
				else if (eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)) {
					
				}
				
				else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
				
				}
				return MessageUtil.messageToXml(textMessage);
			}
			textMessage.setContent(respContent);
		
			respXml = MessageUtil.messageToXml(textMessage);
			}catch (Exception e) {
			e.printStackTrace();
		}
		return respXml;
		}

关键词回复图文消息

if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
		  
	                // 接收用户发送的文本消息内容  
	               // String content = requestMap.get("Content");  
	  
	                // 创建图文消息  
	                NewsMessage newsMessage = new NewsMessage();  
	                newsMessage.setToUserName(fromUserName);  
	                newsMessage.setFromUserName(toUserName);  
	                newsMessage.setCreateTime(new Date().getTime());  
	                newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);  
	                // newsMessage.setFuncFlag(0);  
	  
	                List<Article> articleList = new ArrayList<Article>();  
						// 多图文消息
						if ("XXX".contains(content)) {
							Article article1 = new Article();
							article1.setTitle("");
							article1.setDescription("");
							article1.setPicUrl("");
							article1.setUrl("");
		 
							Article article2 = new Article();
							article2.setTitle("");
							article2.setDescription("");
							article2.setPicUrl("");
							article2.setUrl("");
							
							articleList.add(article1);
							articleList.add(article2);
							
							newsMessage.setArticleCount(articleList.size());
							newsMessage.setArticles(articleList);
							respContent = MessageUtil.messageToXml(newsMessage);
							return respContent;
				}
                    return MessageUtil.messageToXml(textMessage);
	

关键词回复图文消息和订阅后推送图文消息,实现方式是一样的.

消息回复中如果你不想回复任何内容,又不想出现服务器出现故障,请稍后再试,你可以返回空字符串return "";腾讯就知道你不想回复任何内容了.

整体代码:


/**
 * 
 * @author bym @date 2018年7月4日
 */
public class CoreService {
	/** 生成订阅时的图文消息
	 * 
	 * @param fromUserName
	 * @param toUserName
	 * @return */
	public static String processRequest(HttpServletRequest request) {
	
		String respXml = null;
	
		String respContent = "请求处理异常,请稍候尝试!";
		try {
			
			Map<String, String> requestMap = MessageUtil.parseXml(request);
			
			String fromUserName = requestMap.get("FromUserName");
			String toUserName = requestMap.get("ToUserName");
			String msgType = requestMap.get("MsgType");
			String content = requestMap.get("Content");
			TextMessage textMessage = new TextMessage();
			textMessage.setToUserName(fromUserName);
			textMessage.setFromUserName(toUserName);
			textMessage.setCreateTime(new Date().getTime());
			textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
			
			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
				  
	                // 接收用户发送的文本消息内容  
	               // String content = requestMap.get("Content");  
	  
	                // 创建图文消息  
	                NewsMessage newsMessage = new NewsMessage();  
	                newsMessage.setToUserName(fromUserName);  
	                newsMessage.setFromUserName(toUserName);  
	                newsMessage.setCreateTime(new Date().getTime());  
	                newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);  
	                // newsMessage.setFuncFlag(0);  
	  
	                List<Article> articleList = new ArrayList<Article>();  
						// 多图文消息
						if ("XXX".contains(content)) {
							Article article1 = new Article();
							article1.setTitle("");
							article1.setDescription("");
							article1.setPicUrl("");
							article1.setUrl("");
		 
							Article article2 = new Article();
							article2.setTitle("");
							article2.setDescription("");
							article2.setPicUrl("");
							article2.setUrl("");

							articleList.add(article1);
							articleList.add(article2);
	
							newsMessage.setArticleCount(articleList.size());
							newsMessage.setArticles(articleList);
							respContent = MessageUtil.messageToXml(newsMessage);
							return respContent;
					}
				   return MessageUtil.messageToXml(textMessage);
	
			}else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
			
				String eventType = requestMap.get("Event");
			
				if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
					
					   // 创建图文消息   关注后发送多图文消息
	                NewsMessage newsMessage = new NewsMessage();  
	                newsMessage.setToUserName(fromUserName);  
	                newsMessage.setFromUserName(toUserName);  
	                newsMessage.setCreateTime(new Date().getTime());  
	                newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);  
	          
	  
	                List<Article> articleList = new ArrayList<Article>();  
					Article article1 = new Article();
					article1.setTitle("");
					article1.setDescription("");
					article1.setPicUrl("");
					article1.setUrl("");
 
					Article article2 = new Article();
					article2.setTitle("");
					article2.setDescription(包");
					article2.setPicUrl("");
					article2.setUrl("");
					
					articleList.add(article1);
					articleList.add(article2);
					newsMessage.setArticleCount(articleList.size());
					newsMessage.setArticles(articleList);
					respContent = MessageUtil.messageToXml(newsMessage);			  
					       return respContent;
				}
				else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
					UserDao.delUser(fromUserName);
				}
				
				else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {
					
				}
		
				else if (eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)) {
					
				}
				
				else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
				
				}
				
				return MessageUtil.messageToXml(textMessage);
			}
			textMessage.setContent(respContent);
		
			respXml = MessageUtil.messageToXml(textMessage);
			}catch (Exception e) {
			e.printStackTrace();
		}
		return respXml;
		}
}

 

2018-04-08 18:28:40 sinat_36553913 阅读数 814
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

异常信息

将图文消息对象转换为xml时,格式出错

<xml>
  <ToUserName>oVICC0pcZLLPZUowr_wNAxiwTzeo</ToUserName>
  <FromUserName>gh_d6acc2ca6533</FromUserName>
  <CreateTime>1523177601677</CreateTime>
  <MsgType>news</MsgType>
  <ArticleCount>2</ArticleCount>
  <Articles>
    <item>                   // 这里出错  这是Articles类中item的list集合
      <com.example.vo.item>  // 出错这是集合中每个item类对象
        <Title>图文消息测试</Title>
        <Description>第一个</Description>
        <PicUrl>http://f.hiphotos.baidu.com/image/pic/item/8694a4c27d1ed21bfb91c832a66eddc450da3f89.jpg</PicUrl>
        <Url>https://www.baidu.com/</Url>
      </com.example.vo.item>
      <com.example.vo.item>
        <Title>图文消息测试</Title>
        <Description>第二个</Description>
        <PicUrl>http://f.hiphotos.baidu.com/image/pic/item/6159252dd42a283441d4d0dc50b5c9ea14cebff3.jpg</PicUrl>
        <Url>https://www.baidu.com/</Url>
      </com.example.vo.item>
    </item>
  </Articles>
</xml>

解决方法

网上查资料时,发现一种解决方法,是在根类中直接有一个item的list集合,省去了Articles类,通过这种方法发现,并没有解决问题
方法链接:https://www.cnblogs.com/cxchanpin/p/7208440.html
执行结果:

<xml>
  <ToUserName>oVICC0pcZLLPZUowr_wNAxiwTzeo</ToUserName>
  <FromUserName>gh_d6acc2ca6533</FromUserName>
  <CreateTime>1523179217834</CreateTime>
  <MsgType>news</MsgType>
  <ArticleCount>2</ArticleCount>
  <item>  // 这里为不同处
    <com.example.vo.item>
      <Title>图文消息测试</Title>
      <Description>第一个</Description>
      <PicUrl>http://f.hiphotos.baidu.com/image/pic/item/8694a4c27d1ed21bfb91c832a66eddc450da3f89.jpg</PicUrl>
      <Url>https://www.baidu.com/</Url>
    </com.example.vo.item>
    <com.example.vo.item>
      <Title>图文消息测试</Title>
      <Description>第二个</Description>
      <PicUrl>http://f.hiphotos.baidu.com/image/pic/item/6159252dd42a283441d4d0dc50b5c9ea14cebff3.jpg</PicUrl>
      <Url>https://www.baidu.com/</Url>
    </com.example.vo.item>
  </item>
</xml>

最后发现,使用xstream解析时,可以设置忽略节点和设置节点的别名

参考博文:https://www.cnblogs.com/fengmingyue/p/6084100.html

代码实现

 public static String messageToxml(BaseMessage message) {
        XStream xStream = new XStream();
//        xStream.alias("",List.class); // 将图文消息列表中的List类型指定为“”  经验证 这种方法不行
        xStream.addImplicitCollection(Articles.class,"item");//Articles类中的item 忽略
        xStream.alias("item",item.class);//将类的全限定名改为item
        xStream.alias("xml", message.getClass());
        return xStream.toXML(message);
    }

执行结果:

<xml>
  <ToUserName>oVICC0pcZLLPZUowr_wNAxiwTzeo</ToUserName>
  <FromUserName>gh_d6acc2ca6533</FromUserName>
  <CreateTime>1523180542636</CreateTime>
  <MsgType>news</MsgType>
  <ArticleCount>2</ArticleCount>
  <Articles>
    <item>
      <Title>图文消息测试</Title>
      <Description>第一个</Description>
      <PicUrl>http://f.hiphotos.baidu.com/image/pic/item/8694a4c27d1ed21bfb91c832a66eddc450da3f89.jpg</PicUrl>
      <Url>https://www.baidu.com/</Url>
    </item>
    <item>
      <Title>图文消息测试</Title>
      <Description>第二个</Description>
      <PicUrl>http://f.hiphotos.baidu.com/image/pic/item/6159252dd42a283441d4d0dc50b5c9ea14cebff3.jpg</PicUrl>
      <Url>https://www.baidu.com/</Url>
    </item>
  </Articles>
</xml>
2017-02-25 10:04:27 ljh910305 阅读数 2130
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

微信公众平台开发其实挺坑的,个人感觉,发送图文消息,必须先上传到他们那里,然后返回给我们一个ID或者URL让我 们使用,但是要是使用编辑器,有一个问题,那就是编辑器上传的图片不是保存在微信那里,而且编辑器html代码里面的图片的url是不会被识别的,这样我们编辑好的图片就显示不出来,那么,解决的一个办法就是编辑器上传图片的时候,将图片上传到微信,然后将地址替换。

2014-03-05 23:56:31 iteye_19353 阅读数 38
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

仅以此教训纪念我那逝去的粗心大意,也为那写还在无法收到图文消息的筒子们进一份微薄之力。以下问题,并不是什么技术问题,而是不留神造成的。

运行环境,SAE

RT,在测试图文消息时,不论是本地模拟还是使用“微信开发调试小工具1.2”,都能正常获得返回的xml内容。但手机端就是拿不到,这也是微信开发者的郁闷之一,无法调试到微信中心服务到客户端这个阶段的数据处理。煞费苦心之后(开通测试号,调代码,这里那里,甚至发现1个空格都觉得兴奋,但终究无解,毫无头绪),最后找到同事,看了一下他的返回xml,我去~~此处省略我那伤心的粗心大意一万遍。

先看看官方的格式:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title> 
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml> 

 筒子们,注意看标红的那2个属性,第一个代表发送给谁,第二个代表从哪里发送。

 再来看看,从微信公众平台那边接收过来的消息格式:

<xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName> 
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
 </xml>

 这里依然有1个ToUserName和1个FromUserName,如果偷懒或者不留意,很容易直接把这2个属性的值套用到你要响应回去的消息中去,这样的结果~~~悲剧啊!

一定记得反过来,正确的设置ToUserName和FromUserName。这2个值是对于微信公众平台而言的,不是对公众号也不是对手机客户端。

 

另外再说一下使用SAE的storge存储时的问题,图片传上去了,web显示没问题,但是到手机上的微信里就没戏了,此时不要去想什么微信对url的黑白名单限制,真的没有这种限制。问题出在SAE的“防盗链”功能上,因为我开启的防盗链,图片在微信里就加载不了了。使用其他云服务或虚拟机服务等等的服务的筒子们,也许也会遇到类似问题。

微信开发图文消息发送

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