package com.matrix.component.wechat.externalInterface.weixinUtil; 
 | 
  
 | 
import com.matrix.component.wechat.externalInterface.common.HttpsRequest2; 
 | 
import com.matrix.core.exception.GlobleException; 
 | 
import com.matrix.core.tools.LogUtil; 
 | 
import com.matrix.core.tools.StringUtils; 
 | 
import com.matrix.core.tools.WebUtil; 
 | 
import com.matrix.component.wechat.externalInterface.business.JsApiPayBusiness; 
 | 
import com.matrix.component.wechat.externalInterface.common.WechatConfigure; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.paramProtocol.BrandWCPayRequestData; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.payComProtocol.JsApiPayComReqData; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.payComProtocol.JsApiPayComResData; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.payProtocol.JsApiPayReqData; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.payProtocol.JsApiPayResData; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.queryProtocol.ScanPayQueryReqData; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.queryProtocol.ScanPayQueryResData; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.refundProtocol.RefundReqData; 
 | 
import com.matrix.component.wechat.externalInterface.protocol.refundProtocol.RefundResData; 
 | 
import com.matrix.component.wechat.externalInterface.service.JsApiPayComService; 
 | 
import com.matrix.component.wechat.externalInterface.service.RefundService; 
 | 
import com.matrix.component.wechat.externalInterface.service.ScanPayQueryService; 
 | 
import com.matrix.system.common.bean.BusParameterSettings; 
 | 
import com.matrix.system.common.constance.AppConstance; 
 | 
import com.matrix.system.common.dao.BusParameterSettingsDao; 
 | 
import com.matrix.system.common.interceptor.HostInterceptor; 
 | 
import com.matrix.system.shopXcx.api.tools.WxShopOrderUtil; 
 | 
import org.apache.log4j.Logger; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.stereotype.Service; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
  
 | 
/**微信工具类 
 | 
 * @author jiangyouyao 
 | 
 * 
 | 
 */ 
 | 
@Service(value="weixinServiceUtil") 
 | 
public class WeixinServiceUtil { 
 | 
    static Logger logger=Logger.getLogger(WeixinServiceUtil.class); 
 | 
  
 | 
    /** 
 | 
     * 是否为debug模式 
 | 
     */ 
 | 
    @Value("${debug}") 
 | 
    private String debug; 
 | 
  
 | 
    @Autowired 
 | 
    private WxShopOrderUtil wxShopOrderUtil; 
 | 
  
 | 
    @Autowired 
 | 
    BusParameterSettingsDao busParameterSettingsDao; 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
     
 | 
    /** 
 | 
     * 支付"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 { 
 | 
        // 创建微信支付预付接口 
 | 
        JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness(); 
 | 
        String idAddr = getIpAddr(WebUtil.getRequest()); 
 | 
  
 | 
        Long companyId=HostInterceptor.getCompanyId(); 
 | 
  
 | 
        BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_MCHID, companyId); 
 | 
        BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId); 
 | 
        BusParameterSettings notifyUrl = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_NOTIFYURL, companyId); 
 | 
  
 | 
        BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId); 
 | 
  
 | 
        JsApiPayReqData jsApiPayReqData = new JsApiPayReqData(appId.getParamValue(),mchID.getParamValue(), 
 | 
                paySecret.getParamValue(), 
 | 
                notifyUrl.getParamValue(), 
 | 
                desc, outTradeNo, price, idAddr, openId, attach); 
 | 
  
 | 
        // 创建预付订单并返回请求结果 
 | 
        JsApiPayResData result = jsApiPayBusiness.createPrapareOrder(jsApiPayReqData); 
 | 
        // 把预付订单的信息存放在request域中 
 | 
        WebUtil.getRequest().setAttribute("msg", result.toString()); 
 | 
        LogUtil.info("#---返回码:return_code = {}" , result.getReturn_code()); 
 | 
        LogUtil.info("#---签名信息:return_msg = {}" , result.getReturn_msg()); 
 | 
        if (result.getReturn_code().equals("SUCCESS")) { 
 | 
            // 请求成功, 构建BrandWCPayRequest发起支付需要的参数 
 | 
            BrandWCPayRequestData payData = new BrandWCPayRequestData(result.getPrepay_id(),appId.getParamValue(),paySecret.getParamValue()); 
 | 
            WebUtil.getRequest().setAttribute("payData", payData); 
 | 
            return payData; 
 | 
        }else{ 
 | 
            LogUtil.error("创建微信支付订单失败msg={}",result.getReturn_msg()); 
 | 
            throw new GlobleException("创建微信支付订单失败,请检查程序配置"); 
 | 
        } 
 | 
  
 | 
    } 
 | 
     
 | 
     
 | 
    /**@Description 支付后,向微信发送请求、查询订单,看订单是否真的支付成功了 
 | 
       @date 2017年6月27日 
 | 
       @atuhor jiangyouyao 
 | 
     * @param transactionID 微信生成的订单id transactionID和trUuid任意一个即可,另外一个可为空,若两个参数都不为空则transactionID优先 
 | 
     * @param trUuid 系统(项目中)产生的原订单id 
 | 
     * @param orderPrice 原订单的价格 
 | 
     * @return 
 | 
     */ 
 | 
    public boolean isPaySuccess(String transactionID,String trUuid){ 
 | 
            boolean isSucess=false; 
 | 
            try { 
 | 
                JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness(); 
 | 
                ScanPayQueryReqData scanPayQueryReqData = new ScanPayQueryReqData(transactionID, trUuid); 
 | 
                ScanPayQueryService scanPayQueryService = new ScanPayQueryService(); 
 | 
                ScanPayQueryResData result = jsApiPayBusiness.queryPrapareOrder(scanPayQueryService, scanPayQueryReqData); 
 | 
                WebUtil.getRequest().setAttribute("msg", result.toString()); 
 | 
                //订单金额相等 
 | 
                //isSucess=result.getTotal_fee().equals(orderPrice.multiply(new BigDecimal("100")).doubleValue()+""); 
 | 
                 
 | 
                if (result.getReturn_code().equals("SUCCESS")) { 
 | 
                    isSucess=true; 
 | 
                } 
 | 
            }  catch (Exception e) { 
 | 
                LogUtil.error("#查询订单异常#transactionID:{}#trUuid:{}", e, transactionID,trUuid); 
 | 
            } 
 | 
            return isSucess; 
 | 
    } 
 | 
    /**@Description 用户提现提现审核,企业付款到个人 
 | 
       @date 2017年5月26日 
 | 
       @atuhor jiangyouyao 
 | 
     * @param desc 描述 
 | 
     * @param outTradeNo  提现申请编号 
 | 
     * @param totalFee 提现金额(分) 
 | 
     * @param openid 
 | 
     * @return 
 | 
     */ 
 | 
    public JsApiPayComResData comPay(String desc, String outTradeNo,int totalFee, String openid){ 
 | 
        JsApiPayComResData result=null; 
 | 
        //boolean flag=false; 
 | 
        try { 
 | 
            JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness(); 
 | 
            // TODO 企业付款 
 | 
            Long companyId=HostInterceptor.getCompanyId(); 
 | 
            BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_MCHID, companyId); 
 | 
            BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId); 
 | 
  
