cloud-server-account/src/main/java/com/dsh/account/controller/PaymentCallbackController.java
@@ -1,9 +1,18 @@ package com.dsh.account.controller; import com.dsh.account.service.TStudentService; import com.dsh.account.util.PayMoneyUtil; import com.dsh.account.util.ResultUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.util.Map; /** * 支付回调控制器 @@ -15,21 +24,58 @@ public class PaymentCallbackController { @Autowired private PayMoneyUtil payMoneyUtil; @Autowired private TStudentService tstuService; /** * 支付宝支付回调接口 */ @PostMapping("/v1") public void alipayCallback(){ @PostMapping("/base/coursePackage/alipayPaymentCallback") public void alipayCallback(HttpServletRequest request, HttpServletResponse response){ try { Map<String, String> map = payMoneyUtil.alipayCallback(request); if(null != map){ String out_trade_no = map.get("out_trade_no"); String transaction_id = map.get("transaction_id"); ResultUtil resultUtil = tstuService.insertVipPaymentCallback(out_trade_no, transaction_id); if(resultUtil.getCode() == 200){ PrintWriter out = response.getWriter(); out.write("success"); out.flush(); out.close(); } } }catch (Exception e){ e.printStackTrace(); } } /** * 微信支付回调接口 */ @PostMapping("/v2") public void weChatCallback(){ @PostMapping("/base/coursePackage/wechatPaymentCallback") public void weChatCallback(HttpServletRequest request, HttpServletResponse response){ try { Map<String, String> map = payMoneyUtil.weixinpayCallback(request); if(null != map){ String out_trade_no = map.get("out_trade_no"); String transaction_id = map.get("transaction_id"); String result = map.get("result"); ResultUtil resultUtil = tstuService.insertVipPaymentCallback(out_trade_no, transaction_id); if(resultUtil.getCode() == 200){ PrintWriter out = response.getWriter(); out.write(result); out.flush(); out.close(); } } }catch (Exception e){ e.printStackTrace(); } } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java
@@ -33,4 +33,20 @@ @PostMapping("/base/coursePack/allPaymentCourseList") public List<TCoursePackagePayment> getAppuserCourseList(@RequestBody Integer appUserId); @PostMapping("/coursePackagePayment/courseRenewPlayPaiPay") public int paymentWanpaiRenewCourse(@RequestBody PlayPaiGoldCoursePackage coursePackage); @PostMapping("/base/coursePack/getPaymentCoursePackage") public TCoursePackagePayment getCoursePackagePaymentByCode(@RequestBody String code); @PostMapping("/base/coursePack/delPaymentCoursePackage") public boolean delPaymentCoursePackage(@RequestBody Integer payId); @PostMapping("/base/coursePack/updatePaymentCoursePackage") void updatePaymentCoursePackage(TCoursePackagePayment coursePackagePayment); @PostMapping("/base/coursePack/savePaymentCoursePackage") public boolean savePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment); } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/PlayPaiGoldCoursePackage.java
New file @@ -0,0 +1,22 @@ package com.dsh.account.feignclient.course.model; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class PlayPaiGoldCoursePackage { @ApiModelProperty(value = "支付配置id") Integer coursePayConfigId; @ApiModelProperty(value = "学员id") Integer stuId; @ApiModelProperty(value = "课包id") Integer coursePackageId; @ApiModelProperty(value = "code") String code; } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/TCoursePackagePayment.java
@@ -25,7 +25,7 @@ */ private Integer coursePackageId; /** * 支付方式(1=现金,2=玩湃币) * 支付方式(1=微信 2=支付宝 3=玩湃币) */ private Integer payType; /** @@ -88,5 +88,13 @@ * 添加时间 */ private Date insertTime; /** * 业务编号 */ private String code; /** * 原价 */ private Double originalPrice; } cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/ClasspaymentRequest.java
@@ -25,7 +25,7 @@ private Integer conponId; @ApiModelProperty(value = "课时id") private Long courseConfigId; private Integer courseConfigId; @ApiModelProperty(value = "支付金额") private BigDecimal payAmount; cloud-server-account/src/main/java/com/dsh/account/service/TStudentService.java
@@ -73,4 +73,6 @@ ResultUtil renewClassPayment(Integer userIdFormRedis, ClasspaymentRequest request); ResultUtil insertVipPaymentCallback(String outTradeNo, String transactionId); } cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java
@@ -37,10 +37,8 @@ import com.dsh.account.model.vo.sourceDetail.CourseDetailsOfContinuationResp; import com.dsh.account.model.vo.sourceDetail.RecordTimeRequest; import com.dsh.account.service.TStudentService; import com.dsh.account.util.DateTimeHelper; import com.dsh.account.util.DateUtil; import com.dsh.account.util.ResultUtil; import com.dsh.account.util.ToolUtil; import com.dsh.account.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -99,6 +97,10 @@ @Resource private ParticipantClient participantClient; @Autowired private PayMoneyUtil payMoneyUtil; @@ -374,35 +376,183 @@ @Override public ResultUtil renewClassPayment(Integer userIdFormRedis, ClasspaymentRequest request) { // TODO: 2023/7/5 续课支付 switch (request.getPayType()){ case 1: WeChatPayment(); break; case 2: AlipayPayment(); break; case 3: PlaypaiGoldPayment(); break; default: break; SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); TCoursePackagePayment packagePayment = new TCoursePackagePayment(); packagePayment.setCode(code); packagePayment.setAppUserId(userIdFormRedis); packagePayment.setStudentId(request.getStuId()); packagePayment.setCoursePackageId(request.getLessonId()); packagePayment.setPayType(request.getPayType()); packagePayment.setAbsencesNumber(0); packagePayment.setPayUserType(1); packagePayment.setPayStatus(1); packagePayment.setPayUserId(userIdFormRedis); packagePayment.setStatus(1); packagePayment.setState(1); packagePayment.setInsertTime(new Date()); couPayClient.savePaymentCoursePackage(packagePayment); try { switch (request.getPayType()) { case 1: return WeChatPayment(code,request.getPayAmount()); case 2: return AlipayPayment(code,request.getPayAmount()); case 3: int i = PlaypaiGoldPayment(code,request); switch (i){ case 1: return ResultUtil.success(); case 2: return ResultUtil.error("用户未登录!"); case 3: return ResultUtil.error("续课失败,玩湃币不足,请充值"); case 4: return ResultUtil.error("续课失败,请联系管理员"); } default: break; } }catch (Exception e){ ResultUtil.runErr(); } return ResultUtil.success(); } public void WeChatPayment(){ public ResultUtil WeChatPayment(String code,BigDecimal amount) throws Exception { ResultUtil weixinpay = payMoneyUtil.weixinpay("课包续费", "", code, amount.toString(), "/base/coursePackage/wechatPaymentCallback", "APP", ""); if(weixinpay.getCode() == 200){ new Thread(new Runnable() { @Override public void run() { try { int num = 1; int wait = 0; while (num <= 10){ int min = 5000; wait += (min * num); Thread.sleep(wait); TCoursePackagePayment coursePackagePayment = couPayClient.getCoursePackagePaymentByCode(code); if(coursePackagePayment.getPayStatus() == 2){ break; } ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, ""); if(resultUtil.getCode() == 200 && coursePackagePayment.getPayStatus() == 1){ /** * SUCCESS—支付成功, * REFUND—转入退款, * NOTPAY—未支付, * CLOSED—已关闭, * REVOKED—已撤销(刷卡支付), * USERPAYING--用户支付中, * PAYERROR--支付失败(其他原因,如银行返回失败) */ Map<String, String> data1 = resultUtil.getData(); String s = data1.get("trade_state"); String transaction_id = data1.get("transaction_id"); if("REFUND".equals(s) || "NOTPAY".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s) || num == 10){ coursePackagePayment.setState(3); couPayClient.delPaymentCoursePackage(coursePackagePayment.getId()); break; } if("SUCCESS".equals(s)){ coursePackagePayment.setPayStatus(2); coursePackagePayment.setOrderNumber(transaction_id); couPayClient.updatePaymentCoursePackage(coursePackagePayment); break; } if("USERPAYING".equals(s)){ num++; } } } }catch (Exception e){ e.printStackTrace(); } } }).start(); } return weixinpay; } public void AlipayPayment(){ public ResultUtil AlipayPayment(String code,BigDecimal amount){ ResultUtil alipay = payMoneyUtil.alipay("课包续费", "", "", code, amount.toString(), "/base/coursePackage/alipayPaymentCallback"); if(alipay.getCode() == 200){ new Thread(new Runnable() { @Override public void run() { try { int num = 1; int wait = 0; while (num <= 10){ int min = 5000; wait += (min * num); Thread.sleep(wait); TCoursePackagePayment coursePackagePayment = couPayClient.getCoursePackagePaymentByCode(code); if(coursePackagePayment.getPayStatus() == 2){ break; } ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(code); if(resultUtil.getCode() == 200 && coursePackagePayment.getPayStatus() == 1){ /** * WAIT_BUYER_PAY(交易创建,等待买家付款)、 * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、 * TRADE_SUCCESS(交易支付成功)、 * TRADE_FINISHED(交易结束,不可退款) */ Map<String, String> data1 = resultUtil.getData(); String s = data1.get("tradeStatus"); String tradeNo = data1.get("tradeNo"); if("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10){ coursePackagePayment.setState(3); couPayClient.delPaymentCoursePackage(coursePackagePayment.getId()); break; } if("TRADE_SUCCESS".equals(s)){ coursePackagePayment.setPayStatus(2); coursePackagePayment.setOrderNumber(tradeNo); couPayClient.updatePaymentCoursePackage(coursePackagePayment); break; } if("WAIT_BUYER_PAY".equals(s)){ num++; } } } }catch (Exception e){ e.printStackTrace(); } } }).start(); } return alipay; } public void PlaypaiGoldPayment(){ public int PlaypaiGoldPayment(String code,ClasspaymentRequest request){ PlayPaiGoldCoursePackage paiGoldCoursePackage = new PlayPaiGoldCoursePackage(); paiGoldCoursePackage.setCoursePackageId(request.getLessonId()); paiGoldCoursePackage.setStuId(request.getStuId()); paiGoldCoursePackage.setCoursePayConfigId(request.getCourseConfigId()); paiGoldCoursePackage.setCode(code); return couPayClient.paymentWanpaiRenewCourse(paiGoldCoursePackage); } @Override public ResultUtil insertVipPaymentCallback(String code, String orderNumber) { TCoursePackagePayment coursePackagePayment = couPayClient.getCoursePackagePaymentByCode(code); if(coursePackagePayment.getPayStatus() != 1){ return ResultUtil.success(); } coursePackagePayment.setPayStatus(2); coursePackagePayment.setOrderNumber(orderNumber); couPayClient.updatePaymentCoursePackage(coursePackagePayment); return ResultUtil.success(); } } cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java
@@ -81,7 +81,7 @@ */ private Integer sort; /** * 支付方式(1=现金,2=玩湃币) * 支付方式(1=微信 2=支付宝 3=玩湃币) */ private Integer payType; /** cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
@@ -3,23 +3,19 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dsh.course.entity.*; import com.dsh.course.feignclient.account.AppUserClient; import com.dsh.course.feignclient.account.model.AppUser; import com.dsh.course.feignclient.model.*; import com.dsh.course.model.BaseVo; import com.dsh.course.model.dto.DiscountJsonDto; import com.dsh.course.model.vo.CourseDetailRequest; import com.dsh.course.model.vo.RegisterCourseVo; import com.dsh.course.model.vo.request.ClasspaymentRequest; import com.dsh.course.model.vo.request.CourseOfAfterRequest; import com.dsh.course.model.vo.request.CourseWithDetailsRequest; import com.dsh.course.model.vo.request.UpdateCourseVideoStatusRequest; import com.dsh.course.model.vo.request.*; import com.dsh.course.model.vo.response.AppUserVideoResponse; import com.dsh.course.model.vo.response.CourseDetailsResponse; import com.dsh.course.model.vo.response.CourseOfVideoResponse; import com.dsh.course.service.*; import com.dsh.course.util.DateUtil; import com.dsh.course.util.ResultUtil; import com.dsh.course.util.StrUtils; import com.dsh.course.util.TokenUtil; import com.dsh.course.util.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.annotations.Api; @@ -67,6 +63,9 @@ private CancelledClassesService cacService; @Autowired private ICoursePackagePaymentConfigService icppcService; @Autowired private UserVideoDetailsService uvdsService; @Autowired @@ -82,6 +81,9 @@ @Autowired private CancelledClassesService cancelledClassesService; @Autowired private AppUserClient appuClient; private final SimpleDateFormat format = new SimpleDateFormat("MM-dd HH:mm"); @@ -620,4 +622,61 @@ e.printStackTrace(); } } /** * 课包续费玩湃币支付 * @param */ @PostMapping("/coursePackagePayment/courseRenewPlayPaiPay") public int paymentWanpaiRenewCourse(@RequestBody PlayPaiGoldCoursePackage coursePackage){ try { Integer userIdFormRedis = tokenUtil.getUserIdFormRedis(); if (null == userIdFormRedis){ return 2; } CoursePackagePaymentConfig paymentConfig = icppcService.getById(coursePackage.getCoursePayConfigId()); AppUser appUser = appuClient.queryAppUser(userIdFormRedis); if (appUser.getPlayPaiCoins() < paymentConfig.getPlayPaiCoin()){ return 3; } TCoursePackagePayment packagePayment = packagePaymentService.getOne(new QueryWrapper<TCoursePackagePayment>() .eq("code",coursePackage.getCode() )); packagePayment.setPayStatus(2); packagePayment.setPayUserId(userIdFormRedis); packagePayment.setClassHours(paymentConfig.getClassHours()); packagePayment.setPlayPaiCoin(paymentConfig.getPlayPaiCoin()); packagePayment.setTotalClassHours(paymentConfig.getClassHours()); packagePayment.setLaveClassHours(paymentConfig.getClassHours()); packagePaymentService.updateById(packagePayment); appUser.setPlayPaiCoins(appUser.getPlayPaiCoins()-paymentConfig.getPlayPaiCoin()); appuClient.updateAppUser(appUser); } catch (Exception e) { return 4; } return 1; } @PostMapping("/base/coursePack/getPaymentCoursePackage") public TCoursePackagePayment getCoursePackagePaymentByCode(@RequestBody String code){ return packagePaymentService.getOne(new QueryWrapper<TCoursePackagePayment>() .eq("code",code)); } @PostMapping("/base/coursePack/delPaymentCoursePackage") public boolean delPaymentCoursePackage(@RequestBody Integer payId){ return packagePaymentService.removeById(payId); } @PostMapping("/base/coursePack/updatePaymentCoursePackage") public boolean updatePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment){ return packagePaymentService.update(packagePayment,new QueryWrapper<TCoursePackagePayment>() .eq("id",packagePayment.getId())); } @PostMapping("/base/coursePack/savePaymentCoursePackage") public boolean savePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment){ return packagePaymentService.save(packagePayment); } } cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java
@@ -3,6 +3,7 @@ import com.dsh.course.entity.TCoursePackagePayment; import com.dsh.course.feignclient.model.*; import com.dsh.course.model.vo.request.PlayPaiGoldCoursePackage; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -35,4 +36,23 @@ @PostMapping("/base/coursePack/allPaymentCourseList") public List<TCoursePackagePayment> getAppuserCourseList(@RequestBody Integer appUserId); @PostMapping("/coursePackagePayment/courseRenewPlayPaiPay") public int paymentWanpaiRenewCourse(@RequestBody PlayPaiGoldCoursePackage coursePackage); @PostMapping("/base/coursePack/getPaymentCoursePackage") public TCoursePackagePayment getCoursePackagePaymentByCode(@RequestBody String payId); @PostMapping("/base/coursePack/delPaymentCoursePackage") public boolean delPaymentCoursePackage(@RequestBody Integer payId); @PostMapping("/base/coursePack/updatePaymentCoursePackage") public boolean updatePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment); @PostMapping("/base/coursePack/savePaymentCoursePackage") public boolean savePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment); } cloud-server-course/src/main/java/com/dsh/course/model/vo/request/PlayPaiGoldCoursePackage.java
New file @@ -0,0 +1,22 @@ package com.dsh.course.model.vo.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class PlayPaiGoldCoursePackage { @ApiModelProperty(value = "支付配置id") Integer coursePayConfigId; @ApiModelProperty(value = "学员id") Integer stuId; @ApiModelProperty(value = "课包id") Integer coursePackageId; @ApiModelProperty(value = "课包id") String code; }