2016-03-31 17:44:44 hanghangde 阅读数 821
  • 微信开发群发多图文消息-微信开发16(PHP)

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

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

我用dom4j解析微信xml消息时用这种方法Document document = reader.read(inputStream);
他报错Error on line 1 of document : The root element is required in a well-formed document. Nested exception: The root element is required in a well-formed document.通过分析我感就是(如果我错了请兄弟们指出)用SAXReader他会严格检查xml头部但是微信回复消息如下

<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>

一点都不标准,但是可以采用下面的方法

    // 将解析结果存储在HashMap中
        Map<String, String> map = new HashMap<String, String>();
        // 从request中取得输入流
        InputStream inputStream = request.getInputStream();
        // 一定要utf-8
        InputStreamReader inputReader = new InputStreamReader(inputStream,
                "UTF-8");
        BufferedReader buffer = new BufferedReader(inputReader);
        String message = "";
        String s = "";
        while ((s = buffer.readLine()) != null) {
            message += s;
        }
        System.out.println(message);
        System.out.println("获取输入流");
        // // 读取输入流
         SAXReader reader = new SAXReader();
//       Document document = reader.read(inputStream);
        // 将字符串转化为XML文档对象
        Document document = DocumentHelper.parseText(message);
        Element root = document.getRootElement();
        List<Element> elements = root.elements();
        // 遍历根节点下所有子节点
        Iterator<?> iter = root.elementIterator();

        // // 遍历所有子节点
        // for (Element e : elementList) {
        // System.out.println(e.getName() + "|" + e.getText());
        // map.put(e.getName(), e.getText());
        // }
        while (iter.hasNext()) {
            Element ele = (Element) iter.next();
            map.put(ele.getName(), ele.getText());

        }
        // 释放资源
        inputStream.close();
2017-05-11 10:49:01 qq_32635971 阅读数 1058
  • 微信开发群发多图文消息-微信开发16(PHP)

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

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

dom4j 生成XML
需要导包

           <dependency>
                 <groupId>dom4j</groupId>
                 <artifactId>dom4j</artifactId>
                 <version>1.6.1</version>
           </dependency>

例子:

package test;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class XMLdemo {

      public static void main(String[] args) {

           Document document=DocumentHelper.createDocument();
           Element rootElm = document.addElement("XML");
           rootElm.addElement("ToUserName").addCDATA("openid");
           rootElm.addElement("FromUserName").addCDATA("xilaiID");
            rootElm.addElement("CreateTime").addCDATA("1492737230254");
           rootElm.addElement("MsgType").addCDATA("news");
           rootElm.addElement("ArticleCount").addCDATA("1");

           Element contentElm=rootElm.addElement("Articles");
           contentElm.addElement("Title").addCDATA("欢迎关注");
           contentElm.addElement("Description").addCDATA("点点点");
            contentElm.addElement("PicUrl").addCDATA("http://60.205.138.165:8080/wechatServlet/forward/toOrderQuick");
            contentElm.addElement("Url").addCDATA("http://60.205.138.165:8080/wechatServlet/forward/toOrderQuick");

      String xmlaa=document.getRootElement().asXML();  //去掉头信息文件
      System.out.println(xmlaa);
      }
}

输出:

