您的位置:首页 > 移动开发 > 微信开发

微信支付工具类

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: