Commit 435053c1 by giaogiao

vip开通

parent 45b6b497
package com.sien.common.controller;
import com.sien.common.entity.VipPrice;
import com.sien.common.service.VipPriceService;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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 java.util.List;
/**
* 会员价格表 控制器
*
* @author xxx
* @since 2021-03-11
*/
@Slf4j
@RestController
@RequestMapping("/vipPrice")
@Api(value = "会员价格表API", tags = {"会员价格表"})
public class VipPriceController extends BaseController {
@Autowired
private VipPriceService vipPriceService;
/**
* 会员价格表所有列表
*/
@PostMapping("/getAllList")
@OperationLog(name = "会员价格表所有列表", type = OperationLogType.PAGE)
@ApiOperation(value = "会员价格表所有列表")
public ApiResult<List<VipPrice>> getVipPricePageList() throws Exception {
return ApiResult.ok(vipPriceService.list());
}
// /**
// * 会员价格表分页列表
// */
// @PostMapping("/getPageList")
// @OperationLog(name = "会员价格表分页列表", type = OperationLogType.PAGE)
// @ApiOperation(value = "会员价格表分页列表")
// public ApiResult<Paging<VipPriceQueryVo>> getVipPricePageList(@Validated @RequestBody VipPricePageParam vipPricePageParam) throws Exception {
// Paging<VipPriceQueryVo> paging = vipPriceService.getVipPricePageList(vipPricePageParam);
// return ApiResult.ok(paging);
// }
// /**
// * 添加会员价格表
// */
// @PostMapping("/add")
// @OperationLog(name = "添加会员价格表", type = OperationLogType.ADD)
// @ApiOperation(value = "添加会员价格表")
// public ApiResult<Boolean> addVipPrice(@Validated(Add.class) @RequestBody VipPrice vipPrice) throws Exception {
// boolean flag = vipPriceService.saveVipPrice(vipPrice);
// return ApiResult.result(flag);
// }
//
// /**
// * 修改会员价格表
// */
// @PostMapping("/update")
// @OperationLog(name = "修改会员价格表", type = OperationLogType.UPDATE)
// @ApiOperation(value = "修改会员价格表")
// public ApiResult<Boolean> updateVipPrice(@Validated(Update.class) @RequestBody VipPrice vipPrice) throws Exception {
// boolean flag = vipPriceService.updateVipPrice(vipPrice);
// return ApiResult.result(flag);
// }
//
// /**
// * 删除会员价格表
// */
// @PostMapping("/delete/{id}")
// @OperationLog(name = "删除会员价格表", type = OperationLogType.DELETE)
// @ApiOperation(value = "删除会员价格表")
// public ApiResult<Boolean> deleteVipPrice(@PathVariable("id") Long id) throws Exception {
// boolean flag = vipPriceService.deleteVipPrice(id);
// return ApiResult.result(flag);
// }
//
// /**
// * 获取会员价格表详情
// */
// @GetMapping("/info/{id}")
// @OperationLog(name = "会员价格表详情", type = OperationLogType.INFO)
// @ApiOperation(value = "会员价格表详情")
// public ApiResult<VipPriceQueryVo> getVipPrice(@PathVariable("id") Long id) throws Exception {
// VipPriceQueryVo vipPriceQueryVo = vipPriceService.getVipPriceById(id);
// return ApiResult.ok(vipPriceQueryVo);
// }
}
package com.sien.common.controller; package com.sien.common.controller;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.sien.common.param.VipRecordOpenParam; import com.sien.common.param.VipRecordOpenParam;
import com.sien.common.service.VipRecordService; import com.sien.common.service.VipRecordService;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
...@@ -26,7 +27,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -26,7 +27,7 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/vipRecord") @RequestMapping("/vipRecord")
@Api(value = "Vip开通记录API", tags = {"Vip开通记录"}) @Api(value = "Vip开通API", tags = {"Vip开通"})
public class VipRecordController extends BaseController { public class VipRecordController extends BaseController {
@Autowired @Autowired
...@@ -37,11 +38,11 @@ public class VipRecordController extends BaseController { ...@@ -37,11 +38,11 @@ public class VipRecordController extends BaseController {
* Vip开通 * Vip开通
*/ */
@PostMapping("/open") @PostMapping("/open")
@OperationLog(name = "Vip开通", type = OperationLogType.ADD) @OperationLog(name = "开通Vip", type = OperationLogType.ADD)
@ApiOperation(value = "Vip开通") @ApiOperation(value = "开通Vip")
public ApiResult<Boolean> addVipRecord(@Validated(Add.class) @RequestBody VipRecordOpenParam vipRecordOpenParam) throws Exception { public ApiResult<WxPayMpOrderResult> openVip(@Validated(Add.class) @RequestBody VipRecordOpenParam vipRecordOpenParam) throws Exception {
boolean flag = vipRecordService.openVip(vipRecordOpenParam);
return ApiResult.result(flag); return vipRecordService.openVip(vipRecordOpenParam);
} }
// /** // /**
......
package com.sien.common.controller; package com.sien.common.controller;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.WxPayService;
import com.sien.common.service.DonationRecordService; import com.sien.common.service.DonationRecordService;
import com.sien.common.service.VipRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
/** /**
* @author Binary Wang * @author Binary Wang
*/ */
//@Api(value = "微信支付", hidden = true) @Api(value = "微信支付", hidden = true)
@RestController @RestController
@RequestMapping("/pay") @RequestMapping("/pay")
@AllArgsConstructor @AllArgsConstructor
...@@ -29,18 +29,19 @@ public class WxPayController { ...@@ -29,18 +29,19 @@ public class WxPayController {
@Autowired @Autowired
private DonationRecordService donationRecordService; private DonationRecordService donationRecordService;
@ApiOperation(value = "捐款支付回调通知处理") @Autowired
private VipRecordService vipRecordService;
@ApiOperation(value = "捐款支付回调通知处理", hidden = true)
@PostMapping("/notify/donationOrder") @PostMapping("/notify/donationOrder")
public String parseDonationOrderNotifyResult(@RequestBody String xmlData) throws WxPayException { public String parseDonationOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
return donationRecordService.parseDonationOrderNotifyResult(xmlData); return donationRecordService.donationOrderNotifyResult(xmlData);
} }
@ApiOperation(value = "会员充值支付回调通知处理") @ApiOperation(value = "会员充值支付回调通知处理", hidden = true)
@PostMapping("/notify/vipOrder") @PostMapping("/notify/vipOrder")
public String parseVipOrderNotifyResult(@RequestBody String xmlData) throws WxPayException { public String parseVipOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
final WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData); return vipRecordService.vipOrderNotifyResult(xmlData);
// TODO 根据自己业务场景需要构造返回对象
return WxPayNotifyResponse.success("成功");
} }
// //
// /** // /**
......
package com.sien.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.geekidea.springbootplus.framework.core.validator.groups.Update;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
/**
* 会员价格表
*
* @author xxx
* @since 2021-03-11
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "VipPrice对象")
public class VipPrice extends BaseEntity {
private static final long serialVersionUID = 1L;
@NotNull(message = "id不能为空", groups = {Update.class})
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("会员价格")
private BigDecimal price;
@ApiModelProperty("会员类型(名称)")
private String memberShips;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
@ApiModelProperty("状态,0:禁用,1:启用")
private Integer state;
}
...@@ -10,7 +10,6 @@ import lombok.Data; ...@@ -10,7 +10,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
...@@ -51,9 +50,9 @@ public class VipRecord extends BaseEntity { ...@@ -51,9 +50,9 @@ public class VipRecord extends BaseEntity {
@ApiModelProperty("开通多久") @ApiModelProperty("开通多久")
private Integer years; private Integer years;
@NotBlank(message = "会员等级不能为空") // @NotBlank(message = "会员等级不能为空")
@ApiModelProperty("会员等级") // @ApiModelProperty("会员等级")
private String vipLevel; // private String vipLevel;
@ApiModelProperty("备注") @ApiModelProperty("备注")
private String remark; private String remark;
......
package com.sien.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sien.common.entity.VipPrice;
import com.sien.common.param.VipPricePageParam;
import com.sien.common.vo.app.VipPriceQueryVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.io.Serializable;
/**
* 会员价格表 Mapper 接口
*
* @author xxx
* @since 2021-03-11
*/
@Repository
public interface VipPriceMapper extends BaseMapper<VipPrice> {
/**
* 根据ID获取查询对象
*
* @param id
* @return
*/
VipPriceQueryVo getVipPriceById(Serializable id);
/**
* 获取分页对象
*
* @param page
* @param vipPricePageParam
* @return
*/
IPage<VipPriceQueryVo> getVipPricePageList(@Param("page") Page page, @Param("param") VipPricePageParam vipPricePageParam);
}
package com.sien.common.param;
import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <pre>
* 会员价格表 分页参数对象
* </pre>
*
* @author xxx
* @date 2021-03-11
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "会员价格表分页参数")
public class VipPricePageParam extends BasePageOrderParam {
private static final long serialVersionUID = 1L;
}
...@@ -9,7 +9,6 @@ import lombok.experimental.Accessors; ...@@ -9,7 +9,6 @@ import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/** /**
* <pre> * <pre>
...@@ -26,16 +25,16 @@ import java.math.BigDecimal; ...@@ -26,16 +25,16 @@ import java.math.BigDecimal;
public class VipRecordOpenParam extends BasePageOrderParam { public class VipRecordOpenParam extends BasePageOrderParam {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ApiModelProperty("开通会员金额") // @ApiModelProperty("开通会员金额")
private BigDecimal money; // private BigDecimal money;
@NotNull(message = "开通多久不能为空") @NotNull(message = "开通多久不能为空")
@ApiModelProperty("开通多少年") @ApiModelProperty("开通多少年")
private Integer years; private Integer years;
@NotBlank(message = "会员等级不能为空") @NotBlank(message = "会员等级id不能为空")
@ApiModelProperty("会员等级,直接传文字") @ApiModelProperty("会员等级id,传入由会员列表接口返回的id")
private String vipLevel; private Long vipLevelId;
@NotBlank(message = "不能为空") @NotBlank(message = "不能为空")
@ApiModelProperty("是否代替他人开通") @ApiModelProperty("是否代替他人开通")
......
...@@ -40,7 +40,7 @@ public interface DonationRecordService extends BaseService<DonationRecord> { ...@@ -40,7 +40,7 @@ public interface DonationRecordService extends BaseService<DonationRecord> {
/** /**
* 回调 * 回调
*/ */
String parseDonationOrderNotifyResult(String xmlData); String donationOrderNotifyResult(String xmlData);
/** /**
......
package com.sien.common.service;
import com.sien.common.entity.VipPrice;
import com.sien.common.param.VipPricePageParam;
import com.sien.common.vo.app.VipPriceQueryVo;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
/**
* 会员价格表 服务类
*
* @author xxx
* @since 2021-03-11
*/
public interface VipPriceService extends BaseService<VipPrice> {
/**
* 保存
*
* @param vipPrice
* @return
* @throws Exception
*/
boolean saveVipPrice(VipPrice vipPrice) throws Exception;
/**
* 修改
*
* @param vipPrice
* @return
* @throws Exception
*/
boolean updateVipPrice(VipPrice vipPrice) throws Exception;
/**
* 删除
*
* @param id
* @return
* @throws Exception
*/
boolean deleteVipPrice(Long id) throws Exception;
/**
* 根据ID获取查询对象
*
* @param id
* @return
* @throws Exception
*/
VipPriceQueryVo getVipPriceById(Long id) throws Exception;
/**
* 获取分页对象
*
* @param vipPricePageParam
* @return
* @throws Exception
*/
Paging<VipPriceQueryVo> getVipPricePageList(VipPricePageParam vipPricePageParam) throws Exception;
}
package com.sien.common.service; package com.sien.common.service;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.sien.common.entity.VipRecord; import com.sien.common.entity.VipRecord;
import com.sien.common.param.VipRecordOpenParam; import com.sien.common.param.VipRecordOpenParam;
import com.sien.common.param.VipRecordPageParam; import com.sien.common.param.VipRecordPageParam;
import com.sien.common.vo.VipRecordQueryVo; import com.sien.common.vo.VipRecordQueryVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService; import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
...@@ -16,6 +18,13 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging; ...@@ -16,6 +18,13 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging;
public interface VipRecordService extends BaseService<VipRecord> { public interface VipRecordService extends BaseService<VipRecord> {
/** /**
* 支付回调
* @param xmlData
* @return
*/
String vipOrderNotifyResult(String xmlData);
/**
* 保存 * 保存
* *
* @param vipRecord * @param vipRecord
...@@ -30,7 +39,7 @@ public interface VipRecordService extends BaseService<VipRecord> { ...@@ -30,7 +39,7 @@ public interface VipRecordService extends BaseService<VipRecord> {
* @return * @return
* @throws Exception * @throws Exception
*/ */
boolean openVip(VipRecordOpenParam vipRecordOpenParam)throws Exception; ApiResult<WxPayMpOrderResult> openVip(VipRecordOpenParam vipRecordOpenParam)throws Exception;
/** /**
* 修改 * 修改
......
...@@ -81,7 +81,7 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap ...@@ -81,7 +81,7 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap
} }
@Override @Override
public String parseDonationOrderNotifyResult(String xmlData) { public String donationOrderNotifyResult(String xmlData) {
WxPayOrderNotifyResult notifyResult; WxPayOrderNotifyResult notifyResult;
try { try {
...@@ -125,8 +125,6 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap ...@@ -125,8 +125,6 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap
return ApiResult.fail(ApiCode.FAIL, new WxPayMpOrderResult()); return ApiResult.fail(ApiCode.FAIL, new WxPayMpOrderResult());
} }
// 微信支付请求参数对象
WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
String openid = appUserById.getWechatOpenId(); String openid = appUserById.getWechatOpenId();
String spbillCreateIp = httpServletRequest.getRemoteAddr(); String spbillCreateIp = httpServletRequest.getRemoteAddr();
...@@ -152,6 +150,7 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap ...@@ -152,6 +150,7 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap
} }
// 设置捐款记录表 // 设置捐款记录表
donationRecord.setMoney(donationRecordAdd.getMoney()); donationRecord.setMoney(donationRecordAdd.getMoney());
donationRecord.setPurpose(donationRecordAdd.getPurpose()); donationRecord.setPurpose(donationRecordAdd.getPurpose());
donationRecord.setWay(donationRecordAdd.getWay()); donationRecord.setWay(donationRecordAdd.getWay());
...@@ -174,7 +173,7 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap ...@@ -174,7 +173,7 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap
// 调用微信支付api // 调用微信支付api
WxPayMpOrderResult order = null; WxPayMpOrderResult order = null;
try { try {
order = getWxPayMpOrderResult(wxPayUnifiedOrderRequest, outTradeNo, openid, spbillCreateIp, totalFee); order = getWxPayMpOrderResult( outTradeNo, openid, spbillCreateIp, totalFee);
} catch (WxPayException e) { } catch (WxPayException e) {
e.printStackTrace(); e.printStackTrace();
} }
...@@ -182,7 +181,9 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap ...@@ -182,7 +181,9 @@ public class DonationRecordServiceImpl extends BaseServiceImpl<DonationRecordMap
return ApiResult.ok(order); return ApiResult.ok(order);
} }
private WxPayMpOrderResult getWxPayMpOrderResult(WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest, String outTradeNo, String openid, String spbillCreateIp, int totalFee) throws WxPayException { private WxPayMpOrderResult getWxPayMpOrderResult(String outTradeNo, String openid, String spbillCreateIp, int totalFee) throws WxPayException {
WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest =new WxPayUnifiedOrderRequest();
wxPayUnifiedOrderRequest.setBody(DonationRecordServiceImpl.BODY); wxPayUnifiedOrderRequest.setBody(DonationRecordServiceImpl.BODY);
// 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号 // 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
......
package com.sien.common.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sien.common.entity.VipPrice;
import com.sien.common.mapper.VipPriceMapper;
import com.sien.common.param.VipPricePageParam;
import com.sien.common.service.VipPriceService;
import com.sien.common.vo.app.VipPriceQueryVo;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 会员价格表 服务实现类
*
* @author xxx
* @since 2021-03-11
*/
@Slf4j
@Service
public class VipPriceServiceImpl extends BaseServiceImpl<VipPriceMapper, VipPrice> implements VipPriceService {
@Autowired
private VipPriceMapper vipPriceMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveVipPrice(VipPrice vipPrice) throws Exception {
return super.save(vipPrice);
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean updateVipPrice(VipPrice vipPrice) throws Exception {
return super.updateById(vipPrice);
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean deleteVipPrice(Long id) throws Exception {
return super.removeById(id);
}
@Override
public VipPriceQueryVo getVipPriceById(Long id) throws Exception {
return vipPriceMapper.getVipPriceById(id);
}
@Override
public Paging<VipPriceQueryVo> getVipPricePageList(VipPricePageParam vipPricePageParam) throws Exception {
Page<VipPriceQueryVo> page = new PageInfo<>(vipPricePageParam, OrderItem.desc(getLambdaColumn(VipPrice::getCreateTime)));
IPage<VipPriceQueryVo> iPage = vipPriceMapper.getVipPricePageList(page, vipPricePageParam);
return new Paging<VipPriceQueryVo>(iPage);
}
}
package com.sien.common.service.impl; package com.sien.common.service.impl;
import cn.hutool.captcha.generator.RandomGenerator;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.sien.common.entity.AppUser;
import com.sien.common.entity.VipRecord; import com.sien.common.entity.VipRecord;
import com.sien.common.mapper.VipRecordMapper; import com.sien.common.mapper.VipRecordMapper;
import com.sien.common.param.VipRecordOpenParam; import com.sien.common.param.VipRecordOpenParam;
import com.sien.common.param.VipRecordPageParam; import com.sien.common.param.VipRecordPageParam;
import com.sien.common.service.AppUserService;
import com.sien.common.service.VipPriceService;
import com.sien.common.service.VipRecordService; import com.sien.common.service.VipRecordService;
import com.sien.common.vo.AppUserQueryVo;
import com.sien.common.vo.VipRecordQueryVo; import com.sien.common.vo.VipRecordQueryVo;
import com.sien.common.vo.app.VipPriceQueryVo;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo; import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
...@@ -19,7 +34,11 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -19,7 +34,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date;
/** /**
* Vip开通记录 服务实现类 * Vip开通记录 服务实现类
...@@ -31,40 +50,151 @@ import java.util.Calendar; ...@@ -31,40 +50,151 @@ import java.util.Calendar;
@Service @Service
public class VipRecordServiceImpl extends BaseServiceImpl<VipRecordMapper, VipRecord> implements VipRecordService { public class VipRecordServiceImpl extends BaseServiceImpl<VipRecordMapper, VipRecord> implements VipRecordService {
private static final String BODY = "厦门市四恩慈善会会员开通";
private static final String NOTIFY_URL = "https://c7a30ed052d8.ngrok.io/api/pay/notify/vipOrder";
@Autowired @Autowired
private VipRecordMapper vipRecordMapper; private VipRecordMapper vipRecordMapper;
@Autowired
private WxPayService wxService;
@Autowired
private AppUserService appUserService;
@Resource
HttpServletRequest httpServletRequest;
@Autowired
private VipPriceService vipPriceService;
@Override
public String vipOrderNotifyResult(String xmlData) {
WxPayOrderNotifyResult notifyResult;
try {
notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
} catch (WxPayException e) {
// 是否能解密成功
e.printStackTrace();
return WxPayNotifyResponse.fail("错误");
}
VipRecord vipRecord = super.getOne(new QueryWrapper<VipRecord>().lambda().eq(VipRecord::getWxMerPayId, notifyResult.getOutTradeNo()));
// 如果已经支付 直接响应成功
if (vipRecord.getPayStatus() == 1) {
return WxPayNotifyResponse.successResp("成功");
}
vipRecord.setPayStatus(1);
vipRecord.setPayTime(new Date());
super.updateById(vipRecord);
return WxPayNotifyResponse.successResp("成功");
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public boolean saveVipRecord(VipRecord vipRecord) throws Exception { public boolean saveVipRecord(VipRecord vipRecord) throws Exception {
return super.save(vipRecord); return super.save(vipRecord);
} }
private WxPayMpOrderResult getWxPayMpOrderResult(String outTradeNo, String openid, String spbillCreateIp, int totalFee) throws WxPayException {
WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
wxPayUnifiedOrderRequest.setBody(VipRecordServiceImpl.BODY);
// 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
wxPayUnifiedOrderRequest.setOutTradeNo(outTradeNo);
//订单总金额,单位为分,详见支付金额
wxPayUnifiedOrderRequest.setTotalFee(totalFee);
// APP和网页支付提交用户端ip
wxPayUnifiedOrderRequest.setSpbillCreateIp(spbillCreateIp);
// 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
wxPayUnifiedOrderRequest.setNotifyUrl(VipRecordServiceImpl.NOTIFY_URL);
wxPayUnifiedOrderRequest.setOpenid(openid);
String jsapi = "JSAPI";
wxPayUnifiedOrderRequest.setTradeType(jsapi);
WxPayMpOrderResult order = null;
// try {
order = this.wxService.createOrder(wxPayUnifiedOrderRequest);
// } catch (WxPayException e) {
// e.printStackTrace();
// }
return order;
}
@Override @Override
public boolean openVip(VipRecordOpenParam vipRecordOpenParam) throws Exception { public ApiResult<WxPayMpOrderResult> openVip(VipRecordOpenParam vipRecordOpenParam) throws Exception {
JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal(); JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
VipRecord vipRecord = new VipRecord(); AppUserQueryVo appUserById = appUserService.getAppUserById(jwtToken.getUserId());
vipRecord.setFkUserId(jwtToken.getUserId());
vipRecord.setMoney(vipRecordOpenParam.getMoney()); // 获取vip价格表
vipRecord.setFkRechargeUser(-1L); VipPriceQueryVo vipPriceById = vipPriceService.getVipPriceById(vipRecordOpenParam.getVipLevelId());
if (vipPriceById == null) {
return ApiResult.fail(ApiCode.FAIL, null);
}
// 应付金额
BigDecimal money = vipPriceById.getPrice().multiply(new BigDecimal(vipRecordOpenParam.getYears()));
// 设置到期时间 // 设置到期时间
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, vipRecordOpenParam.getYears()); calendar.add(Calendar.YEAR, vipRecordOpenParam.getYears());
vipRecord.setExpiredAt(calendar.getTime()); Date expiredAt = calendar.getTime();
// 商家订单号
String outTradeNo = new RandomGenerator(32).generate();
VipRecord vipRecord = new VipRecord();
vipRecord.setMoney(money);
vipRecord.setExpiredAt(expiredAt);
vipRecord.setYears(vipRecordOpenParam.getYears()); vipRecord.setYears(vipRecordOpenParam.getYears());
vipRecord.setVipLevel(vipRecordOpenParam.getVipLevel()); vipRecord.setPayStatus(0);
// vipRecord.setRemark("");
// vipRecord.setCreateTime(new Date());
// vipRecord.setUpdateTime(new Date());
// 判断是否为替他人 // // 判断是否为替他人
if (vipRecordOpenParam.getIsReplace()) { if (vipRecordOpenParam.getIsReplace()) {
// vipRecord.setFkRechargeUser(vipRecordOpenParam.getAgentUserId()); AppUser user = appUserService.getOne(new QueryWrapper<AppUser>().lambda()
.eq(AppUser::getPhone, vipRecordOpenParam.getUserPhone())
.eq(AppUser::getPhoneArea, vipRecordOpenParam.getPhoneArea()));
//判断接收方是否存在
if (user == null) {
return ApiResult.fail(ApiCode.FAIL, new WxPayMpOrderResult());
}
vipRecord.setFkUserId(user.getId());
vipRecord.setFkRechargeUser(jwtToken.getUserId());
} else {
vipRecord.setFkUserId(jwtToken.getUserId());
vipRecord.setFkRechargeUser(-1L);
}
// 保存数据库
boolean save = super.save(vipRecord);
if (save) {
// 保存成功调用微信支付
String ip = httpServletRequest.getRemoteAddr();
BigDecimal num2 = new BigDecimal(100);
int totalFee = money.multiply(num2).intValue();
WxPayMpOrderResult wxPayMpOrderResult = getWxPayMpOrderResult(outTradeNo, appUserById.getWechatOpenId(), ip, totalFee);
return ApiResult.ok(wxPayMpOrderResult);
} else {
return ApiResult.fail(ApiCode.FAIL, null);
} }
return super.save(vipRecord);
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
......
package com.sien.common.vo.app;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <pre>
* 会员价格表 查询结果对象
* </pre>
*
* @author xxx
* @date 2021-03-11
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "VipPriceQueryVo对象")
public class VipPriceQueryVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("会员价格")
private BigDecimal price;
@ApiModelProperty("会员类型(名称)")
private String memberShips;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
@ApiModelProperty("状态,0:禁用,1:启用")
private Integer state;
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sien.common.mapper.VipPriceMapper">
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id
, price, member_ships, create_time, update_time, state
</sql>
<select id="getVipPriceById" resultType="com.sien.common.vo.app.VipPriceQueryVo">
select
<include refid="Base_Column_List"/>
from vip_price where id = #{id}
</select>
<select id="getVipPricePageList" parameterType="com.sien.common.param.VipPricePageParam"
resultType="com.sien.common.vo.app.VipPriceQueryVo">
select
<include refid="Base_Column_List"/>
from vip_price
</select>
</mapper>
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<!-- 通用查询结果列 --> <!-- 通用查询结果列 -->
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, fk_user_id, fk_recharge_user, money, expired_at, years, vip_level, remark, create_time, update_time,wx_mer_pay_id,pay_status,pay_time id, fk_user_id, fk_recharge_user, money, expired_at, years, remark, create_time, update_time,wx_mer_pay_id,pay_status,pay_time
</sql> </sql>
<select id="getVipRecordById" resultType="com.sien.common.vo.VipRecordQueryVo"> <select id="getVipRecordById" resultType="com.sien.common.vo.VipRecordQueryVo">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment