版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/java_zhulinghai/article/details/89478581
package com.yxb.makerhomeapi.common.util;
import com.yxb.base.util.MD5Util;
import com.yxb.common.base.constant.WechartConstant;
import com.yxb.common.base.entity.wx.AccessToken;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class WxUtil {
public static String map2XmlString(Map<String, String> map) {
String xmlResult = "";
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
for (String key : map.keySet()) {
String value = map.get(key);
if ("attach".equalsIgnoreCase(key) || "body".equalsIgnoreCase(key)){
value = "<![CDATA[" + map.get(key) + "]]>";
}
sb.append("<" + key + ">" + value + "</" + key + ">");
}
sb.append("</xml>");
xmlResult = sb.toString();
return xmlResult;
}
/**
* @description 将xml字符串转换成map
* @param xml
* @return Map
*/
public static Map<String, String> readStringXmlOut(String xml) {
Map<String, String> map = new HashMap<String, String>();
Document doc = null;
try {
doc = DocumentHelper.parseText(xml); // 将字符串转为XML
Element rootElt = doc.getRootElement(); // 获取根节点
@SuppressWarnings("unchecked")
List<Element> list = rootElt.elements();// 获取根节点下所有节点
for (Element element : list) { // 遍历节点
map.put(element.getName(), element.getText()); // 节点的name为map的key,text为map的value
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* 新版微信创建创建sign签名 需要使用的方法
*
* @param paraMap
* @param paykey
* @return
*/
public static String createSign(Map<String, String> paraMap, String paykey) {
StringBuffer sb = new StringBuffer();
Set<String> keySet = paraMap.keySet();
String[] str = new String[paraMap.size()];
// 进行字典排序
str = keySet.toArray(str);
Arrays.sort(str);
for (int i = 0; i < str.length; i++) {
if(StringUtils.isBlank(paraMap.get(str[i]))){
continue;
}
if("sign".equals(str[i])){
continue;
}
sb.append(str[i]).append("=").append(paraMap.get(str[i])).append("&");
}
if (null != paykey) {
sb.append("key=" + paykey);
}
return MD5Util.EncoderByMd5(sb.toString()).toUpperCase();
}
public static String getTimeStamp() {
return String.valueOf(System.currentTimeMillis() / 1000);
}
public static String reciverWx(HttpServletRequest request) throws IOException
{
InputStream inputStream;
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
String s;
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
while ((s = in.readLine()) != null)
{
sb.append(s);
}
in.close();
inputStream.close();
return sb.toString();
}
/**
* 编写Get请求的方法。但没有参数传递的时候,可以使用Get请求
*
* @param url 需要请求的URL
* @return 将请求URL后返回的数据,转为JSON格式,并return
*/
public static JSONObject doGetStr(String url) throws ClientProtocolException, IOException {
DefaultHttpClient client = new DefaultHttpClient();//获取DefaultHttpClient请求
HttpGet httpGet = new HttpGet(url);//HttpGet将使用Get方式发送请求URL
JSONObject jsonObject = null;
HttpResponse response = client.execute(httpGet);//使用HttpResponse接收client执行httpGet的结果
HttpEntity entity = response.getEntity();//从response中获取结果,类型为HttpEntity
if(entity != null){
String result = EntityUtils.toString(entity,"UTF-8");//HttpEntity转为字符串类型
jsonObject = JSONObject.fromObject(result);//字符串类型转为JSON类型
}
return jsonObject;
}
/**
* 编写Post请求的方法。当我们需要参数传递的时候,可以使用Post请求
*
* @param url 需要请求的URL
* @param outStr 需要传递的参数
* @return 将请求URL后返回的数据,转为JSON格式,并return
*/
public static JSONObject doPostStr(String url,String outStr) throws ClientProtocolException, IOException {
DefaultHttpClient client = new DefaultHttpClient();//获取DefaultHttpClient请求
HttpPost httpost = new HttpPost(url);//HttpPost将使用Get方式发送请求URL
JSONObject jsonObject = null;
httpost.setEntity(new StringEntity(outStr,"UTF-8"));//使用setEntity方法,将我们传进来的参数放入请求中
HttpResponse response = client.execute(httpost);//使用HttpResponse接收client执行httpost的结果
String result = EntityUtils.toString(response.getEntity(),"UTF-8");//HttpEntity转为字符串类型
jsonObject = JSONObject.fromObject(result);//字符串类型转为JSON类型
return jsonObject;
}
/**
* 获取AccessToken
* @return 返回拿到的access_token及有效期
*/
public static AccessToken getAccessToken() throws IOException{
AccessToken token = new AccessToken();
String url = WechartConstant.ACCESS_TOKEN_URL.replace("APPID", WechartConstant.appId).replace("APPSECRET", WechartConstant.secret);
JSONObject jsonObject = doGetStr(url);
if(jsonObject != null){
token.setToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInt("expires_in"));
}
return token;
}
/**
* 根据accessToken 获取jsapi_ticket
* @param accessToken
* {
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
* @return
*/
public static String getJSTicket(String accessToken) throws Exception{
String url = WechartConstant.JSAPI_TICKET_URL.replace("ACCESS_TOKEN",accessToken);
JSONObject jsonObject = doGetStr(url);
if(jsonObject != null && 0 == jsonObject.getInt("errcode")){ //如果返回不为空,将返回结果封装进AccessToken实体类
return jsonObject.getString("ticket");
}
return null;
}
/**
* SHA1 安全加密算法
* @param para 需要加密的para参数
* @return
* @throws Exception
*/
public static String SHA1(String para) {
//指定sha1算法
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
digest.update(para.getBytes());
//获取字节数组
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString().toUpperCase();
}
}