目录

  • 一、准备工作
  • 二、代码编写
    • 1.将大部分常用的数据封装在WechatConstant中
    • 2.controller
    • 3.service

一、准备工作

要实现退款,需要准备很多东西。
小程序ID(APPID)
商户号(mch_id)
随机字符串(nonce_str)
微信订单号(transaction_id)
商户退款单号(out_refund_no)
订单金额(total_fee)
退款金额(refund_fee)
签名(sign)通过商户证书密钥生成
商户证书:是从微信商户平台-》账户设置-》API安全 中下载的

Tip:其中的微信的订单号、订单金额都在订单里,在: https://blog.csdn.net/weixin_46030885/article/details/112734175中有提到支付成功后如何实现回调,如何存支付订单。


二、代码编写

1.将大部分常用的数据封装在WechatConstant中

Tip:这个WechatConstant在下边的代码中会用到,而且以后修改信息可直接在这里修改,别处的代码就不用动了

public class WechatConstant {public final static String MCH_ID = "****************"; //商户号public final static String MCH_KEY = "***************"; //商户密钥public final static String APPID = "*****************"; //appidpublic final static String SECRET = "****************"; //小程序密钥public final static String KEY = "*******************"; //商户证书密钥
}

2.controller

Tip:这个controller主要是构建参数的,将那些APPID、商户号等东西放进map里,在后边的service中要转成xml格式

