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

  • 添加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整理出的未实测(主要需要相关参数测试,不方便),目测没毛病
posted @ 2019-02-17 15:08  21karat  阅读(3607)  评论(0编辑  收藏  举报