Browse Source

no message

FengChaoYu 10 months ago
parent
commit
855d704260

+ 26 - 0
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/bean/material/WebsitSalesPayMapBean.java

@@ -0,0 +1,26 @@
+package com.gree.mall.miniapp.bean.material;
+
+import com.gree.mall.miniapp.plus.entity.WebsitSalesPayMap;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel
+public class WebsitSalesPayMapBean extends WebsitSalesPayMap {
+
+    @ApiModelProperty(value = "短链接")
+    private String code;
+
+    @ApiModelProperty(value = "appid")
+    private String appid;
+
+    @ApiModelProperty(value = "appOrderId")
+    private String appOrderId;
+
+    @ApiModelProperty(value = "请求位置 1=小程序")
+    private Integer type;
+
+}

+ 38 - 0
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/controller/material/MaterialSalesController.java

@@ -1,12 +1,14 @@
 package com.gree.mall.miniapp.controller.material;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.miniapp.annotation.ApiNotAuth;
 import com.gree.mall.miniapp.bean.PayDetail;
 import com.gree.mall.miniapp.bean.material.*;
 import com.gree.mall.miniapp.constant.Constant;
 import com.gree.mall.miniapp.exception.RemoteServiceException;
 import com.gree.mall.miniapp.helper.ResponseHelper;
 import com.gree.mall.miniapp.logic.material.WebsitSalesLogic;
+import com.gree.mall.miniapp.plus.entity.AdminWebsitPayConfig;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -166,4 +168,40 @@ public class MaterialSalesController {
 //        return ResponseHelper.success(salesId);
 //    }
 
+    @PostMapping("/get/pay/config")
+    @ApiOperation("获取支付配置")
+    public ResponseHelper<List<AdminWebsitPayConfig>> getPayConfig(
+            @ApiParam(value = "网点号",required = true) @RequestParam String websitId,
+            @ApiParam(value = "商品类型 M=辅材 P=配件",required = true) @RequestParam String goodsType,
+            HttpServletRequest request
+    ){
+        List<AdminWebsitPayConfig> configList = websitSalesLogic.getPayConfig(websitId, goodsType, request);
+        return ResponseHelper.success(configList);
+    }
+
+    @PostMapping("/save/pay/order")
+    @ApiOperation(value = "生成订单支付并返回短链接")
+    public ResponseHelper<WebsitSalesPayMapBean> saveSheetPayMap(@RequestBody WebsitSalesPayMapBean sheetPayMap) throws RemoteServiceException {
+        return ResponseHelper.success(websitSalesLogic.saveSheetPayMap(sheetPayMap));
+    }
+
+    @ApiNotAuth
+    @GetMapping("/pay")
+    @ApiOperation(value = "生成小程序支付")
+    public ResponseHelper<PayDetail> websitDefault(
+            @ApiParam(value = "appOrderId",required = true) @RequestParam String key,
+            @ApiParam(value = "openid",required = true) @RequestParam String openid
+    ) throws RemoteServiceException, InterruptedException {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_ORDER + ":" + key);
+        if(!obtain.tryLock(10, TimeUnit.SECONDS)){
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            PayDetail pay = websitSalesLogic.generatePayRecord(key, openid);
+            return ResponseHelper.success(pay);
+        }finally {
+            obtain.unlock();
+        }
+
+    }
 }

+ 22 - 0
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/enums/PayOrderTypeEnum.java

@@ -0,0 +1,22 @@
+package com.gree.mall.miniapp.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.miniapp.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PayOrderTypeEnum implements BaseEnum {
+    S("S","收款"),
+    R("R","退款"),
+    ;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+
+    private final String remark;
+}

+ 110 - 0
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/logic/material/WebsitSalesLogic.java

@@ -1,14 +1,20 @@
 package com.gree.mall.miniapp.logic.material;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.gree.mall.miniapp.bean.PayDetail;
 import com.gree.mall.miniapp.bean.material.*;
 import com.gree.mall.miniapp.bean.user.CurrentCompanyWechat;
 import com.gree.mall.miniapp.commonmapper.MaterialMapper;
