Просмотр исходного кода

调用易宝支付(统一支付)

xiaoqiang 4 лет назад
Родитель
Сommit
d3da29189b

+ 12 - 11
src/main/java/org/springblade/gateway/point_gateway/controller/PointExchangeController.java

@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
+import java.util.HashMap;
 
 /**
  * @author cy-computer
@@ -46,30 +47,30 @@ public class PointExchangeController {
 	 */
 	@PostMapping("/exchange")
 	@ApiOperation("积分兑换")
-	public R<YeepayOrder> exchange(@ApiParam(value = "兑换类型",required = true) @RequestParam Integer type,
-								   @ApiParam(value = "手机号",required = true) @RequestParam String phone,
-								   @ApiParam(value = "活动id",required = true) @RequestParam Long activeId,
-								   @ApiParam(value = "兑换数量",required = true) @RequestParam Integer num,
-								   @ApiParam(value = "商品ID",required = true) @RequestParam Long goodsId,
-								   @ApiParam(value = "收获地址ID",required = false) @RequestParam Long addressId,
-								   BigDecimal point) throws Exception {
+	public R<Object> exchange(@ApiParam(value = "兑换类型",required = true) @RequestParam Integer type,
+							   @ApiParam(value = "手机号",required = true) @RequestParam String phone,
+							   @ApiParam(value = "openId",required = true) @RequestParam String openId,
+							   @ApiParam(value = "活动id",required = true) @RequestParam Long activeId,
+							   @ApiParam(value = "兑换数量",required = true) @RequestParam Integer num,
+							   @ApiParam(value = "商品ID",required = true) @RequestParam Long goodsId,
+							   @ApiParam(value = "收获地址ID",required = false) @RequestParam Long addressId,
+							   BigDecimal point) throws Exception {
 		YeepayOrder yeepayOrder = new YeepayOrder(){{
 			setNum(num);
 			setPhone(phone);
 			setPointGoodsId(goodsId);
 			setActiveId(activeId);
 			setAddressId(addressId);
+			setOpenId(openId);
 		}};
 		if (type == 1){
 			pointExchangeService.pointExchange(yeepayOrder);
 			return R.data(yeepayOrder);
 		}else if (type == 0){
-			pointExchangeService.cashExchange(yeepayOrder);
-			return R.data(yeepayOrder);
+			return R.data(pointExchangeService.cashExchange(yeepayOrder));
 		}else if (type == 2){
 			if (point != null){
-				pointExchangeService.hybridExchange(yeepayOrder,point);
-				return R.data(yeepayOrder);
+				return R.data(pointExchangeService.hybridExchange(yeepayOrder,point));
 			}
 		}
 		return R.data(yeepayOrder);

+ 3 - 2
src/main/java/org/springblade/gateway/point_gateway/service/PointExchangeService.java

@@ -4,6 +4,7 @@ import org.springblade.sing.yeepay.entity.YeepayOrder;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
+import java.util.HashMap;
 
 public interface PointExchangeService {
 	/**
@@ -18,7 +19,7 @@ public interface PointExchangeService {
 	 * @param yeepayOrder
 	 * @return
 	 */
-	void cashExchange(YeepayOrder yeepayOrder) throws Exception;
+	HashMap<String, Object> cashExchange(YeepayOrder yeepayOrder) throws Exception;
 
 	/**
 	 * 现金支付回调
@@ -32,6 +33,6 @@ public interface PointExchangeService {
 	 * @param point
 	 * @return
 	 */
-	void hybridExchange(YeepayOrder yeepayOrder, BigDecimal point) throws Exception;
+	HashMap<String, Object> hybridExchange(YeepayOrder yeepayOrder, BigDecimal point) throws Exception;
 }
 

+ 77 - 33
src/main/java/org/springblade/gateway/point_gateway/service/impl/PointExchangeServiceImpl.java

@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springblade.common.enums.AppConstant;
 import org.springblade.common.utils.BeanPropertyUtil;
+import org.springblade.common.utils.IPUtils;
 import org.springblade.core.log.logger.BladeLogger;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.gateway.goods_gateway.exception.HelpGoodsException;
@@ -24,7 +25,9 @@ import org.springblade.sing.point.entity.PointRecord;
 import org.springblade.sing.point.entity.UserPufaPoint;
 import org.springblade.sing.point.service.IPointRecordService;
 import org.springblade.sing.point.service.IUserPufaPointService;
+import org.springblade.sing.user.entity.LoginUser;
 import org.springblade.sing.user.entity.UserAddress;
+import org.springblade.sing.user.service.ILoginUserService;
 import org.springblade.sing.user.service.IUserAddressService;
 import org.springblade.sing.yeepay.entity.YeepayOrder;
 import org.springblade.sing.yeepay.enums.YeepayOrderPayStatus;
@@ -41,6 +44,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Optional;
 
 @Service
@@ -64,6 +68,8 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 	@Autowired
 	private IYeepayOrderService yeepayOrderService;
 	@Autowired
+	private ILoginUserService loginUserService;
+	@Autowired
 	private YeePayConst yeePayConst;
 	@Autowired
 	private BladeLogger bladeLogger;
@@ -75,27 +81,27 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void pointExchange(YeepayOrder yeepayOrder) {
-		UserPufaPoint user = userPufaPointService.getOne(new LambdaQueryWrapper<UserPufaPoint>().eq(UserPufaPoint::getPhone,yeepayOrder.getPhone()));
-		Assert.notNull(user,"用户不存在");
+		UserPufaPoint user = userPufaPointService.getOne(new LambdaQueryWrapper<UserPufaPoint>().eq(UserPufaPoint::getPhone, yeepayOrder.getPhone()));
+		Assert.notNull(user, "用户不存在");
 		PointGoods goods = pointGoodsService.getById(yeepayOrder.getPointGoodsId());
-		Assert.notNull(goods,"商品不存在");
+		Assert.notNull(goods, "商品不存在");
 		UserAddress address = userAddressService.getById(yeepayOrder.getAddressId());
-		Assert.notNull(address,"请添加收货地址");
-		Assert.notNull(yeepayOrder.getActiveId(),"兑换失败");
+		Assert.notNull(address, "请添加收货地址");
+		Assert.notNull(yeepayOrder.getActiveId(), "兑换失败");
 
 		Boolean isLimit = Optional.ofNullable(goods.getIsLimit()).orElse(false);
-		if (isLimit){
+		if (isLimit) {
 			int size = goodsOrderService.list(new LambdaQueryWrapper<GoodsOrder>()
 				.eq(GoodsOrder::getPhone, yeepayOrder.getPhone()).eq(GoodsOrder::getPointGoodsId, yeepayOrder.getPointGoodsId())).size();
 			System.out.println(size);
-			if ((yeepayOrder.getNum() + size) > goods.getLimitBuy()){
+			if ((yeepayOrder.getNum() + size) > goods.getLimitBuy()) {
 				throw new PointException("超过限购数量");
 			}
 		}
 		if (goods.getRemain() < yeepayOrder.getNum()) {
 			throw new PointException("库存不足");
 		}
-		if (user.getPufaPoint().compareTo(BigDecimal.ZERO)<=0){
+		if (user.getPufaPoint().compareTo(BigDecimal.ZERO) <= 0) {
 			throw new PointException("积分不足");
 		}
 		//商品所需积分
@@ -104,12 +110,12 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 
 		BigDecimal userPoint = user.getPufaPoint().subtract(exchangePoint);
 
-		if (userPoint.compareTo(BigDecimal.ZERO) < 0){
+		if (userPoint.compareTo(BigDecimal.ZERO) < 0) {
 			throw new PointException("积分不足");
 		}
 
 		user.setPufaPoint(userPoint);
-		Assert.isTrue(userPufaPointService.saveOrUpdate(user),"兑换失败");
+		Assert.isTrue(userPufaPointService.saveOrUpdate(user), "兑换失败");
 		//下单
 		yeepayOrder.setUserId(user.getUserId());
 		yeepayOrder.setUsePoint(exchangePoint);
@@ -123,26 +129,27 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 		pointRecord.setPointType(PointTypeEnum.PUFA_POINT_EXCHANGE);
 		pointRecord.setPhone(yeepayOrder.getPhone());
 		pointRecord.setActiveId(yeepayOrder.getActiveId());
-		Assert.isTrue(pointRecordService.save(pointRecord),"兑换失败");
+		Assert.isTrue(pointRecordService.save(pointRecord), "兑换失败");
 
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void cashExchange(YeepayOrder yeepayOrder) throws Exception {
-		UserPufaPoint user = userPufaPointService.getOne(new LambdaQueryWrapper<UserPufaPoint>().eq(UserPufaPoint::getPhone,yeepayOrder.getPhone()));
-		Assert.notNull(user,"用户不存在");
+	public HashMap<String, Object> cashExchange(YeepayOrder yeepayOrder) throws Exception {
+		LoginUser loginUser = loginUserService.getOne(new LambdaQueryWrapper<LoginUser>().eq(LoginUser::getPhone, yeepayOrder.getPhone()));
+		UserPufaPoint user = userPufaPointService.getOne(new LambdaQueryWrapper<UserPufaPoint>().eq(UserPufaPoint::getPhone, yeepayOrder.getPhone()));
+		Assert.notNull(user, "用户不存在");
 		PointGoods goods = pointGoodsService.getById(yeepayOrder.getPointGoodsId());
-		Assert.notNull(goods,"商品不存在");
+		Assert.notNull(goods, "商品不存在");
 		UserAddress address = userAddressService.getById(yeepayOrder.getAddressId());
-		Assert.notNull(address,"请添加收货地址");
-		Assert.notNull(yeepayOrder.getActiveId(),"兑换失败");
+		Assert.notNull(address, "请添加收货地址");
+		Assert.notNull(yeepayOrder.getActiveId(), "兑换失败");
 
 		Boolean isLimit = Optional.ofNullable(goods.getIsLimit()).orElse(false);
-		if (isLimit){
+		if (isLimit) {
 			int size = goodsOrderService.list(new LambdaQueryWrapper<GoodsOrder>().eq(GoodsOrder::getPhone, yeepayOrder.getPhone())
-												.eq(GoodsOrder::getPointGoodsId, yeepayOrder.getPointGoodsId())).size();
-			if ((yeepayOrder.getNum() + size) > goods.getLimitBuy()){
+				.eq(GoodsOrder::getPointGoodsId, yeepayOrder.getPointGoodsId())).size();
+			if ((yeepayOrder.getNum() + size) > goods.getLimitBuy()) {
 				throw new PointException("超过限购数量");
 			}
 		}
@@ -169,6 +176,7 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 		yeepayOrder.setUserId(user.getUserId());
 		yeepayOrder.setUsePoint(BigDecimal.ZERO);
 		yeepayOrder.setPointGoodsName(goods.getName());
+		yeepayOrder.setIp(IPUtils.getRealIp(request));
 
 		// 请求易宝
 		try {
@@ -178,6 +186,10 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 				.orderAmount(amount.doubleValue())
 				.goodsName(goods.getName())
 				.scene("OFFLINE")
+				.payWay("WECHAT_OFFIACCOUNT")
+				.userIp(yeepayOrder.getIp())
+				.channel("WECHAT")
+				.userId(yeepayOrder.getOpenId())
 				.appId(configForOfficial.getAppId())
 				//支付订单有效期为一天
 				.expiredTime(DateUtil.format(cn.hutool.core.date.DateUtil.offsetDay(DateUtil.now(), 1), DateUtil.PATTERN_DATETIME))
@@ -186,11 +198,14 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 			//设置易宝配置内容
 			initOrderDto.setParentMerchantNo(yeePayConst.getPlatformServiceNo());
 			initOrderDto.setMerchantNo(yeePayConst.getMerchantNo());
-			YopResponse yopResponse = yeepaySaasService.aggPayPayLink(initOrderDto);
+			YopResponse yopResponse = yeepaySaasService.aggPrepay(initOrderDto);
 
 			//返回数据
 			String stringResult = yopResponse.getStringResult();
 			JSONObject jsonObject = JSONObject.parseObject(stringResult);
+			//返回给前端
+			String prePayTn = jsonObject.getString("prePayTn");
+
 			if (!StringUtils.equals(jsonObject.getString("code"), "00000")) {
 				bladeLogger.error("创建道具订单错误", jsonObject.getString("message"));
 				log.error("创建道具订单错误:{}", jsonObject.getString("message"));
@@ -198,10 +213,22 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 			}
 			yeepayOrder.setUniqueOrderNo(jsonObject.getString(BeanPropertyUtil.getFieldName(YeepayOrder::getUniqueOrderNo)));
 			yeepayOrder.setQrCodeUrl(jsonObject.getString(BeanPropertyUtil.getFieldName(YeepayOrder::getQrCodeUrl)));
-
+			yeepayOrder.setBankOrderId(jsonObject.get("bankOrderId").toString());
+			yeepayOrder.setPrePayTn(prePayTn);
 			//保存订单
 			Assert.isTrue(yeepayOrderService.save(yeepayOrder), "创建订单失败");
 
+			JSONObject prePayTnJson = JSONObject.parseObject(prePayTn);
+
+			HashMap<String, Object> map = new HashMap<>();
+			map.put("appId", prePayTnJson.get("appId"));
+			map.put("timeStamp", prePayTnJson.get("timeStamp"));
+			map.put("nonceStr", prePayTnJson.get("nonceStr"));
+			map.put("package", prePayTnJson.get("package"));
+			map.put("signType", prePayTnJson.get("signType"));
+			map.put("paySign", prePayTnJson.get("paySign"));
+
+			return map;
 		} catch (Exception e) {
 			throw new Exception(e.getMessage());
 		}
@@ -230,14 +257,14 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 		goodsOrder.setGoodsPoint(pointGoods.getPoint());
 		goodsOrder.setActiveId(yeepayOrder.getActiveId());
 		goodsOrder.setUserId(yeepayOrder.getUserId());
-		if (yeepayOrder.getAmount() == null){
+		if (yeepayOrder.getAmount() == null || yeepayOrder.getAmount().equals(BigDecimal.ZERO)) {
 			goodsOrder.setCash(BigDecimal.ZERO);
-		}else {
+		} else {
 			goodsOrder.setCash(yeepayOrder.getAmount());
 		}
 		goodsOrder.setUsePoint(yeepayOrder.getUsePoint());
 
-		Assert.isTrue(goodsOrderService.save(goodsOrder),"兑换失败");
+		Assert.isTrue(goodsOrderService.save(goodsOrder), "兑换失败");
 
 		//更新商品库存
 		pointGoods.setRemain(pointGoods.getRemain() - yeepayOrder.getNum());
@@ -254,13 +281,13 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 		//根据回调信息,获取订单
 		Long orderId = jsonObject.getLong(BeanPropertyUtil.getFieldName(InitOrderDto::getOrderId));
 		YeepayOrder yeepayOrder = yeepayOrderService.getById(orderId);
-		UserPufaPoint user = userPufaPointService.getOne(new LambdaQueryWrapper<UserPufaPoint>().eq(UserPufaPoint::getPhone,yeepayOrder.getPhone()));
+		UserPufaPoint user = userPufaPointService.getOne(new LambdaQueryWrapper<UserPufaPoint>().eq(UserPufaPoint::getPhone, yeepayOrder.getPhone()));
 
-		if (yeepayOrder.getUsePoint() != null && !yeepayOrder.getUsePoint().equals(BigDecimal.ZERO)){
+		if (yeepayOrder.getUsePoint() != null && !yeepayOrder.getUsePoint().equals(BigDecimal.ZERO)) {
 
 			//更新用户积分
 			user.setPufaPoint(user.getPufaPoint().subtract(yeepayOrder.getUsePoint()));
-			Assert.isTrue(userPufaPointService.saveOrUpdate(user),"兑换失败");
+			Assert.isTrue(userPufaPointService.saveOrUpdate(user), "兑换失败");
 			//添加积分消费记录
 			PointRecord pointRecord = new PointRecord();
 			pointRecord.setPoint(yeepayOrder.getUsePoint());
@@ -269,7 +296,7 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 			pointRecord.setPointType(PointTypeEnum.PUFA_POINT_EXCHANGE);
 			pointRecord.setPhone(yeepayOrder.getPhone());
 			pointRecord.setActiveId(yeepayOrder.getActiveId());
-			Assert.isTrue(pointRecordService.save(pointRecord),"兑换失败");
+			Assert.isTrue(pointRecordService.save(pointRecord), "兑换失败");
 		}
 
 		//设置订单状态
@@ -285,7 +312,7 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void hybridExchange(YeepayOrder yeepayOrder, BigDecimal point) throws Exception {
+	public HashMap<String, Object> hybridExchange(YeepayOrder yeepayOrder, BigDecimal point) throws Exception {
 
 		UserPufaPoint user = userPufaPointService.getOne(new LambdaQueryWrapper<UserPufaPoint>().eq(UserPufaPoint::getPhone, yeepayOrder.getPhone()));
 		Assert.notNull(user, "用户不存在");
@@ -297,7 +324,7 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 
 		Boolean isLimit = Optional.ofNullable(goods.getIsLimit()).orElse(false);
 		if (isLimit) {
-			int size = goodsOrderService.list(new LambdaQueryWrapper<GoodsOrder>().eq(GoodsOrder::getPhone, yeepayOrder.getPhone()).eq(GoodsOrder::getPointGoodsId,yeepayOrder.getPointGoodsId())).size();
+			int size = goodsOrderService.list(new LambdaQueryWrapper<GoodsOrder>().eq(GoodsOrder::getPhone, yeepayOrder.getPhone()).eq(GoodsOrder::getPointGoodsId, yeepayOrder.getPointGoodsId())).size();
 			if ((yeepayOrder.getNum() + size) > goods.getLimitBuy()) {
 				throw new PointException("超过限购数量");
 			}
@@ -312,10 +339,10 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 		BigDecimal exchangeNum = BigDecimal.valueOf(yeepayOrder.getNum());
 		BigDecimal exchangePoint = goods.getPoint().multiply(exchangeNum);
 
-		if (user.getPufaPoint().compareTo(exchangePoint) >= 0){
+		if (user.getPufaPoint().compareTo(exchangePoint) >= 0) {
 			log.info("积分兑换");
 			this.pointExchange(yeepayOrder);
-			return;
+			return null;
 		}
 
 		//需要的现金
@@ -346,6 +373,10 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 				.orderAmount(useCash.doubleValue())
 				.goodsName(goods.getName())
 				.scene("OFFLINE")
+				.payWay("WECHAT_OFFIACCOUNT")
+				.userIp(yeepayOrder.getIp())
+				.channel("WECHAT")
+				.userId(yeepayOrder.getOpenId())
 				.appId(configForOfficial.getAppId())
 				//支付订单有效期为一天
 				.expiredTime(DateUtil.format(cn.hutool.core.date.DateUtil.offsetDay(DateUtil.now(), 1), DateUtil.PATTERN_DATETIME))
@@ -359,6 +390,7 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 			//返回数据
 			String stringResult = yopResponse.getStringResult();
 			JSONObject jsonObject = JSONObject.parseObject(stringResult);
+			String prePayTn = jsonObject.getString("prePayTn");
 			if (!StringUtils.equals(jsonObject.getString("code"), "00000")) {
 				bladeLogger.error("创建道具订单错误", jsonObject.getString("message"));
 				log.error("创建道具订单错误:{}", jsonObject.getString("message"));
@@ -366,10 +398,22 @@ public class PointExchangeServiceImpl implements PointExchangeService {
 			}
 			yeepayOrder.setUniqueOrderNo(jsonObject.getString(BeanPropertyUtil.getFieldName(YeepayOrder::getUniqueOrderNo)));
 			yeepayOrder.setQrCodeUrl(jsonObject.getString(BeanPropertyUtil.getFieldName(YeepayOrder::getQrCodeUrl)));
+			yeepayOrder.setBankOrderId(jsonObject.get("bankOrderId").toString());
+			yeepayOrder.setPrePayTn(prePayTn);
 
 			//保存订单
 			Assert.isTrue(yeepayOrderService.save(yeepayOrder), "创建订单失败");
+			JSONObject prePayTnJson = JSONObject.parseObject(prePayTn);
+
+			HashMap<String, Object> map = new HashMap<>();
+			map.put("appId", prePayTnJson.get("appId"));
+			map.put("timeStamp", prePayTnJson.get("timeStamp"));
+			map.put("nonceStr", prePayTnJson.get("nonceStr"));
+			map.put("package", prePayTnJson.get("package"));
+			map.put("signType", prePayTnJson.get("signType"));
+			map.put("paySign", prePayTnJson.get("paySign"));
 
+			return map;
 		} catch (Exception e) {
 			throw new Exception(e.getMessage());
 		}

+ 6 - 0
src/main/java/org/springblade/sing/yeepay/entity/YeepayOrder.java

@@ -149,4 +149,10 @@ public class YeepayOrder extends BaseEntity {
 	 */
 	@ApiModelProperty(value = "用户IP地址")
 	private String ip;
+
+	/**
+	 * 用户openId
+	 */
+	@ApiModelProperty(value = "用户openId")
+	private String openId;
 }