diff --git a/ruoyi-cms/src/main/java/com/ruoyi/cms/controller/ApiWxPayController.java b/ruoyi-cms/src/main/java/com/ruoyi/cms/controller/ApiWxPayController.java index bcf6a0041..fe713f29e 100644 --- a/ruoyi-cms/src/main/java/com/ruoyi/cms/controller/ApiWxPayController.java +++ b/ruoyi-cms/src/main/java/com/ruoyi/cms/controller/ApiWxPayController.java @@ -49,7 +49,8 @@ public class ApiWxPayController extends BaseController { @Autowired private IVipUserOrdersService vipUserOrdersService; - + @Autowired + private ISysUserService sysUserService; @Autowired private WxPayService wxService; @PostMapping("/notify/order") @@ -110,6 +111,7 @@ public class ApiWxPayController extends BaseController { public T createOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException { request.setOutTradeNo( IdUtil.simpleUUID()); request.setSpbillCreateIp( IpUtils.getIpAddr( ServletUtils.getRequest())); + VipUserOrders userOrders = new VipUserOrders(); userOrders.setId(request.getOutTradeNo()); userOrders.setVipUserId(Integer.parseInt(request.getOpenid())); @@ -129,15 +131,32 @@ public class ApiWxPayController extends BaseController { * 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder * * @param request 请求对象,注意一些参数如appid、mchid等不用设置,方法内会自动从配置对象中获取到(前提是对应配置中已经设置) + * 示例参数 + * { + "body":"测试商品", + "outTradeNo":"12344324242342342342554", + "totalFee":1.01, + "spbillCreateIp":"1.80.82.241", + "notifyUrl":"http://www.baidu.com", + "tradeType":"JSAPI", + "productId":"13652b4a71df2f49e3647c55c8e31a88" + "openid":'' + } + 返回 + { + "codeUrl": "weixin://wxpay/bizpayurl?pr=pK0R74G" + } */ @ApiOperation(value = "原生的统一下单接口") @PostMapping("/unifiedOrder") public WxPayUnifiedOrderResult unifiedOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException { request.setOutTradeNo( IdUtil.simpleUUID()); request.setSpbillCreateIp( IpUtils.getIpAddr( ServletUtils.getRequest())); + request.setSignType( "MD5" ); VipUserOrders userOrders = new VipUserOrders(); userOrders.setId(request.getOutTradeNo()); - userOrders.setVipUserId(ShiroUtils.getUserId().intValue()); + SysUser sysUser = sysUserService.selectUserByLoginName( JwtUtil.getLoginName() ); + userOrders.setVipUserId(sysUser.getUserId().intValue()); userOrders.setTrainCourseId(Integer.parseInt(request.getProductId())); userOrders.setPrice(new BigDecimal(request.getTotalFee().intValue()/100)); //未支付订单 diff --git a/ruoyi-cms/src/main/resources/templates/web/course/courseInfo.html b/ruoyi-cms/src/main/resources/templates/web/course/courseInfo.html index e25338f4e..5045e2fac 100644 --- a/ruoyi-cms/src/main/resources/templates/web/course/courseInfo.html +++ b/ruoyi-cms/src/main/resources/templates/web/course/courseInfo.html @@ -79,6 +79,10 @@ font-size: 24px; color: #e91c35; } + .courseInfo-right .price-info-free { + font-size: 24px; + color: #3ab57f; + } .courseInfo-right .button { @@ -177,7 +181,8 @@ 安全测试基础课程
- + +
@@ -257,7 +262,7 @@ "outTradeNo":"12344324242342342342554", "totalFee":[[${trainCourse.price*100}]], "spbillCreateIp":"1.80.82.241", - "notifyUrl":"http://ceshi4.yqhl.cc/api/v1/wx/pay/notify/order", + //"notifyUrl":"http://ceshi4.yqhl.cc/api/v1/wx/pay/notify/order", "tradeType":"NATIVE", "productId":"[[${trainCourse.id}]]", "openid":userId diff --git a/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/ApiTrainCourseController.java b/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/ApiTrainCourseController.java index 9124fa01d..f47550cd8 100644 --- a/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/ApiTrainCourseController.java +++ b/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/ApiTrainCourseController.java @@ -2,10 +2,12 @@ package com.ruoyi.train.course.controller; import cn.hutool.json.JSONObject; import com.ruoyi.common.base.AjaxResult; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.jwt.JwtUtil; import com.ruoyi.framework.web.base.BaseController; import com.ruoyi.framework.web.util.ShiroUtils; import com.ruoyi.system.domain.SysUser; +import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.train.course.domain.*; import com.ruoyi.train.course.service.ITrainCourseCategoryService; @@ -26,84 +28,101 @@ import java.util.List; @RestController @RequestMapping("/api/v1") public class ApiTrainCourseController extends BaseController { - @Autowired - private ITrainCourseService trainCourseService; - @Autowired - private ITrainCourseUserService trainCourseUserService ; - @Autowired - private ITrainCourseCategoryService trainCourseCategoryService; + @Autowired + private ITrainCourseService trainCourseService; + @Autowired + private ITrainCourseUserService trainCourseUserService; + @Autowired + private ITrainCourseCategoryService trainCourseCategoryService; - @Autowired - private ITrainCourseSectionService trainCourseSectionService; + @Autowired + private ITrainCourseSectionService trainCourseSectionService; - @Autowired - private ISysUserService sysUserService; - /** - * 查询课程列表 - */ - @GetMapping("/trainCourse/category") - public AjaxResult list( TrainCourseCategory category) { - List trainCourseCategories = trainCourseCategoryService.selectCategoryList( category ); - AjaxResult success = success( "查询成功" ); - success.put( "data", trainCourseCategories ); - return success; - } - /** - * 查询课程列表 - */ - @GetMapping("/trainCourse/list") - public AjaxResult list( TrainCourseVO trainCourse) { - List list = trainCourseService.selectTrainCoursePage( trainCourse ); - AjaxResult success = success( "查询成功" ); - success.put( "data", list ); - return success; - } - /** - * 查询我的课程列表 - */ - @GetMapping("/trainCourse/myList") - public AjaxResult myList( TrainCourseVO trainCourse) { - SysUser sysUser = sysUserService.selectUserByLoginName( JwtUtil.getLoginName() ); - trainCourse.setUserId( sysUser.getUserId().intValue() ); - List list = trainCourseService.selectTrainCoursePage( trainCourse ); - AjaxResult success = success( "查询成功" ); - success.put( "data", list ); - return success; - } - /** - * 查询课程详情 - */ - @GetMapping("/trainCourse/{id}") - public AjaxResult get(@PathVariable("id") Integer id) { - TrainCourse trainCourse = trainCourseService.selectById( id ); - AjaxResult success = success( "查询成功" ); - success.put( "data", trainCourse ); - return success; - } + @Autowired + private ISysUserService sysUserService; + @Autowired + private ISysConfigService configService; + /** + * 查询课程列表 + */ + @GetMapping("/trainCourse/category") + public AjaxResult list(TrainCourseCategory category) { + List trainCourseCategories = trainCourseCategoryService.selectCategoryList( category ); + AjaxResult success = success( "查询成功" ); + success.put( "data", trainCourseCategories ); + return success; + } - /** - * 查询课程章节列表详情 - */ - @GetMapping("/trainCourse/{id}/section") - public AjaxResult trainCourseSection(@PathVariable("id") Integer id) { - TrainCourseSection trainCourseSection = new TrainCourseSection(); - trainCourseSection.setTrainCourseId( id ); - List trainCourseSections = trainCourseSectionService.selectTrainCourseSectionList( trainCourseSection ); + /** + * 查询课程列表 + */ + @GetMapping("/trainCourse/list") + public AjaxResult list(TrainCourseVO trainCourse) { + List list = trainCourseService.selectTrainCoursePage( trainCourse ); + AjaxResult success = success( "查询成功" ); + success.put( "data", list ); + return success; + } - AjaxResult success = success( "查询成功" ); - success.put( "data", trainCourseSections ); - return success; - } - /** - * 查询课程章节列表详情 - */ - @GetMapping("/trainCourse/section/{id}") - public AjaxResult trainCourseSectionInfo(@PathVariable("id") Integer id) { - TrainCourseSection trainCourseSections = trainCourseSectionService.selectById( id ); + /** + * 查询我的课程列表 + */ + @GetMapping("/trainCourse/myList") + public AjaxResult myList(TrainCourseVO trainCourse) { + SysUser sysUser = sysUserService.selectUserByLoginName( JwtUtil.getLoginName() ); + trainCourse.setUserId( sysUser.getUserId().intValue() ); + List list = trainCourseService.selectTrainCoursePage( trainCourse ); + AjaxResult success = success( "查询成功" ); + success.put( "data", list ); + return success; + } - AjaxResult success = success( "查询成功" ); - success.put( "data", trainCourseSections ); - return success; - } + /** + * 查询课程详情 + */ + @GetMapping("/trainCourse/{id}") + public AjaxResult get(@PathVariable("id") Integer id) { + TrainCourse trainCourse = trainCourseService.selectById( id ); + boolean courseAuth = false; + String courseDays = configService.selectConfigByKey( "course.days" ); + String loginName = JwtUtil.getLoginName(); + if (StringUtils.isNotEmpty( loginName )) { + SysUser sysUser = sysUserService.selectUserByLoginName( loginName ); + if (sysUser != null) { + courseAuth = trainCourseUserService.authority( sysUser.getUserId(), id ); + } + } + AjaxResult success = success( "查询成功" ); + success.put( "data", trainCourse ); + success.put( "courseAuth", courseAuth ); + success.put( "courseDays", courseDays ); + return success; + } + + /** + * 查询课程章节列表详情 + */ + @GetMapping("/trainCourse/{id}/section") + public AjaxResult trainCourseSection(@PathVariable("id") Integer id) { + TrainCourseSection trainCourseSection = new TrainCourseSection(); + trainCourseSection.setTrainCourseId( id ); + List trainCourseSections = trainCourseSectionService.selectTrainCourseSectionList( trainCourseSection ); + + AjaxResult success = success( "查询成功" ); + success.put( "data", trainCourseSections ); + return success; + } + + /** + * 查询课程章节列表详情 + */ + @GetMapping("/trainCourse/section/{id}") + public AjaxResult trainCourseSectionInfo(@PathVariable("id") Integer id) { + TrainCourseSection trainCourseSections = trainCourseSectionService.selectById( id ); + + AjaxResult success = success( "查询成功" ); + success.put( "data", trainCourseSections ); + return success; + } } diff --git a/ruoyi-weixin/src/main/java/com/ruoyi/wx/pay/config/WxPayConfiguration.java b/ruoyi-weixin/src/main/java/com/ruoyi/wx/pay/config/WxPayConfiguration.java index 0fd6b643f..e0c7a971b 100644 --- a/ruoyi-weixin/src/main/java/com/ruoyi/wx/pay/config/WxPayConfiguration.java +++ b/ruoyi-weixin/src/main/java/com/ruoyi/wx/pay/config/WxPayConfiguration.java @@ -36,7 +36,7 @@ public class WxPayConfiguration { payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId())); payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId())); payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath())); - + payConfig.setNotifyUrl(StringUtils.trimToNull(this.properties.getNotifyUrl())); // 可以指定是否使用沙箱环境 payConfig.setUseSandboxEnv(false); diff --git a/ruoyi-weixin/src/main/java/com/ruoyi/wx/pay/config/WxPayProperties.java b/ruoyi-weixin/src/main/java/com/ruoyi/wx/pay/config/WxPayProperties.java index 687986412..5a92387fc 100644 --- a/ruoyi-weixin/src/main/java/com/ruoyi/wx/pay/config/WxPayProperties.java +++ b/ruoyi-weixin/src/main/java/com/ruoyi/wx/pay/config/WxPayProperties.java @@ -40,6 +40,10 @@ public class WxPayProperties { * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定 */ private String keyPath; + /** + * 支付成功回调地址 + */ + private String notifyUrl; public String getAppId() { return this.appId; @@ -89,6 +93,14 @@ public class WxPayProperties { this.keyPath = keyPath; } + public String getNotifyUrl() { + return notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this, diff --git a/ruoyi-weixin/src/main/resources/application-weixin.yml b/ruoyi-weixin/src/main/resources/application-weixin.yml index 2b12821a7..598038965 100644 --- a/ruoyi-weixin/src/main/resources/application-weixin.yml +++ b/ruoyi-weixin/src/main/resources/application-weixin.yml @@ -11,9 +11,10 @@ wechat: token: 111 aesKey: 111 pay: - appId: wxf9fcc68ce428cfb6 #wxd67baf702dad665c #微信公众号或者小程序等的appid #wx6b73f1161cbfd5f3 + appId: wxd67baf702dad665c #wxd67baf702dad665c #微信公众号或者小程序等的appid #wx6b73f1161cbfd5f3 mchId: 1518812711 #微信支付商户号 #1518466961 mchKey: nantongjunruanquanjishu888888888 #微信支付商户密钥 #nantonghanhaixinxijishuyouxian88 subAppId: #服务商模式下的子商户公众账号ID subMchId: #服务商模式下的子商户号 - keyPath: # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头) \ No newline at end of file + keyPath: # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头) + notifyUrl: http://ceshi4.yqhl.cc/api/v1/wx/pay/notify/order \ No newline at end of file