+import com.gree.mall.miniapp.constant.SybConstants;
 import com.gree.mall.miniapp.enums.IsYesNoEnum;
 import com.gree.mall.miniapp.enums.OrderInfoSourceEnum;
+import com.gree.mall.miniapp.enums.PayOrderTypeEnum;
+import com.gree.mall.miniapp.enums.PayTypeEnum;
 import com.gree.mall.miniapp.enums.material.WebsitGoodsTypeEnum;
 import com.gree.mall.miniapp.exception.RemoteServiceException;
 import com.gree.mall.miniapp.logic.common.AllInPayLogic;
@@ -19,7 +25,9 @@ import com.gree.mall.miniapp.plus.service.*;
 import com.gree.mall.miniapp.utils.DateUtils;
 import com.gree.mall.miniapp.utils.IpUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -35,6 +43,9 @@ import java.util.stream.Collectors;
 @Slf4j
 public class WebsitSalesLogic {
 
+    @Value("${share.mall.appid}")
+    private String mallAppid;
+
     @Resource
     MaterialMapper materialMapper;
     @Resource
@@ -59,6 +70,8 @@ public class WebsitSalesLogic {
     AllInPayLogic allInPayLogic;
     @Resource
     AdminWebsitPayConfigService adminWebsitPayConfigService;
+    @Resource
+    WebsitSalesPayMapService websitSalesPayMapService;
 
     public IPage<SalesOrderBean> buyList(String flag, Integer pageNum, Integer pageSize, HttpServletRequest request) {
         CurrentCompanyWechat wechat = commonLogic.getCurrentCompanyWechat(request);
@@ -435,4 +448,101 @@ public class WebsitSalesLogic {
                 log.info("未定义交易状态:" + trxstatus);
         }
     }
+
+    public List<AdminWebsitPayConfig> getPayConfig(String websitId, String goodsType, HttpServletRequest request) {
+        CurrentCompanyWechat wechat = commonLogic.getCurrentCompanyWechat(request);
+        return adminWebsitPayConfigService.lambdaQuery()
+                .eq(AdminWebsitPayConfig::getCompanyWechatId, wechat.getCompanyWechatId())
+                .eq(AdminWebsitPayConfig::getWebsitId, websitId)
+                .eq(AdminWebsitPayConfig::getType, goodsType)
+                .eq(AdminWebsitPayConfig::getStatus, true)
+                .list();
+    }
+
+    @Transactional
+    public WebsitSalesPayMapBean saveSheetPayMap(WebsitSalesPayMapBean sheetPayMap) {
+        if (StringUtils.isBlank(sheetPayMap.getSalesId())) {
+            throw new RemoteServiceException("订单号不能为空");
+        }
+        if (StringUtils.isBlank(sheetPayMap.getPayConfigId())) {
+            throw new RemoteServiceException("支付配置不能为空");
+        }
+
+        // 获取支付记录
+        List<WebsitSalesPayOrder> payList = websitSalesPayOrderService.lambdaQuery()
+                .eq(WebsitSalesPayOrder::getOrderId, sheetPayMap.getSalesId())
+                .orderByAsc(WebsitSalesPayOrder::getId)
+                .list();
+        // 判断是否存在一个或以上支付记录
+        if (CollectionUtil.isNotEmpty(payList)) {
+            WebsitSalesPayOrder salesPayList = payList.get(payList.size() - 1);
+            // 判断是否支付
+            if (salesPayList.getPayFlag().equals(IsYesNoEnum.YES.getKey())) {
+                throw new RemoteServiceException(salesPayList.getOrderId() + " 订单已支付,请刷新界面!");
+            }
+        }
+
+        sheetPayMap.setId(null);
+        sheetPayMap.setAppid(mallAppid);
+        sheetPayMap.setAppOrderId(sheetPayMap.getId());
+        websitSalesPayMapService.save(sheetPayMap);
+
+        return sheetPayMap;
+    }
+
+    /**
+     * 生成支付记录
+     * @param key
+     * @param openid
+     * @return
+     */
+    public PayDetail generatePayRecord(String key, String openid) {
+        PayDetail payDetail = null;
+        final WebsitSalesPayMap payMap = websitSalesPayMapService.getById(key);
+
+        final AdminWebsitPayConfig payConfig = adminWebsitPayConfigService.getById(payMap.getPayConfigId());
+
+        final WebsitSales sales = websitSalesService.getById(payMap.getSalesId());
+
+        if (Objects.nonNull(sales)) {
+            WebsitSalesPayOrder payOrder = new WebsitSalesPayOrder();
+            payOrder.setId(IdWorker.getIdStr())
+                    .setCompanyWechatId(sales.getCompanyWechatId())
+                    .setCompanyWechatName(sales.getCompanyWechatName())
+                    .setGoodsType(sales.getGoodsType())
+                    .setWebsitId(sales.getWebsitId())
+                    .setWebsitName(sales.getWebsitName())
+                    .setOrderId(sales.getSalesId())
+                    .setOutTradeNo(payOrder.getId())
+                    .setOpenid(openid)
+                    .setPayType(PayTypeEnum.ALLINPAY.getKey())
+                    .setOrderCreateTime(sales.getCreateTime())
+                    .setPayValue(sales.getTotalAmount())
+                    .setOrgId(payConfig.getOrgId())
+                    .setMchNo(payConfig.getMchNo())
+                    .setAppid(payConfig.getAppid())
+                    .setOrderType(PayOrderTypeEnum.S.getKey())
+                    .setRunTime(DateUtil.offsetSecond(DateUtil.date(), 10))
+                    .setOrderSource(sales.getGoodsType().equals(WebsitGoodsTypeEnum.M.toString()) ? "M_SALES" : "P_SALES")
+                    .setIsDeliver(false);
+
+
+            // 请求通联得到结果
+            Map<String, String> resMap = allInPayLogic.serviceUnifiedOrder(payOrder, SybConstants.PAY_TYPE_W06);
+
+            if (!resMap.get("trxstatus").equals("0000")) {
+                throw new RemoteServiceException("通联统一支付接口执行失败:" + resMap.get("errmsg"));
+            }
+
+            payOrder.setOrderNo(resMap.get("trxid"))
+                    .insert();
+
+            payDetail = new PayDetail();
+            payDetail.setCodeUrl(resMap.get("payinfo"));
+            payDetail.setId(payOrder.getId());
+            log.info("通联支付payDetail:{}", JSONObject.toJSONString(payDetail));
+        }
+
+        return payDetail;
+    }
 }

+ 4 - 1
mall-miniapp-service/src/main/resources/bootstrap-dev.properties

@@ -76,4 +76,7 @@ allIn.payment.notifyUrl=${php.interface.url}/java_fucai/common/allInPayCall
 #内部接口
 inf.url=http://121.43.111.127:11111
 inf.token.appid=zfire-jsm-sxb
-inf.token.appSecret=3e7iee31ub94rvvesp7266kwske7fple
+inf.token.appSecret=3e7iee31ub94rvvesp7266kwske7fple
+
+#分销商城appid
+share.mall.appid=wx21d155e8a449d9b1

+ 4 - 1
mall-miniapp-service/src/main/resources/bootstrap-prd.propertiesb

@@ -78,4 +78,7 @@ allIn.payment.notifyUrl=${php.interface.url}/java_fucai/common/allInPayCall
 #内部接口
 inf.url=http://121.43.111.127:11111
 inf.token.appid=zfire-jsm-sxb
-inf.token.appSecret=3e7iee31ub94rvvesp7266kwske7fple
+inf.token.appSecret=3e7iee31ub94rvvesp7266kwske7fple
+
+#分销商城appid
+share.mall.appid=wx21d155e8a449d9b1

+ 4 - 1
mall-miniapp-service/src/main/resources/bootstrap-test.properties

@@ -74,4 +74,7 @@ allIn.payment.notifyUrl=${php.interface.url}/java_fucai/common/allInPayCall
 #内部接口
 inf.url=http://121.43.111.127:11111
 inf.token.appid=zfire-jsm-sxb
-inf.token.appSecret=3e7iee31ub94rvvesp7266kwske7fple
+inf.token.appSecret=3e7iee31ub94rvvesp7266kwske7fple
+
+#分销商城appid
+share.mall.appid=wx21d155e8a449d9b1