java 微信退款 怎么获取out

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 微信退款 怎么获取out相关的知识,希望对你有一定的参考价值。

参考技术A 一、下载证书并导入到系统
微信支付接口中,涉及资金回滚的接口会使用到商户证书,包括退款、撤销接口。商家在申请微信支付成功后,可以按照以下路径下载:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->证书下载 。
\
\
下载的时候需要手机验证及登录密码。下载后找到apiclient_cert.p12这个证书,双击导入,导入的时候提示输入密码,这个密码就是商户ID,且必须是在自己的商户平台下载的证书。否则会出现密码错误的提示:
\
导入正确的提示:
\
二、编写代码
首先初始化退款接口中的请求参数,如微信订单号transaction_id(和商户订单号只需要知道一个)、订单金额total_fee等;其次调用MobiMessage中的RefundResData2xml方法解析成需要的类型;最后调用RefundRequest类的httpsRequest方法触发请求。

java 微信申请退款的开发

一、接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund

二、请求字段

技术分享图片

三、注意事项

(1)需要证书:

技术分享图片

(2)证书来源:

技术分享图片

(3)证书获取

技术分享图片

四、代码开发

/**
* 微信退款
* @throws Exception
*/
public static String refundFunction(Map<String, Object> map) throws Exception {
//这里的map主要有两个参数(商户号mchId和订单金额totalFee)
String result = "";//这里用于返回处理返回结果
//xml转换为map,这里用于方便自己后面取出打印结果
XmlToMap xmlToMap = new XmlToMap();
  //这里是自己封装的一些配置文件,大家可以跳过这一步,下面用到这里会和大家说明
MyConfig config = null;
try {
//加载配置
config = new MyConfig();
} catch (Exception e) {
e.printStackTrace();
}

//获取商户订单号和订单金额
String mchId = map.get("mchId").toString();
//获取订单金额(退款金额默认全部)
  //这里是自己做的一些格式的转换,有点笨拙,希望不影响大家的思路
String a = map.get("totalFee")+"";
String b = Double.valueOf(a) + "";
int lastindex = b.indexOf(".");
b = b.substring(0 , lastindex);
int c = Integer.parseInt(b);
// String d = c + "";
// System.out.println("refundMoney--------->"+refundMoney);
String totalFee = c + "";
//获取微信订单号
// String transactionId = map.get("transactionId").toString();

SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
parameters.put("appid", config.getAppID());//appid
parameters.put("mch_id", config.getMchID());//商户号
parameters.put("nonce_str", CreateNoncestr());//随机数
// parameters.put("transaction_id", transactionId);//微信支付单号
parameters.put("out_trade_no", mchId);//商户订单号
parameters.put("out_refund_no", CreateNoncestr());//我们自己设定的退款申请号,约束为UK
parameters.put("total_fee", totalFee) ;//订单金额 单位为分!!!这里稍微注意一下
parameters.put("refund_fee", totalFee);//退款金额 单位为分!!!
parameters.put("op_user_id", config.getMchID());//操作人员,默认为商户账号
String sign = createSign("utf-8", parameters);
System.out.println("sign---->"+sign);//签名
parameters.put("sign", sign);

 //xml和map之间的转换
String reuqestXml = getRequestXml(parameters);
Map<String, Object> xmlMap = XmlToMap.xmlStr2Map(reuqestXml);

KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream instream = new FileInputStream(new File(config.certPath));//放商户证书的路径
try {
keyStore.load(instream, config.getMchID().toCharArray());//商户号
} finally {
instream.close();
}

 //这里导包注意一下,可能会冲突
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, config.getMchID().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(config.refund_url);//退款接口

System.out.println("executing request" + httpPost.getRequestLine());
StringEntity reqEntity = new StringEntity(reuqestXml);
// 设置类型
reqEntity.setContentType("application/x-www-form-urlencoded");
httpPost.setEntity(reqEntity);
CloseableHttpResponse response = httpclient.execute(httpPost);
try {
HttpEntity entity = response.getEntity();

System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
System.out.println("bufferedReader.readLine()--->"+bufferedReader.readLine());
String text;
//这里是自己做的输出结果,方便查看错误原因
while ((text = bufferedReader.readLine()) != null) {
System.out.println(text);
if(!text.startsWith("</xml>")) {
text = "<xml>"+text+"</xml>";
Map<String, Object> xmlResultMap = XmlToMap.xmlStr2Map(text);
if(xmlResultMap.get("result_code") != null) {
result = xmlResultMap.get("result_code")+"";
}
}
}
}
EntityUtils.consume(entity);
} finally {
response.close();
}
} finally {
httpclient.close();
}
return result;
}

 











































































































以上是关于java 微信退款 怎么获取out的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序付款后怎么退款

微信小程序订单完成怎么申请退款流程?

java 微信申请退款的开发

微信支付酒店怎么退款

微信小程序订单如何退款

微信支付——微信退款实战教程(Java版)