• 添加WXpayCommon类用以具体实现相关功能

  1 package com.karat.cn.wxCommon;
  2
  3 import java.io.IOException;
  4 import java.util.HashMap;
  5 import java.util.Map;
  6
  7 import com.karat.cn.util.WXPay;
  8 import com.karat.cn.util.WXPayConfigImpl;
  9 import com.karat.cn.util.WXPayConstants;
 10 import com.karat.cn.util.WXPayUtil;
 11 import com.karat.cn.vo.VoUnifiedOrderWx;
 12
 13 /**
 14  * 支付,提现,退款
 15  * @author 开发
 16  *
 17  */
 18 public class WXpayCommon {
 19
 20     private static WXPay wxpay;
 21     private static WXPayConfigImpl config;
 22
 23
 24     public static void WXpayCommonIns() throws Exception {
 25         config = WXPayConfigImpl.getInstance();
 26         wxpay = new WXPay(config);
 27     }
 28
 29     /**
 30      * 支付
 31      * @param orderInfo 自己数据库生成的订单
 32      * @param openid    用户的标识openId
 33      * @param ip
 34      * @param flag
 35      * @return
 36      * @throws IOException
 37      */
 38     public static VoUnifiedOrderWx payOrderWx(WxWithdrawOrder orderInfo, String openid, String ip, boolean flag) throws IOException {
 39         VoUnifiedOrderWx voUnifiedOrderWx = null;
 40         try {
 41             Map<String, String> respData = null;
 42             if (flag) {
 43                 HashMap<String, String> data = new HashMap<String, String>();
 44                 data.put("body", orderInfo.getOrderNo());
 45                 data.put("out_trade_no", orderInfo.getOrderNo());//订单号
 46                 data.put("fee_type", "CNY");
 47                 data.put("total_fee", "1");//支付金额(分)
 48                 data.put("spbill_create_ip", ip);
 49                 data.put("notify_url", "******************");//支付成功回调地址
 50                 // 交易类型--JSAPI:公众号支付、NATIVE:原生扫码支付、APP:APP支付
 51                 // 公众号支付
 52                 data.put("trade_type", "JSAPI");//支付方式
 53                 // 设备号--自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB"
 54                 data.put("device_info", "WEB");
 55                 // 用户openid
 56                 data.put("openid", openid);
 57                 data.put("product_id", "1000" + "");
 58
 59                 if (null == wxpay) {
 60                     WXpayCommonIns();
 61                 }
 62                 respData = wxpay.unifiedOrder(data);//统一下单
 63                 orderInfo.setRemark(respData);
 64             } else {
 65                 respData = orderInfo.getRemark();
 66             }
 67             System.out.println(respData);
 68             // 返回状态码
 69             String return_code = respData.get("return_code");
 70             if (return_code.equals(WXPayConstants.SUCCESS)) {
 71                 // 业务结果
 72                 String result_code = respData.get("result_code");
 73                 if (result_code.equals(WXPayConstants.SUCCESS)) {
 74                     voUnifiedOrderWx = new VoUnifiedOrderWx();
 75                     // 时间戳
 76                     voUnifiedOrderWx.setTimeStamp(BaseToolsUtil.systemtimeLong()/1000 + "");
 77                     // 随机串
 78                     voUnifiedOrderWx.setNonceStr(respData.get("nonce_str"));
 79                     // 数据包
 80                     voUnifiedOrderWx.setPackageValue("prepay_id=" + respData.get("prepay_id"));
 81
 82                     // 二次签名
 83                     HashMap<String, String> dataPay = new HashMap<String, String>();
 84                     dataPay.put("appId", respData.get("appid"));
 85                     dataPay.put("nonceStr", voUnifiedOrderWx.getNonceStr());
 86                     dataPay.put("package", voUnifiedOrderWx.getPackageValue());
 87                     dataPay.put("timeStamp", voUnifiedOrderWx.getTimeStamp());
 88                     dataPay.put("signType", "MD5");
 89                     String sign = WXPayUtil.generateSignature(dataPay, config.getKey());
 90                     // 签名
 91                     voUnifiedOrderWx.setSign(sign);
 92                 }
 93             }
 94         } catch (Exception e) {
 95             e.printStackTrace();
 96         }
 97         return voUnifiedOrderWx;
 98     }
 99
100
101     /**
102      * 企业付款(提现)
103      * @param wxWithdrawOrder
104      * @param openid
105      * @param ip
106      * @throws Exception
107      */
108     public static void transfers(WxWithdrawOrder wxWithdrawOrder, String openid, String ip) throws Exception {
109         HashMap<String, String> data = new HashMap<String, String>();
110         // 商户订单号
111         data.put("partner_trade_no", wxWithdrawOrder.getOrderNo());
112         // 用户openid
113         data.put("openid", openid);
114         // 校验用户姓名选项
115         data.put("check_name", "NO_CHECK");
116         // 金额
117         data.put("amount", wxWithdrawOrder.getMoney() + "");
118         // 企业付款描述信息
119         // TODO
120         data.put("desc", "提现");
121         // Ip地址
122         data.put("spbill_create_ip", ip);
123
124         if (null == wxpay) {
125             WXpayCommonIns();
126         }
127         String respXml = wxpay.transfers(data);//企业付款
128         System.out.println(respXml);
129         Map<String, String> respData = WXPayUtil.xmlToMap(respXml);
130         wxWithdrawOrder.setRemark(respData);
131         wxWithdrawOrder.setRemark2(respXml);
132         // 返回状态码
133         String return_code = respData.get("return_code");
134         System.out.println(return_code);
135         if (return_code.equals(WXPayConstants.SUCCESS)) {
136             // 业务结果处理
137         }
138     }
139
140
141     /**
142      * @description:微信退款业务封装(支付押金退还);
143      * @param   PayLog order:支付订单信息
144      *           Double refundAmount:退款金额
145      * @return 微信退款接口返回数据  true 退款成功  false 退款失败
146      * @author:FanHaoJian
147      * @throws Exception
148      */
149     public static Boolean refundOrder(WxWithdrawOrder orderInfo,Double refundAmount) throws Exception{
150         if (null == wxpay) {
151             WXpayCommonIns();
152         }
153         HashMap<String, String> data = new HashMap<String, String>();
154             data.put("out_trade_no", orderInfo.getOrderNo());
155             data.put("out_refund_no", orderInfo.getOrderNo());
156             data.put("total_fee", "1000");//价钱分
157             data.put("refund_fee", String.valueOf((int)(refundAmount*100)));
158             data.put("refund_fee_type", "CNY");
159             data.put("op_user_id", config.getMchID());
160             try {
161                 Map<String, String> r = wxpay.refund(data);//订单退款
162                 System.out.println(r);
163                 return Boolean.TRUE;
164             } catch (Exception e) {
165                 e.printStackTrace();
166             }
167         return Boolean.FALSE;
168     }
169
170 }

View Code

  • 控制层接口

  1 package com.karat.cn.action;
  2
  3 import java.io.BufferedOutputStream;
  4 import java.io.ByteArrayOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.util.HashMap;
  8 import java.util.Map;
  9
 10 import javax.servlet.http.HttpServletRequest;
 11 import javax.servlet.http.HttpServletResponse;
 12
 13 import org.springframework.stereotype.Controller;
 14 import org.springframework.web.bind.annotation.RequestMapping;
 15
 16 import com.karat.cn.util.WXPayConfigImpl;
 17 import com.karat.cn.util.WXPayConstants;
 18 import com.karat.cn.util.WXPayUtil;
 19 import com.karat.cn.wxCommon.IpAddressUtil;
 20 import com.karat.cn.wxCommon.WXpayCommon;
 21 import com.karat.cn.wxCommon.WxWithdrawOrder;
 22 /**
 23  * 接口模板
 24  * @author 开发
 25  *
 26  */
 27 @Controller
 28 @RequestMapping("wx")
 29 public class WxPayAction {
 30
 31     private HttpServletRequest request;
 32     private HttpServletResponse response;
 33     private WXPayConfigImpl config;
 34     /**
 35      * 支付
 36      * @return
 37      */
 38     @RequestMapping("/pay")
 39     public String pay(){
 40         Map<String, String> remark=new HashMap<String, String>();
 41         //新建订单
 42         WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,"");
 43         try {
 44             WXpayCommon.payOrderWx(order, "用户openId",IpAddressUtil.getIpAddr(request), true);
 45         } catch (IOException e) {
 46             // TODO Auto-generated catch block
 47             e.printStackTrace();
 48         }
 49         return "";
 50     }
 51     /**
 52      * 微信回调接口notify(支付填写的支付成功回调地址)
 53      * @throws Exception
 54      */
 55     @RequestMapping("/notifyPayWx")
 56     public void notifyPayWx() throws Exception {
 57         boolean state = false;
 58         System.out.println("微信回调");
 59         InputStream inStream = request.getInputStream();
 60         ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
 61         byte[] buffer = new byte[1024];
 62         int len = 0;
 63         while ((len = inStream.read(buffer)) != -1) {
 64             outSteam.write(buffer, 0, len);
 65         }
 66         outSteam.close();
 67         inStream.close();
 68         String resultXml = new String(outSteam.toByteArray(), "utf-8");
 69         System.out.println("resultXml:" + resultXml);
 70         Map<String, String> resultMap = WXPayUtil.xmlToMap(resultXml);
 71         // 签名验证
 72         if (WXPayUtil.isSignatureValid(resultXml, config.getKey())) {
 73             String resXml = "";
 74             // 业务结果
 75             String result_code = resultMap.get("result_code");
 76             if (result_code.equals(WXPayConstants.SUCCESS)) {
 77                 // 订单号
 78                 //String out_trade_no = resultMap.get("out_trade_no");
 79                 // 支付成功处理业务逻辑
 80                 state =true;//根据订单号查询自己数据库该条数据进行业务操作,操作成功返回true
 81             }
 82             if (state) {
 83                 //通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
 84                 resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
 85                         + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
 86             } else {
 87                 resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
 88                         + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
 89             }
 90             System.out.println("resXml:" + resultXml);
 91             BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
 92             out.write(resXml.getBytes());
 93             out.flush();
 94             out.close();
 95         } else {
 96             // 签名验证失败
 97             System.out.println("签名验证失败");
 98         }
 99     }
100
101     /**
102      * 退款
103      * @return
104      */
105     @RequestMapping("/returnPay")
106     public String returnPay(){
107         Map<String, String> remark=new HashMap<String, String>();
108         //新建订单
109         WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,"");
110         try {
111             WXpayCommon.refundOrder(order,0.01);
112         } catch (Exception e) {
113             // TODO Auto-generated catch block
114             e.printStackTrace();
115         }
116         return "";
117     }
118     /**
119      * 提现
120      * @return
121      */
122     @RequestMapping("/withdrawDeposit")
123     public String withdrawDeposit(){
124         Map<String, String> remark=new HashMap<String, String>();
125         //新建订单
126         WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,"");
127         try {
128             WXpayCommon.transfers(order,"用户openId", "服务器地址");
129         } catch (Exception e) {
130             // TODO Auto-generated catch block
131             e.printStackTrace();
132         }
133         return "";
134     }
135     public HttpServletRequest getRequest() {
136         return request;
137     }
138     public void setRequest(HttpServletRequest request) {
139         this.request = request;
140     }
141     public HttpServletResponse getResponse() {
142         return response;
143     }
144     public void setResponse(HttpServletResponse response) {
145         this.response = response;
146     }
147
148
149
150 }

View Code

  • 接口中主要根据业务逻辑调用WXpayCommon类中的功能实现方法即可。项目中的相关代码,线上可用,copy整理出的未实测(主要需要相关参数测试,不方便),目测没毛病

转载于:https://www.cnblogs.com/LJing21/p/10391196.html

