上班一直用到微信 银联调用支付接口的问题 写了一个方法 在此做下记录
package com.zte.xh.micromall.core.utils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import net.sf.json.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
public class MicroWeichatUtils {
/**
*
* @param url
* 地址
* @param params
* 返回的结果中需要哪些返回值,不加密的https调用
* @param resultType
* response响应的结果是什么类型的,一般是json或者xml
* @return 其实这里还需要加一个http请求类型的参数,来判断是http请求还是https的请求,目前微信都是https的 所以没添加
*/
public static Map<String, String> getParam(String url, String resultType,
String... params) {
try {
URL console = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) console
.openConnection();
conn.setRequestMethod("GET");// get方式提交
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setInstanceFollowRedirects(true);
conn.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream(), "UTF-8"));
String line;
StringBuffer responseText = new StringBuffer();
while ((line = reader.readLine()) != null) {
responseText.append(line).append("\r\n");
}
reader.close();
conn.disconnect();
// System.out.println("响应结果responseText--------------"
// + responseText.toString());
String result = responseText.toString();
Map<String, String> resultM = new HashMap<String, String>();
if (StringUtils.isNotEmpty(result)) {
// 解析获取到的json
JSONObject jsonObject = JSONObject.fromObject(result);
for (String param : params) {
resultM.put(param, jsonObject.getString(param));
// System.out.println(param + "--------"
// + jsonObject.getString(param));
}
}
return resultM;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 字典排序
*
* @param hm
* @param kl
* @param key
* @return
*/
public static String getSign(Map<String, String> hm, List<String> kl) {
// 排序
String[] kls = kl.toArray(new String[] {});
Arrays.sort(kls);
// 拼接处待加密的String
StringBuffer sb = new StringBuffer();
for (String k : kls) {
sb.append(k);
sb.append("=");
sb.append(hm.get(k));
sb.append("&");
}
String stringSignTemp = sb.toString();
// 去掉最后的一个&
stringSignTemp = stringSignTemp.substring(0,
stringSignTemp.length() - 1);
// System.out.println("字典排序后-------" + stringSignTemp);
// 进行sha1加密
String asignature = DigestUtils.shaHex(stringSignTemp);
// System.out.println("加密后的signature---" + asignature);
return asignature;
}
// 这是需要加密文件的方法,XML表示传递的参数为xml类型的字符串,通过httpclient来实现的
private String addMenu(String URL, String XML, String mch_id)
throws Exception {
//有的需要的代理
//System.setProperty("proxyHost", "");
//System.setProperty("proxyPort", "80");
//System.setProperty("proxyUser", "");
//System.setProperty("proxyPassword", "!");
String result = null;
KeyStore keyStore = KeyStore.getInstance("PKCS12");
// 读取配置文件的路劲
Map params = this.paymentManager.getConfigParams(this.getId());
String merPath = (String) params.get("merPath");
FileInputStream instream = new FileInputStream(new File(merPath));
try {
keyStore.load(instream, mch_id.toCharArray());
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, mch_id.toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext, new String[] { "TLSv1" }, null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf).build();
try {
HttpPost httppost = new HttpPost(URL);
StringEntity entity = new StringEntity(XML.toString(), "utf-8");
httppost.setEntity(entity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
result = EntityUtils.toString(resEntity);
}
} finally {
httpclient.close();
}
return result;
}
public static void main(String[] args) {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+ appid + "&secret=" + secret;
Map<String, String> tokenMap = MicroWeichatUtils.getParam(url,
"json", "access_token");
if (tokenMap != null
&& StringUtils.isNotEmpty(tokenMap.get("access_token"))) {
String accessToken = tokenMap.get("access_token");
// 获取ticket
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="
+ accessToken + "&type=jsapi";
// 自定义调用微信接口方法
Map<String, String> ticketMap = MicroWeichatUtils.getParam(
url, "json", "ticket");
String ticket = ticketMap.get("ticket");
WxConstant.setWxAccessToken(accessToken);
WxConstant.setWxTicket(ticket);
}
}
}