@ApiOperation("退款")@RequestMapping(value = "/refund", method = {RequestMethod.GET})public Res refund(HttpServletRequest request,@RequestParam("openid") String openid,@RequestParam("activityid")int activityid,@RequestParam("memberid") int memberid) throws Exception {//先将订单信息查出来  这里的订单就是上边说的支付订单,我的是通过openid和一个activityid查出来的,自己可根据业务逻辑修改。QueryWrapper<Wxpaynotifyvo> wxPayNotifyVOQueryWrapper = new QueryWrapper<>();wxPayNotifyVOQueryWrapper.eq("openid", openid);wxPayNotifyVOQueryWrapper.eq("activityid",activityid);Wxpaynotifyvo wxPayNotifyVO = this.wxPayService.getBaseMapper().selectOne(wxPayNotifyVOQueryWrapper);//构建参数Map<String, String> dataMap = new HashMap<>();//小程序IDdataMap.put("appid", WechatConstant.APPID);//商户号dataMap.put("mch_id", WechatConstant.MCH_ID);//随机字符串dataMap.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));//微信订单号dataMap.put("transaction_id", wxPayNotifyVO.getTransactionid());//商户退款单号Date now = new Date();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");//可以方便地修改日期格式String outRefundNo = "NO" + dateFormat.format(now);dataMap.put("out_refund_no", outRefundNo);//订单金额dataMap.put("total_fee", wxPayNotifyVO.getTotalfee());//退款金额dataMap.put("refund_fee", wxPayNotifyVO.getTotalfee());//商户证书密钥,生成签名String sign = WXPayUtil.generateSignature(dataMap, WechatConstant.KEY);dataMap.put("sign", sign);//这个是将报名表里的数据删除int i = applymanService.deleteApplyman(openid, activityid, memberid);//这个不是this.wxPayService.refound(dataMap);Res res = new Res();res.setCode(0);res.setMsg("退款成功!");return res;}

3.service

Tip:在这里真正实现退款,里边要用到一个商户证书,上边提到过,需要在微信商户平台下载的,大概就长这个样子:

/*** 退款** @param dataMap*/@Overridepublic void refound(Map<String, String> dataMap) {try {//将传来的map转xmlStringBuffer sb = new StringBuffer();sb.append("<xml>");for (String key : dataMap.keySet()) {String value = "<![CDATA[" + dataMap.get(key) + "]]>";sb.append("<" + key + ">" + value + "</" + key + ">");System.out.println();}sb.append("</xml>");String xmlString = sb.toString();doRefoud(dataMap.get("mch_id"), "https://api.mch.weixin.qq.com/secapi/pay/refund", xmlString);} catch (Exception e) {e.printStackTrace();}//退款之后将wxpaynotifyvo中的数据删除,防止下次报名活动时与上次数据重复QueryWrapper<Wxpaynotifyvo> wxpaynotifyvoQueryWrapper = new QueryWrapper<>();wxpaynotifyvoQueryWrapper.eq("transactionid",dataMap.get("transaction_id"));int delete = this.baseMapper.delete(wxpaynotifyvoQueryWrapper);}private static String doRefoud(String mch_id, String url, String xmlString) throws Exception {//证书 是从微信商户平台-》账户设置-》 API安全 中下载的KeyStore keyStore = KeyStore.getInstance("PKCS12");//我想的是把证书传到服务器上,没写出来//FileInputStream inputStream = new FileInputStream(new File("src\\main\\resources\\apiclient_cert.p12"));//据说这样写打包后也可以找到,就放在resources里了ClassPathResource classPathResource = new ClassPathResource("apiclient_cert.p12");InputStream inputStream = classPathResource.getInputStream();try {//这里写密码,默认是MCHIDkeyStore.load(inputStream, WechatConstant.MCH_ID.toCharArray());} finally {inputStream.close();}                                                           //这里写密码SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, WechatConstant.MCH_ID.toCharArray()).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.getDefaultHostnameVerifier());CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();try {//请求路径HttpPost httpPost = new HttpPost(url);httpPost.setEntity(new StringEntity(xmlString,"UTF-8"));CloseableHttpResponse response = httpClient.execute(httpPost);try {HttpEntity entity = response.getEntity();//接受到返回信息String jsonStr = EntityUtils.toString(response.getEntity(),"UTF-8");EntityUtils.consume(entity);} finally {response.close();}} finally {httpClient.close();}return null;}

Tip:退款之前先要实现支付,因为支付订单里边的参数是必须的,本来支付退款应该写在一起,但是东西太多所以分开了。这篇小程序退款是和前边写的微信支付是一个项目里的,可以结合着一起看比较完整。连接:https://blog.csdn.net/weixin_46030885/article/details/112734175
欢迎批评纠正 ~ _ ~

微信小程序实现退款,Java版。相关推荐

  1. 微信小程序商城(Java版)

    技术选型 1 后端使用技术 1.1 springframework4.3.7.RELEASE 1.2 mybatis3.4.1 1.3 shiro1.3.2 1.4 servlet3.1.0 1.5 ...

  2. JAVA程序红包_微信小程序红包(Java版)

    文章更新说明: 1.小程序源码,特简单,仅仅一个按钮点击时间,里面传递的package等参数是服务端请求返回参数,贴出来的就是核心,源码地址暂无法访问.(2020-03-11) 2.文章留言可当日回复 ...

  3. 微信小程序商城 (后台JAVA)

    微信小程序商城(Java版) 技术选型 1 后端使用技术 1.1 springframework4.3.7.RELEASE 1.2 mybatis3.4.1 1.3 shiro1.3.2 1.4 se ...

  4. 微信小程序:二开版优化新紫色UI云开发新款壁纸小程序源码

    这是一款由旧版https://airymz.com/3387.html进行优化二开的一个新版本 本壁纸表情包头像小程序采用(dcloud云开发)所以无需服务器与域名 无需服务器.无需域名.云开发直接上 ...

  5. 微信小程序支付退款功能

    微信小程序支付退款功能 2022年02月做了一个微信小程序前端+ASP.NET后台的微信退款功能.功能的基本原理是使用JSAPI方式,对接之前的微信支付功能差不多.也是要签名,校验等.只不过它的退款传 ...

  6. 微信小程序:大红喜庆版UI猜灯谜又叫猜字谜

    大家好给大家带来一款UI比较喜庆的猜灯谜小程序 大家看演示图的时候当然也是可以看得到那界面是多么的喜庆 而且新的一年也很快就来了,所以种种的界面可能都比较往喜庆方面去变吧 这款小程序搭建是免服务器和域 ...

  7. 文案微信小程序源码独立版+前端

    文案微信小程序源码文案+头像+背景图 api接口是别人的,毕竟自己采集资源比较难 后台程序没有首页,只需要安装即用 后台账户:admin/123456 小程序源码下载地址: 文案微信小程序源码独立版+ ...

  8. 小程序源码:最新wordpress黑金壁纸微信小程序 二开修复版源码下载支持流量主收益

    这是一款wordpress系统框架的壁纸小程序源码 相信很多人以前也有用过这类的壁纸小程序源码吧 现在给大家发的这一款是二开修复版的 和以前的安装方式差不多,支持流量主收益模式 介绍: WordPre ...

  9. 最新wordpress黑金壁纸微信小程序 二开修复版源码下载支持流量主收益

    这是一款wordpress系统框架的壁纸小程序源码 相信很多人以前也有用过这类的壁纸小程序源码吧 现在给大家发的这一款是二开修复版的 和以前的安装方式差不多,支持流量主收益模式 介绍: WordPre ...

  10. 最新wordpress黑金壁纸微信小程序 二开修复版源码下载

    这是一款wordpress系统框架的壁纸小程序源码 相信很多人以前也有用过这类的壁纸小程序源码吧 现在给大家发的这一款是二开修复版的 和以前的安装方式差不多, 介绍: WordPress独立后台壁纸小 ...

最新文章

  1. Nature Method:DEMIC——使用宏基因组数据预测细菌的生长速率
  2. 何恺明团队最新力作SimSiam:消除表征学习“崩溃解”,探寻对比表达学习成功之根源...
  3. 【Linux】一步一步学Linux——lastlog命令(100)
  4. C语言指针详解----指针声明定义赋值
  5. opencv mat数据剪裁感兴趣的部分处理方法
  6. ruby on rails连接mysql_ruby on rails 连接mysql数据库
  7. 《C#多线程编程实战(原书第2版)》——3.6 在线程池中使用等待事件处理器及超时...
  8. Node JS环境设置– Node.js安装
  9. eclipse php 教程,Eclipse PHPEclipse配置方法文字教程
  10. 计算机组成原理课程设计(附完整项目)
  11. python给定dna等分成两个序列_Biopython序列
  12. 机器学习入门 线性回归及梯度下降
  13. JIEDU7种EMI电磁屏蔽材料介绍
  14. 非常好用的离线地图手机app
  15. FIT2CLOUD飞致云发布开源轻量级云管平台CloudExplorer Lite
  16. C++第2次实验作业
  17. ig信息增益 java_【Python 编程】实现文本分类中的信息增益算法
  18. 深度学习提高泛化能力的技术
  19. python:DataFrame的创建以及DataFrame的属性
  20. 网狐棋牌QueueService

热门文章

  1. 1688api 图片搜索功能 item_search_img-按图搜索1688商品(拍立淘)
  2. matlab自带滤波器,matlab自带滤波器函数小结(图像处理)
  3. 【SpringMVC注解篇】SpringMVC 注解驱动开发(二)JSON数据交互相关注解
  4. 阿里PEGASUS笔记:PEGASUS : Bridging Polynomial and Non-polynomial Evaluations in Homomorphic Encryption
  5. 第一范式、第二范式、第三范式、BCNF范式的区别
  6. 组装台式计算机配置清单,组装台式机清单配置,组装台式机详细清单
  7. X509TrustManager信任SSL证书
  8. Oracle JDK 终于免费了!网友:are you sure?
  9. Android 设置屏幕亮度
  10. 世界上公认最快的学习法 - 弗曼学习法