微信小程序支付(基于Java实现微信JSAPI支付):支付,提现,退款相关推荐

  1. 【微信小程序】基于Java+uniapp框架开发的全开源微信小程序商城系统

    应用介绍 基于Java+uniapp框架开发的全开源微信小程序商城系统,前端采用目前主流的uniapp框架开发,后端采用Java语言开发,前后端代码全部开源,减少重复造轮子,支持小程序商城秒杀.优惠券 ...

  2. mpvue 微信小程序api_基于mpvue构建微信和支付宝小程序(1)

    基于mpvue构建微信和支付宝小程序(1) (1)----- 基础架构篇 why?为啥会有这个系列? 无论是百度和google,关于mpvue构建小程序的项目讲的都是管中窥豹,没有一个系统的讲解. 本 ...

  3. 小程序毕业设计 基于java后台微信在线视频点播小程序毕业设计参考

    小程序 后台

  4. 小程序毕业设计 基于java后台微信餐厅座位预定小程序毕业设计参考

    小程序 后台

  5. 小程序毕业设计 基于java后台微信电影院选座购票小程序毕业设计参考

    效果图

  6. 【微信小程序】基于JavaScript的花店商城小程序微信云开发

    [微信小程序]基于JavaScript的花店商城小程序微信云开发 用Java Script语言进行一次微信小程序开发 文章目录 前言 一.功能总览 二.功能显示 1.搜索框 2.轮播图 3.主题导航栏 ...

  7. iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级培训教程分享...

    ?? 微信小程序课程,面向所有具备前端基础知识的同学 ?? iKcamp官网:http://www.ikcamp.com 访问官网更快阅读全部免费分享课程:<iKcamp出品|全网最新|微信小程 ...

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

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

  9. (微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好

    转载地址:(微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好 转载请注明出处 作者:Happy王子乐 个人网站(整理 ...

  10. 深入讲解微信小程序上传图片与JAVA后台的结合

    背景 微信小程序上传文件是微信小程序提供的API之一,如果用JAVA后台如何来处理上传的文件呢? 官方文档 UploadTask wx.uploadFile(Object object) 将本地资源上 ...

最新文章

  1. SRE工程师到底是做什么的?
  2. python 配置文件对比_Python运维自动化之nginx配置文件对比操作示例
  3. Linux比较大文件内容,Linux系统最大文件打开数优化,解决Too many open files报错
  4. 计算机编程语言的分类与python语言快速度认识
  5. 单进程服务器-select版
  6. ECCV 2020 论文大盘点-人体形状与姿态估计篇
  7. 【训练题】分队 P1672
  8. Java 操作Word书签:用文本、图片、表格替换书签
  9. 通过概率规划归纳的人类水平概念学习
  10. 算法练习 - 五笔编码
  11. python泊松分布_泊松分布与Python图解
  12. HDU 4461 The Power of Xiangqi
  13. u盾如何在计算机上使用方法,u盾在电脑中具体使用操作过程
  14. 卸载安装Ubuntu18.04双系统、ROS+装机
  15. Python做游戏很难吗—来看看我做的多有趣
  16. 数据挖掘#金融风控总结
  17. 360怎样修改wifi服务器地址,360路由器怎么改wi-fi密码(无线密码)? | 192路由网
  18. spring cloud灰度发布快速上下线问题解决
  19. Android中骨架屏(Skeleton Screen)使用
  20. 学生公寓管理java_基于JAVA的学生公寓管理系统需要用到那些技术?

热门文章

  1. windet插入图片的大小_LaTeX的图片插入及排版
  2. Deepin Linux设置环境变量时出现【Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=gasp】的解决方法
  3. python爬虫实战,爬虫之路,永无止境
  4. jsp 和 servlet 有什么区别?
  5. mysql ley_len计算
  6. 从0开始安装苹果cms及其资源采集和页面部分代码
  7. Virtex—5 GTP和Virtex—6 GTX间匹配通信研究及应用
  8. lambda no instance(s) of type variable(s) T exist so that void conforms to R
  9. 莽撞小子终到迟暮中年 弗朗西斯择队目标转换(转)
  10. 用实战项目经验告诉你什么是二方包!