Merge remote-tracking branch 'origin/master'

This commit is contained in:
flower 2019-01-26 01:04:46 +08:00
commit 1a53f0a436
6 changed files with 137 additions and 81 deletions

View File

@ -49,7 +49,8 @@ public class ApiWxPayController extends BaseController {
@Autowired @Autowired
private IVipUserOrdersService vipUserOrdersService; private IVipUserOrdersService vipUserOrdersService;
@Autowired
private ISysUserService sysUserService;
@Autowired @Autowired
private WxPayService wxService; private WxPayService wxService;
@PostMapping("/notify/order") @PostMapping("/notify/order")
@ -110,6 +111,7 @@ public class ApiWxPayController extends BaseController {
public <T> T createOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException { public <T> T createOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {
request.setOutTradeNo( IdUtil.simpleUUID()); request.setOutTradeNo( IdUtil.simpleUUID());
request.setSpbillCreateIp( IpUtils.getIpAddr( ServletUtils.getRequest())); request.setSpbillCreateIp( IpUtils.getIpAddr( ServletUtils.getRequest()));
VipUserOrders userOrders = new VipUserOrders(); VipUserOrders userOrders = new VipUserOrders();
userOrders.setId(request.getOutTradeNo()); userOrders.setId(request.getOutTradeNo());
userOrders.setVipUserId(Integer.parseInt(request.getOpenid())); userOrders.setVipUserId(Integer.parseInt(request.getOpenid()));
@ -129,15 +131,32 @@ public class ApiWxPayController extends BaseController {
* 接口地址https://api.mch.weixin.qq.com/pay/unifiedorder * 接口地址https://api.mch.weixin.qq.com/pay/unifiedorder
* *
* @param request 请求对象注意一些参数如appidmchid等不用设置方法内会自动从配置对象中获取到前提是对应配置中已经设置 * @param request 请求对象注意一些参数如appidmchid等不用设置方法内会自动从配置对象中获取到前提是对应配置中已经设置
* 示例参数
* {
"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 = "原生的统一下单接口") @ApiOperation(value = "原生的统一下单接口")
@PostMapping("/unifiedOrder") @PostMapping("/unifiedOrder")
public WxPayUnifiedOrderResult unifiedOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException { public WxPayUnifiedOrderResult unifiedOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {
request.setOutTradeNo( IdUtil.simpleUUID()); request.setOutTradeNo( IdUtil.simpleUUID());
request.setSpbillCreateIp( IpUtils.getIpAddr( ServletUtils.getRequest())); request.setSpbillCreateIp( IpUtils.getIpAddr( ServletUtils.getRequest()));
request.setSignType( "MD5" );
VipUserOrders userOrders = new VipUserOrders(); VipUserOrders userOrders = new VipUserOrders();
userOrders.setId(request.getOutTradeNo()); 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.setTrainCourseId(Integer.parseInt(request.getProductId()));
userOrders.setPrice(new BigDecimal(request.getTotalFee().intValue()/100)); userOrders.setPrice(new BigDecimal(request.getTotalFee().intValue()/100));
//未支付订单 //未支付订单

View File

@ -79,6 +79,10 @@
font-size: 24px; font-size: 24px;
color: #e91c35; color: #e91c35;
} }
.courseInfo-right .price-info-free {
font-size: 24px;
color: #3ab57f;
}
.courseInfo-right .button { .courseInfo-right .button {
@ -177,7 +181,8 @@
安全测试基础课程 安全测试基础课程
</div> </div>
<div class="price"> <div class="price">
<span class="price-info"><span th:text="'¥'+${trainCourse.price}"></span></span> <span th:if="${trainCourse.price>0}" class="price-info"><span th:text="'¥'+${trainCourse.price}"></span></span>
<span th:if="${trainCourse.price==0}" class="price-info-free"><span th:text="免费"></span></span>
</div> </div>
<div class="button" th:if="${trainCourse.price>0 && !courseAuth}"> <div class="button" th:if="${trainCourse.price>0 && !courseAuth}">
<input type="button" onclick="shop()" class="hb-ui-btn" value="立刻购买"> <input type="button" onclick="shop()" class="hb-ui-btn" value="立刻购买">
@ -257,7 +262,7 @@
"outTradeNo":"12344324242342342342554", "outTradeNo":"12344324242342342342554",
"totalFee":[[${trainCourse.price*100}]], "totalFee":[[${trainCourse.price*100}]],
"spbillCreateIp":"1.80.82.241", "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", "tradeType":"NATIVE",
"productId":"[[${trainCourse.id}]]", "productId":"[[${trainCourse.id}]]",
"openid":userId "openid":userId

View File

@ -2,10 +2,12 @@ package com.ruoyi.train.course.controller;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.ruoyi.common.base.AjaxResult; import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.jwt.JwtUtil; import com.ruoyi.framework.jwt.JwtUtil;
import com.ruoyi.framework.web.base.BaseController; import com.ruoyi.framework.web.base.BaseController;
import com.ruoyi.framework.web.util.ShiroUtils; import com.ruoyi.framework.web.util.ShiroUtils;
import com.ruoyi.system.domain.SysUser; import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.train.course.domain.*; import com.ruoyi.train.course.domain.*;
import com.ruoyi.train.course.service.ITrainCourseCategoryService; import com.ruoyi.train.course.service.ITrainCourseCategoryService;
@ -26,84 +28,101 @@ import java.util.List;
@RestController @RestController
@RequestMapping("/api/v1") @RequestMapping("/api/v1")
public class ApiTrainCourseController extends BaseController { public class ApiTrainCourseController extends BaseController {
@Autowired @Autowired
private ITrainCourseService trainCourseService; private ITrainCourseService trainCourseService;
@Autowired @Autowired
private ITrainCourseUserService trainCourseUserService ; private ITrainCourseUserService trainCourseUserService;
@Autowired @Autowired
private ITrainCourseCategoryService trainCourseCategoryService; private ITrainCourseCategoryService trainCourseCategoryService;
@Autowired @Autowired
private ITrainCourseSectionService trainCourseSectionService; private ITrainCourseSectionService trainCourseSectionService;
@Autowired @Autowired
private ISysUserService sysUserService; private ISysUserService sysUserService;
/** @Autowired
* 查询课程列表 private ISysConfigService configService;
*/ /**
@GetMapping("/trainCourse/category") * 查询课程列表
public AjaxResult list( TrainCourseCategory category) { */
List<TrainCourseCategory> trainCourseCategories = trainCourseCategoryService.selectCategoryList( category ); @GetMapping("/trainCourse/category")
AjaxResult success = success( "查询成功" ); public AjaxResult list(TrainCourseCategory category) {
success.put( "data", trainCourseCategories ); List<TrainCourseCategory> trainCourseCategories = trainCourseCategoryService.selectCategoryList( category );
return success; AjaxResult success = success( "查询成功" );
} success.put( "data", trainCourseCategories );
/** return success;
* 查询课程列表 }
*/
@GetMapping("/trainCourse/list")
public AjaxResult list( TrainCourseVO trainCourse) {
List<TrainCourseVO> 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<TrainCourseVO> 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;
}
/** /**
* 查询课程章节列表详情 * 查询课程列表
*/ */
@GetMapping("/trainCourse/{id}/section") @GetMapping("/trainCourse/list")
public AjaxResult trainCourseSection(@PathVariable("id") Integer id) { public AjaxResult list(TrainCourseVO trainCourse) {
TrainCourseSection trainCourseSection = new TrainCourseSection(); List<TrainCourseVO> list = trainCourseService.selectTrainCoursePage( trainCourse );
trainCourseSection.setTrainCourseId( id ); AjaxResult success = success( "查询成功" );
List<TrainCourseSection> trainCourseSections = trainCourseSectionService.selectTrainCourseSectionList( trainCourseSection ); success.put( "data", list );
return success;
}
AjaxResult success = success( "查询成功" ); /**
success.put( "data", trainCourseSections ); * 查询我的课程列表
return success; */
} @GetMapping("/trainCourse/myList")
/** public AjaxResult myList(TrainCourseVO trainCourse) {
* 查询课程章节列表详情 SysUser sysUser = sysUserService.selectUserByLoginName( JwtUtil.getLoginName() );
*/ trainCourse.setUserId( sysUser.getUserId().intValue() );
@GetMapping("/trainCourse/section/{id}") List<TrainCourseVO> list = trainCourseService.selectTrainCoursePage( trainCourse );
public AjaxResult trainCourseSectionInfo(@PathVariable("id") Integer id) { AjaxResult success = success( "查询成功" );
TrainCourseSection trainCourseSections = trainCourseSectionService.selectById( id ); 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<TrainCourseSection> 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;
}
} }

View File

@ -36,7 +36,7 @@ public class WxPayConfiguration {
payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId())); payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));
payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId())); payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath())); payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
payConfig.setNotifyUrl(StringUtils.trimToNull(this.properties.getNotifyUrl()));
// 可以指定是否使用沙箱环境 // 可以指定是否使用沙箱环境
payConfig.setUseSandboxEnv(false); payConfig.setUseSandboxEnv(false);

View File

@ -40,6 +40,10 @@ public class WxPayProperties {
* apiclient_cert.p12文件的绝对路径或者如果放在项目中请以classpath:开头指定 * apiclient_cert.p12文件的绝对路径或者如果放在项目中请以classpath:开头指定
*/ */
private String keyPath; private String keyPath;
/**
* 支付成功回调地址
*/
private String notifyUrl;
public String getAppId() { public String getAppId() {
return this.appId; return this.appId;
@ -89,6 +93,14 @@ public class WxPayProperties {
this.keyPath = keyPath; this.keyPath = keyPath;
} }
public String getNotifyUrl() {
return notifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
@Override @Override
public String toString() { public String toString() {
return ToStringBuilder.reflectionToString(this, return ToStringBuilder.reflectionToString(this,

View File

@ -11,9 +11,10 @@ wechat:
token: 111 token: 111
aesKey: 111 aesKey: 111
pay: pay:
appId: wxf9fcc68ce428cfb6 #wxd67baf702dad665c #微信公众号或者小程序等的appid #wx6b73f1161cbfd5f3 appId: wxd67baf702dad665c #wxd67baf702dad665c #微信公众号或者小程序等的appid #wx6b73f1161cbfd5f3
mchId: 1518812711 #微信支付商户号 #1518466961 mchId: 1518812711 #微信支付商户号 #1518466961
mchKey: nantongjunruanquanjishu888888888 #微信支付商户密钥 #nantonghanhaixinxijishuyouxian88 mchKey: nantongjunruanquanjishu888888888 #微信支付商户密钥 #nantonghanhaixinxijishuyouxian88
subAppId: #服务商模式下的子商户公众账号ID subAppId: #服务商模式下的子商户公众账号ID
subMchId: #服务商模式下的子商户号 subMchId: #服务商模式下的子商户号
keyPath: # p12证书的位置可以指定绝对路径也可以指定类路径以classpath:开头) keyPath: # p12证书的位置可以指定绝对路径也可以指定类路径以classpath:开头)
notifyUrl: http://ceshi4.yqhl.cc/api/v1/wx/pay/notify/order