一、接口链接: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;
}

转载于:https://www.cnblogs.com/qqzhulu/p/10311189.html

java 微信申请退款的开发相关推荐

  1. java 微信申请退款,退款回调通知,解密,V2版

    下载微信官方提供的SDK,转 https://blog.csdn.net/qq_40506288/article/details/110918650 博客查看下载流程 微信退款说明,官方提供:http ...

  2. php做一个微信退款,PHP实现微信申请退款流程实例代码

    前面讲了怎么实现微信支付,详见博文:php实现微信支付(jsapi支付)流程  和ThinkPHP中实现微信支付(jsapi支付)流程.由于业务需求,还需要有微信退款,经过研究和摸索,也终于搞定了. ...

  3. php 微信支付退款接口开发,微信支付退款功能开发

    第一次做微信的退款处理,特此标记一下 准备 appId 微信分配的公众账号ID(企业号corpid即为此appId) mch_id 微信支付分配的商户号 pay_secret 商户平台设置的秘钥:微信 ...

  4. java 微信转账 ca_error_java,微信支付退款_微信支付退款接口调用证书出现错误,java,微信支付退款,ssl - phpStudy...

    微信支付退款接口调用证书出现错误 PS:代码是copy腾讯提供的demo,但运行有问题,望大拿能够帮忙解决 加载证书时间出现如下错误: java.io.IOException: DER input, ...

  5. 微信退款php参数格式错误,PHP实现微信申请退款功能

    前期准备: 搞定微信支付,不然怎么退款,官方的demo. 当然网上可能也有很多大神自己重写和封装了demo,或许更加好用简洁,但是我还是不提倡用,安全考虑,涉及到支付涉及到金钱,必须要非常安全.官方S ...

  6. Java微信服务号的开发(简单入门)

    进行微信服务号开发的步骤 一个别人已经搭建好的项目参考地址:下载链接 1.搭建微信服务号的服务器 项目配置maven <dependency><groupId>com.soec ...

  7. java微信公众号支付开发平台_Java微信公众平台开发之公众号支付(微信内H5调起支付)...

    官方文档 准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败) 借鉴了很多大神的文章,在此先谢过了 整个支付流程,看懂就很好写了 一.设置支付目录 在微信公众平台设置您的公众号 ...

  8. JAVA微信公众号后台开发 接口接入

    前期准备 注册一个公众号,完成认证,阅读开发手册,选取开发工具,配置环境等等. 微信公众号开发标准 通过阅读文档我们了解到微信服务器向开发者提供接口,具体的流程如下 由上图可以看出,开发者需要做的:接 ...

  9. java微信公众号支付开发平台_微信公众号支付demo,微信公众号支付Java DEMO

    1.5.4微信验证的控制方法: /** * 微信验证 * 请填写接口配置信息,此信息需要你有自己的服务器资源,填写的URL需要正确响应微信发送的Token验证 * 验证服务器地址的有效性 * 开发者提 ...

最新文章

  1. 使用List中的remove方法遇到的坑,不信你没有踩过!
  2. Oracle Gateway使用分享
  3. sharepoint 不同路径下 COOKIE找不到
  4. Android开发中的控件--ProgressBar和ListView
  5. keras终止训练后显存不释放_Keras实现Large-scale Bisample Learning on ID vs. Spot Face Recognition...
  6. 深层神经网络中的前向传播
  7. 常微分方程I ODE的例子1 弹簧的振动、RLC电路与单摆
  8. 项目实战-linux下安装activeMQ
  9. 27.CSS3文本效果
  10. 剑指offer之二叉搜索树的第K个节点
  11. OnKeyPress事件和Javascript检测键盘输入
  12. 三层交换及DHCP中继配置
  13. Java 8 Stream
  14. Cortex-M3 (NXP LPC1788)之UART用法
  15. 智渔课堂官方免费教程二十六:Java基础教程之数组
  16. linpack性能测试记录
  17. mongoose 入门(四)使用aggregate 聚合管道、使用 populate 实现关联查询
  18. 设置typora标题、目录、大纲自动编号
  19. 2022年终总结与展望
  20. 如何解决Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]

热门文章

  1. Postman的一个使用技巧----设置环境变量
  2. mySQL 数据库工具问题总结
  3. iphone openssh
  4. 苏州为什么只能做二线中游?
  5. 祝贺Terrylee博客园Post达到100篇
  6. 贪心算法|Greedy Algorithms(背包问题)
  7. tf.graph函数
  8. VMware虚拟机上配置nginx后,本机无法访问问题(转载)
  9. Centos系统使用代理上网时 yum的代理设置
  10. spark视频-Spark on Yarn