xiaoyong931011
2022-09-01 5a4ab1f92adb1f6d7e3596388bcebc77709e460f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
package cc.mrbird.febs.pay.util;
 
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.SpringContextHolder;
import cc.mrbird.febs.pay.model.*;
import cc.mrbird.febs.pay.service.impl.JsApiPayComService;
import cc.mrbird.febs.pay.service.impl.RefundService;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
 
import javax.servlet.http.HttpServletRequest;
 
/**微信工具类
 * @author jiangyouyao
 *
 */
@Slf4j
@Service(value="weixinServiceUtil")
public class WeixinServiceUtil {
 
    private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
 
    /**
     * 支付"175.9.82.254"
     * WebUtil.getRequest().getRemoteAddr()
     * getRemortIP(WebUtil.getRequest())
     * @Description 公众号支付,生成预支付订单
       @date 2017年6月27日
       @atuhor jiangyouyao
     * @param desc 描述信息
     * @param outTradeNo 订单id
     * @param price 订单价格,类型为整型,单位是分,不是元,等于你的实际价格*100
     * @param openId  支付者的微信openId
     * @return 预支付订单返回的结果对象(该结果对象已封装),在H5页面使用该对象信息
     * @throws Exception
     */
    public BrandWCPayRequestData createOrder(String desc, String outTradeNo, int price, String openId, String attach) throws Exception {
        String wecharPaynotifyUrl = xcxProperties.getWecharPaynotifyUrl();
        return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, wecharPaynotifyUrl);
    }
 
    public BrandWCPayRequestData createRechargeWallet(String desc, String outTradeNo, int price, String openId, String attach) throws Exception {
        String wecharRechargePaynotifyUrl = xcxProperties.getWecharRechargePaynotifyUrl();
        return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, wecharRechargePaynotifyUrl);
    }
 
    private BrandWCPayRequestData buildBrandWCPayRequestData(String desc, String outTradeNo, int price, String openId, String attach, String notifyUrl) throws Exception {
        // 创建微信支付预付接口
        JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
        String idAddr = getIpAddr(WebUtil.getRequest());
 
        String mchID = xcxProperties.getWecharpayMchid();
        String paySecret = xcxProperties.getWecharpaySecret();
        String appId = xcxProperties.getXcxAppid();
 
        JsApiPayReqData jsApiPayReqData = new JsApiPayReqData(
                appId, mchID, paySecret, notifyUrl, desc,
                outTradeNo, price, idAddr, openId, attach);
 
        // 创建预付订单并返回请求结果
        JsApiPayResData result = jsApiPayBusiness.createPrapareOrder(jsApiPayReqData);
        // 把预付订单的信息存放在request域中
        WebUtil.getRequest().setAttribute("msg", result.toString());
        log.info("#---返回码:return_code = {}" , result.getReturn_code());
        log.info("#---签名信息:return_msg = {}" , result.getReturn_msg());
        if (result.getReturn_code().equals("SUCCESS")) {
            // 请求成功, 构建BrandWCPayRequest发起支付需要的参数
            BrandWCPayRequestData payData = new BrandWCPayRequestData(result.getPrepay_id(),appId,paySecret);
            WebUtil.getRequest().setAttribute("payData", payData);
            return payData;
        }else{
            log.error("创建微信支付订单失败msg={}",result.getReturn_msg());
            throw new FebsException("创建微信支付订单失败,请检查程序配置");
        }
    }
 
    /**@Description 退款,企业付款到个人
       @date 2017年5月26日
       @atuhor jiangyouyao
     * @param outTradeNo 商户订单编号(原订单编号)
     * @param outRefundNo 退款编号
     * @param totalFee 原订单金额(分)
     * @param refundFee 退款金额(分)
     * @param opUserID 操作员id,默认为商户号
     * @return
     */
    public boolean comRefund(String outTradeNo, String outRefundNo,int totalFee,
            int refundFee, String opUserID){
        log.info("#---outTradeNo:{}#---outRefundNo:{}#---totalFee:{}#---refundFee:{}",
                outTradeNo,outRefundNo,totalFee,refundFee);
 
        String mchID = xcxProperties.getWecharpayMchid();
        if(opUserID==null){
            opUserID=mchID;
        }
        RefundResData result=null;
        boolean flag=false;
        try {
            JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
            String paySecret = xcxProperties.getWecharpaySecret();
            String appId = xcxProperties.getXcxAppid();
            String certLocalPath = xcxProperties.getCertLocalPath();
 
            RefundReqData refundReqData=new RefundReqData(mchID,appId,paySecret, outTradeNo, outRefundNo, totalFee, refundFee,opUserID);
            RefundService refundService=new RefundService();
            HttpsRequest2 request2= (HttpsRequest2) refundService.getServiceRequest();
            request2.setCertLocalPath(certLocalPath);
            request2.setMchId(mchID);
 
            result = jsApiPayBusiness.refundComOrder(refundService, refundReqData);
            log.info("#退款,企业付款到个人---result:{}",result);
            //如果返回余额不足时,商户余额不足时微信返回状态码(退款失败时)
            if (StrUtil.equals("NOTENOUGH", result.getErr_code())) {
                log.info("#退款失败,{}!", "商户余额不足");
                flag=false;
            }
        } catch (Exception e) {
            log.error("#企业付款到个人异常#退款#outTradeNo:{}#opUserID:{}", e, outTradeNo,opUserID);
            flag=false;
        }
 
        if (result.getResult_code().equals("SUCCESS")) {
             flag=true;
        }else{
             flag=false;
        }
        return flag;
    }
 
    /**@Description 用户提现提现审核,企业付款到个人
     @date 2017年5月26日
     @atuhor jiangyouyao
      * @param desc 描述
     * @param outTradeNo  提现申请编号
     * @param totalFee 提现金额(分)
     * @param openid
     * @return
     */
    public boolean comPay(String desc, String outTradeNo,int totalFee, String openid){
        log.info("后台同意提现申请..."+ desc+outTradeNo+totalFee+openid);
        boolean flag=false;
        try {
            JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
            String paySecret = xcxProperties.getWecharpaySecret();
            String appId = xcxProperties.getXcxAppid();
            String certLocalPath = xcxProperties.getCertLocalPath();
            String mchID = xcxProperties.getWecharpayMchid();
 
            JsApiPayComReqData jsApiPayComReqData=new JsApiPayComReqData(mchID,
                    appId,
                    paySecret,
                    desc,outTradeNo,totalFee,openid,"NO_CHECK","");
            JsApiPayComService jsApiPayComService=new JsApiPayComService();
 
            HttpsRequest2 request2= (HttpsRequest2) jsApiPayComService.getServiceRequest();
            request2.setCertLocalPath(certLocalPath);
            request2.setMchId(mchID);
 
            JsApiPayComResData result = jsApiPayBusiness.payComOrder(jsApiPayComService, jsApiPayComReqData);
 
            log.info("#提现,企业付款到个人---result:{}",result);
            if (result.getResult_code().equals("SUCCESS")) {
                flag=true;
            }else{
                log.info("#提现,企业付款到个人失败,{}!", "商户余额不足");
                flag=false;
            }
        } catch (Exception e) {
            log.error("#企业付款到个人异常#提现#outTradeNo:{}#opUserID:{}", e, outTradeNo,openid);
            flag=false;
        }
        return flag;
    }
    
    /**@Description 支付获取远程设备的ip
       @date 2017年6月27日
       @atuhor jiangyouyao
     * @param request
     * @return
     */
    public String getIpAddr(HttpServletRequest request) { 
           String ip = request.getHeader("x-forwarded-for");
          /* if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
               ip = request.getHeader("Proxy-Client-IP");
           }
           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
               ip = request.getHeader("WL-Proxy-Client-IP");
           } */
           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
               ip = request.getRemoteAddr(); 
           } 
           if(ip!=null){
            ip=ip.split(",")[0];
           }
           return ip; 
       } 
    
    
}