1、实现申请好微信商户号appid,微信拿到商户id和商户秘钥,和支退款的付宝附代话需要商户证书
2、申请好支付宝商户号appid,支付商户公钥和秘钥(需要用支付宝工具自己生成),没想码支付宝退款不需要证书

AliPayServiceImpl
package com.qcsoft.payment.service.impl; import com.alibaba.fastjson.JSON; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.AlipayTradeAppPayModel; import com.alipay.api.domain.AlipayTradePrecreateModel; import com.alipay.api.domain.AlipayTradeRefundModel; import com.alipay.api.domain.AlipayTradeWapPayModel; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.*; import com.alipay.api.response.*; import com.qcsoft.commonbean.bean.payment.AlipayConfig; import com.qcsoft.commonbean.bean.payment.alipay.AliPayRefundParam; import com.qcsoft.commonbean.bean.payment.common.PayConstant; import com.qcsoft.commonbean.bean.payment.common.PayNotify; import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; import com.qcsoft.easyqinyutools.message.ReturnMsg; import com.qcsoft.payment.commns.exception.BaseException; import com.qcsoft.payment.commns.exception.QYError; import com.qcsoft.payment.commns.utils.DateUtils; import com.qcsoft.payment.commns.utils.RedisUtil; import com.qcsoft.payment.service.AliPayService; import com.qcsoft.payment.service.AlipayConfigService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.net.URLEncoder; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * 支付宝相关业务实现类 */ @Service public class AliPayServiceImpl implements AliPayService { private static final Logger logger = LoggerFactory.getLogger(AliPayServiceImpl.class); @Autowired private AlipayConfigService alipayConfigService; @Autowired private RedisUtil redisUtil; @Value("${payNotifyUrl}") private String notifyUrl; /** * APP支付 * 参数加签 */ @Override public String aliAppPay(AlipayClient alipayClient, PreOrderParam orderParam) { logger.info("AliPayServiceImpl.aliAppPay--->>>\n支付宝预支付开始,\n支付类型为:APP支付,\n订单号为:{}", orderParam.getDh()); Date date = new Date(); AlipayTradeAppPayResponse response = null; // 发起App支付请求 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); // 订单描述 model.setBody(orderParam.getBody()); // 订单标题 model.setSubject(orderParam.getSubject()); // 商户订单号 就是商户后台生成的订单号 model.setOutTradeNo(orderParam.getOutTradeNo()); // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天 (屁股后面的字母一定要带,不然报错) model.setTimeoutExpress(DateUtils.toString(date, orderParam.getTimeExpire())); // 订单总金额 ,默认单位为元,精确到小数点后两位,取值范围[0.01,100000000] model.setTotalAmount(orderParam.getTotalAmount().toString()); // 销售产品码 model.setProductCode(PayConstant.ALIPAY_QUICK_WAP_WAY.getKey()); AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); request.setBizModel(model); // request.setNotifyUrl("商户外网可以访问的异步地址,不写就是不回调"); request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh()); //支付成功返回地址 request.setReturnUrl(orderParam.getRedirectUrl()); // 通过api的方法请求阿里接口获得反馈 logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预支付接口请求信息:{}", JSON.toJSONString(request)); try { response = alipayClient.sdkExecute(request); } catch (AlipayApiException e) { logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预下单失败,\n本次下单的亿华云订单号为:{},\n相关报错信息为:{}", orderParam.getDh(), response, e); throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]")); } logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); if (response.isSuccess()) { logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预下单成功,\n本次下单的订单号为:{},商户订单号为:{}", orderParam.getDh(), orderParam.getOutTradeNo()); } else { logger.error("AliPayServiceImpl.aliAppPay----->\n调用支付宝预下单接口失败!\n具体信息为:\n{}", response.getBody()); throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + response.getMsg() + "]")); } return response.getBody(); } /** * 扫码支付 * 参数加签 */ @Override public String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam) { logger.info("AliPayServiceImpl.aliScanPay--->>>\n支付宝预支付开始,\n支付类型为:扫码支付,\n订单号:{}", orderParam.getDh()); /* AlipayTradePagePayResponse response = null;*/ AlipayTradePrecreateResponse response = null; Date date = new Date(); /** * 设置请求model参数(body、subject、outTradeNo、totalAmount、timeoutExpress;必传) */ AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); // 订单描述 model.setBody(orderParam.getBody()); // 订单标题 model.setSubject(orderParam.getBody()); // 商户订单号 就是商户后台生成的订单号 model.setOutTradeNo(orderParam.getOutTradeNo()); // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天 (屁股后面的字母一定要带,不然报错) model.setTimeoutExpress(orderParam.getTimeExpire()); //model.setSellerId(DateUtils.toString(date, "yyyyMMddHHmmssSSS")); // 订单总金额 ,默认单位为元,精确到小数点后两位,取值范围[0.01,100000000] model.setTotalAmount(orderParam.getTotalAmount().toString()); //model.setProductCode(PayConstant.ALIPAY_FAST_INSTANT_TRADE_PAY.getKey()); // 选填 /** * 创建支付宝扫码支付请求接口类,设置相关请求处理信息,准备请求下单 */ AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); request.setBizModel(model); // request.setNotifyUrl("商户外网可以访问的异步地址,不写就是不回调"); request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh()); //支付成功返回地址 request.setReturnUrl(orderParam.getRedirectUrl()); // 通过api的方法请求阿里接口获得反馈 alipayClient.pageExecute(request) try { logger.info("支付宝扫码付请求报文:{}",JSON.toJSONString(request)); response = alipayClient.execute(request)/**/; } catch (AlipayApiException e) { logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预下单失败,\n本次下单的订单号:{},\n相关报错信息为:{}", orderParam.getDh(), response, e); throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]")); }catch (Exception e){ e.printStackTrace(); throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]")); } //打印返回信息 logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); //判断预下单返回状态 if (response.isSuccess()) { logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预下单成功,\n本次下单的订单号:{},商务订单号为", orderParam.getDh(), orderParam.getOutTradeNo()); } else { logger.error("AliPayServiceImpl.aliScanPay----->\n调用支付宝预下单接口失败!\n具体信息:\n{}", response.getBody()); throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + response.getMsg() + "]")); } return response.getQrCode(); } /** * H5支付 * 参数加签 */ @Override public String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam) { logger.info("AliPayServiceImpl.aliH5Pay--->>>\n支付宝预支付开始,\n支付类型为:H5支付,\n订单号:{}", orderParam.getDh()); String form = ""; AlipayTradeWapPayResponse response = null; /** * 封装请求支付信息 */ AlipayTradeWapPayModel payModel = new AlipayTradeWapPayModel(); payModel.setOutTradeNo(orderParam.getOutTradeNo()); payModel.setSubject(orderParam.getBody()); payModel.setTotalAmount(orderParam.getTotalAmount().toString()); payModel.setBody(orderParam.getBody()); payModel.setTimeoutExpress(orderParam.getTimeExpire()); payModel.setProductCode(PayConstant.ALIPAY_QUICK_WAP_WAY.getKey()); payModel.setQuitUrl(URLEncoder.encode(orderParam.getQuitUrl())); /** * 创建支付宝H5支付请求接口类,设置相关请求处理信息,准备请求下单 */ AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest(); alipay_request.setBizModel(payModel); // 设置异步通知地址 logger.info("通知地址{}", notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh()); alipay_request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh()); // 设置同步地址 alipay_request.setReturnUrl(URLEncoder.encode(orderParam.getRedirectUrl())); // 调用SDK生成表单 try { response = alipayClient.pageExecute(alipay_request); if (response.isSuccess()) { form = response.getBody(); logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); } else { logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); throw new BaseException(QYError.msg("支付宝")); } } catch (AlipayApiException e) { logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]")); } logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); /** * 打印日志,并返回链接 */ return form; } /** * 支付宝通知 * * @param params */ @Override public void aliPayNotify(PayNotify params) { logger.info("AliPayServiceImpl.appAliPayNotify-\n阿里服务器消费手机回调参数获取和参数判断-------》》》"); /** * 打印信息 */ //校验支付金额 /*ReturnMsg returnMsg = restTemplate.postForEntity(params.getNoOrderAmountUrl(), params, ReturnMsg.class).getBody(); if (!returnMsg.isSuccess()) { logger.info("WxPayController.wxPayNotify-->\n校验订单金额失败,网站模板请核实商务订单号:{}", params); throw new BaseException(QYError.msg("校验订单金额失败!商务订单号[" + params.getOutTradeNo() + "]")); }*/ /** * 判断支付状态 */ if (params.getTradeStatus().equals("TRADE_SUCCESS")) { logger.info("AliPayServiceImpl.appAliPayNotify----\n支付宝支付成功!商务订单号[{}]----->>", params.getOutTradeNo(), JSON.toJSONString(params)); } else { logger.error("AliPayServiceImpl.appAliPayNotify---\n支付宝支付失败!商务订单号[{}]---->>", params.getOutTradeNo()); throw new BaseException(QYError.msg("支付宝支付失败!商务订单号[" + params.getOutTradeNo() + "]")); } } @Override public boolean rsaCheckV1(HttpServletRequest request, String appCode) { //获取支付宝GET过来反馈信息 Map<String, String> params = new HashMap<String, String>(); // 签名验证(对支付宝返回的数据验证,确定是支付宝返回的) boolean result = false; try { // 从支付宝回调的request域中取值 Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) { String name = iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } params.put(name, valueStr); } logger.info("AliPayServiceImpl.appAliPayNotify--\n支付宝通知数据包----->>>>>>>>>>>>>>>{}", JSON.toJSONString(params)); // 商家编码 AlipayConfig alipayConfig = getConfigByAppCode(appCode); result = AlipaySignature.rsaCheckV1(params, alipayConfig.getAliPublicKey(), PayConstant.ALIPAY_CHARSET.getKey(), PayConstant.ALIPAY_SIGN_TYPE_RSA2.getKey()); } catch (Exception e) { logger.error("AliPayServiceImpl.appAliPayNotify---\n校验签名失败!商务订单号[{}]---->>", JSON.toJSONString(request), e); throw new BaseException(QYError.msg("支付宝支付校验签名失败!")); } return result; } /** * 根据商务订单号查询查询支付信息 * * @param alipayClient * @param out_trade_no * @return */ @Override public AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no) { logger.info("AliPayServiceImpl.aliPayOrderQuery----\n根据商务订单号查询支付宝订单信息,\n商务订单号:[{}]----》》》", out_trade_no); AlipayTradeQueryResponse response = null; AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); //设置查询参数 Map<String, String> bizModel = new HashMap<>(); bizModel.put("out_trade_no", out_trade_no); request.setBizContent(JSON.toJSONString(bizModel)); //开始查询 try { response = alipayClient.execute(request); } catch (AlipayApiException e) { logger.error("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询失败,\n商务订单号:[{}]", out_trade_no); throw new BaseException(QYError.msg("订单号[" + out_trade_no + "],订单支付失败,状态码为[" + response.getTradeStatus() + "]")); } logger.info("AliPayServiceImpl.aliPayOrderQuery---->>\n查询支付宝订单信息,\n商务订单号:[{}],\n返回信息:{}", out_trade_no, JSON.toJSONString(response)); //查询状态处理 if (response.isSuccess()) { logger.info("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询成功,\n商务订单号:[{}]", out_trade_no); } else { logger.error("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询失败,\n商务订单号:[{}]", out_trade_no); throw new BaseException(QYError.msg("订单号[" + out_trade_no + "],订单支付失败,状态码为[" + response.getTradeStatus() + "]")); } return response; } /** * 根据商家编码设置alipay配置信息 * * @param appCode 商家编码 * @return */ @Override public AlipayClient getAlipayClientByAppCode(String appCode) { logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝配置信息:[{}]", appCode); AlipayConfig alipayConfig = null; /** * 获取商家支付宝配置信息(优先级:1-redis,2-mysql,3-用户系统) */ try { alipayConfig = getConfigByAppCode(appCode); if (alipayConfig == null) { logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝支付配置信息失败:[{}]", appCode); logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝支付配置信息失败:[{}{}]", appCode,alipayConfig); throw new BaseException(QYError.msg("获取支付宝支付配置信息失败!")); } } catch (Exception e) { logger.error("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝配置信息失败:[{}]", e); throw new BaseException(QYError.msg("获取支付宝配置信息失败!")); } AlipayClient alipayClient = new DefaultAlipayClient( PayConstant.ALIPAY_01.getKey(), alipayConfig.getAliAppid(), alipayConfig.getAliPrivateKey(), PayConstant.ALIPAY_FORMAT.getKey(), PayConstant.ALIPAY_CHARSET.getKey(), alipayConfig.getAliPublicKey(), PayConstant.ALIPAY_SIGN_TYPE_RSA2.getKey()); return alipayClient; } //获取商家支付宝的配置信息 public AlipayConfig getConfigByAppCode(String appCode) { AlipayConfig alipayConfig = alipayConfigService.selectByAppCode(appCode); return alipayConfig; } /** * 支付宝退款接口 * @param aliPayRefundParam * @return */ public ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam){ ReturnMsg returnMsg=new ReturnMsg(); String appCode=aliPayRefundParam.getAppCode(); AlipayClient alipayClient = getAlipayClientByAppCode(appCode); AlipayTradeRefundResponse response = null; AlipayTradeRefundModel model = new AlipayTradeRefundModel(); //订单支付时传入的商户订单号,不能和 trade_no同时为空。 model.setOutTradeNo(aliPayRefundParam.getOutTradeNo()); //支付宝交易号,和商户订单号不能同时为空 //model.setTradeNo(aliPayRefundParam.getTradeNo()); //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。 model.setOutRequestNo(aliPayRefundParam.getOutRequestNo()); // 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数 model.setRefundAmount(aliPayRefundParam.getRefundAmount()); //退款的原因说明 model.setRefundReason(aliPayRefundParam.getRefundReason()); /** * 创建支付宝扫码支付请求接口类,设置相关请求处理信息,准备请求下单 */ AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); request.setBizModel(model); //商户外网可以访问的异步地址,不写就是不回调 request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + aliPayRefundParam.getAppCode() + "/" + aliPayRefundParam.getDh()); //支付成功返回地址 request.setReturnUrl(aliPayRefundParam.getRedirectUrl()); // 通过api的方法请求阿里接口获得反馈 alipayClient.pageExecute(request) try { logger.info("支付宝退款请求完整报文:{}",JSON.toJSONString(request)); response = alipayClient.execute(request)/**/; } catch (AlipayApiException e) { logger.info("支付宝退款失败,\n本次下单的订单号:{},\n相关报错信息为:{}", aliPayRefundParam.getDh(), response, e); throw new BaseException(QYError.msg("调用支付宝预退款失败![" + e.getMessage() + "]")); }catch (Exception e){ e.printStackTrace(); throw new BaseException(QYError.msg("支付宝预退款失败![" + e.getMessage() + "]")); } //打印返回信息 logger.info("支付宝退款失败:{}", JSON.toJSONString(response)); //判断预下单返回状态 if (response.isSuccess()&&"Y".equals(response.getFundChange())) { logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝退款成功,\n本次下单的订单号:{},商务订单号为,{}", aliPayRefundParam.getDh(), aliPayRefundParam.getOutTradeNo()); return returnMsg.setData("退款成功"); } else { logger.error("AliPayServiceImpl.aliScanPay----->\n调用支付宝退款接口失败!\n具体信息:\n{}", response.getBody()); throw new BaseException(QYError.msg("调用支付宝退款接口失败![" + response.getBody() + "]")); } } }WxPayServiceImpl
package com.qcsoft.payment.service.impl; import com.alibaba.fastjson.JSON; import com.qcsoft.commonbean.bean.payment.PayLog; import com.qcsoft.commonbean.bean.payment.WxConfig; import com.qcsoft.commonbean.bean.payment.WxMinConfig; import com.qcsoft.commonbean.bean.payment.common.PayConstant; import com.qcsoft.commonbean.bean.payment.common.PayNotify; import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.*; import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayOrderQueryRequest; import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest; import com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult; import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayOrderQueryResult; import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult; import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig; import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException; import com.qcsoft.commonbean.bean.payment.wx.handler.EntPayHandler; import com.qcsoft.commonbean.bean.payment.wx.handler.WxPayHandler; import com.qcsoft.commonbean.bean.payment.wx.handler.impl.EntPayHandlerImpl; import com.qcsoft.commonbean.bean.payment.wx.handler.impl.WxPayHandlerApacheHttpImpl; import com.qcsoft.payment.commns.exception.BaseException; import com.qcsoft.payment.commns.exception.QYError; import com.qcsoft.payment.commns.utils.DateUtils; import com.qcsoft.payment.commns.utils.RedisUtil; import com.qcsoft.payment.service.PayLogService; import com.qcsoft.payment.service.WxConfigService; import com.qcsoft.payment.service.WxMinConfigService; import com.qcsoft.payment.service.WxPayService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Date; @Service @Slf4j public class WxPayServiceImpl implements WxPayService { private static final Logger logger = LoggerFactory.getLogger(WxPayServiceImpl.class); @Value("${payNotifyUrl}") private String notifyUrl; @Autowired private RedisUtil redisUtil; @Autowired private WxConfigService wxConfigService; @Autowired private WxMinConfigService wxMinConfigService; @Autowired private PayLogService payLogService; /** * @param config {appId:应用ID,mchId:商务号ID,mchKey:商务号密钥,notifyUrl:异步通知地址,signType:签名类型} * @param request {body:订单描述,totalFee:金额, * spbillCreateIp:app和h5支付需要用户的真实请求地址Native支付填调用微信支付API的机器IP, * tradeType:SAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里, * outTradeNo:商户订单号,productId:商品Id(扫码支付必传,其他选填),openid:公众号openId} 还有很多参数选填 * @return * @throws WxPayException */ @Override public WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request) { logger.info("WxPayServiceImpl.wxPrePay--->>\n微信预支付,\n商务订单号:[{}]", request.getOutTradeNo()); WxPayHandler wx = new WxPayHandlerApacheHttpImpl(); WxPayUnifiedOrderResult orderResult = null; wx.setConfig(config); log.info("WxPayUnifiedOrderResult ={}", config.getNotifyUrl()); try { orderResult = wx.unifiedOrder(request); } catch (WxPayException e) { logger.error("WxPayServiceImpl.wxPrePay--->>\n微信预支付失败,\n商务订单号:[{}]", request.getOutTradeNo(), orderResult); logger.error("异常信息{}", e.getMessage()); throw new BaseException(QYError.msg("订单号[" + request.getOutTradeNo() + "]预支付失败!")); } return orderResult; } /** * 根据商家编码获取微信商户配置信息 * * @param appCode * @return */ @Override public WxPayConfig getWxPayConfigByAppCode(String appCode, String bmCode) { logger.info("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息:appCode[{}],bmCode[{}]", appCode, bmCode); WxConfig config = null; WxPayConfig wxPayConfig = new WxPayConfig(); /** * 获取商家支付宝配置信息(优先级:1-redis,2-mysql,3-用户系统) */ try { //2、mysql if (config == null) { if (StringUtils.isNotBlank(bmCode)) { config = wxConfigService.selectByBmCode(bmCode, appCode); //如果部门取不到,则去商家的配置 if (config == null) config = wxConfigService.selectByAppCode(appCode); } else { config = wxConfigService.selectByAppCode(appCode); } } if (config == null) { logger.warn("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息失败:[{}]", appCode); throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); } } catch (Exception e) { logger.error("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息失败:[{}]", e); throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); } //根据appCode查询商家微信配置信息 wxPayConfig.setAppId(config.getAppid()); wxPayConfig.setMchId(config.getMchId()); wxPayConfig.setMchKey(config.getMchKeySecret()); wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey()); wxPayConfig.setKeyUrl(config.getCrtPath()); wxPayConfig.setKeyPath(config.getCrtPath()); log.info("获取微信公众号配置为 [{}],转为微信支付实体为 [{}]",config,wxPayConfig); return wxPayConfig; } @Override public WxPayConfig getWxMinPayConfigByAppCode(String appCode, String sysSoftwareCode) { logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息:[{}]", appCode); if (StringUtils.isBlank(sysSoftwareCode)) { sysSoftwareCode = "store-service"; } WxMinConfig config = null; WxPayConfig wxPayConfig = new WxPayConfig(); /** * 获取商家支付宝配置信息(优先级:1-redis,2-mysql,3-用户系统) */ try { if (config == null) { //config = wxMinConfigService.selectByAppCode(appCode); config = wxMinConfigService.selectBySysSoftwareCode(appCode,sysSoftwareCode); } if (config == null) { logger.warn("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息失败:[{}]", appCode); throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); } } catch (Exception e) { logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息失败:[{}]", e); throw new BaseException(QYError.msg("获取微信小程序支付配置信息失败!")); } //根据appCode查询商家微信配置信息 wxPayConfig.setAppId(config.getAppid()); wxPayConfig.setMchId(config.getMchId()); wxPayConfig.setMchKey(config.getMchKeySecret()); wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey()); wxPayConfig.setKeyUrl(config.getCrtPath()); wxPayConfig.setKeyPath(config.getCrtPath()); log.info("获取微信小程序退款配置为 [{}],转为微信支付实体为 [{}]",config,wxPayConfig); return wxPayConfig; } /** * 封装预下单参数实体 * * @param orderParam 预支付接口参数实体 * @param order 点单 * @return */ @Override public WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam) { Date date = new Date(); BigDecimal paramAmount = new BigDecimal(orderParam.getTotalAmount().toString()); BigDecimal multiplyNum = new BigDecimal("100"); WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder() .body(orderParam.getBody()) .totalFee(paramAmount.multiply(multiplyNum).intValue()) .spbillCreateIp(orderParam.getReqId()) .notifyUrl(notifyUrl + PayConstant.WXPAY_09.getKey()) .tradeType(orderParam.getTradeType()) .outTradeNo(orderParam.getOutTradeNo()) .build(); log.info("WxPayUnifiedOrderRequest = {}", PayConstant.WXPAY_09.getKey()); request.setProductId(orderParam.getDh()); request.setDetail(orderParam.getSubject()); PayNotify payNotify = new PayNotify(); payNotify.setAppCode(orderParam.getAppCode()); payNotify.setCode(orderParam.getBmCode()); payNotify.setDh(orderParam.getDh()); request.setAttach(JSON.toJSONString(payNotify)); if (orderParam.getTradeType().equals(PayConstant.JSAPI.toString())) { request.setOpenid(orderParam.getOpenId()); } //开始时间 request.setTimeStart(DateUtils.getLastMinute(date, 0)); //有效期 request.setTimeExpire(orderParam.getTimeExpire()); return request; } /** * 订单查询 * * @param appCode 商家编码 * @param dh 订单号 * @param sysSoftwareCode * @return */ @Override public WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode) { logger.info("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询,\n本次查询的商家编码为:[{}],商务订单号:[{}]", appCode, dh); WxPayHandler handler = new WxPayHandlerApacheHttpImpl(); WxPayOrderQueryRequest request = new WxPayOrderQueryRequest(); WxPayOrderQueryResult queryResult = null; WxPayConfig config = null; try { PayLog payLog = payLogService.selectByDh(dh); if (payLog==null) { //商家的微信支付 if (type == null || type == 1) { bmCode = null; config = this.getWxPayConfigByAppCode(appCode, bmCode); //部门的微信支付支付 } else if (type == 2) { config = this.getWxPayConfigByAppCode(appCode, bmCode); //商家小程序支付 } else if (type == 3) { config = this.getWxMinPayConfigByAppCode(appCode,sysSoftwareCode); } }else{ config = JSON.parseObject(payLog.getPayConfigJsonStr(), WxPayConfig.class); } request.setOutTradeNo(dh); handler.setConfig(config); queryResult = handler.queryOrder(request); logger.info("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询成功,\n返回包信息:[{}]", JSON.toJSONString(queryResult)); } catch (WxPayException e) { logger.error("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询失败,\n商务订单号:[{}]", dh); throw new BaseException(QYError.msg("微信订单查询失败,商务订单号:[{}]" + dh + "")); } return queryResult; } /** * 企业支付 * @param params * @return: com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult * @Author: * @date: */ @Override public BaseWxPayResult entPay(EntPayParam params) throws WxPayException { WxPayHandler wxPayHandler = new WxPayHandlerApacheHttpImpl(); WxPayConfig config = null; EntPayResult result = null; EntPayBankResult bankResult = null; if (params.getTradeType() != null && params.getTradeType() == 3) { config = this.getWxMinPayConfigByAppCode(params.getAppCode(),params.getSysSoftwareCode()); } else { config = this.getWxPayConfigByAppCode(params.getAppCode(), params.getBmCode()); } config.setUseKey(true); wxPayHandler.setConfig(config); if (params.getTradeType()==1) { EntPayRequest request = packEntPayRequest(params,config); EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler); result = entPayHandler.entPay(request); return result; }else{ EntPayBankRequest request = packEntPayBankRequest(params); EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler); bankResult = entPayHandler.payBank(request); return bankResult; } } /** * 封装微信企业支付请求参数 * @param params * @return: com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayRequest * @Author: * @date: */ public EntPayRequest packEntPayRequest(EntPayParam params,WxPayConfig config) { EntPayRequest request = new EntPayRequest(); request.setAmount(params.getAmount().multiply(new BigDecimal("10")).intValue()); request.setCheckName("NO_CHECK"); request.setOpenid(params.getOpenid()); request.setSpbillCreateIp(params.getSpbillCreateIp()); request.setPartnerTradeNo(params.getPartnerTradeNo()); request.setMchAppid(config.getAppId()); request.setMchId(config.getMchId()); request.setDescription(params.getDesc()); return request; } /** * 封装银行卡企业支付参数 * @param params * @return: com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayBankRequest * @Author: * @date: */ public EntPayBankRequest packEntPayBankRequest(EntPayParam params) { EntPayBankRequest request = new EntPayBankRequest(); request.setAmount(params.getAmount().multiply(new BigDecimal("10")).intValue()); request.setBankCode(params.getBankCode()); request.setEncTrueName(params.getEncTrueName()); request.setPartnerTradeNo(params.getPartnerTradeNo()); request.setDescription(params.getDesc()); return request; } }