之前做微信支付,在网上找了好多教程感觉都不太详细。下面是本人做完支付功能后的一个小结。后面会有微信退款详细步骤
1.统一下单
参考官方API:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
2.准备工作
首先需要在微信商户平台申请 账户参数 appid、mch_id、key、secret等参数。具体申请步骤这里不再赘述
3.发起微信支付
@RequestMapping(value="/wxPay", method = RequestMethod.POST)
public void wxPay(HttpServletRequest request,HttpServletResponse response,String orderNo,String token) throws Exception{
System.out.println("开始支付");
System.out.println("请求参数orderNo:"+orderNo+"token:"+token);
String appid = WeixinUtil.appid;
String mch_id = WeixinUtil.mch_id;
String mch_key = WeixinUtil.mch_key;
//jsapi接口初始化
RequestHandler requestHandler=new RequestHandler(request, response);
XMLHelper xh;
requestHandler.init();
requestHandler.init(appid, mch_key);
GoodsOrder goodsOrder=orderService.getOrderByNo(orderNo);
if(goodsOrder.getOrderStatus() == OrderStatus.ORDER_PAY_NO){
System.out.println("根据订单查询金额:"+goodsOrder);
Double amount=goodsOrder.getPayAmount();
String totalFee=BigDecimal.valueOf(amount).multiply(new BigDecimal(100)).setScale(0,BigDecimal.ROUND_HALF_UP) + "";
//随机字符串
String noncestr = Sha1Util.getNonceStr();
//时间串
String timestamp = Sha1Util.getTimeStamp();
//回调地址,需要改成自己的
String notify=WebUtils.getServerPath(request)+"/vue/wx/notify.ohtml";
System.out.println("回调地址:"+notify);
//===============
//已支付接口参数
//===============
requestHandler.setParameter("appid", appid); //公众号 必填
requestHandler.setParameter("mch_id", mch_id); //商户号 必填
requestHandler.setParameter("nonce_str", noncestr); //随机字符串 必填
requestHandler.setParameter("body", "商品订单"); //商品描述 必填
requestHandler.setParameter("out_trade_no", orderNo); //商户系统内部的订单号 必填
requestHandler.setParameter("total_fee", totalFee); //订单总金额,单位为分不能带小数点 必填
requestHandler.setParameter("spbill_create_ip", "116.226.20.188"); //订单生成的机器IP 必填
// requestHandler.setParameter("spbill_create_ip", "101.229.233.216"); //订单生成的机器IP 必填
requestHandler.setParameter("notify_url", notify); //接收支付成功通必填
requestHandler.setParameter("trade_type", "JSAPI"); //支付类型 必填
requestHandler.setParameter("openid", token); //用户唯一标识(trade_type为JSAPI时必填)
//参数转换为xml格式
String xmlParams=requestHandler.getRequestURL();
//预支付提交地址
String url="https://api.mch.weixin.qq.com/pay/unifiedorder";
//预支付请求
String json=HttpRequestHelper.postData(url, xmlParams, "utf-8");
System.out.println("参数信息"+json);
//转换为xml
xh=new XMLHelper(json,"UTF-8");
// 将解析结果存储在HashMap中
Map map = PayUtil.doXMLParse(json);
String return_code = (String) map.get("return_code");//返回状态码
System.out.println("return_code的值是"+return_code);
//预支付id
String prepay_id = xh.readByName("prepay_id");
//获取package包
String packageValue = "prepay_id="+prepay_id;
//微信支付参数
SortedMap<String, String> signParams = new TreeMap<String, String>();
signParams.put("appId", appid);
signParams.put("nonceStr", noncestr);
signParams.put("package", packageValue);
signParams.put("timeStamp", timestamp);
signParams.put("signType", "MD5");
//生成支付签名
String sign = requestHandler.createSign(signParams);
//增加非参与签名的额外参数
signParams.put("paySign", sign);
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"appId\":\"");sb.append(appid);sb.append("\",");
sb.append("\"timeStamp\":\"");sb.append(timestamp);sb.append("\",");
sb.append("\"nonceStr\":\"");sb.append(noncestr);sb.append("\",");
sb.append("\"package\":\"");sb.append(packageValue);sb.append("\",");
sb.append("\"signType\":\"");sb.append("MD5");sb.append("\",");
sb.append("\"paySign\":\"");sb.append(sign);sb.append("\"");
sb.append("}");
System.out.println("前台输出"+sb.toString());
WebUtils.toPageJson(response, sb.toString());
}
}
4.支付回调
@SuppressWarnings({ "static-access", "unused" })
@RequestMapping(value="/notify.ohtml",method = RequestMethod.POST)
public void notify(HttpServletRequest request,HttpServletResponse response ) throws Exception
{
System.out.println("支付回调");
//解析xml
InputStream a=request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(a,"UTF-8"));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
//xml帮助类
XMLHelper xh=new XMLHelper(sb.toString(),"UTF-8");
System.out.println("返回的参数:"+sb.toString());
//订单号
String orderNo = xh.readByName("out_trade_no");
String tradeNo = xh.readByName("transaction_id");
String totalFee = xh.readByName("total_fee");
//状态码
String resultCode = xh.readByName("result_code");
String sign = xh.readByName("sign");
ResponseHandler rsh=new ResponseHandler();
String mySign=rsh.createSign(rsh.parseXml(sb.toString()));
System.out.println("订单号:"+orderNo+",状态码:"+resultCode+",sign签名:"+sign+",mySign签名"+mySign);
if(resultCode.equals("SUCCESS")&&sign.equals(mySign)){
System.out.println("进成功判断了");
BigDecimal amount=(new BigDecimal(totalFee)).divide(new BigDecimal("100")).setScale(2,BigDecimal.ROUND_HALF_UP);//微信支付的单位是分 转化为元 保留两位小数
WebUtils.toPageText(response, "success");
//更改订单状态,修改支付时间
long payTime = new Date().getTime();
Map<String,Object> map = new HashMap<String,Object>();
map.put("orderNo", orderNo);
map.put("orderStatus", 4);
map.put("payTime", payTime);
map.put("tradeNo", tradeNo);
goodsOrderManageService.updateOrderStatusByOrderNo(map);
}else{
System.out.println("进失败判断了");
WebUtils.toPageText(response, "fail");
}
}
下面是所用到的工具类
package com.hhz.basic.util.weixin;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.hhz.basic.util.common.XMLHelper;
/*
'微信支付服务器签名支付请求请求类
'============================================================================
'api说明:
'init(app_id, app_secret, partner_key, app_key);
'初始化函数,默认给一些参数赋值,如cmdno,date等。
'setKey(key_)'设置商户密钥
'getLasterrCode(),获取最后错误号
'GetToken();获取Token
'getTokenReal();Token过期后实时获取Token
'createMd5Sign(signParams);生成Md5签名
'genPackage(packageParams);获取package包
'createSHA1Sign(signParams);创建签名SHA1
'sendPrepay(packageParams);提交预支付
'getDebugInfo(),获取debug信息
'============================================================================
'*/
public class RequestHandler {
/** Token获取网关地址地址 */
private String tokenUrl;
/** 预支付网关url地址 */
private String gateUrl;
/** 查询支付通知网关URL */
private String notifyUrl;
/** 商户参数 */
private String appid;
private String appkey;
private String partnerkey;
private String appsecret;
private String key;
/** 请求的参数 */
private SortedMap parameters;
/** Token */
private String Token;
private String charset;
/** debug信息 */
private String debugInfo;
private String last_errcode;
private HttpServletRequest request;
private HttpServletResponse response;
/**
* 初始构造函数。
*
* @return
*/
public RequestHandler(HttpServletRequest request,
HttpServletResponse response) {
this.last_errcode = "0";
this.request = request;
this.response = response;
this.charset = "UTF-8";
this.parameters = new TreeMap();
}
/**
* 初始化函数。
*/
public void init(String app_id, String app_secret) {
this.last_errcode = "0";
this.Token = "token_";
this.debugInfo = "";
this.appid = app_id;
this.appsecret = app_secret;
}
public void init() {
}
/**
* 获取最后错误号
*/
public String getLasterrCode() {
return last_errcode;
}
/**
*获取入口地址,不包含参数值
*/
public String getGateUrl() {
return gateUrl;
}
/**
* 获取参数值
*
* @param parameter
* 参数名称
* @return String
*/
public String getParameter(String parameter) {
String s = (String) this.parameters.get(parameter);
return (null == s) ? "" : s;
}
public void setParameter(String parameter, String parameterValue) {
String v = "";
if(null != parameterValue) {
v = parameterValue.trim();
}
this.parameters.put(parameter, v);
}
/**
* @Description:组装微信预支付xml参数
* @return
* @throws UnsupportedEncodingException
* @return String 返回类型
* @author Qiu
*/
public String getRequestURL() throws UnsupportedEncodingException {
createSign();
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
Set es = this.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();
}
protected void createSign() {
StringBuffer sb = new StringBuffer();
Set es = this.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(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + this.getKey()); //自己的API密钥
String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
String sign = MD5Util.MD5Encode(sb.toString(), enc).toUpperCase();
this.setParameter("sign", sign);
}
//设置密钥
public void setKey(String key) {
this.partnerkey = key;
}
//设置微信密钥
public void setAppKey(String key){
this.appkey = key;
}
// 特殊字符处理
public String UrlEncode(String src) throws UnsupportedEncodingException {
return URLEncoder.encode(src, this.charset).replace("+", "%20");
}
/**
* 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
*/
public String createSign(SortedMap<String, String> packageParams) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.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 (null != v && !"".equals(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + this.getKey());
String sign = MD5Util.MD5Encode(sb.toString(), this.charset).toUpperCase(); //进行MD5运算,再将得到得字符串转化为大写
return sign;
}
public static SortedMap<String, String> parseXml(String xml)
throws Exception {
// 解析结果存储在HashMap
SortedMap<String, String> m=new TreeMap<String,String>();
XMLHelper xh=new XMLHelper(xml.toString(),"UTF-8");
Map<String,String> map=xh.readXMLMapByName("xml");
for(String k : map.keySet()){
m.put(k,map.get(k));
}
return m;
}
//输出XML
public String parseXML() {
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
Set es = this.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(null != v && !"".equals(v) && !"appkey".equals(k)) {
sb.append("<" + k +">" + getParameter(k) + "</" + k + ">\n");
}
}
sb.append("</xml>");
return sb.toString();
}
/**
* 设置debug信息
*/
protected void setDebugInfo(String debugInfo) {
this.debugInfo = debugInfo;
}
public void setPartnerkey(String partnerkey) {
this.partnerkey = partnerkey;
}
public String getDebugInfo() {
return debugInfo;
}
public String getKey() {
return appsecret;
}
}
XML解析工具
package com.hhz.basic.util.common;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* xml解析工具类
* @author Enjoy
* @since 2011.12.17
*/
public class XMLHelper {
DocumentBuilderFactory factory = null;
DocumentBuilder builder =null;
Document document = null;
Element element = null;
public XMLHelper(String xmlStr){
factory = DocumentBuilderFactory.newInstance();
try {
builder = factory.newDocumentBuilder();
document = builder.parse(new ByteArrayInputStream((xmlStr.getBytes("GBK"))));
element = document.getDocumentElement();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public XMLHelper(String xmlStr,String encode){
factory = DocumentBuilderFactory.newInstance();
try {
builder = factory.newDocumentBuilder();
document = builder.parse(new ByteArrayInputStream((xmlStr.getBytes(encode))));
element = document.getDocumentElement();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 解析xml返回所需key下的所有元素的文本值(只有一个名字为key的元素)
* @param key element的标签名
* @return key元素的所有子集元素的文本值
*/
public Map<String,String> readXMLText(String key){
Map<String,String> map = new HashMap<String,String>();
NodeList recordNodes = element.getElementsByTagName(key);
NodeList childNodes = null;
Node node = null;
node = recordNodes.item(0);
childNodes = node.getChildNodes();//得到子元素
map = new HashMap<String,String>();
for(int j=0;j<childNodes.getLength();j++){
if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){//必须是element类型的
map.put(childNodes.item(j).getNodeName(), childNodes.item(j).getFirstChild() == null ? "" :childNodes.item(j).getFirstChild().getNodeValue());
}
}
return map;
}
/**
* 解析xml
* @param key element的标签名
* @return key元素的所有子集元素的文本值
*/
public String readXMLByName(String key){
return element.getFirstChild().getNodeValue();
}
/**
* 解析xml 获得最低
* @param key element的标签名
* @return key元素的所有子集元素的文本值
*/
public String readByName(String key){
NodeList recordNodes = element.getElementsByTagName(key);
String xmlText=recordNodes.item(0).getFirstChild().getNodeValue();
return xmlText;
}
/**
* 解析xml
* @param key element的标签名
* @return key元素的所有子集元素的文本值
*/
public Map<String,String> readXMLMapByName(String key){
NodeList list=element.getChildNodes();
Map<String,String> map=new HashMap<String,String>();
for(int i=0;i<list.getLength();i++){
if(list.item(i)==null||list.item(i).getFirstChild()==null){
continue;
}else{
map.put(list.item(i).getNodeName(),list.item(i).getFirstChild().getNodeValue());
}
}
return map;
}
/**
* 解析xml返回所需xml下所有元素的列表(有多个名字为key的元素)
* @param key element的标签名
* @return key元素的所有子集元素的文本值集合
*/
public List<Map<String,String>> readXMLList(String key){
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
Map<String,String> map = null;
NodeList recordNodes = element.getElementsByTagName(key);
NodeList childNodes = null;
Node node = null;
for(int i=0;i<recordNodes.getLength();i++){
node = recordNodes.item(i);
childNodes = node.getChildNodes();//得到子元素
map = new HashMap<String,String>();
for(int j=0;j<childNodes.getLength();j++){
if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){//必须是element类型的
map.put(childNodes.item(j).getNodeName(), childNodes.item(j).getFirstChild() == null ? "" :childNodes.item(j).getFirstChild().getNodeValue());
}
}
list.add(map);
}
return list;
}
public static void main(String[] arg){
StringBuffer sb = new StringBuffer();
String xml="<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wxd88ec4864ec6b776]]></appid><mch_id><![CDATA[1244143202]]></mch_id><nonce_str><![CDATA[LLuqI6C2zr8sVsMF]]></nonce_str><sign><![CDATA[C10BABFB3025CBB6C861ED7050CF26E0]]></sign><result_code><![CDATA[SUCCESS]]></result_code><transaction_id><![CDATA[1004920996201506130247214508]]></transaction_id><out_trade_no><![CDATA[ZY20150613222200001]]></out_trade_no><out_refund_no><![CDATA[201506132223181434205398974]]></out_refund_no><refund_id><![CDATA[2004920996201506130009713926]]></refund_id><refund_channel><![CDATA[]]></refund_channel><refund_fee>301</refund_fee><coupon_refund_fee>0</coupon_refund_fee><total_fee>301</total_fee><coupon_refund_count>0</coupon_refund_count><cash_refund_fee>301</cash_refund_fee></xml>";
XMLHelper x=new XMLHelper(xml);
System.out.println(x.readByName("return_code"));
Map<String,String> map = x.readXMLMapByName("xml");
for(String k : map.keySet()){
System.out.println(k+"-"+map.get(k));
}
// String xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+
// "<response>"+
// "<a>1002</a>"+
// "<b>身份信息错误</b>"+
// "<c>true</c>"+
// "</response>";
// XMLHelper xh=new XMLHelper(xml.toString(),"UTF-8");
// System.out.println(xh.readXMLByName("c"));
}
}
PayUtil
package com.hhz.utils.weixin;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SignatureException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.digest.DigestUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilderFactory;
public class PayUtil {
/**
* 签名字符串
* @param //text需要签名的字符串
* @param key 密钥
* @param //input_charset编码格式
* @return 签名结果
*/
public static String sign(String text, String key, String input_charset) {
text = text + "&key=" + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
}
/**
* 签名字符串
* @param //text需要签名的字符串
* @param sign 签名结果
* @param //key密钥
* @param input_charset 编码格式
* @return 签名结果
*/
public static boolean verify(String text, String sign, String key, String input_charset) {
text = text + key;
String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
if (mysign.equals(sign)) {
return true;
} else {
return false;
}
}
/**
* @param content
* @param charset
* @return
* @throws SignatureException
* @throws UnsupportedEncodingException
*/
public static byte[] getContentBytes(String content, String charset) {
if (charset == null || "".equals(charset)) {
return content.getBytes();
}
try {
return content.getBytes(charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
}
}
private static boolean isValidChar(char ch) {
if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
return true;
if ((ch >= 0x4e00 && ch <= 0x7fff) || (ch >= 0x8000 && ch <= 0x952f))
return true;// 简体中文汉字编码
return false;
}
/**
* 除去数组中的空值和签名参数
* @param sArray 签名参数组
* @return 去掉空值与签名参数后的新签名参数组
*/
public static Map<String, String> paraFilter(Map<String, String> sArray) {
Map<String, String> result = new HashMap<String, String>();
if (sArray == null || sArray.size() <= 0) {
return result;
}
for (String key : sArray.keySet()) {
String value = sArray.get(key);
if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
|| key.equalsIgnoreCase("sign_type")) {
continue;
}
result.put(key, value);
}
return result;
}
/**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
/**
*
* @param //requestUrl请求地址
* @param //requestMethod请求方法
* @param //outputStr参数
*/
public static String httpRequest(String requestUrl,String requestMethod,String outputStr){
// 创建SSLContext
StringBuffer buffer = null;
try{
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(requestMethod);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
//往服务器端写内容
if(null !=outputStr){
OutputStream os=conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
// 读取服务器端返回的内容
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
buffer = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line);
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}
public static String urlEncodeUTF8(String source){
String result=source;
try {
result=java.net.URLEncoder.encode(source, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
/**
* 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
* @param strxml
* @return
* @throws JDOMException
* @throws IOException
*/
public static Map doXMLParse(String strxml) throws Exception {
if(null == strxml || "".equals(strxml)) {
return null;
}
/*============= !!!!注意,修复了微信官方反馈的漏洞,更新于2018-10-16 ===========*/
try {
Map<String, String> data = new HashMap<String, String>();
// TODO 在这里更换
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
//documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
documentBuilderFactory.setXIncludeAware(false);
documentBuilderFactory.setExpandEntityReferences(false);
InputStream stream = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().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) {
throw ex;
}
}
/**
* 获取子结点的xml
* @param children
* @return String
*/
public static String getChildrenText(List children) {
StringBuffer sb = new StringBuffer();
if(!children.isEmpty()) {
Iterator it = children.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String name = e.getName();
String value = e.getTextNormalize();
List list = e.getChildren();
sb.append("<" + name + ">");
if(!list.isEmpty()) {
sb.append(getChildrenText(list));
}
sb.append(value);
sb.append("</" + name + ">");
}
}
return sb.toString();
}
public static InputStream String2Inputstream(String str) {
return new ByteArrayInputStream(str.getBytes());
}
}
WebUtil
package com.hhz.basic.util.common;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* request response封装
* @version 2016/06/09
*
*/
public class WebUtils{
// 从session里取值
public static Object getSessionAttribute(HttpServletRequest request, String name)
{
HttpSession session = request.getSession(false);
return ((session != null) ? session.getAttribute(name) : null);
}
// 把值放入session
public static void removeSessionAttribute(HttpServletRequest request, String name)
{
request.getSession().removeAttribute(name);
}
// 把值放入session
public static void clearSessionAttribute(HttpServletRequest request)
{
request.getSession().invalidate();
}
// 把值放入session
public static void setSessionAttribute(HttpServletRequest request, String name, Object value)
{
if (value != null) {
request.getSession().setAttribute(name, value);
}
else {
HttpSession session = request.getSession(false);
if (session != null)
session.removeAttribute(name);
}
}
/**
* 操作成功时给页面发出提示信息(ajax)
* @param mes 消息
* @param response
* @throws IOException
*/
public static void toPageJsonSuccess(String mes , HttpServletResponse response){
try {
WebUtils.toPageJsonMessage(1, mes, response);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 操作错误时给页面发出提示信息(ajax)
* @param mes 消息
* @param response
* @throws IOException
*/
public static void toPageJsonFailed(String mes , HttpServletResponse response){
try {
WebUtils.toPageJsonMessage(-1, mes, response);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 未登录
* @param mes 消息
* @param response
* @throws IOException
*/
public static void toPageJsonNoLogin(String mes , HttpServletResponse response){
try {
WebUtils.toPageJsonMessage(98, mes, response);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 无权限
* @param mes 消息
* @param response
* @throws IOException
*/
public static void toPageJsonNoAuth(String mes , HttpServletResponse response){
try {
WebUtils.toPageJsonMessage(99, mes, response);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 未登录
* @param result 1成功 其他失败
* @param mes 消息
* @param response
* @throws IOException
*/
public static void toPageJsonMessage(int result , String mes , HttpServletResponse response) throws IOException{
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"result\":\""+result+"\",");
sb.append("\"mes\":\""+mes+"\"");
sb.append("}");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = response.getWriter();
out.write(sb.toString());
out.flush();
out.close();
}
//向前台输出
public static void toPageJson(HttpServletResponse response,String message){
try {
response.setContentType("application/json; charset=utf-8");//
PrintWriter out = response.getWriter();
out.print(message);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//向前台输出
public static void toPageXml(HttpServletResponse response,String message){
try {
response.setContentType("application/xml; charset=utf-8");//
PrintWriter out = response.getWriter();
out.print(message);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//向前台输出
public static void toPageText(HttpServletResponse response,String message){
try {
response.setContentType("text/html; charset=utf-8");//
PrintWriter out = response.getWriter();
out.print(message);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//向前台输出
public static void toPageTextPlain(HttpServletResponse response,String message){
try {
response.setContentType("text/plain; charset=utf-8");//
PrintWriter out = response.getWriter();
out.print(message);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String InputStreamToString(InputStream a){
StringBuilder sb = new StringBuilder();
String line = null;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(a,"UTF-8"));
line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
//根据0和1 判断true和false
public static boolean intToBoolean(int i)
{
return i==1?true:false;
}
/**
* @Description: 获取服务器路径
* @author cc
* @param request
* @return
* @date 2015年6月10日
*/
public static String getServerPath(HttpServletRequest request){
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName();
if(80!=request.getServerPort()){
basePath+=":"+request.getServerPort();
}
basePath+=path;
return basePath;
}
/**
* 获取Cookies的值
*/
public static String getCookies(HttpServletRequest request,String name){
// 获取request里面的cookie cookie里面存值方式也是 键值对的方式
String result="";
Cookie[] cookie = request.getCookies();
if(cookie==null) return "";
for (int i = 0; i < cookie.length; i++) {
Cookie cook = cookie[i];
if(cook.getName().equals(name)){ //获取键
result=cook.getValue().toString();
}
}
return result;
}
public static String getRequestUrl(HttpServletRequest request){
String url=WebUtils.getServerPath(request)+request.getServletPath();
if(request.getQueryString()!=null){
url += "?"+request.getQueryString();//完整url 加上参数
}
return url;
}
/**
* 设置Cookies的值
*/
public static void setCookies(HttpServletResponse response,String name,String value){
Cookie cookie = new Cookie(name,value);
cookie.setMaxAge(30*24*60*60);//设置1年有效期
//设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问
cookie.setPath("/");
response.addCookie(cookie);
}
public static boolean isInApp(HttpServletRequest request){
String referer=request.getHeader("referer");
String from=request.getParameter("from");
if(referer!=null&&from==null){
return true;
}else{
return false;
}
}
public static boolean isWeixin(HttpServletRequest request){
String ua = request.getHeader("user-agent")
.toLowerCase();
if (ua.indexOf("micromessenger") > 0) {// 是微信浏览器
return true;
}else{
return false;
}
}
}
到此,微信支付后端完成。