微信支付工具类
2016-08-17 12:13
267 查看
package com.shop.util; import java.io.IOException; import java.io.StringReader; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import com.alibaba.fastjson.JSONObject; public class CommonPayment { /** * 将map转换为xml * * @return */ public static String conventTreeMapToXml(SortedMap<String, String> treeMap) { StringBuilder xml = new StringBuilder(); xml.append("<xml>\n"); for (Map.Entry<String, String> entry : treeMap.entrySet()) { if ("attach".equalsIgnoreCase(entry.getKey()) || "body".equalsIgnoreCase(entry.getKey()) || "sign".equalsIgnoreCase(entry.getKey())) { xml.append("<" + entry.getKey() + "><![CDATA[").append(entry.getValue()) .append("]]></" + entry.getKey() + ">\n"); } else { xml.append("<" + entry.getKey() + ">").append(entry.getValue()).append("</" + entry.getKey() + ">\n"); } } xml.append("</xml>"); return xml.toString(); } public static String getPrepayIdParam(HttpServletRequest request, Map<String, String> paramMap) { SortedMap<String, String> treeMap = new TreeMap<String, String>(); treeMap.put("appid", CommonWeChat.APPID.trim()); treeMap.put("mch_id", CommonWeChat.MCH_ID.trim()); treeMap.put("device_info", CommonWeChat.DEVICE_INFO.trim()); treeMap.put("nonce_str", RandomUtil.randomStringCode(32).trim()); treeMap.put("body", CommonWeChat.BODY.trim()); treeMap.put("out_trade_no", paramMap.get("out_trade_no").toString().trim()); treeMap.put("total_fee", paramMap.get("total_fee").toString().trim()); treeMap.put("spbill_create_ip", request.getRemoteAddr().trim()); treeMap.put("trade_type", CommonWeChat.TRADE_TYPE.trim()); treeMap.put("notify_url", CommonWeChat.PAYMENT_REDIRECT_URL.trim()); treeMap.put("openid", paramMap.get("openid").toString().trim()); StringBuilder sb = new StringBuilder(); for (String key : treeMap.keySet()) { sb.append(key).append("=").append(treeMap.get(key)).append("&"); } sb.append("key=" + CommonWeChat.MCH_KEY.trim()); String sign = PayMD5.MD5Encode(sb.toString(), "utf-8").toUpperCase(); treeMap.put("sign", sign); return conventTreeMapToXml(treeMap); } /** * 功能描述:支付成功后签名 */ public static String SuccessSign(Map<String, String> map,String key){ StringBuffer buff = new StringBuffer(); buff.append("appid=").append(map.get("appid")); buff.append("&attach=").append(map.get("attach")); buff.append("&bank_type=").append(map.get("bank_type")); buff.append("&cash_fee=").append(map.get("cash_fee")); buff.append("&fee_type=").append(map.get("fee_type")); buff.append("&is_subscribe=").append(map.get("is_subscribe")); buff.append("&mch_id=").append(map.get("mch_id")); buff.append("&nonce_str=").append(map.get("nonce_str")); buff.append("&openid=").append(map.get("openid")); buff.append("&out_trade_no=").append(map.get("out_trade_no")); buff.append("&result_code=").append(map.get("result_code")); buff.append("&return_code=").append(map.get("return_code")); buff.append("&time_end=").append(map.get("time_end")); buff.append("&total_fee=").append(map.get("total_fee")); buff.append("&trade_type=").append(map.get("trade_type")); buff.append("&transaction_id=").append(map.get("transaction_id")); buff.append("&key=").append(key); String signature = PayMD5.MD5Encode(buff.toString(), "UTF-8"); return signature.toUpperCase(); } public static String getMD5Sign(SortedMap<String, String> resultMap) { StringBuilder sb = new StringBuilder(); for (String key : resultMap.keySet()) { sb.append(key).append("=").append(resultMap.get(key)).append("&"); } sb.append("key=" + CommonWeChat.MCH_KEY); String sign = PayMD5.MD5Encode(sb.toString(), "utf-8").toUpperCase(); return sign; } /** * 把xml文件转换为map形式,其中key为有值的节点名称,并以其所有的祖先节点为前缀,用 * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType * * @param xmlStr * xml内容 * @return Map 转换为map返回 */ public static TreeMap<String, String> xmlToMap(String xmlStr) throws JDOMException, IOException { TreeMap<String, String> rtnMap = new TreeMap<String, String>(); SAXBuilder builder = new SAXBuilder(); Document doc = (Document) builder.build(new StringReader(xmlStr)); // 得到根节点 Element root = doc.getRootElement(); String rootName = root.getName(); // rtnMap.put("root.name", rootName); // 调用递归函数,得到所有最底层元素的名称和值,加入map中 convert(root, rtnMap, rootName); return rtnMap; } /** * 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。 * * @param e * xml节点,包括根节点 * @param map * 目标map * @param lastname * 从根节点到上一级节点名称连接的字串 */ @SuppressWarnings("rawtypes") public static void convert(Element e, Map<String, String> map, String lastname) { if (e.getAttributes().size() > 0) { Iterator it_attr = e.getAttributes().iterator(); while (it_attr.hasNext()) { Attribute attribute = (Attribute) it_attr.next(); String attrname = attribute.getName(); String attrvalue = e.getAttributeValue(attrname); map.put(lastname + "." + attrname, attrvalue); // key 根据根节点 进行生成 } } List children = e.getChildren(); Iterator it = children.iterator(); while (it.hasNext()) { Element child = (Element) it.next(); String name = child.getName(); // 如果有子节点,则递归调用 if (child.getChildren().size() > 0) { convert(child, map, lastname + "." + child.getName()); } else { // 如果没有子节点,则把值加入map map.put(name, child.getText()); // 如果该节点有属性,则把所有的属性值也加入map if (child.getAttributes().size() > 0) { Iterator attr = child.getAttributes().iterator(); while (attr.hasNext()) { Attribute attribute = (Attribute) attr.next(); String attrname = attribute.getName(); String attrvalue = child.getAttributeValue(attrname); map.put(lastname + "." + child.getName() + "." + attrname, attrvalue); } } } } } /** * 将json转为Map * * @param jsonStr * @return * @throws Exception */ public static TreeMap<String, String> jsonToObject(String jsonStr) throws Exception { JSONObject jsonObj = JSONObject.parseObject(jsonStr); TreeMap<String, String> outMap = new TreeMap<String, String>(); for (String key : jsonObj.keySet()) { outMap.put(key, jsonObj.getString(key)); } return outMap; } /** * 获取access_token jsapi_ticket * * @return */ public static TreeMap<String, String> getTockenAndTicket() { String token = ReadFile.readFile("d:/hourm", "WeChat.txt"); JSONObject jsonObj = JSONObject.parseObject(token); TreeMap<String, String> outMap = new TreeMap<String, String>(); for (String key : jsonObj.keySet()) { outMap.put(key, jsonObj.getString(key)); } return outMap; } 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>"; } public static void main(String args[]) throws Exception { System.out.println(Sha1Util.getSignature(Sha1Util.getTimeStamp(), Sha1Util.getNonceStr(), "adfsf")); String str = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; String aaa = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; // str = str.replaceAll("<![CDATA[|]]>", ""); System.out.println(xmlToMap(aaa)); } }
/** * * @author Administrator *微信接口连接 */ public class CommonWeChat { //微信appID public static String APPID="11111111111"; //微信appsecret public static String APPSECRET="1111111111111111111111"; //微信获取用户信息url public static String WCUSERINFO="https://open.weixin.qq.com/connect/oauth2/authorize"; // 通过code换取网页授权access_token public static String WCUSERINFO_ACCESS_TOKEN="https://api.weixin.qq.com/sns/oauth2/access_token"; // 刷新access_token(如果需要) public static String WCUSERINFO_REFRESH_TOKEN="https://api.weixin.qq.com/sns/oauth2/refresh_token"; public static String WCUSERINFO_USERINFO_TOKEN="https://api.weixin.qq.com/sns/userinfo"; // 检验授权凭证(access_token)是否有效 public static String WCUSERINFO_AUTH_TOKEN="https://api.weixin.qq.com/sns/auth"; // 授权后重定向的回调链接地址,请使用urlencode对链接进行处理 public static String REDIRECT_URI="http%3a%2f%2f<span style="font-family: Arial, Helvetica, sans-serif;">xx.xxx.com</span><span style="font-family: Arial, Helvetica, sans-serif;">%2fmobile%2flogin%2fwclogin.jhtml";</span> public static String REDIRECT_CAET_URI="http%3a%2f%2fxx.xxx.com%2fmobile%2flogin%2fwclogincart.jhtml"; //支付需要用到参数 //商户号 public final static String MCH_ID="11111111111"; //设备号 public final static String DEVICE_INFO="WEB"; //货币类型 public final static String FEE_TYPE="CNY"; //交易类型 public final static String TRADE_TYPE="JSAPI"; //商品描述 public final static String BODY="XXXX-XXXX"; //签名方式 public final static String SIGNTYPE="MD5"; //商户秘钥 public final static String MCH_KEY="1111111111111111111111111111111"; //获取perpayId public final static String PAYMENT_GET_PREPAYID_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //支付结果查询 public final static String PAYMENT_RESULT = "https://api.mch.weixin.qq.com/pay/orderquery"; //支付回调页面 public final static String PAYMENT_REDIRECT_URL="http://xx.xxx.com/payment/paySuccess.jhtml"; }
package com.http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.List; import java.util.Map; public class HttpRequest { /** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param param * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return URL 所代表远程资源的响应结果 */ public static String sendGet(String url, String param) { String result = ""; BufferedReader in = null; try { String urlNameString = url + "?" + param; URL realUrl = new URL(urlNameString); // 打开和URL之间的连接 URLConnection connection = realUrl.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 建立实际的连接 connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { System.out.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } /** * 向指定 URL 发送POST方法的请求 * * @param url * 发送请求的 URL * @param param * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ public static String sendPost(String url, String param) { //PrintWriter out = null; OutputStreamWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 //out = new PrintWriter(conn.getOutputStream()); out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); // 发送请求参数 // out.print(param); out.write(param); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader( new InputStreamReader(conn.getInputStream(),"UTF-8")); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送 POST 请求出现异常!"+e); e.printStackTrace(); } //使用finally块来关闭输出流、输入流 finally{ try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } return result; } }
相关文章推荐
- 微信支付--工具类--处理二维码
- 微信支付--工具类--组包
- 微信支付--工具类--产生二维码验证签名
- 微信支付--工具类--MD5
- 微信支付--工具类--随机字符串
- 微信支付--工具类--创建签名
- 微信支付--工具类--处理XML数据
- 微信支付--工具类--通过Https往API post xml数据
- 微信支付--工具类--通过Https往API post xml数据
- 微信支付订单工具类
- 微信支付--工具类--处理二维码
- 微信支付--工具类--组包
- 微信支付--工具类--产生二维码验证签名
- 微信支付--工具类--MD5
- 微信支付--工具类--随机字符串
- 微信支付--工具类--创建签名
- 微信支付--工具类--处理XML数据
- 微信支付--工具类--通过Https往API post xml数据
- 微信支付--工具类--通过Https往API post xml数据
- 微信支付--工具类--处理二维码