<XML>
     <ToUserName><![CDATA[openid]]></ToUserName>
     <FromUserName><![CDATA[xilaiID]]></FromUserName>
     <CreateTime><![CDATA[1492737230254]]></CreateTime>
     <MsgType><![CDATA[news]]></MsgType>
     <ArticleCount><![CDATA[1]]></ArticleCount>
     <Articles>
          <Title><![CDATA[欢迎关注]]></Title>
          <Description><![CDATA[点点点]]></Description>
          <PicUrl><![CDATA[http://60.205.138.165:8080/wechatServlet/forward/toOrderQuick]]></PicUrl>
          <Url><![CDATA[http://60.205.138.165:8080/wechatServlet/forward/toOrderQuick]]></Url>
     </Articles>
</XML>
2017-09-21 21:28:23 u011334221 阅读数 746
  • 微信开发群发多图文消息-微信开发16(PHP)

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

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

首先,不知道jersey或者restful是什么东西的,建议自己去百度学习下。本篇文章不适合你。
今天同事做微信支付时候,回调地址传了一个jersey的接口,当微信回调的时候,总是取不到它的xml信息,很恼火,然后注意到控制台里边微信访问的Context-Type是text/xml格式的,对于text/xml格式应该怎么去接收他的参数呢?在网上看到了这位仁兄的帖子,按照他的方案顺利取到了xml信息。
这里是传送门:http://blog.csdn.net/xxssyyyyssxx/article/details/53635241
简单来讲,需要做的
1、设置

@Consumes("text/xml")

2、随便定义一个String 类型接收参数就好
完整代码如下:

@Path("wxPayNotify")
@POST
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.APPLICATION_JSON)
public Response payCallBack(String xml){
}

现在这个变量xml中存的就是微信返回的xml了,接下来要解析这个xml,就要用到dom4j了,直接上代码

private Map<String, String> parseXml(String xml){
    //解析结果
    Map<String,String> resultMap = new HashMap<String,String>();
    try {
        // 将xml String转化为xml
        Document document = DocumentHelper.parseText(xml);
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();
        // 获取各个节点中的数据
        for (Element e : elementList) {
            resultMap.put(e.getName(), e.getText());
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    return resultMap;
}

当然如果不使用jersey,比如使用SpringMVC,这个xml就是放在request中的,dom4j的解析方法如下:

/** 
     * 解析微信发来的请求(XML) 
     *  
     * @param request 
     * @return 
     * @throws Exception 
     */
    @SuppressWarnings("unchecked")  
    public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {  
        // 将解析结果存储在HashMap中  
        Map<String, String> map = new HashMap<String, String>();  

        // 从request中取得输入流  
        InputStream inputStream = request.getInputStream();  
        // 读取输入流  
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);  
        // 得到xml根元素  
        Element root = document.getRootElement();  
        // 得到根元素的所有子节点  
        List<Element> elementList = root.elements();  

        // 遍历所有子节点  
        for (Element e : elementList)  
            map.put(e.getName(), e.getText());  

        // 释放资源  
        inputStream.close();  
        inputStream = null;  

        return map;  
    }
2017-11-10 09:05:47 towtotow 阅读数 1349
  • 微信开发群发多图文消息-微信开发16(PHP)

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

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

用微信公众号做营销互动,

都会用到一个功能,

让用户在公众号后台回复一个关键词,

然后会自动推送对应的内容给用户。


微信开发消息推送


这个功能在微信开发中,

我们叫它消息管理。


用户除了使用关键词回复之外,

还可以回复图片,用户地理位置,小视频等等。


从这一节课程开始,

子恒老师将跟你分享微信开发中的消息管理,

学完后,你将很容易实现上面说的功能…

微信开发推送消息案例视频教程在线观看

http://edu.csdn.net/course/detail/2946/48500

2016-12-27 16:31:38 getluo 阅读数 1358
  • 微信开发群发多图文消息-微信开发16(PHP)

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

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

首先需要公众号有模板消息的权限,这里不多说明了。


要实现的功能就是在第三方网站通过调用接口在对给用户发消息,当然也可以给用户标签组群发消息。


获取access_token代码:

$weixin_appid = "";
$weixin_secret = "";
$weixin_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$weixin_appid."&secret=".$weixin_secret;
$weixin_return = get_url_contents ( $weixin_url );
$weixin = json_decode ( $weixin_return );
$access_token = $weixin->access_token;
//模板ID
$template_id = "";

发送消息代码:

				$dataarray = array(
						"touser"=>$openid,//用户的openid
						"template_id"=>$template_id,//消息模板id
						"url"=>$_POST['yanbao_url'],
						"data"=>array(
						    "first"=>array(
				                       "value"=>$_POST['yanbao_title'],
				                       "color"=>"#173177"
				                    ),
				                    "keyword1"=>array(
				                       "value"=>$_POST['yanbao_name'],
				                       "color"=>"#173177"
				                    ),
				                    "keyword2"=>array(
				                       "value"=>$_POST['yanbao_desc'],
				                       "color"=>"#173177"
				                    ),
				                    "remark"=>array(
				                       "value"=>$_POST['yanbao_more'],
				                       "color"=>"#173177"
				                    )
								)
				            );
				$data = json_encode($dataarray);
				$output = json_decode(do_post($url,$data));//do_post是模拟post的函数,请自行定义
				if($output->errcode == '0'){
					echo '<div class="updated"><p>发送成功!</p></div>';
				}else{
					echo '<div class="error"><p>发送失败!错误码:'.$output->errcode.'</p></div>';
				}

获取用户标签代码:

				<tr valign="top">
					<th scope="row"><label>用户标签</label></th>
					<td>
						<select name="yanbao_user_tag" id="yanbao_user_tag" style="min-width: 150px">
							<option value="">请选择</option>
							<option value="all">所有用户</option>
							<?php 
								$yanbao_user_tag_url = "https://api.weixin.qq.com/cgi-bin/tags/get?access_token=".$access_token;
								$yanbao_user_tag_return = get_url_contents ( $yanbao_user_tag_url );
								$yanbao_user_tag = json_decode ( $yanbao_user_tag_return );
								$tags = $yanbao_user_tag->tags;
								foreach ($tags as $tag) {
									echo '<option value="'.$tag->id.'">'.$tag->name.'('.$tag->count.')</option>';
								}
							?>		
						</select>
						<span class="description">(选择了用户标签就是<strong>群发</strong>给该标签下的用户)</span>
					</td>
				</tr>

获取用户代码:

<tr valign="top">
					<th scope="row"><label>用户</label></th>
					<td>
						<select name="yanbao_user" id="yanbao_user">
							<option selected="selected" value="">请选择</option>
							<?php 
								/*
								$yanbao_user_url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=".$access_token."&next_openid=";
								$yanbao_user_return = get_url_contents ( $yanbao_user_url );
								$yanbao_user = json_decode ( $yanbao_user_return );
								$openids = $yanbao_user->data->openid;
								foreach ($openids as $openid) {
									$added_user = Moge_check_weixin_user_added($openid);
									if($added_user){
										echo '<option value="'.$openid.'">'.$added_user->nickname.'</option>';
									}else{
										$user = Moge_weixin_get_user_info($access_token,$openid);
										$wpdb->query("insert into ".$wpdb->prefix."erphp_weixin_users (openid,nickname) values('".$openid."','".$user->nickname."')");
										echo '<option value="'.$openid.'">'.$user->nickname.'</option>';
									}
								}*/
								
								$weixin_users = Moge_get_weixin_users();//获取本地数据库里的微信用户函数
								if($weixin_users){
									foreach ($weixin_users as $user) {
										echo '<option value="'.$user->openid.'">'.$user->nickname.'</option>';
									}
								}
								
							?>
						</select>
						<span class="description">(若已选择了用户标签,此项选择就无效了。)</span>
					</td>
				</tr>


这里主要遇到一个问题就是如果高效快速的获取用户列表的昵称(nickname),通过以下的接口

https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID

只能获取用户的openid,我尝试过针对每个用户获取其详细资料,结果页面直接卡死了(用户数量太多)。虽然看到有批量获取资料,但是不适合用,最后没办法,只能先循环获取然后存在本地数据库,定期获取更新下数据库了,有个弊端就是取消关注的人还是会在本地数据库里。

没有更多推荐了,返回首页