/**
* Android 微信退款
**/
// 存放微信退款参数参数
Map<String, String> map = new HashMap<String, String>();
params.put("appid", appid); // 公众账号ID
params.put("mch_id", mch_id); // 商户号
params.put("nonce_str", nonce_str); // 随机字符串
params.put("sign_type", "MD5"); // 签名类型
params.put("out_trade_no", out_trade_no); // 商户退款原订单号
params.put("out_refund_no", out_refund_no); // 商户退款新单号
params.put("total_fee", "100"))); // 订单金额
params.put("refund_fee", "100"))); // 退款金额
if (!"".equals(sub_mch_id())) { // 子商户号
params.put("sub_mch_id", sub_mch_id()); // 子商户id
}
// 签名 按微信要求
String sign = sign;
String cert_text = cert_text; // 微信证书后台证书转成的base64编码的字符串
/**
* 根据需求 把微信退款证书转成 InputStream
**/
InputStream inStream = new ByteArrayInputStream(Base64.decode(cert_text));
/**
** 证书在android上的使用
**/
KeyStore keyStore = null;
try {
keyStore = KeyStore.getInstance("PKCS12");
try {
keyStore.load(inStream, mch_id().toCharArray()); // inStream :证书流,mch_id :密码,注意当证书和密码不对应的时候会出现异常
} finally {
inStream.close();
}
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(keyStore, payRefund.getWxMch_id().toCharArray());
KeyManager[] keyManagers = kmf.getKeyManagers();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, null, null);
String wx_xml = " "; // 参数生成xml
String urladdress = "https://api.mch.weixin.qq.com/secapi/pay/refund";
// 发送https请求
byte[] xml = content.getBytes();
URL url = new URL(urladdress);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (conn instanceof HttpURLConnection) {
((HttpsURLConnection) conn).setSSLSocketFactory(sslContext.getSocketFactory());
}
((HttpsURLConnection) conn).setSSLSocketFactory(sslContext.getSocketFactory());
}conn.setConnectTimeout(10000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
// 设置HTTP请求的头字段
conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8"); // 内容类型
conn.setRequestProperty("Content-Length", String.valueOf(xml.length)); // 实体内容的长度
conn.getOutputStream().write(xml);
conn.getOutputStream().flush();
conn.getOutputStream().close();
if (conn.getResponseCode() != 200)
throw new RuntimeException("请求url失败");
InputStream is = conn.getInputStream(); // 获取返回的数据
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
}
String string = out.toString("UTF-8");
result = string;
out.close();
// 解析文本 查看退款结果