package com.dk.oauth.service.wxapi.basic; import com.dk.common.response.ResponseResultUtil; import com.dk.common.response.ResponseResultVO; import com.dk.common.util.*; import com.dk.oauth.config.WechatPayConfigInfo; import com.dk.oauth.entity.Company; import com.dk.oauth.entity.Trade; import com.dk.oauth.entity.UserLogin; import com.dk.oauth.mapper.CompanyMapper; import com.dk.oauth.mapper.TradeMapper; import com.dk.oauth.mapper.UserMapper; import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * 微信支付服务 * 后台管理设置的金额 从dkic_ms里取数据 金额 * 所以放到了 权限的oauth-server 的服务里240327 * * @author 姜永辉 * @since 20223-07-01 09:41:05 */ @Service("wechatPayService") @Slf4j public class WechatPayService { @Autowired private WechatPayConfigInfo wechatPayConfigInfo; @Autowired private TradeMapper tradeMapper; @Autowired private UserMapper userMapper; @Autowired private CompanyMapper companyMapper; /** * 商户 下单选取旗舰版或专业版的订单 * * @param param * @return * @throws WxPayException */ public ResponseResultVO unifiedOrder(Map param) throws WxPayException { String paymentSn = param.get("paymentSn").toString(); String openId = param.get("openId").toString(); log.info("下单选取旗舰版或专业版的订单1----------" + param.toString()); try { // 获取单据的金额 --后台管理设置的金额 从dkic_ms里取数据 金额 // 所以放到了 权限的oauth-server 的服务里 // todo。。。。。。。。。。。。 String payFee = "0.01"; WxPayService wxPayService = this.getWxPayService(); WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); orderRequest.setBody("商品测试"); orderRequest.setOutTradeNo(paymentSn); orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(payFee.toString()));//元转成分 orderRequest.setOpenid(openId); orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest())); orderRequest.setNotifyUrl(wechatPayConfigInfo.getWechatNotifyUrl() + "/" + wechatPayConfigInfo.getAppId()); orderRequest.setTradeType("JSAPI"); // 生成预支付订单 WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(orderRequest); String prepay_id = wxPayUnifiedOrderResult.getPrepayId(); String timeStamp = new Date().getTime() + ""; String nonceStr = UUID.fastUUID().toString(true); String pack = "prepay_id=" + prepay_id; String signType = "MD5"; String paySign = ""; String sigmTemp = "appId=" + wxPayUnifiedOrderResult.getAppid() + "&nonceStr=" + nonceStr + "&package=" + pack + "&signType=" + signType + "&timeStamp=" + timeStamp; sigmTemp = sigmTemp + "&key=" + wechatPayConfigInfo.getMchKey(); paySign = Md5Utils.hash(sigmTemp); log.info("下单选取旗舰版或专业版的订单2----------" + prepay_id + "--" + sigmTemp + "--"); Map params = new HashMap(); params.put("appId", wxPayUnifiedOrderResult.getAppid()); params.put("timeStamp", timeStamp); params.put("nonceStr", nonceStr); params.put("pack", pack); params.put("signType", signType); params.put("paySign", paySign); log.info("下单选取旗舰版或专业版的订单3----------" + params.toString()); return ResponseResultUtil.success(params); } catch (Exception e) { log.error("unifiedOrder--微信支付失败!支付单号:{},原因:{}", paymentSn, e.getMessage()); return ResponseResultUtil.error("支付失败,请稍后重试!"); } } /** * @desc : 处理支付成功逻辑 * @author : 姜永辉 * @date : 2024/03/06 11:29 */ @Transactional( rollbackFor = {Exception.class} ) public ResponseResultVO notifyWechatPay(WxPayOrderNotifyResult info) { log.info("处理支付成功逻辑----------" + info.getOutTradeNo() + "---------" + info.toString()); UserLogin byWxid = userMapper.getByWxid(info.getOpenid()); log.info("微信用户----------" + byWxid); // 插入 待支付的 数据 BigDecimal payFee = new BigDecimal(info.getTotalFee()).divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN); Integer cpid = byWxid.getCurrentCp(); // 交易记录 Trade trade = new Trade(); trade.setTradeCode(info.getTransactionId()); // 微信交易单号 trade.setCpId(cpid); trade.setWxUserId(byWxid.getUserId()); trade.setTradeAmount(payFee); trade.setTradeType("功能单买"); trade.setBuyLong("1年"); trade.setBuyBeginDate(LocalDate.now()); trade.setBuyEndDate(LocalDate.now().plusYears(1)); trade.setWxGradeCoNo(info.getTransactionId());// 微信交易单号 trade.setExtendDays(365); tradeMapper.insert(trade); log.info("交易记录----------" + trade); // 企业 Company c = new Company(); c.setCpId(cpid); // 结束日期 c.setEndDate(LocalDate.now().plusYears(1)); companyMapper.updateById(c); log.info("交易记录-企业更新----------" + c); return ResponseResultUtil.success(); } /** * @desc : 获取商户配置信息 * @author : 姜永辉 * @date : 2023-08-02 17:30 */ public WxPayService getWxPayService() { log.info("getWxPayService----------" + wechatPayConfigInfo.toString()); WxPayConfig payConfig = new WxPayConfig(); payConfig.setAppId(StringUtils.trimToNull(wechatPayConfigInfo.getAppId())); payConfig.setMchId(StringUtils.trimToNull(wechatPayConfigInfo.getMchId())); payConfig.setMchKey(StringUtils.trimToNull(wechatPayConfigInfo.getMchKey())); // payConfig.setSubAppId(null); // payConfig.setSubMchId(null); // payConfig.setKeyPath(StringUtils.trimToNull(wechatPayConfigInfo.getKeyPath())); // 可以指定是否使用沙箱环境 payConfig.setUseSandboxEnv(false); WxPayService wxPayService = new WxPayServiceImpl(); wxPayService.setConfig(payConfig); return wxPayService; } }