微信提交订单信息报关,解析String类型的XML

应用场景:用户订单信息提交报关请求,返回数据并解析。

WXBaoGuangTools 

package com.shopping.wxbaoguan;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.jdom.JDOMException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.shopping.core.tools.CommUtil;
import com.shopping.core.tools.WxCommonUtil;
import com.shopping.foundation.domain.OrderForm;
import com.shopping.pay.tenpay.util.MD5Util;
import com.shopping.view.web.action.PayViewAction;
@Component
public class WXBaoGuangTools {
	   private static Logger logger = LoggerFactory.getLogger(WXBaoGuangTools.class);
	public static void Wxbg_Send(OrderForm of) throws Exception {

		Map map = new HashMap();
		map.put("out_trade_no", of.getId().toString());//商户订单号(支付订单ID)
		map.put("transaction_id", of.getOut_order_id().toString());//微信支付订单号	
		map.put("cert_id", of.getAddr().getIdCard());//证件号码
		map.put("name", of.getAddr().getTrueName());//姓名
		//***********************************************************
		//map.put("out_trade_no", "wd123456789");//商户订单号(支付订单ID)
		//map.put("transaction_id", "40026565656565656");//微信支付订单号	
		//map.put("cert_id", "370126199999999999");//证件号码
		//map.put("name", "王*");//姓名
		// 获得签名
		String url1 = "appid=wxa52937220019ac6f"   //公众账号ID	
				+ "&cert_id=" + map.get("cert_id") //证件号码	
				+ "&cert_type=IDCARD"			   //证件类型	
				+ "&customs=NINGBO"			   //海关
				+ "&mch_customs_no=3701232323069"     //商户海关备案号	
				+ "&mch_id=1292292001&name="+ map.get("name") //商户号	
				+ "&out_trade_no=" + map.get("out_trade_no")  //商户订单号	
				+ "&transaction_id="+ map.get("transaction_id");//微信支付订单号	
		url1 += "&key=79edbcda0f5161670cf413a216da1c5e"; //key为商户平台设置的密钥key
		String sign = MD5Util.MD5Encode(url1, "UTF-8").toUpperCase();
		map.put("sign", sign);
		SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
		// 公众账号ID    描叙:微信分配的公众账号ID   必填
		parameters.put("appid", "wxa5294444419ac6f");
		// 海关名称                                                                
		//           必填
		parameters.put("customs", "NINGBO");
		// 商户号                                                                  
		//             必填  
		parameters.put("mch_id", "129222323001");
		// 商户订单号                                                                
		//       必填
		parameters.put("out_trade_no", map.get("out_trade_no"));
		// 签名,详见签名生成算法                                                 必填
		parameters.put("sign", map.get("sign"));
		// 微信支付订单号                                                              
		//  必填
		parameters.put("transaction_id", map.get("transaction_id"));
		// 证件类型                                                                
		//           必填
		parameters.put("cert_type", "IDCARD");
		// 证件号码                                                                
		//           必填
		parameters.put("cert_id", map.get("cert_id"));
		// 姓名                                                                  
		//                必填
		parameters.put("name", map.get("name"));
		// &mch_customs_no=3701660069
		parameters.put("mch_customs_no", "37015665650069");
		System.out.println(new XMLMethods().getRequestXml(parameters));
		// 发送请求
		String url = "https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclareorder";
		HttpClient client = new HttpClient();
		PostMethod myPost = new PostMethod(url);
		client.getParams().setSoTimeout(300 * 1000);
		String responseString = null;
		try {
			myPost.setRequestEntity(
					new StringRequestEntity(new XMLMethods().getRequestXml(parameters), "text/xml", "utf-8"));
			int statusCode = client.executeMethod(myPost);
			if (statusCode == HttpStatus.SC_OK) {
				BufferedInputStream bis = new BufferedInputStream(myPost.getResponseBodyAsStream());
				byte[] bytes = new byte[1024];
				ByteArrayOutputStream bos = new ByteArrayOutputStream();
				int count = 0;
				while ((count = bis.read(bytes)) != -1) {
					bos.write(bytes, 0, count);
				}
				byte[] strByte = bos.toByteArray();
				responseString = new String(strByte, 0, strByte.length, "utf-8");
				bos.close();
				bis.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		myPost.releaseConnection();
		client.getHttpConnectionManager().closeIdleConnections(0);
		System.out.println(responseString);
		logger.info("报关信息打印:"+responseString);
		//解析String 串类型的 XML
		 Document dom=DocumentHelper.parseText(responseString);  
         Element root=dom.getRootElement();  
         List<Element> elements = root.elements();
         for(Iterator<Element> it = elements.iterator();it.hasNext();){
          Element element = it.next();
          System.out.println(element.getName()+" : "+element.getTextTrim());
         }
	}
	
	public static void main(String[] args) throws DocumentException {
		//Wxbg_Send();
	}
}

XMLMethods

package com.shopping.wxbaoguan;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

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

public class XMLMethods {
	/**
	 *      * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。      * @param
	 * strxml      * @return      * @throws DocumentException       * @throws
	 * JDOMException      * @throws IOException      
	 */
	@SuppressWarnings("unchecked")
	public static Map doXMLParse(String strxml) throws DocumentException {
		strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
		if (null == strxml || "".equals(strxml)) {
			return null;
		}
		Map m = new HashMap();
		Document document = DocumentHelper.parseText(strxml);
		Element root = document.getRootElement();
		// 遍历根节点下所有子节点  
		Iterator<?> it = root.elementIterator();
		while (it.hasNext()) {
			Element e = (Element) it.next();
			if (!e.isTextOnly()) {
				System.out.println("有多个子节点");
			}
			String k = e.getName();
			String v = e.getText();
			//         System.out.println(k+" "+v);
			m.put(k, v);
		}
		return m;
	}

	/**
	 * 将map封装成XML
	 * 
	 * @param parameters
	 * @return
	 */
	@SuppressWarnings("unchecked")
	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();
			// 注意,有一些值要用![CDATA[value]]来表示
			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返回给微信的通知
	 * 
	 * @param return_code
	 * @param return_msg
	 * @return
	 */
	public static String setXML(String return_code, String return_msg) {
		return "<xml><return_code><![CDATA[" + return_code + "]]></return_code><return_msg><![CDATA[" + return_msg
				+ "]]></return_msg></xml>";
	}

	/**
	 *        * 封装微信text类的返回消息       * @param to       * @param from     
	 *  * @param content       * @return       
	 */
	public static String formatXmlAnswer(String to, String from, String content) {
		StringBuffer sb = new StringBuffer();
		Date date = new Date();
		sb.append("<xml><ToUserName><![CDATA[");
		sb.append(to);
		sb.append("]]></ToUserName><FromUserName><![CDATA[");
		sb.append(from);
		sb.append("]]></FromUserName><CreateTime>");
		sb.append(date.getTime());
		sb.append("</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA["); 
		sb.append(content);
		sb.append("]]></Content><FuncFlag>0</FuncFlag></xml>");
		return sb.toString();

	}

	public static void main(String[] args) throws DocumentException {
		String xml = "<xml><appid><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></appid><attach>支付测试</attach><body>JSAPI支付测试</body><mch_id>10000100</mch_id></xml>";
		doXMLParse(xml);
	}
}

 

 

执行结果:
信息: 报关信息打印:<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[成功]]></return_msg>
<sign><![CDATA[FEF26344FC4CECB1C0BA7BADAE745E82]]></sign>
<appid><![CDATA[wxa5293722oo19ac6f]]></appid>
<mch_id><![CDATA[1292292oo1]]></mch_id>
<result_code><![CDATA[SUCCESS]]></result_code>
<err_code><![CDATA[0]]></err_code>
<err_code_des><![CDATA[OK]]></err_code_des>
<state><![CDATA[FAIL]]></state>
<transaction_id><![CDATA[4200000132201807044386132189]]></transaction_id>
<out_trade_no><![CDATA[232444]]></out_trade_no>
<modify_time><![CDATA[20190226133143]]></modify_time>
<cert_check_result><![CDATA[SAME]]></cert_check_result>
<verify_department><![CDATA[OTHERS]]></verify_department>
<verify_department_trade_id><![CDATA[4200000132201807044386132189]]></verify_department_trade_id>
</xml>

解析数据:
return_code : SUCCESS
return_msg : 成功
sign : FEF26344FC4CECB1C0BA7BADAE745E82
appid : wxa52937220019ac6f
mch_id : 1292292001
result_code : SUCCESS
err_code : 0
err_code_des : OK
state : FAIL
transaction_id : 4200000132201807044386132189
out_trade_no : 232444
modify_time : 20190226133143
cert_check_result : SAME
verify_department : OTHERS
verify_department_trade_id : 4200000132201807044386132189
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值