 | 
  
 | 
            JsApiPayComReqData jsApiPayComReqData=new JsApiPayComReqData(mchID.getParamValue(),paySecret.getParamValue(),"","",0,"","",""); 
 | 
            JsApiPayComService jsApiPayComService=new JsApiPayComService(); 
 | 
            result = jsApiPayBusiness.payComOrder(jsApiPayComService, jsApiPayComReqData); 
 | 
            LogUtil.info("#提现,企业付款到个人---result:{}",result); 
 | 
            if (result.getResult_code().equals("SUCCESS")) { 
 | 
                return result; 
 | 
            }else{ 
 | 
                 throw new GlobleException(result.getErr_code_des()); 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            LogUtil.error("#企业付款到个人异常#提现#outTradeNo:{}#opUserID:{}", e, outTradeNo,openid); 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
     
 | 
     
 | 
    /**@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){ 
 | 
        LogUtil.info("#---outTradeNo:{}#---outRefundNo:{}#---totalFee:{}#---refundFee:{}", 
 | 
                outTradeNo,outRefundNo,totalFee,refundFee); 
 | 
        BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_MCHID, HostInterceptor.getCompanyId()); 
 | 
        if(opUserID==null){ 
 | 
            opUserID=mchID.getParamValue(); 
 | 
        } 
 | 
        RefundResData result=null; 
 | 
        boolean flag=false; 
 | 
        try { 
 | 
            JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness(); 
 | 
            Long companyId=HostInterceptor.getCompanyId(); 
 | 
            BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId); 
 | 
            BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId); 
 | 
            BusParameterSettings certLocalPath = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_CERTLOCAL_PATH, companyId); 
 | 
  
 | 
            RefundReqData refundReqData=new RefundReqData(mchID.getParamValue(),appId.getParamValue(),paySecret.getParamValue(), outTradeNo, outRefundNo, totalFee, refundFee,opUserID); 
 | 
            RefundService refundService=new RefundService(); 
 | 
            HttpsRequest2 request2= (HttpsRequest2) refundService.getServiceRequest(); 
 | 
            request2.setCertLocalPath(certLocalPath.getParamValue()); 
 | 
            request2.setMchId(mchID.getParamValue()); 
 | 
  
 | 
            result = jsApiPayBusiness.refundComOrder(refundService, refundReqData); 
 | 
            LogUtil.info("#退款,企业付款到个人---result:{}",result); 
 | 
            //如果返回余额不足时 
 | 
            if (StringUtils.equals(AppConstance.REFUND_FAIL_NOTENOUGH, result.getErr_code())) { 
 | 
                LogUtil.info("#退款失败,{}!", "商户余额不足"); 
 | 
                throw new GlobleException("退款失败,请联系管理员!"); 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            LogUtil.error("#企业付款到个人异常#退款#outTradeNo:{}#opUserID:{}", e, outTradeNo,opUserID); 
 | 
        } 
 | 
         
 | 
        if (result.getResult_code().equals(WechatConfigure.SUCCESS)) { 
 | 
             flag=true; 
 | 
        }else{ 
 | 
             flag=false; 
 | 
             throw new GlobleException(result.getErr_code_des()); 
 | 
        } 
 | 
        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;  
 | 
       }  
 | 
     
 | 
     
 | 
} 
 |