zoukankan      html  css  js  c++  java
  • 微信小程序支付(基于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整理出的未实测(主要需要相关参数测试,不方便),目测没毛病
  • 相关阅读:
    [N1CTF 2018]eating_cms 敏感文件扫描+php伪协议利用
    文件包含漏洞(总结)+常见的getshell+PHP伪协议
    laravel安装jwt-auth及验证(实例)
    理解 PHP 8 的 JIT
    Laravel 文件缓存也可以快得飞起,tmpfs 了解一下
    关于 Laravel ORM 对 Model::find 方法进行缓存
    在 Laravel 7 中优雅使用 UUID 教程
    PestPHP 正式开源,一个优雅的测试框架
    PHP 8 还有半年就要来了, 来看看有哪些新特性
    Redis持久化过程的监控及优化
  • 原文地址:https://www.cnblogs.com/LJing21/p/10391196.html
Copyright © 2011-2022 走看看