xml 微信开发_微信开发接收不到到微信发送过来的xml报文信息 - CSDN
  • 发现微信API的开发都是同样的套路~~封装参数–》包装成Xml—》提交到Api—》获取返回的内容就行了。因为会有多个API都设计到这些操作,特地抽取出来封装成工具类单独讲,学习完以下这5~8个放法、那么你的开发就很...

           近日,在开发微信支付、微信退款、微信付款到零钱、微信订单查询、微信付款到银行卡的功能。以及其他微信API的使用。发现微信API的开发都是同样的套路~~封装参数–》包装成Xml—》提交到Api—》获取返回的内容就行了。因为会有多个API都设计到这些操作,特地抽取出来封装成工具类单独讲,学习完以下这5~8个放法、那么你的开发就很简便了 ~ ~ 一个支付方法简单的十五行代码立马搞定。希望对你们有帮助。个人浅薄的见解
    资料下载:目前资料已经删除了,之前有网友吐槽说:资料不全,那就不共享了。也有很多网友加了我qq拿资,咨询怎么做,目前已经解答了有50多位网友的问题了,本人的精力有限,没办法顾及所有网友的问题,所以源码将不再开源。如果有需要加我qq:924155240。发个15~20块吃饭钱,可以把源码发给你+稍稍解答问题
    在这里插入图片描述

    在这里插入图片描述
    一、微信签名的工具类
    【温馨提示:】数字签名是一般开发人员容易遇到的错误,记住“你没遇到数字签名错误,都不好意思说自己做过微信开发”。
    耐心解决就行

    【Description】简单来解释,就是对自己要发送的数据进行加密处理、换句话说假如说你要传递A/B/C,就对这三者进行加密。初开发者的误区:例如看到别人代码拿D和E等去数字签名、然后在自己的开发中就拿D和E去签名,这是错误的做法,会出现数字签名错误。你要看一下你的开发需要传递D和F去后台,那么你应该拿D和F去签名就对了

    package com.fh.util.weixin;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    import java.util.SortedMap;
    import com.fh.controller.app.nrb.bargain.wxconfig;
    /**
     * 签名工具类
     * @author 小郑
     * @date 2018年02月22日
     * @Notice:wxconfig.apikey。这句代码是获取商务号设置的api秘钥。这里不方便贴出来,
     * 复制签名代码的人,需要把该常量改成自己商务号的key值。原因是Api规定了签名必须加上自己的key值哦 
     * */
    public class SignUtils {
    
    	/**
    	 * @param characterEncoding 编码格式 utf-8
    	 * */
    	public static String creatSign(String characterEncoding,
    			SortedMap<Object, Object> parameters) {
    		StringBuffer sb = new StringBuffer();
    		Set es = parameters.entrySet();
    		Iterator it = es.iterator();
    		while(it.hasNext()) {
    			Map.Entry entry = (Map.Entry)it.next();
    			String k = (String)entry.getKey();
    			Object v = entry.getValue();
    			if(null != v && !"".equals(v) 
    					&& !"sign".equals(k) && !"key".equals(k)) {
    				sb.append(k + "=" + v + "&");
    			}
    		}
    		//wxconfig.apikey。这句代码是获取商务号设置的api秘钥。这里不方便贴出来,
    		//复制签名代码的人,需要把该常量改成自己商务号的key值。原因是Api规定了签名必须加上自己的key值哦 
    		sb.append("key=" + wxconfig.apikey);
    		String sign = MD5Utils.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
    		System.out.println(sign);
    		return sign;
    	}
    }
    

    这里写图片描述

    二、将当前的map结合转化成xml格式 ~~ 微信请求参数是必须要封装成Xml格式的,在java中写xml很不方便,但是写Map集合很方便。故需要提供map转化xml的方法

    
        /**
         * 将Map转换为XML格式的字符串
         *
         * @param data Map类型数据
         * @return XML格式的字符串
         * @throws Exception
         */
        public static String mapToXml(Map<String, String> data) throws Exception {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
            org.w3c.dom.Document document = documentBuilder.newDocument();
            org.w3c.dom.Element root = document.createElement("xml");
            document.appendChild(root);
            for (String key: data.keySet()) {
                String value = data.get(key);
                if (value == null) {
                    value = "";
                }
                value = value.trim();
                org.w3c.dom.Element filed = document.createElement(key);
                filed.appendChild(document.createTextNode(value));
                root.appendChild(filed);
            }
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            DOMSource source = new DOMSource(document);
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            StringWriter writer = new StringWriter();
            StreamResult result = new StreamResult(writer);
            transformer.transform(source, result);
            String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
            try {
                writer.close();
            }
            catch (Exception ex) {
            }
            return output;
        }
    
     /*
         * 将SortedMap<Object,Object> 集合转化成 xml格式
         */
        public static String getRequestXml(SortedMap<Object,Object> parameters){
            StringBuffer sb = new StringBuffer();
            sb.append("<xml>");
            Set es = parameters.entrySet();
            Iterator it = es.iterator();
            while(it.hasNext()) {
                Map.Entry entry = (Map.Entry)it.next();
                String k = (String)entry.getKey();
                String v = (String)entry.getValue();
                if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)||"sign".equalsIgnoreCase(k)) {
                    sb.append("<"+k+">"+"<![CDATA["+v+"]]></"+k+">");
                }else {
                    sb.append("<"+k+">"+v+"</"+k+">");
                }
            }
            sb.append("</xml>");
            return sb.toString();
        }
    

    这里写图片描述

    这里写图片描述
    三、xml转化成map或者Bean
    微信返回的信息是Xml格式、需要一个工具类把它解析成Map集合或者是一个Bean。方便我们去获取里面返回值。这里会介绍两种方式,一种是转化成Map集合,通过get出来使用,这个方法是通用的,第二种是转化成Bean、这种的话不通用。每个bean基本都不大一样,需要定制

     //通用的。返回map格式
     /**
         * XML格式字符串转换为Map
         *
         * @param strXML XML字符串
         * @return XML数据转换后的Map
         * @throws Exception
         */
        public static Map<String, String> xmlToMap(String strXML) throws Exception {
            try {
                Map<String, String> data = new HashMap<String, String>();
                DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
                InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
                org.w3c.dom.Document doc = documentBuilder.parse(stream);
                doc.getDocumentElement().normalize();
                NodeList nodeList = doc.getDocumentElement().getChildNodes();
                for (int idx = 0; idx < nodeList.getLength(); ++idx) {
                    Node node = nodeList.item(idx);
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        org.w3c.dom.Element element = (org.w3c.dom.Element) node;
                        data.put(element.getNodeName(), element.getTextContent());
                    }
                }
                try {
                    stream.close();
                } catch (Exception ex) {
                    // do nothing
                }
                return data;
            } catch (Exception ex) {
                WXPayUtil.getLogger().warn("Invalid XML, can not convert to map. 
                Error message: {}. XML content: {}", ex.getMessage(), strXML);
                throw ex;
            }
    
        }
    
    //不通用的、返回Bean格式
    
    //以企业付款到零钱为例子~~根据Api会返回的参数,书写一个Bean类型
    package com.fh.entity.nrb.xiaozheng;
    /**
     * 
     * 企业 付款到 客户  的 实体类
     * @author xiaozheng
     * @version 1.0 
     * @description: 收集企业 支付给客户成功后的返回信息
     * @time : 2018-01-16 16:00:00
     */
    public class EnterpriceToCustomer {
    	/*	<xml>
    		<return_code><![CDATA[SUCCESS]]></return_code>
    		<return_msg><![CDATA[]]></return_msg>
    		<mchid><![CDATA[1488323162]]></mchid>
    		<nonce_str><![CDATA[o9fcpfvqow1aks48a2omvayu1ne7c709]]></nonce_str>
    		<result_code><![CDATA[SUCCESS]]></result_code>
    		<partner_trade_no><![CDATA[xvuct0087w4t1dpr87iqj98w5f71ljae]]></partner_trade_no>
    		<payment_no><![CDATA[1000018301201801163213961289]]></payment_no>
    		<payment_time><![CDATA[2018-01-16 14:52:16]]></payment_time>
    		</xml>
    	*/
    	
    	private String return_code;
    	private String return_msg;
    	private String mchid;
    	private String nonce_str;
    	private String result_code;
    	private String partner_trade_no;
    	private String payment_no;
    	private String payment_time;
    
    	/*
    	 * 支付错误时,返回的代码
    	 *  key是:return_code,值是:SUCCESS
    		key是:return_msg,值是:支付失败
    		key是:mch_appid,值是:wx49c22ad731b679c3
    		key是:mchid,值是:1488323162
    		key是:result_code,值是:FAIL
    		key是:err_code,值是:AMOUNT_LIMIT
    		key是:err_code_des,值是:付款金额超出限制。低于最小金额1.00元或累计超过20000.00元。
    	 * 
    	 */
    	private String err_code;
    	private String err_code_des;
    
    	public String getErr_code() {
    		return err_code;
    	}
    	public void setErr_code(String errCode) {
    		err_code = errCode;
    	}
    	public String getErr_code_des() {
    		return err_code_des;
    	}
    	public void setErr_code_des(String errCodeDes) {
    		err_code_des = errCodeDes;
    	}
    	public String getReturn_code() {
    		return return_code;
    	}
    	public void setReturn_code(String returnCode) {
    		return_code = returnCode;
    	}
    	public String getReturn_msg() {
    		return return_msg;
    	}
    	public void setReturn_msg(String returnMsg) {
    		return_msg = returnMsg;
    	}
    	public String getMchid() {
    		return mchid;
    	}
    	public void setMchid(String mchid) {
    		this.mchid = mchid;
    	}
    	public String getNonce_str() {
    		return nonce_str;
    	}
    	public void setNonce_str(String nonceStr) {
    		nonce_str = nonceStr;
    	}
    	public String getResult_code() {
    		return result_code;
    	}
    	public void setResult_code(String resultCode) {
    		result_code = resultCode;
    	}
    	public String getPartner_trade_no() {
    		return partner_trade_no;
    	}
    	public void setPartner_trade_no(String partnerTradeNo) {
    		partner_trade_no = partnerTradeNo;
    	}
    	public String getPayment_no() {
    		return payment_no;
    	}
    	public void setPayment_no(String paymentNo) {
    		payment_no = paymentNo;
    	}
    	public String getPayment_time() {
    		return payment_time;
    	}
    	public void setPayment_time(String paymentTime) {
    		payment_time = paymentTime;
    	}
    	@Override
    	public String toString() {
    		return "EnterpriceToCustomer [err_code=" + err_code + ", err_code_des="
    				+ err_code_des + ", mchid=" + mchid + ", nonce_str="
    				+ nonce_str + ", partner_trade_no=" + partner_trade_no
    				+ ", payment_no=" + payment_no + ", payment_time="
    				+ payment_time + ", result_code=" + result_code
    				+ ", return_code=" + return_code + ", return_msg=" + return_msg
    				+ "]";
    	}
    }
    
    /** 
    	下面是需要通过跟节点,找找到对应的类属性,手动把它set进去。因此API返回的参数不一样。需要写每个返回的Bean。看个人的习惯呗~~我喜欢用bean存储数据的方式
    	* 解析企业支付申请 
    	* 解析的时候自动去掉CDMA 
    	* @param xml 
    	*/ 
    	@SuppressWarnings("unchecked") 
    	public static EnterpriceToCustomer parseXmlToMapEnterpriceToCustomer(String xml){ 
    			EnterpriceToCustomer enterpriceToCustomer = new EnterpriceToCustomer(); 
    			try { 
    					StringReader read = new StringReader(xml); 
    					// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入 
    					InputSource source = new InputSource(read); 
    					// 创建一个新的SAXBuilder 
    					SAXBuilder sb = new SAXBuilder(); 
    					// 通过输入源构造一个Document 
    					Document doc; 
    					doc = (Document) sb.build(source); 
    				
    					Element root = doc.getRootElement();// 指向根节点 
    					List<Element> list = root.getChildren(); 
    				
    					if(list!=null&&list.size()>0){ 
    					for (Element element : list) { 
    						System.out.println("key是:"+element.getName()+",值是:"+element.getText()); 
    						if("return_code".equals(element.getName())){ 
    								enterpriceToCustomer.setReturn_code(element.getText()); 
    							} 
    					
    						if("return_msg".equals(element.getName())){ 
    								enterpriceToCustomer.setReturn_msg(element.getText()); 
    							} 
    						
    						if("mchid".equals(element.getName())){ 
    							enterpriceToCustomer.setMchid(element.getText()); 
    						}
    						
    						if("nonce_str".equals(element.getName())){ 
    							enterpriceToCustomer.setNonce_str(element.getText()); 
    						}
    						if("result_code".equals(element.getName())){ 
    							enterpriceToCustomer.setResult_code(element.getText()); 
    						}
    						if("partner_trade_no".equals(element.getName())){ 
    							enterpriceToCustomer.setPartner_trade_no(element.getText()); 
    						}
    						if("payment_no".equals(element.getName())){ 
    							enterpriceToCustomer.setPayment_no(element.getText()); 
    						}
    						if("payment_time".equals(element.getName())){ 
    							enterpriceToCustomer.setPayment_time(element.getText()); 
    						}	
    						//错误的编码
    						/*
    						   private String err_code;
    						   private String err_code_des;
    						 * */
    						if("err_code".equals(element.getName())){ 
    							enterpriceToCustomer.setErr_code(element.getText()); 
    						}
    						if("err_code_des".equals(element.getName())){ 
    							enterpriceToCustomer.setErr_code_des(element.getText()); 
    						}	
    						
    					}
    				}
    				
    
    			} catch (JDOMException e) { 
    			e.printStackTrace(); 
    			} catch (IOException e) { 
    			e.printStackTrace(); 
    			}catch (Exception e) { 
    			e.printStackTrace(); 
    			} 
    				
    			return enterpriceToCustomer; 
    		} 
    

    四、Post请求+证书~~亲测可以的

    package com.fh.entity.nrb.weixinResult;
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.security.KeyStore; 
    
    import javax.net.ssl.SSLContext; 
    
    import org.apache.http.HttpEntity; 
    import org.apache.http.client.methods.CloseableHttpResponse; 
    import org.apache.http.client.methods.HttpPost; 
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
    import org.apache.http.conn.ssl.SSLContexts; 
    import org.apache.http.entity.StringEntity; 
    import org.apache.http.impl.client.CloseableHttpClient; 
    import org.apache.http.impl.client.HttpClients; 
    import org.apache.http.util.EntityUtils; 
    
    import com.fh.controller.app.nrb.bargain.wxconfig;
    
    
    
    /** 
    * This example demonstrates how to create secure connections with a custom SSL 
    * context. 
    */ 
    public class ClientCustomSSL { 
    
    @SuppressWarnings("deprecation")
    public static String doRefund(String url,String data) throws Exception { 
    		/** 
    		* 注意PKCS12证书 是从微信商户平台-》账户设置-》 API安全 中下载的 
    		*/ 
    		
    		KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
    		/**
    		*此处要改
    		*wxconfig.SSLCERT_PATH : 指向你的证书的绝对路径,带着证书去访问
    		*/
    		
    		FileInputStream instream = new FileInputStream(new File(wxconfig.SSLCERT_PATH));//P12文件目录 
    		try { 
    		/** 
    		* 此处要改 
    		* 
    		* 下载证书时的密码、默认密码是你的MCHID mch_id
    		* */ 
    		keyStore.load(instream, wxconfig.SSLCERT_PASSWORD.toCharArray());//这里写密码
    		} finally { 
    			instream.close(); 
    		} 
    		
    		// Trust own CA and all self-signed certs 
    		/** 
    		* 此处要改 
    		* 下载证书时的密码、默认密码是你的MCHID mch_id
    		* */ 
    		SSLContext sslcontext = SSLContexts.custom() 
    		.loadKeyMaterial(keyStore, wxconfig.SSLCERT_PASSWORD.toCharArray())//这里也是写密码的 
    		.build(); 
    		// Allow TLSv1 protocol only 
    		SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( 
    		sslcontext, 
    		new String[] { "TLSv1" }, 
    		null, 
    		SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
    		CloseableHttpClient httpclient = HttpClients.custom() 
    		.setSSLSocketFactory(sslsf) 
    		.build(); 
    		try { 
    		HttpPost httpost = new HttpPost(url); // 设置响应头信息 
    		httpost.addHeader("Connection", "keep-alive"); 
    		httpost.addHeader("Accept", "*/*"); 
    		httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
    		httpost.addHeader("Host", "api.mch.weixin.qq.com"); 
    		httpost.addHeader("X-Requested-With", "XMLHttpRequest"); 
    		httpost.addHeader("Cache-Control", "max-age=0"); 
    		httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); 
    		httpost.setEntity(new StringEntity(data, "UTF-8")); 
    		CloseableHttpResponse response = httpclient.execute(httpost); 
    		try { 
    		HttpEntity entity = response.getEntity(); 
    		
    		String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8"); 
    		EntityUtils.consume(entity); 
    		return jsonStr; 
    		} finally { 
    		response.close(); 
    		} 
    		} finally { 
    		httpclient.close(); 
    		} 
    	} 
    } 
    

    其他的。遇到了会补充上来。还有一个get方式,不需要证书的提交,稍后补充呗

    展开全文
  • 1、一部分由于历史原因,毕竟微信是2011年开发的加上一般当时的应用上都是用的java写的 2、java用xml最多了,基本就是亲儿子,就跟node与json一样 3、目前主流当然是json了,但是对于php跟node这种语言特别不友好...

    1、一部分由于历史原因,毕竟微信是2011年开发的加上一般当时的应用上都是用的java写的

    2、java用xml最多了,基本就是亲儿子,就跟node与json一样

    3、目前主流当然是json了,但是对于php跟node这种语言特别不友好,多了空格都转换不了xml

    4、XML格式因为有schema,可以很方便的对数据进行验证

    5、不过微信现有大部分也都用的是json了,毕竟类似开放平台的这种还是以json为主会好些

     

    有兴趣的可以点击了解微信的历史等等:https://baike.baidu.com/item/%E5%BE%AE%E4%BF%A1/3905974?fr=aladdin

    展开全文
  • 说到微信公众平台开发调试,还是先讲讲微信公众平台开发模式的信息传送过程,明白了其信息传送过程,对于调试方法就应该明白了。微信公众平台开发模式的信息传送过程很简单,如下所示: 请求过程:手机微信端发送...

    说到微信公众平台开发调试,还是先讲讲微信公众平台开发模式的信息传送过程,明白了其信息传送过程,对于调试方法就应该明白了。微信公众平台开发模式的信息传送过程很简单,如下所示:

    请求过程:手机微信端发送内容——>微信服务器根据内容生成xml请求——>我们自己的服务器程序接收并处理xml消息
    响应过程:我们自己的服务器程序的响应内容xml——>微信服务器获取xml内容——>用户手机微信

    也就是说,微信服务器其实是一个中介的作用。知道了它的过程,我们进行开发调试就简单了,这里我用到了firefox的一个扩展poster。调试方法如下所示:

    请求过程:录入xml消息——>poster——>我们自己的服务器程序(远程或本地环境)处理
    响应过程:我们自己的服务器程序(远程或本地环境)的响应内容——>poster——>显示响应内容

    通过以上对比,可以看出,调试过程中,省略了手机微信这一环节,直接通过poster发送和接收显示xml消息,以获得调试结果。我用图片展示下会更明白,如下所示:

    请求过程:

    得到响应:

    展开全文
  • 微信公众号开发最主要的一个问题就是解决自己服务器和微信服务器之间的数据交互,因为之前的时候微信公众号都是采用的xml格式,而现在新的API都是采用json了,而我是开发的个人订阅号,所以需要解决xml与bean相互...

     

    微信公众号开发最主要的一个问题就是解决自己服务器和微信服务器之间的数据交互,因为之前的时候微信公众号都是采用的xml格式,而现在新的API都是采用json了,而我是开发的个人订阅号,所以需要解决xml与bean相互转换的问题。

    纵观目前百度上的xml与java对象的转换工具,主要是JAXB,XStream,DOM4j等等,我看了看例子,感觉XStream比较简单上手,再加上之前有在老师的公司看到过XStream,当时也是开发微信公众号,所以决定采用XStream

    微信公众号的数据格式如下:

    <xml>
        <ToUserName>< ![CDATA[toUser] ]></ToUserName>
        <FromUserName>< ![CDATA[fromUser] ]></FromUserName>
        <CreateTime>12345678</CreateTime>
        <MsgType>< ![CDATA[text] ]></MsgType>
        <Content>< ![CDATA[你好] ]></Content>
    </xml>

    可以看到,给微信服务器发送数据的时候是这个xml格式,所以我们需要使用XStream来根据bean的属性来动态构造出这样的数据结构,首先导入XStream的jar包;

    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>1.4.10</version>
    </dependency>

    配置一下XStream在根据bean属性生成xml的时候自动加上 ---![CDATA[----和----]]---,如下配置:

    //xstream扩展,bean转xml自动加上![CDATA[]]
        public static XStream getMyXStream() {
            return new XStream(new XppDriver() {
                @Override
                public HierarchicalStreamWriter createWriter(Writer out) {
                    return new PrettyPrintWriter(out) {
                        // 对所有xml节点都增加CDATA标记
                        boolean cdata = true;
    
                        @Override
                        public void startNode(String name, Class clazz) {
                            super.startNode(name, clazz);
                        }
    
                        @Override
                        protected void writeText(QuickWriter writer, String text) {
                            if (cdata) {
                                writer.write("<![CDATA[");
                                writer.write(text);
                                writer.write("]]>");
                            } else {
                                writer.write(text);
                            }
                        }
                    };
                }
            });
        }

    写个测试方法看看 :

        /**
         * bean转成微信的xml消息格式
         * @param object
         * @return
         */
        public static String beanToXml( Object object) {
            XStream xStream = getMyXStream();
            xStream.alias("xml", object.getClass());
            xStream.processAnnotations(object.getClass());
            String xml = xStream.toXML(object);
            if (!StringUtils.isEmpty(xml)){
                return xml;
            }else{
                return null;
            }
        }

    新建个实体;

    public class MessageTextEntity {
    
        @XStreamAlias("ToUserName")
        private String toUserName;
        @XStreamAlias("FromUserName")
        private String fromUserName;
        //由于微信服务端需要的时间整形是以秒为单位的,故需要除以1000L
        // this.setCreateTime(String.valueOf(System.currentTimeMillis() / 1000L));
        @XStreamAlias("CreateTime")
        private String createTime;
        @XStreamAlias("MsgType")
        private String msgType;
        @XStreamAlias("Content")
        private String content;
    
        public MessageTextEntity() {
        }
    
        @Override
        public String toString() {
            return "MessageTextEntity{" +
                    "toUserName='" + toUserName + '\'' +
                    ", fromUserName='" + fromUserName + '\'' +
                    ", createTime='" + createTime + '\'' +
                    ", msgType='" + msgType + '\'' +
                    ", content='" + content + '\'' +
                    '}';
        }
    
        public String getToUserName() {
            return toUserName;
        }
    
        public void setToUserName(String toUserName) {
            this.toUserName = toUserName;
        }
    
        public String getFromUserName() {
            return fromUserName;
        }
    
        public void setFromUserName(String fromUserName) {
            this.fromUserName = fromUserName;
        }
    
        public String getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(String createTime) {
            this.createTime = createTime;
        }
    
        public String getMsgType() {
            return msgType;
        }
    
        public void setMsgType(String msgType) {
            this.msgType = msgType;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
    }

     这里说一下,XStream吧java对象转成xml,在java对象中其实并不需要写getter和setter和默认构造函数的,我这里写了只是习惯而已。

        @Test
        public void testBeanToXml(){
            MessageTextEntity entity = new MessageTextEntity();
            entity.setContent("content");
            entity.setCreateTime(new Date().toString());
            entity.setFromUserName("fromusername");
            entity.setMsgType("type");
            entity.setToUserName("tousername");
            System.out.println(WeChatUtil.beanToXml(entity));
        }

    运行测试用例,可以看到如下输出

    <xml>
      <ToUserName><![CDATA[tousername]]></ToUserName>
      <FromUserName><![CDATA[fromusername]]></FromUserName>
      <CreateTime><![CDATA[Wed Sep 26 08:32:29 CST 2018]]></CreateTime>
      <MsgType><![CDATA[type]]></MsgType>
      <Content><![CDATA[content]]></Content>
    </xml>

    这样就OK了,吧xml转成bean的方法就比较简单一点了,

        /**
         * xml转成bean泛型方法
         * @param resultXml
         * @param clazz
         * @param <T>
         * @return
         */
        public static <T> T xmlToBean(String resultXml, Class clazz) {
            // XStream对象设置默认安全防护,同时设置允许的类
            XStream stream = new XStream(new DomDriver());
    //        XStream.setupDefaultSecurity(stream);
    //        stream.allowTypes(new Class[]{clazz});
            stream.processAnnotations(new Class[]{clazz});
    //        stream.setMode(XStream.NO_REFERENCES);
            stream.alias("xml", clazz);
            return (T) stream.fromXML(resultXml);
        }

    这样就能完成xml到bean的转换了,但是这样直接执行的话会报一个红色的警告信息

    Security framework of XStream not initialized, XStream is probably vulnerable.

    这是因为要为XStream进行安全设置。吧上面代码注释去掉就可以了。

    测试一下:

        @Test
        public void testXmlToBean(){
            String xml = "<xml>" +
                    "<ToUserName><![CDATA[tousername]]></ToUserName>" +
                    "<FromUserName><![CDATA[fromusername]]></FromUserName>" +
                    "<CreateTime>Tue Sep 25 15:10:09 CST 2018</CreateTime>" +
                    "<MsgType><![CDATA[type]]></MsgType>" +
                    "<Content><![CDATA[content]]></Content>" + "</xml>";
            MessageTextEntity entity = WeChatUtil.xmlToBean(xml, MessageTextEntity.class);
            System.out.println(entity);
        }

    可以看到如下输出:

    MessageTextEntity{toUserName='tousername', fromUserName='fromusername', createTime='Tue Sep 25 15:10:09 CST 2018', msgType='type', content='content'}
    

    可以了,现在可以开始微信开发了。

    展开全文
  • 上一篇《微信开发学习总结(一)——微信开发环境搭建》我们已经完成了微信开发的准备工作,准备工作完成之后,就要开始步入正题了。 一、微信公众平台的基本原理  在开始做之前,先简单介绍了微信公众平台的基本...
  • 微信开发之解析xml

    2016-03-21 11:33:57
    public Map, String> parseXml(HttpServletRequest request) throws Exception { // 将解析结果存储在HashMap中 Map, String> map = new HashMap, String>(); // 从request中取得输入
  • 经常有同学过来询问“小白想学习微信开发,需要会哪些技术?”,今天我就系统的回答这个问题。想弄清楚这个问题,你必须知道一些微信开发的相关知识。微信公众号主要有:订阅号、服务号、企业号(已经升级到企业微信...
  • 微信公众号开发时,因为后台发送接收的是xml类型,为了后期方便处理,我们需要将xml类型,转为集合类型或者将对象转为XML类型。首先我们需要导入包: dom4j -1.6.1.jar 用于解析xml xstream-1.3.1.jar &lt;...
  • 个人微信开发api文档

    2019-07-14 15:15:09
    个人微信开发api文档,个人微信开发sdk,个人微信开发协议接口 微信开发sdk服务端调用接口 1、基础消息类型 1、客户端发送的心跳包 HeartBeatReq = 1001; 2、消息接收确认回复(接收或拒绝接收) MsgReceivedAck = ...
  • 文章详情:【微信公众号开发】三、解析微信事件XML数据消息及响应 链接:https://www.microanswer.cn/blog/13
  • 微信支付的开发,作为微信公众号开发的难点之一,另不少开发者颇为头痛。市面上微信支付开发成本动辄上万,也让刚创业的小公司无力负担。本次文章将详细介绍微信支付中微信原生红包的开发思路,并提供源代码。以供...
  • 关键字:微信开发图书 微信公众平台开发书籍 微信图书 微信开发书籍 微信图书推荐 微信开发图书推荐  本文介绍了当前图书市场上最主要的微信公众平台开发类书籍,并对每本书的特色做了简要点评,供有需要购买的...
  • 发送消息,是指用户公众号向用户发送相应形式的消息。根据微信开发文档,由以下四种形式:被动回复,群发接口,客服消息接口以及模板消息接口。...这一部分较为简单,正式进行微信开发的第一步就是,在公众号中基本
  • 将图文消息对象转换为xml时,格式出错 &lt;xml&gt; &lt;ToUserName&gt;oVICC0pcZLLPZUowr_wNAxiwTzeo&lt;/ToUserName&gt; &lt;FromUserName&gt;gh_d6acc2ca6533&lt;/...
  • 微信开发源码注释

    2016-06-11 18:11:55
    本文用于解释微信开发中的中PHP代码意义,用于学习先关基础知识。
  • 过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。 微信公众平台官网:https://mp.weixin.qq.com 文章目录一、注册公众号二、了解公众号管理页面三、必备...
  • 转自:https://www.cnblogs.com/c-xiaohai/p/6796116.html 1、首先理解一下html  html的全名是:HyperText Transfer markup language 超级文本标记语言,html本质上是一门标记(符合...有一套 固定的标记的集合。
  • $GLOBALS['HTTP_RAW_POST_DATA']一直接收不到微信发过来的XML数据改用file_get_contents('php://input')即可接收
1 2 3 4 5 ... 20
收藏数 45,669
精华内容 18,267
关键字:

xml 微信开发