微信公众号退款java代码(整理)
来源:互联网 发布:通联支付网络 编辑:程序博客网 时间:2024/05/07 12:19
微信公众号支付请看上一篇文章:
http://blog.csdn.net/aofavx/article/details/52220394
需要用到的java类都在:
http://download.csdn.net/detail/aofavx/9606697
微信公众号退款相对支付来说就简单多了,唯一需要注意的地方就是:在支付的时候需要用到商户的证书。
退款代码如下:
jsp提交退款申请:
//退款function refundWXPay() { window.location.href="refundPay?orderId=${orderId}";}
java代码:
/** *微信公众号申请退款 * @param orderId 订单id * @param total_fee 退款金额 * @param refund_fee 退款金额 * @param response * @return * @throws Exception */ @RequestMapping(value="/refundPay") @ResponseBody private ModelAndView refundwx(HttpServletRequest request,HttpServletResponse response) throws Exception{ logBefore(logger, "退款"); ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); /*--------1.初始化数据参数----------*/ String appId= "wxfd7c065eee11112222"; String secret= "b5b3a627f5d1f8888888888888"; String shh= "111111111; String key= "mmmmmmmmmmmmmmm"; String filePath = "E:\\证书\\apiclient_cert.p12"; //退款需要提供证书数据,所以需要根据证书路径读取证书 //需要退款的商户订单号,对应提交订单中的out_trade_no String orderId = request.getParameter("orderId").toString(); String total_fee=WeChat.getMoney(request.getParameter("total_fee")); //也可以根据业务场景从数据库中获取总金额和退款金额 String refund_fee=WeChat.getMoney(request.getParameter("refund_fee")); Map<String,String> result = (Map<String, String>) wxRefund(request,response,appId,secret,shh,key,orderId,total_fee,refund_fee,filePath); /* 根据result的返回状态,处理你的业务逻辑 ..... */ mv.setViewName("wechat/refundFind"); return mv; } private Object wxRefund(HttpServletRequest request,HttpServletResponse response,String appId, String secret,String shh,String key,String orderId,String total_fee,String refund_fee,String path){ Map<String,String> result=new HashMap<String,String>(); PageData pd = new PageData(); pd = this.getPageData(); String refundid = UuidUtil.get32UUID(); String nonce_str = MD5.getMessageDigest(String.valueOf(new Random().nextInt(10000)).getBytes()); /*----- 1.生成预支付订单需要的的package数据-----*/ SortedMap<String, String> packageParams = new TreeMap<String, String>(); packageParams.put("appid", appId); packageParams.put("mch_id", shh); packageParams.put("nonce_str", nonce_str); packageParams.put("op_user_id", shh); packageParams.put("out_trade_no", orderId); packageParams.put("out_refund_no", refundid); packageParams.put("total_fee",total_fee); packageParams.put("refund_fee", refund_fee); /*----2.根据package生成签名sign---- */ RequestHandler reqHandler = new RequestHandler(request, response); reqHandler.init(appId, secret, key); String sign = reqHandler.createSign(packageParams); /*----3.拼装需要提交到微信的数据xml---- */ String xml="<xml>" +"<appid>"+appId+"</appid>" + "<mch_id>"+shh+"</mch_id>" + "<nonce_str>"+nonce_str+"</nonce_str>" + "<op_user_id>"+shh+"</op_user_id>" + "<out_trade_no>"+orderId+"</out_trade_no>" + "<out_refund_no>"+refundid+"</out_refund_no>" + "<refund_fee>"+refund_fee+"</refund_fee>" + "<total_fee>"+total_fee+"</total_fee>" + "<sign>"+sign+"</sign>" +"</xml>"; try { /*----4.读取证书文件,这一段是直接从微信支付平台提供的demo中copy的,所以一般不需要修改---- */ KeyStore keyStore = KeyStore.getInstance("PKCS12"); FileInputStream instream = new FileInputStream(new File(path)); try { keyStore.load(instream, shh.toCharArray()); } finally { instream.close(); } // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, shh.toCharArray()).build(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); /*----5.发送数据到微信的退款接口---- */ String url="https://api.mch.weixin.qq.com/secapi/pay/refund"; HttpPost httpost= HttpClientConnectionManager.getPostMethod(url); httpost.setEntity(new StringEntity(xml, "UTF-8")); HttpResponse weixinResponse = httpClient.execute(httpost); String jsonStr = EntityUtils.toString(weixinResponse.getEntity(), "UTF-8"); logger.info(jsonStr); Map map = GetWxOrderno.doXMLParse(jsonStr); if("success".equalsIgnoreCase((String) map.get("return_code"))){ logger.info("退款成功"); result.put("returncode", "ok"); result.put("returninfo", "退款成功"); }else{ logger.info("退款失败"); result.put("returncode", "error"); result.put("returninfo", "退款失败"); } } catch (Exception e) { logger.info("退款失败"); result.put("returncode", "error"); result.put("returninfo", "退款失败"); } return result; }
0 0
- 微信公众号退款java代码(整理)
- 微信公众号开发---退款(java)
- 微信 退款 java
- 微信退款相关整理
- 微信服务号开发----公众号支付退款
- 微信支付一 :公众号支付3 申请退款
- 微信公众号授权,支付,退款总结
- php微信公众号支付,退款,回调函数
- 微信退款demo--Java
- 微信退款开发 --Java
- java实现微信退款
- 关于微信公众号开发的微信支付退款
- (原创)C# MVC微信公众号支付之微信退款
- java-微信支付-微信退款
- 微信开发申请退款-公众号支付开发-视频教程10
- 微信支付开发查询退款-公众号支付开发-视频教程11
- app微信退款接口Java 后台
- 微信公众号资料整理
- vbox 命令行操作
- POJ 3468 A Simple Problem with Integers
- Arm汇编学习笔记(八)——寄存器的使用
- JavaScript-DOM操作
- POJ2280 Amphiphilic Carbon Molecules
- 微信公众号退款java代码(整理)
- unity3d 通过 http网络下载到本地
- Android中自定义时间日期Dialog
- zzuli oj 1919(序列分段求和)(二分)
- npm、bower和spm3的比较
- QA 这个职位在中国有前途么?转自知乎
- loadrunner监控centos6方法
- 杭电1224 DP+记录路径
- openlayers3加载各种底图,补齐中..