This commit is contained in:
彭勇平 2025-04-23 17:26:23 +08:00
parent bccc0204de
commit cbfed2e429
8 changed files with 177 additions and 109 deletions

View file

@ -729,20 +729,20 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> 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<UserDao, UserEntity> 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)) {

View file

@ -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支付宝")

View file

@ -733,9 +733,9 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> 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<OrdersDao, Orders> implements
}
}
} else {
payMoney = BigDecimal.ZERO; // 取消师傅佣金
orders.setRate(payMoney);
userMoneyService.updateMoney(1, orders.getOrderTakingUserId(), payMoney);
UserMoneyDetails userMoneyDetails = new UserMoneyDetails();

View file

@ -35,6 +35,11 @@ public class PayDetails implements Serializable {
*/
private String orderId;
/**
* 商户单号
*/
private String outTradeNo;
/**
* 支付宝交易订单号
*/

View file

@ -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-APP7-微信公众号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-ddTHH: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<PayDetails>().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<PayOrder> queryWrapper = new QueryWrapper<>();
//根据订单编号去查询订单
queryWrapper.eq("orders_no", out_trade_no);
//去订单表中查询到该订单
PayOrder orders = payOrderDao.selectOne(queryWrapper);
PayOrder orders = payOrderDao.selectOne(new QueryWrapper<PayOrder>().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<String, String> reqParams, String path) {
Map<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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

View file

@ -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);
}
}

View file

@ -7,7 +7,7 @@ import com.sqx.modules.taking.entity.Game;
public interface GameService extends IService<Game> {
Result queryGameNameList();
Result queryGameNameList(String laundryId);
/**
* 查询首页游戏分类

View file

@ -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<GameDao, Game> implements GameS
}
@Override
public Result queryGameNameList() {
public Result queryGameNameList(String laundryId) {
QueryWrapper<Game> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", 0);
List<Game> games = baseMapper.selectList(queryWrapper);
for(Game game:games){
game.setOrderTakingList(orderTakingService.list(new QueryWrapper<OrderTaking>().eq("game_id",game.getId()).eq("status",0).ne("is_delete",-1).orderByAsc("sort")));
QueryWrapper<OrderTaking> query = new QueryWrapper<OrderTaking>().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);
}