java對微信支付HTTPS伺服器證書更新進行後當前伺服器是否可用驗證
阿新 • • 發佈:2019-02-16
收到了這樣的一個通知:微信支付HTTPS伺服器證書的根證書將於2018-08-23日到期,微信支付計劃於2018-05-29日更換伺服器證書。請通知貴司技術開發人員儘快完成相關驗證,確保安裝新的根證書,以免影響正常交易。詳細驗證流程可參考指引(http://url.cn/52EYiAE)
連結中給了兩種方式去判斷當前機器是否支援新證書,我這裡用到的是第一種——呼叫微信支付沙箱環境的API介面驗證
//商戶id
String mchID = Constant.MCHID;
//32位隨機字串
String nonceStr = RandomStringGenerator.getRandomStringByLength (32);
//傳入驗籤引數
Map<String, Object> map = new HashMap<String, Object>();
map.put("mch_id", mchID);
map.put("nonce_str", nonceStr);
//生成sign
ArrayList<String> list = new ArrayList<String>();
for(Map.Entry<String,Object> entry:map.entrySet ()){
if(entry.getValue()!=""){
list.add(entry.getKey() + "=" + entry.getValue() + "&");
}
}
int size = list.size();
String [] arrayToSort = list.toArray(new String[size]);
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size; i ++) {
sb.append(arrayToSort[i]);
}
String result = sb.toString();
result += "key=" + Constant.MCHID_KEY; //商戶金鑰
Util.log("Sign Before MD5:" + result);
System.out.println("----------------------------------------------Sign Before MD5:" + result);
result = MD5.MD5Encode(result).toUpperCase();//生成的sign
Util.log("Sign Result:" + result);
System.out.println("-----------------------------------------Sign Result:" + result);
map.put("sign", result);
Map<String, String> map2 = new HashMap<>();
map2.put("mch_id", mchID);
map2.put("nonce_str", nonceStr);
map2.put("sign", result);
//將驗簽結果變成一個無頭的xml字串
String xml = AppTool.createXML(map2);
System.out.println("xml=" + xml);
result = AppTool.sendPostData("https://apitest.mch.weixin.qq.com/sandboxnew/pay/getsignkey", xml);
System.out.println("result="+result);
如果最後輸出的內容是下圖
說明當前伺服器是支援微信新證書的,附上兩個要用到的方法
/**
* 建立一個無頭的xml
*/
public static String createXML(Map<String, String> map) {
Document document = DocumentHelper.createDocument();
Element element = document.addElement("xml");
for(String key : map.keySet()) {
Element appid = element.addElement(key);
appid.setText(map.get(key));
}
String result = document.asXML();
return result.substring(39, result.length());
}
/**
* @param POST_URL url地址
* @param content key=value形式
* @return 返回結果
* @throws Exception
*/
public static String sendPostData(String POST_URL, String content)
throws Exception {
HttpURLConnection connection=null;
DataOutputStream out=null;
BufferedReader reader=null;
String line = "";
String result="";
try {
URL postUrl = new URL(POST_URL);
connection= (HttpURLConnection) postUrl.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
// Post 請求不能使用快取
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
connection.connect();
out = new DataOutputStream(connection.getOutputStream());
//content = URLEncoder.encode(content, "utf-8");
// DataOutputStream.writeBytes將字串中的16位的unicode字元�?8位的字元形式寫道流裡�?
out.writeBytes(content);
out.flush();
out.close();
//獲取結果
reader = new BufferedReader(new InputStreamReader(
connection.getInputStream(), "utf-8"));// 設定編碼
while ((line = reader.readLine()) != null) {
result=result+line;
}
return result;
} catch (Exception e) {
throw e;
}finally
{
if(out!=null)
{
out.close();
out=null;
}
if(reader!=null)
{
reader.close();
reader=null;
}
connection.disconnect();
}
}