微信支付之退款--原路退回

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

注意:
1、交易时间超过⼀年的订单⽆法提交退款
2、微信⽀付退款⽀持单笔交易分多次退款,多次退款需要提交原⽀付订单的商户订单号和设置不同的退款单号。

申请退款总⾦额不能超过订单⾦额。

⼀笔退款失败后重新提交,请不要更换退款单号,请使⽤原商户退款单号
3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次
错误或⽆效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次
4、每个⽀付订单的部分退款次数不能超过50次
5、如果同⼀个⽤户有多笔退款,建议分不同批次进⾏退款,避免并发退款导致退款失败
2.返回的接⼝地址
3.需要证书
如果证书不是⾃⼰配置的,在微信⽀付平台管理的地⽅是下载不了的。

也可以换⼀种⽅法去找你的经理要⼀份就好了。

4.请求参数(以下截图是必填的参数,如有不明⽩请参考官⽅⽂档:)
5.代码部分
 ①.service⽅法
1/**
2 *
3 * @param mchId 商户ID
4 * @param url 请求URL
5 * @param data 退款参数
6 * @return
7 * @throws Exception
8*/
9 String doRefund(String mchId, String url, String data) throws Exception;
 ②.impl 此⽅法内要读取证书的位置
1/**
2 *
3 * @param mchId 商户ID
4 * @param url 请求URL
5 * @param data 退款参数
6 * @return
7 * @throws Exception
8*/
9public String doRefund(String mchId, String url, String data) throws Exception {
10/**
11 * 注意PKCS12证书是从微信商户平台-》账户设置-》 API安全中下载的
12*/
13 KeyStore keyStore = KeyStore.getInstance("PKCS12");
14
15//这⾥读取.p12的⽂件是放在服务器中使⽤nginx配置时指向的后端项⽬路径
16 FileInputStream inputStream = new FileInputStream(new File("apiclient_cert.p12"));//P12⽂件⽬录
17try {
18//这⾥写密码..默认是你的MCHID
19 keyStore.load(inputStream, mchId.toCharArray());
20 } finally {
21 inputStream.close();
22 }
23 SSLContext sslcontext = SSLContexts.custom()
24//这⾥也是写密码的
25 .loadKeyMaterial(keyStore, mchId.toCharArray())
26 .build();
27 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
28 sslcontext,
29 SSLConnectionSocketFactory.getDefaultHostnameVerifier());
30 CloseableHttpClient httpclient = HttpClients.custom()
31 .setSSLSocketFactory(sslsf)
32 .build();
33try {
34 HttpPost httpost = new HttpPost(url);
35 httpost.setEntity(new StringEntity(data, "UTF-8"));
36 CloseableHttpResponse response = httpclient.execute(httpost);
37try {
38 HttpEntity entity = response.getEntity();
39//接受到返回信息
40 String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
41 System.out.println(jsonStr+"-====接收到返回的信息");
42 EntityUtils.consume(entity);
43return jsonStr;
44 } finally {
45 response.close();
46 }
47 } finally {
48 httpclient.close();
49 }
50 }
51
52
③.controller
1 @RequestMapping("/refund")
2public String refund() throws Exception {
3 System.out.println("进⼊退款----");
4try {
5//构建参数
6 Map<String, String> dataMap = new HashMap<>();
7 dataMap.put("appid","公众账号ID");
8 dataMap.put("mch_id","商户号");
9//⾃⾏实现该随机串
10 dataMap.put("nonce_str",WXPayUtil.generateNonceStr());
11//商户订单号
12 dataMap.put("out_trade_no","订单号");
13//商户退款单号
14 dataMap.put("out_refund_no","订单号");
15//订单⾦额
16 dataMap.put("total_fee","1");
17//退款⾦额
18 dataMap.put("refund_fee","1");
19//退款原因 (可写可不写)
20 dataMap.put("refund_desc","退款");
21//⽣成签名
22 String sign = WXPayUtil.generateSignature(dataMap, "商户密钥");
23 dataMap.put("sign", sign);
24 System.out.println(dataMap+"=========dataMap");
25
26//map数据转xml
27 String xmlString = XMLBeanUtil.map2XmlString(dataMap);
28 System.out.println("--------------map-->xml转换------------"+xmlString);
29
30//发起退款
31 String result= weixinPayService.doRefund("商户号", "https:///secapi/pay/refund", xmlString);
32 System.out.println(result.toString()+"----结果");
33 System.out.println("================退款===========");
34
35//这⾥需要将发起退款的xml格式转换为map
36 Map<String, String> returnMap = WXPayUtil.xmlToMap(result);
37 System.out.println("--------------xml-->map转换"+result);
38//⽤map取值返回的状态码来判断是否退款成功
39//判断是否退款成功
40if (returnMap.get("return_code").equals("SUCCESS")) {
41return "微信已成功退款";
42 }
43return "微信退款失败";
44 } catch (Exception e) {
45 e.printStackTrace();
46 }
47return "失败";
48 }
49
50
6.结语
 第⼀次写博客,写的不太好,还希望⼤家多多包涵。

同时也希望这篇博客可以帮助到正在做退款这⼀块
的码友们。

有不懂的可以评论哦看到必回。

相关文档
最新文档