JAVA微信退款(JSAPI支付)

上一章咱们介绍了微信支付整个流程,这章就趁热打铁地整理下微信退款(JSAPI支付)相关的知识,为这几章的微信支付画上一个句号把。

前提:从微信公众号那边获取appid,mchid,paternerKey三个参数备用。

1、微信申请退款的实现

应用场景

当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。

注意:

1、交易时间超过一年的订单无法提交退款

2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号

3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次

错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次

4、每个支付订单的部分退款次数不能超过50次

5、如果同一个用户有多笔退款,建议分不同批次进行退款,避免并发退款导致退款失败

是否需要证书:

java开发申请退款需要要用到双向证书(apiclient_cert.p12证书)。登录微信商户平台(https://pay.weixin.qq.com/)如下图所示操作


申请退款接口调用:

@GET
@Path(value = "refundOrder")
@Produces(MediaType.APPLICATION_JSON)
public Response refundOrder(@QueryParam("outTradeNo") String outTradeNo){Map<String, Object> result = new HashMap<String, Object>();try{// 1、获取参数,再进行申请退款Map<String, String> paramMap = new HashMap<String, String>(); paramMap.put("appid", appid); //公众账号IDparamMap.put("mch_id", mchid); //商户号paramMap.put("nonce_str",  WXPayUtil.generateNonceStr());//随机字符串  paramMap.put("out_refund_no", WXPayUtil.generateNonceStr());//商户退款单号paramMap.put("out_trade_no", outTradeNo);//商户订单号paramMap.put("total_fee", price+"");  //订单金额paramMap.put("refund_fee", price+"");  //退款金额 String sign = WXPayUtil.generateSignature(paramMap, paternerKey);paramMap.put("sign", sign); //签名String requestXmlString = WXPayUtil.mapToXml(paramMap);//转为xml字符串String refundUrl = "https://api.mch.weixin.qq.com/secapi/pay/refund";//微信申请退款接口// 2、判断微信是否退款成功HttpResponse resp = WeChatUtil.httpPost(refundUrl, requestXmlString);WeChatOrderResponse response = null;if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String entityStr = EntityUtils.toString(resp.getEntity(), "UTF-8");response = (WeChatOrderResponse) WeChatUtil.xmlToPojo(entityStr,WeChatOrderResponse.class);}if("FAIL".equals(response.getReturn_code())){throw new RuntimeException("return_code为fail, " + response.getReturn_msg());}if("FAIL".equals(response.getResult_code())){throw new RuntimeException("result_code为fail, " +response.getErr_code_des());}//3、微信退款成功后的操作流程......result.put("code", SUCCESS);}catch(Exception e){result.put("code", ERROR);result.put("msg", e.getMessage());}return Response.ok(result).build();
}

WeChatOrderResponse类的参数与微信的申请退款接口的返回结果一致,下面是该类的具体实现:

@XmlRootElement(name = "xml")
public class WeChatOrderResponse {private String return_code;private String return_msg;// 以下字段在return_code为SUCCESS的时候有返回private String result_code;private String err_code;private String err_code_des;private String appid;private String mch_id;private String nonce_str;private String sign;private String transaction_id;private String out_trade_no;private String out_refund_no;private String refund_id;private String refund_fee;private String settlement_refund_fee;private String total_fee;private String settlement_total_fee;private String fee_type;private String cash_fee;private String cash_fee_type;private String cash_refund_fee;private String coupon_type_$n;private String coupon_refund_fee;private String coupon_refund_fee_$n;private String coupon_refund_count;private String coupon_refund_id_$n;// 以下字段在return_code 和result_code都为SUCCESS的时候有返回private String trade_type;private String prepay_id;private String code_url;private String openid;//参数的get/set方法......
}

WeChatUtil工具类(亲测有效)的具体结构如下:

public class WeChatUtil {/*** Post请求+证书* @param url  微信申请退款接口链接* @param entity  微信申请退款接口的参数*/public static HttpResponse httpPost(String url, String entity) {//注意PKCS12证书 是从微信商户平台->账号设置->API安全 中下载的KeyStore keyStore = KeyStore.getInstance("PKCS12");//加载本地的证书进行https加密传输,keystorePath是证书的绝对路径FileInputStream instream = new FileInputStream(new File(keystorePath)); try{//设置证书密码,keystorePassword:下载证书时的密码,默认密码是你的mchidkeyStore.load(instream, keystorePassword.toCharArray()); } finally { instream.close();}//java 主动信任证书//keystorePassword:下载证书时的密码,默认密码是你的mchidSSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, keystorePassword.toCharArray()).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);//CloseableHttpClient 加载证书来访问https网站CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();try {// 设置响应头信息,发送post请求HttpPost httpPost = new HttpPost(url);  RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).setConnectionRequestTimeout(5000).build();httpPost.setConfig(requestConfig);httpPost.setEntity(new StringEntity(entity, "UTF-8"));httpPost.setHeader("Accept", "*/*");httpPost.setHeader("Content-type", "application/xml");HttpResponse resp = httpClient.execute(httpPost);return resp;} catch (Exception e) {e.printStackTrace();return null;}}/*** 字符串转为对象* @param xml  json字符串* @param clazz*/public static Object xmlToPojo(String xml, Class<?> clazz){try {JAXBContext context = JAXBContext.newInstance(clazz);Unmarshaller umMarshaller = context.createUnmarshaller();Object pojo = umMarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes("utf-8")));           }catch (Exception e ){e.printStackTrace();}}
}

2、查询退款的实现

应用场景:

提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。(退款有延迟,可通过轮询来判断是否成功退款)

注意:如果单个支付订单部分退款次数超过20次请使用退款单号查询

退款状态变化:

 

查询退款接口具体实现:

@GET
@Path(value = "queryRefund")
@Produces(MediaType.APPLICATION_JSON)
public Response queryRefund(@QueryParam("outTradeNo") String outTradeNo){Map<String, Object> result = new HashMap<String, Object>();try{// 1、查询退款Map<String, String> paramMap = new HashMap<>();paramMap.put("appid", appid);// 公众账号IDparamMap.put("mch_id", mchid);// 商户号paramMap.put("nonce_str", WXPayUtil.generateNonceStr());// 随机字符串paramMap.put("out_trade_no", outTradeNo + "");// 商户订单号String sign = WXPayUtil.generateSignature(paramMap, paternerKey);paramMap.put("sign", sign);// 签名WXPay wxpay = new WXPay(MyConfig.getInstance()); Map<String, String> resp = wxpay.refundQuery(paramMap);if("FAIL".equals(resp.get("return_code"))){throw new RuntimeException("return_code为fail, " + resp.get("return_msg"));}if("FAIL".equals(resp.get("result_code")) && !"订单已全额退款".equals(resp.get("err_code_des"))){throw new RuntimeException("result_code为fail, " + resp.get("err_code_des")); }// 2、成功退款后的操作流程......result.put("code", SUCCESS); }catch(Exception e){e.printStackTrace();result.put("code", ERROR);result.put("msg", e.getMessage()); }return Response.ok(result).build();
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1382603.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式

在做线上、线下销售时&#xff0c;可以使用微信便捷支付&#xff0c;通过微信公众号收款有很多种收款方式&#xff0c;如下图&#xff1a; 今天我们来讲一下jsapi支付&#xff0c;场景就是在微信内打开某个页面&#xff0c;完成在线支付&#xff0c;同样一个网页&#xff0c;使…

基于时态差分法的强化学习:Sarsa和Q-learning

时态差分法&#xff08;Temporal Difference, TD&#xff09;是一类在强化学习中广泛应用的算法&#xff0c;用于学习价值函数或策略。Sarsa和Q-learning都是基于时态差分法的重要算法&#xff0c;用于解决马尔可夫决策过程&#xff08;Markov Decision Process, MDP&#xff0…

微信小游戏直播在Android端的跨进程渲染推流实践

本文由微信开发团队工程师“virwu”分享。 1、引言 近期&#xff0c;微信小游戏支持了视频号一键开播&#xff0c;将微信升级到最新版本&#xff0c;打开腾讯系小游戏&#xff08;如跳一跳、欢乐斗地主等&#xff09;&#xff0c;在右上角菜单就可以看到发起直播的按钮一键成…

辞职信微信html,微信退款处理.html

&#xfeff;微信退款处理 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.h…

php微信退款到银行卡,微信支付PHP开发教程七查询退款

重要&#xff1a;本文最后更新于2019-06-07 08:47:57&#xff0c;某些文章具有时效性&#xff0c;若有错误或已失效&#xff0c;请在下方留言或联系代码狗。 上一篇我们已经学会了如何使用微信支付的退款接口发起退款请求&#xff0c;并且能判断退款成功与否&#xff0c;为了安…

题解:ABC276E - Round Trip

题解&#xff1a;ABC276E - Round Trip 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;普及。 思维难度&#xff1a;提高。 调码难度&#xff1a;提高。 综合评价&#xff1a;困难。 算法 bfs。 思路 从起点周围四个点中任选两…

北京冬奥会 向世界展示了什么

01 北京冬奥会让全球的目光&#xff0c;再次聚焦到中国。大家深刻感知到了一个巨大的变化&#xff1a;从过去中国需要融入世界&#xff0c;需要走向全球化&#xff0c;到今天世界需要中国&#xff0c;中国做好了准备。从2008年北京奥运会&#xff0c;到2022年北京冬奥会&#…

我们该不该旗帜鲜明地反对李彦宏当选院士?

这几天&#xff0c; 中国工程院对外公布2019年 院士增选候选人&#xff0c;百度董事长兼 首席执行官 李彦宏位列其中。尽管&#xff0c;最终有望从531名候选人中脱颖而出的&#xff0c;可算凤毛麟角。但是&#xff0c;针对李彦宏的候选&#xff0c;还是有网友喊出了“旗帜鲜明地…

程序员为什么应该旗帜鲜明地反对“最佳实践”?

让第一个版本的系统混乱一点&#xff0c;或许是件好事。 作者 | 黄峰达&#xff0c;CSDN 博客专家 Phodal 责编 | 唐小引 头图 | 作者绘制并授权 CSDN 使用 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 最近&#xff0c;我在设计、开发、维护一个基于『文档代码…

旗帜鲜明地反对“码而优则仕”

点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复“大礼包”有惊喜礼包&#xff01; 每日英文 Real strong men are not those without tears,but those running in tears. 真正的强者&#xff0c;不是没有眼泪的人&#xff0c;而是含着眼泪奔跑的人。 每日…

微软GitHub旗帜鲜明抵制996!

作者 | 伍杏玲 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 自3月27日996.ICU话题诞生以来&#xff0c;已引发国内外持续不断地关注和热议。国内大佬忙着发声&#xff0c;主流浏览器忙着屏蔽项目的GitHub地址。 而马云几天前谈的“996成功论”&#xff0c;被图…

我的世界java什么村民卖地图_教程/村民交易大厅

此条目的(部分)内容需要翻译。 你可以帮助我们来翻译此条目,但请勿使用机器翻译。 这篇教程将教你如何建造一个村民交易大厅。 主条目:交易 村民交易大厅要求最大限度地增加易于达到的村民数量,也要求提供一个快速遗弃并替换不需要的村民的途径。 村民交易大厅中有三个部分:…

旗帜鲜明的反对基因编辑婴儿!

阅读本文大概需要 3.3 分钟。 昨天的新闻&#xff0c;相信大家都知道了&#xff0c;媒体报道称世界首例免疫艾滋病的基因编辑婴儿在中国诞生&#xff0c;这事引起大家激烈的讨论&#xff0c;后台很多人问我对这件事是什么看法&#xff0c;我不是生物医学领域内的科学家&#xf…

攻防世界web刷题

web新手区 view_sourcerobotsbackupcookiedisabled_buttonweak authsimple_phpget_postxff_refererwebshellcommand_execution view_source 打开源代码发现答案就在这里 robots 查看robots.txt文件 发现flag文件并打开 backup 网站存在备份文件&#xff0c;常见的备份文件…

程序员与你共观世界杯:Javascript 简易绘制世界杯旗帜(含足球元素)

引言&#xff1a;2022年是世界杯赛事年&#xff0c;世界杯是一项非常受全世界欢迎的大赛事&#xff0c;一到世界杯赛事期间&#xff0c;各大平台热搜就一直是世界杯相关的话题&#xff0c;在这期间&#xff0c;即使你不了解足球&#xff0c;也能耳濡目染&#xff0c;因为身边到…

初学RenderMonkey做一面旗帜飘动的效果

这几天在捣鼓一个游戏 骑马与砍杀 不知道有没有人玩过。官方出了个shader包&#xff0c;可以自定义shader,于是就开始学起来了&#xff0c;学了一点&#xff0c;简单的实现了一直想弄的动态世界。这期间一直在用RenderMonkey开发&#xff08;貌似停止更新了&#xff0c;会不会有…

攻防世界ctf题目easyupload做题笔记。

刚刷完upload-labs靶场&#xff0c;做做ctf题目&#xff0c;发现自己掌握的知识并不牢固。做了半天没有解出来&#xff0c;最后还是看别人的题解做出来的。写下做题过程&#xff0c;也就是wp吧。为了方便以后复习巩固。 本题的主要考点为利用fastcgi的.user.ini特性进行任意命…

我的世界java太卡了怎么办_我的世界服务器太卡怎么办 MC服务器优化攻略

我的世界很多玩家都有自己的服务器,但是很多玩家并不知道怎么优化和维护服务器,从而导致服务器很卡,今天小编为大家带来的是我的世界服务器优化攻略,还不知道怎么优化服务器的小伙伴不要错过哦。 系统的选择 (网页后台可以跳过本段)关于系统的选择,Linux类系统(Centos、Re…

我的世界1.14刷雪机java版_我的世界全自动刷雪机图文攻略 手把手教你刷雪机怎么做...

&#xff1a;原标题&#xff1a; 我的世界刷雪机怎么做?我的世界全自动刷雪机做法是什么?想必对于各位初入我的世界的小伙伴来说有些困难&#xff0c;接下来我们一起来看看我的世界全自动刷雪机做法吧。 【需要的材料提前准备】 橡木楼梯、南瓜、雪块、橙色羊毛、红石中继器、…

我的世界显示java过老_你在《我的世界》中做过哪些蠢事?玩家:误把“java”看成了jave...

本期内容 玩到现在&#xff0c;我们在Minecraft中获得了很多的乐趣&#xff0c;并将其作为一种信仰来对待&#xff0c;只要有人对这款游戏做了人神共愤的事&#xff0c;便会群起而攻之。不过在一开始的探索过程中&#xff0c;我们或多或少做过一些“蠢事”&#xff0c;其中有些…