应用场景:用户订单信息提交报关请求,返回数据并解析。
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