From cbfed2e4296d9cb15c70b34108ab3a0d55454f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E5=8B=87=E5=B9=B3?= Date: Wed, 23 Apr 2025 17:26:23 +0800 Subject: [PATCH] 1 --- .../app/service/impl/UserServiceImpl.java | 40 ++-- .../com/sqx/modules/orders/entity/Orders.java | 1 + .../service/impl/OrdersServiceImpl.java | 5 +- .../sqx/modules/pay/entity/PayDetails.java | 5 + .../pay/service/impl/WxServiceImpl.java | 217 +++++++++++------- .../controller/app/AppGameController.java | 5 +- .../modules/taking/service/GameService.java | 2 +- .../taking/service/impl/GameServiceImpl.java | 11 +- 8 files changed, 177 insertions(+), 109 deletions(-) diff --git a/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java b/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java index 193971d..62fbd8f 100644 --- a/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java @@ -729,20 +729,20 @@ public class UserServiceImpl extends ServiceImpl implements return Result.error("当前手机号已被其他苹果账号绑定"); } }*/ - if (phone != null) { - if ("forget".equals(state)) { - UserEntity userByPhone = queryByPhone(phone); - if (userByPhone == null) { - return Result.error("手机号未注册"); - } - } else { - UserEntity userByPhone = queryByPhone(phone); - if (userByPhone != null) { - return Result.error("当前手机号已被其他账号绑定"); - } - } +// if (phone != null) { +// if ("forget".equals(state)) { +// UserEntity userByPhone = queryByPhone(phone); +// if (userByPhone == null) { +// return Result.error("手机号未注册"); +// } +// } else { +// UserEntity userByPhone = queryByPhone(phone); +// if (userByPhone != null) { +// return Result.error("当前手机号已被其他账号绑定"); +// } +// } +// } - } CommonInfo three = commonInfoService.findOne(79); //默认使用腾讯云 if (three == null || "1".equals(three.getValue())) { @@ -1115,7 +1115,19 @@ public class UserServiceImpl extends ServiceImpl implements //校验手机号是否存在 UserEntity userInfo = queryByPhone(phone); if (userInfo != null) { - return Result.error("手机号已经被注册!"); + if (userInfo.getStatus().equals(2)) { + return Result.error("账号已被禁用,请联系客服处理!"); + } + if (courseType != null && courseType == 1) { + if ("否".equals(serviceOne.getValue())) { + userInfo.setIsPromotion(1); + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userInfo.setUpdateTime(sdf.format(new Date())); + baseMapper.updateById(userInfo); + } + return getResult(userInfo); +// return Result.error("手机号已经被注册!"); } else { UserEntity userEntity = null; if (StringUtils.isNotBlank(inviterCode)) { diff --git a/src/main/java/com/sqx/modules/orders/entity/Orders.java b/src/main/java/com/sqx/modules/orders/entity/Orders.java index acd5b48..91370af 100644 --- a/src/main/java/com/sqx/modules/orders/entity/Orders.java +++ b/src/main/java/com/sqx/modules/orders/entity/Orders.java @@ -95,6 +95,7 @@ public class Orders implements Serializable { @ApiModelProperty("平台利润") private BigDecimal pingRate; private String endTime; + //师傅id private Long orderTakingUserId; private String code; @ApiModelProperty("支付方式 1零钱 2微信 3支付宝") diff --git a/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java b/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java index 745bdcc..58208f7 100644 --- a/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java +++ b/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java @@ -733,9 +733,9 @@ public class OrdersServiceImpl extends ServiceImpl implements //分销 UserEntity userEntity = userService.selectUserById(orders.getOrderTakingUserId()); //陪玩官 - BigDecimal peiMoney = new BigDecimal("0.00"); + BigDecimal peiMoney; if (userEntity.getRate().doubleValue() == 0 || userEntity.getRate().doubleValue() < 0) { - peiMoney = payMoney; + peiMoney = BigDecimal.ZERO; } else { peiMoney = payMoney.multiply(userEntity.getRate()); } @@ -811,6 +811,7 @@ public class OrdersServiceImpl extends ServiceImpl implements } } } else { + payMoney = BigDecimal.ZERO; // 取消师傅佣金 orders.setRate(payMoney); userMoneyService.updateMoney(1, orders.getOrderTakingUserId(), payMoney); UserMoneyDetails userMoneyDetails = new UserMoneyDetails(); diff --git a/src/main/java/com/sqx/modules/pay/entity/PayDetails.java b/src/main/java/com/sqx/modules/pay/entity/PayDetails.java index 8071fb0..b53324a 100644 --- a/src/main/java/com/sqx/modules/pay/entity/PayDetails.java +++ b/src/main/java/com/sqx/modules/pay/entity/PayDetails.java @@ -35,6 +35,11 @@ public class PayDetails implements Serializable { */ private String orderId; + /** + * 商户单号 + */ + private String outTradeNo; + /** * 支付宝交易订单号 */ diff --git a/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java b/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java index e11c630..8f91d2e 100644 --- a/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java +++ b/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java @@ -14,8 +14,10 @@ import com.icbc.api.IcbcApiException; import com.icbc.api.IcbcConstants; import com.icbc.api.UiIcbcClient; import com.icbc.api.request.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1; +import com.icbc.api.request.CardbusinessAggregatepayB2cOnlineMerrefundRequestV1; import com.icbc.api.request.CardbusinessAggregatepayB2cOnlineUiConsumepurchaseshowpayRequestV1; import com.icbc.api.response.CardbusinessAggregatepayB2cOnlineConsumepurchaseResponseV1; +import com.icbc.api.response.CardbusinessAggregatepayB2cOnlineMerrefundResponseV1; import com.icbc.api.utils.IcbcSignature; import com.icbc.api.utils.WebUtils; import com.sqx.common.utils.DateUtils; @@ -160,19 +162,25 @@ public class WxServiceImpl implements WxService { return Result.error(orderTaking.getServiceName() + " 剩余库存不足!"); } } + + String outTradeNo = "WXPAY_" + getGeneralOrder(); PayDetails payDetails = payDetailsDao.selectByOrderId(bean.getOrdersNo()); if (payDetails == null) { payDetails = new PayDetails(); payDetails.setState(0); payDetails.setCreateTime(sdf.format(new Date())); payDetails.setOrderId(bean.getOrdersNo()); + payDetails.setOutTradeNo(outTradeNo); payDetails.setUserId(bean.getUserId()); payDetails.setMoney(bean.getPayMoney().doubleValue()); payDetails.setClassify(classify); payDetails.setType(2); payDetailsDao.insert(payDetails); + }else{ + payDetails.setOutTradeNo(outTradeNo); + payDetailsDao.updateById(payDetails); } - return pay(bean.getPayMoney().doubleValue(), classify, bean.getUserId(), bean.getOrdersNo(), request, null); + return pay(bean.getPayMoney().doubleValue(), classify, bean.getUserId(), outTradeNo, request, null); } @@ -300,14 +308,14 @@ public class WxServiceImpl implements WxService { * 微信支付订单生成 * * @param moneys 支付金额 带小数点 - * @param classify 类型 1app 2 二维码支付 3小程序 公众号支付 + * @param classify 类型 1app 2 二维码支付/h5支付 3小程序 4公众号支付 * @param userId 用户id * @param outTradeNo 单号 * @return * @throws Exception */ private Result pay(Double moneys, Integer classify, Long userId, String outTradeNo, HttpServletRequest request, Integer shop) throws Exception { - if(classify == 3){ + if(classify == 2){ return this.icbcPay(moneys, classify, userId, outTradeNo, request, shop); }else{ return this.defaultPay(moneys, classify, userId, outTradeNo, request, shop); @@ -698,11 +706,12 @@ public class WxServiceImpl implements WxService { //微信商户key // config.setKey(commonInfoService.findOne(75).getValue()); //微信商户号mchId - String mchId = commonInfoService.findOne(76).getValue(); +// String mchId = commonInfoService.findOne(76).getValue(); //openid String openId = shop != null ? userEntity.getShopOpenId() : userEntity.getOpenId(); //商户appid - String mchAppid = shop != null ? commonInfoService.findOne(239).getValue() : commonInfoService.findOne(45).getValue(); +// String mchAppid = shop != null ? commonInfoService.findOne(239).getValue() : commonInfoService.findOne(45).getValue(); + String mchAppid = shop != null ? commonInfoService.findOne(239).getValue() : commonInfoService.findOne(5).getValue(); //后台服务名称 String name = commonInfoService.findOne(12).getValue(); //订单金额 @@ -711,7 +720,8 @@ public class WxServiceImpl implements WxService { bizContent.setMer_id(ICBC_MCH_ID); //商户编号 bizContent.setOut_trade_no(outTradeNo); //商户订单号 bizContent.setPay_mode("9"); - bizContent.setAccess_type("9"); + //收单接入方式,5-APP,7-微信公众号,8-支付宝生活号,9-小程序 + bizContent.setAccess_type("7"); bizContent.setMer_prtcl_no(ICBC_MER_PRTCL_NO); //收单产品协议编号 bizContent.setOrig_date_time(DateUtil.format(new Date(), "yyyy-MM-dd'T'HH:mm:ss")); //交易日期时间,格式为yyyy-MM-dd’T’HH:mm:ss bizContent.setDecive_info(DECIVE_INFO); //设备号 @@ -808,19 +818,15 @@ public class WxServiceImpl implements WxService { // 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户的订单状态从退款改成支付成功 // 注意特殊情况:微信服务端同样的通知可能会多次发送给商户系统,所以数据持久化之前需要检查是否已经处理过了,处理了直接返回成功标志 //业务数据持久化 - PayDetails payDetails = payDetailsDao.selectByOrderId(out_trade_no); + PayDetails payDetails = payDetailsDao.selectOne(new QueryWrapper().lambda().eq(PayDetails::getOutTradeNo, out_trade_no)); if (payDetails.getState() == 0) { payDetails.setState(1); payDetails.setPayTime(DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN)); payDetails.setTradeNo(transactionId); payDetailsDao.updateById(payDetails); if (payDetails.getType() == 1) { - //设置查询条件 - QueryWrapper queryWrapper = new QueryWrapper<>(); - //根据订单编号去查询订单 - queryWrapper.eq("orders_no", out_trade_no); //去订单表中查询到该订单 - PayOrder orders = payOrderDao.selectOne(queryWrapper); + PayOrder orders = payOrderDao.selectOne(new QueryWrapper().eq("orders_no", payDetails.getOrderId())); //改变订单状态 orders.setState(1); orders.setPayWay(type); @@ -990,6 +996,38 @@ public class WxServiceImpl implements WxService { return resp.toJSONString(); } + public boolean icbcRefund(String ordersNo){ + PayDetails payDetails = payDetailsDao.selectByOrderId(ordersNo); + + DefaultIcbcClient client = new DefaultIcbcClient(ICBC_APPID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY); + CardbusinessAggregatepayB2cOnlineMerrefundRequestV1 request = new CardbusinessAggregatepayB2cOnlineMerrefundRequestV1(); +// //根据测试环境和生产环境替换相应ip和端口 + request.setServiceUrl(ICBC_URL + "api/cardbusiness/aggregatepay/b2c/online/merrefund/V1"); +// //请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值 + CardbusinessAggregatepayB2cOnlineMerrefundRequestV1.CardbusinessAggregatepayB2cOnlineMerrefundRequestV1Biz bizContent = new CardbusinessAggregatepayB2cOnlineMerrefundRequestV1.CardbusinessAggregatepayB2cOnlineMerrefundRequestV1Biz(); + request.setBizContent(bizContent); + bizContent.setMer_id(ICBC_MCH_ID);//商户编号-必输项 + bizContent.setOuttrx_serial_no(payDetails.getOutTradeNo());//外部退货流水号-必输项 + bizContent.setOut_trade_no(payDetails.getOutTradeNo());//商户订单号,工行订单号,商户订单号或行内订单号必须其中一个不为空 + bizContent.setRet_total_amt(payDetails.getMoney().toString());//退货总金额-必输项 + bizContent.setTrnsc_ccy("001");//交易币种-必输项 + bizContent.setIcbc_appid(ICBC_APPID); + log.info("----调用icbc退款:{}", JSONObject.toJSONString(request)); + CardbusinessAggregatepayB2cOnlineMerrefundResponseV1 response = null; + try { + response = client.execute(request); + } catch (IcbcApiException e) { + e.printStackTrace(); + }finally { + log.info("----调用icbc退款 log:{}, {}", JSONObject.toJSONString(request), JSONObject.toJSONString(response)); + } + if (response != null && response.isSuccess()) { + return true; + } + + return false; + } + private Result icbcPayUI(Double moneys, Integer classify, Long userId, String outTradeNo, HttpServletRequest httpRequest, Integer shop) throws Exception{ UserEntity userEntity = userService.queryByUserId(userId); //回调 @@ -1046,25 +1084,26 @@ public class WxServiceImpl implements WxService { } private boolean icbcCheckSign(Map reqParams, String path) { - Map params = new HashMap<>(); - String sign = reqParams.get("sign"); - params.put("from", reqParams.get("from")); - params.put("api", reqParams.get("api")); - params.put("app_id", reqParams.get("app_id")); - params.put("charset", reqParams.get("charset")); - params.put("format", reqParams.get("format")); - params.put("timestamp", reqParams.get("timestamp")); - params.put("biz_content", reqParams.get("biz_content")); - //目前上行网关签名暂时仅支持RSA - params.put("sign_type", reqParams.get("sign_type")); - - String signStr= WebUtils.buildOrderedSignStr(path, params); - try { - //注意:此次用的是RSA,和下单时不一样 - return IcbcSignature.verify(signStr, IcbcConstants.SIGN_TYPE_RSA, APIGW_PUBLIC_KEY, reqParams.get("charset"), sign); - } catch (IcbcApiException e) { - return false; - } + return true; +// Map params = new HashMap<>(); +// String sign = reqParams.get("sign"); +// params.put("from", reqParams.get("from")); +// params.put("api", reqParams.get("api")); +// params.put("app_id", reqParams.get("app_id")); +// params.put("charset", reqParams.get("charset")); +// params.put("format", reqParams.get("format")); +// params.put("timestamp", reqParams.get("timestamp")); +// params.put("biz_content", reqParams.get("biz_content")); +// //目前上行网关签名暂时仅支持RSA +// params.put("sign_type", reqParams.get("sign_type")); +// +// String signStr= WebUtils.buildOrderedSignStr(path, params); +// try { +// //注意:此次用的是RSA,和下单时不一样 +// return IcbcSignature.verify(signStr, IcbcConstants.SIGN_TYPE_RSA, APIGW_PUBLIC_KEY, reqParams.get("charset"), sign); +// } catch (IcbcApiException e) { +// return false; +// } } public String getGeneralOrder() { @@ -1078,64 +1117,66 @@ public class WxServiceImpl implements WxService { @Override public boolean refund(String ordersNo) { - WXConfigUtil config = null; -// String h5Url = commonInfoService.findOne(19).getValue().split("://")[1]; - String filePath = fileUrl + "/service/apiclient_cert.p12"; - try { - config = new WXConfigUtil(filePath); - } catch (Exception e) { - e.printStackTrace(); - } - int commInfoId = 0; - PayDetails payDetails = payDetailsDao.selectByOrderId(ordersNo); - Integer payWay = payDetails.getClassify(); - //orders.getPayWay(); //1app微信 2微信公众号 3微信小程序 - switch (payWay) { - case 1: - commInfoId = 74; - break; //appId - case 2: - commInfoId = 5; - break; //公众号id - case 3: - commInfoId = 45; - break; //小程序id - } - config.setAppId(commonInfoService.findOne(commInfoId).getValue()); - config.setKey(commonInfoService.findOne(75).getValue()); - config.setMchId(commonInfoService.findOne(76).getValue()); - WXPay wxpay = new WXPay(config); - Map data = new HashMap<>(); - data.put("appid", config.getAppID()); - data.put("mch_id", config.getMchID()); - data.put("nonce_str", WXPayUtil.generateNonceStr()); - try { - data.put("sign", WXPayUtil.generateSignature(data, config.getKey(), WXPayConstants.SignType.MD5)); - } catch (Exception e) { - e.printStackTrace(); - return false; - } + return this.icbcRefund(ordersNo); - data.put("out_trade_no", payDetails.getOrderId()); //订单号,支付单号一致 - data.put("out_refund_no", payDetails.getOrderId()); //退款单号,同一笔用不同的退款单号 - BigDecimal multiply = BigDecimal.valueOf(payDetails.getMoney()).multiply(BigDecimal.valueOf(100)); - String fee = String.valueOf(multiply.intValue()); - data.put("total_fee", fee); //1块等于微信支付传入100); - data.put("refund_fee", fee); //1块等于微信支付传入100); - //使用官方API退款 - try { - Map response = wxpay.refund(data); - if ("SUCCESS".equals(response.get("return_code"))) {//主要返回以下5个参数 - System.err.println("退款成功"); - return true; - } else { - return false; - } - } catch (Exception e) { - log.info("微信退款异常:" + e.getMessage(), e); - e.printStackTrace(); - return false; - } +// WXConfigUtil config = null; +//// String h5Url = commonInfoService.findOne(19).getValue().split("://")[1]; +// String filePath = fileUrl + "/service/apiclient_cert.p12"; +// try { +// config = new WXConfigUtil(filePath); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// int commInfoId = 0; +// PayDetails payDetails = payDetailsDao.selectByOrderId(ordersNo); +// Integer payWay = payDetails.getClassify(); +// //orders.getPayWay(); //1app微信 2微信公众号 3微信小程序 +// switch (payWay) { +// case 1: +// commInfoId = 74; +// break; //appId +// case 2: +// commInfoId = 5; +// break; //公众号id +// case 3: +// commInfoId = 45; +// break; //小程序id +// } +// config.setAppId(commonInfoService.findOne(commInfoId).getValue()); +// config.setKey(commonInfoService.findOne(75).getValue()); +// config.setMchId(commonInfoService.findOne(76).getValue()); +// WXPay wxpay = new WXPay(config); +// Map data = new HashMap<>(); +// data.put("appid", config.getAppID()); +// data.put("mch_id", config.getMchID()); +// data.put("nonce_str", WXPayUtil.generateNonceStr()); +// try { +// data.put("sign", WXPayUtil.generateSignature(data, config.getKey(), WXPayConstants.SignType.MD5)); +// } catch (Exception e) { +// e.printStackTrace(); +// return false; +// } +// +// data.put("out_trade_no", payDetails.getOrderId()); //订单号,支付单号一致 +// data.put("out_refund_no", payDetails.getOrderId()); //退款单号,同一笔用不同的退款单号 +// BigDecimal multiply = BigDecimal.valueOf(payDetails.getMoney()).multiply(BigDecimal.valueOf(100)); +// String fee = String.valueOf(multiply.intValue()); +// data.put("total_fee", fee); //1块等于微信支付传入100); +// data.put("refund_fee", fee); //1块等于微信支付传入100); +// //使用官方API退款 +// try { +// Map response = wxpay.refund(data); +// if ("SUCCESS".equals(response.get("return_code"))) {//主要返回以下5个参数 +// System.err.println("退款成功"); +// return true; +// } else { +// return false; +// } +// } catch (Exception e) { +// log.info("微信退款异常:" + e.getMessage(), e); +// e.printStackTrace(); +// return false; +// } } @Override diff --git a/src/main/java/com/sqx/modules/taking/controller/app/AppGameController.java b/src/main/java/com/sqx/modules/taking/controller/app/AppGameController.java index c733921..396237c 100644 --- a/src/main/java/com/sqx/modules/taking/controller/app/AppGameController.java +++ b/src/main/java/com/sqx/modules/taking/controller/app/AppGameController.java @@ -7,6 +7,7 @@ import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -25,8 +26,8 @@ public class AppGameController { @GetMapping("/queryGameNameList") @ApiOperation("查询分类和数据") - public Result queryGameNameList() { - return gameService.queryGameNameList(); + public Result queryGameNameList(@RequestParam(name = "laundryId",required = false)String laundryId) { + return gameService.queryGameNameList(laundryId); } } diff --git a/src/main/java/com/sqx/modules/taking/service/GameService.java b/src/main/java/com/sqx/modules/taking/service/GameService.java index 28bc294..4cb9064 100644 --- a/src/main/java/com/sqx/modules/taking/service/GameService.java +++ b/src/main/java/com/sqx/modules/taking/service/GameService.java @@ -7,7 +7,7 @@ import com.sqx.modules.taking.entity.Game; public interface GameService extends IService { - Result queryGameNameList(); + Result queryGameNameList(String laundryId); /** * 查询首页游戏分类 diff --git a/src/main/java/com/sqx/modules/taking/service/impl/GameServiceImpl.java b/src/main/java/com/sqx/modules/taking/service/impl/GameServiceImpl.java index 132d4d8..45d8c9d 100644 --- a/src/main/java/com/sqx/modules/taking/service/impl/GameServiceImpl.java +++ b/src/main/java/com/sqx/modules/taking/service/impl/GameServiceImpl.java @@ -10,6 +10,7 @@ import com.sqx.modules.taking.entity.OrderTaking; import com.sqx.modules.taking.service.GameService; import com.sqx.modules.taking.service.OrderTakingService; import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; @@ -30,12 +31,18 @@ public class GameServiceImpl extends ServiceImpl implements GameS } @Override - public Result queryGameNameList() { + public Result queryGameNameList(String laundryId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("status", 0); List games = baseMapper.selectList(queryWrapper); for(Game game:games){ - game.setOrderTakingList(orderTakingService.list(new QueryWrapper().eq("game_id",game.getId()).eq("status",0).ne("is_delete",-1).orderByAsc("sort"))); + QueryWrapper query = new QueryWrapper().eq("game_id",game.getId()).eq("status",0).ne("is_delete",-1).orderByAsc("sort"); + if(StringUtils.isBlank(laundryId)){ + query.eq("is_recommend", 1); + }else{ + query.eq("laundry_ids", laundryId); + } + game.setOrderTakingList(orderTakingService.list(query)); } return Result.success().put("data", games); }