From 7852a4de1aad3098000740b98851e3918796c29f Mon Sep 17 00:00:00 2001 From: xhxu Date: Thu, 18 Nov 2021 14:05:51 +0800 Subject: [PATCH] update pay --- .../migration/V2021111100002__addTTuser.sql | 8 + .../V2021111700001__addPay_vendor.sql | 14 + .../iformall/controller/BaseController.java | 11 + .../controller/WxOrderController.java | 3 +- .../controller/WxPayOrderController.java | 2 +- .../iformall/service/impl/PosServiceImpl.java | 2 + .../java/com/iformall/domain/po/WxOrder.java | 2 + .../java/com/iformall/enums/EnumPayWay.java | 2 + .../com/iformall/service/WxOrderService.java | 2 +- .../service/impl/WxOrderServiceImpl.java | 13 +- .../service/pay/PayServiceFactory.java | 8 +- .../pay/douyin/BaseTtPayAdapterService.java | 248 ++++++++++++++++ .../miniApp/TtMiniAppPayAdapterService.java | 269 ++++++++++++++++++ .../main/resources/mapper/WxOrderMapper.xml | 74 ++++- 14 files changed, 643 insertions(+), 15 deletions(-) create mode 100644 mallinkAdmin/src/main/resources/db/migration/V2021111700001__addPay_vendor.sql create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/service/pay/douyin/BaseTtPayAdapterService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/service/pay/douyin/miniApp/TtMiniAppPayAdapterService.java diff --git a/mallinkAdmin/src/main/resources/db/migration/V2021111100002__addTTuser.sql b/mallinkAdmin/src/main/resources/db/migration/V2021111100002__addTTuser.sql index 4bbe4ba8a..ef65c69e5 100644 --- a/mallinkAdmin/src/main/resources/db/migration/V2021111100002__addTTuser.sql +++ b/mallinkAdmin/src/main/resources/db/migration/V2021111100002__addTTuser.sql @@ -104,3 +104,11 @@ CREATE TABLE tt_buser LIKE wx_buser; update wx_buser set expire_time = now(); + +ALTER TABLE `wx_buser` +MODIFY COLUMN `open_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '微信openId' AFTER `parent_tenant_id`, +MODIFY COLUMN `union_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '微信unionId' AFTER `open_id`; + +ALTER TABLE `tt_buser` +MODIFY COLUMN `open_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '微信openId' AFTER `parent_tenant_id`, +MODIFY COLUMN `union_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '微信unionId' AFTER `open_id`; diff --git a/mallinkAdmin/src/main/resources/db/migration/V2021111700001__addPay_vendor.sql b/mallinkAdmin/src/main/resources/db/migration/V2021111700001__addPay_vendor.sql new file mode 100644 index 000000000..61a4ef5c4 --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V2021111700001__addPay_vendor.sql @@ -0,0 +1,14 @@ +wx_order +type = 10 pay_vendor = 11 +type = 1 pay_vendor = 12 +type = 3 pay_vendor = 13 +type = 4 pay_vendor = 1 + + + + +type = 0 pay_vendor = 1??? + + +ALTER TABLE `mallink`.`wx_order_0` +ADD COLUMN `pay_vendor` smallint(3) COMMENT '订单渠道,EnumPayWay.class' AFTER `type`; \ No newline at end of file diff --git a/mallinkCApi/src/main/java/com/iformall/controller/BaseController.java b/mallinkCApi/src/main/java/com/iformall/controller/BaseController.java index 872539b56..05481b0f2 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/BaseController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/BaseController.java @@ -8,6 +8,7 @@ import com.iformall.domain.po.base.BaseCUserEntity; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.tt.TtCUser; import com.iformall.enums.EnumAppPlat; +import com.iformall.enums.EnumPayWay; import com.iformall.enums.EnumScoreType; import com.iformall.exception.MallinkException; import com.iformall.service.*; @@ -159,6 +160,16 @@ public class BaseController { } return user; } + + public EnumPayWay getPayWay(){ + EnumAppPlat appPlat = getCUser().getAppPlat(); + if(EnumAppPlat.WX.equals(appPlat)){ + return EnumPayWay.PAY_WAY_WECHAT; + }else if (EnumAppPlat.TOUTIAO.equals(appPlat)){ + return EnumPayWay.PAY_WAY_TT; + } + return null; + } public void removeCacheCUser() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java index 82cfd40ee..c8528b319 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java @@ -62,6 +62,7 @@ public class WxOrderController extends BaseController { @Autowired RedisLock redisLock; + //券包下单的逻辑和组合下单的逻辑差不错,但是库存走的是券包的库存,子订单的分账需要调用多次分账 @ApiOperation(value = "券包下单,", notes = "[{\"signleOrder\":{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"},\"count\":8},]") @PostMapping("couponPackageSave") @@ -115,7 +116,7 @@ public class WxOrderController extends BaseController { dto.setSignleOrder(orderSaveDto); dto.setCount(1); list.add(dto); - return wxOrderService.composeSaveOrder(false,EnumComposeOrder.SINGLE,list,memberId,EnumPayWay.PAY_WAY_WECHAT,getTenantInfo()); + return wxOrderService.composeSaveOrder(false,EnumComposeOrder.SINGLE,list,memberId,getPayWay(),getTenantInfo()); } @ApiOperation(value = "取消订单", notes = "{\"orderId\":\"string\"}") diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index 2c3706564..736319170 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -100,7 +100,7 @@ public class WxPayOrderController extends BaseController { return new ResultData(ErrorCode.USER_IS_NOT_MEMBER.getCode(), "暂未成为会员,请授权手机号"); } - return _create(orderIdStr,composeOrderType,user.getUserId(),EnumPayWay.PAY_WAY_WECHAT,user.getAppId(),new PayExtraParam("openId",user.getOpenId()),request); + return _create(orderIdStr,composeOrderType,user.getUserId(),getPayWay(),user.getAppId(),new PayExtraParam("openId",user.getOpenId()),request); } private ResultData _create(String orderIdStr,String composeOrderType,Long userId, EnumPayWay payWay,String appId,PayExtraParam parm,HttpServletRequest request) { diff --git a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java index 703f442cf..0a4ddf8b1 100644 --- a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java +++ b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java @@ -2485,6 +2485,7 @@ public class PosServiceImpl implements PosService { order.updateTenantInfo(merchantBUser); order.setOrderNumber(orderId); order.setType(EnumOrderType.POSPAY.getCode()); + order.setPayVendor(EnumPayWay.PAY_WAY_POS_NEU.getCode()); order.setProductId(merchantBUser.getId()); order.setCUserId(memId); order.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); @@ -2567,6 +2568,7 @@ public class PosServiceImpl implements PosService { order.setId(orderId); order.updateTenantInfo(buUser); order.setType(EnumOrderType.POSPAY.getCode()); + order.setPayVendor(EnumPayWay.PAY_WAY_POS_NEU.getCode()); order.setProductId(buUser.getId()); order.setCUserId(memId); order.setPaymentType(EnumPayType.PAY_POS_REFUND.getCode()); diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java index a67638368..80546db5e 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java @@ -52,6 +52,8 @@ public class WxOrder extends TenantEntity { private Long productId; @io.swagger.annotations.ApiModelProperty(value="类型(0:券,1:B刷卡支付,2:C扫码支付,3:储值卡, 10:POS支付)",name="type") private Integer type; + @io.swagger.annotations.ApiModelProperty(value = "支付渠道EnumPayWay", name = "payVendor") + private Integer payVendor; @io.swagger.annotations.ApiModelProperty(value="0: 付款 1: 退款",name="paymentType") private Integer paymentType; diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumPayWay.java b/mallinkService/src/main/java/com/iformall/enums/EnumPayWay.java index a99899c91..91131baf6 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumPayWay.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumPayWay.java @@ -13,6 +13,8 @@ public enum EnumPayWay { PAY_WAY_TT(5, "抖音担保支付",EnumPayWayType.TT_PAY,EnumAppPlat.TOUTIAO,null), PAY_WAY_POS_B(10, "POS B端",EnumPayWayType.POS,null,null), PAY_WAY_POS_NEU(11, "POS 东软",EnumPayWayType.NEU_POS,null,EnumCardSpendFrom.POS), + PAY_WAY_PREPAIDCARD(13, "储值卡支付",null,null,null), + PAY_WAY_NOT_UNPAY_OUTER(90, "外部注卷",null,null,null), PAY_WAY_NOT_UNPAY_MERCHANT(91, "商户注券,无需支付",null,null,null), PAY_WAY_NOT_UNPAY_VERRIFY(92, "核销发券,无需支付",null,null,null), PAY_WAY_NOT_UNPAY_B_MA(93, "支付发券,无需支付",null,null,null), diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 8457fb8de..c7ffe5cbb 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -222,7 +222,7 @@ public interface WxOrderService { Integer shippingType, UserBasicInfoAddress address); // 3. 创建有价订单 - WxOrder saveNoFreeOrderForCoupon(boolean allowUnPayOrder,WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber,OrderComposeSaveDto orderdto); + WxOrder saveNoFreeOrderForCoupon(boolean allowUnPayOrder,WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber,OrderComposeSaveDto orderdto,EnumPayWay payWay); /** * 下订单成功后处理 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 34ae32f43..8d624923c 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -860,6 +860,7 @@ public class WxOrderServiceImpl implements WxOrderService { record.updateTenantInfo(user); record.setOrderNumber(orderNumber); record.setType(EnumOrderType.MICROPAY.getCode()); + record.setPayVendor(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()); record.setProductId(user.getId()); record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); record.setPayment(payment); @@ -917,6 +918,7 @@ public class WxOrderServiceImpl implements WxOrderService { record.updateTenantInfo(user); record.setOrderNumber(orderNumber); record.setType(EnumOrderType.MICROPAY.getCode()); + record.setPayVendor(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()); record.setProductId(user.getId()); if (cUser != null) { record.setCUserId(cUser.getId()); @@ -959,6 +961,7 @@ public class WxOrderServiceImpl implements WxOrderService { record.updateTenantInfo(merchant); record.setOrderNumber(orderNumber); record.setType(EnumOrderType.PREPAIDCARD.getCode()); + record.setPayVendor(EnumPayWay.PAY_WAY_PREPAIDCARD.getCode()); record.setProductId(merchant.getId()); record.setCUserId(cUserId); record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); @@ -1212,6 +1215,7 @@ public class WxOrderServiceImpl implements WxOrderService { couponOrder.setAutoRefund(coupon.getAutoRefund()); couponOrder.setOrderId(order.getId()); couponOrder.setExpiredTime(valid_date); + couponOrder.setPayVendor(EnumPayWay.PAY_WAY_NOT_UNPAY_OUTER.getCode()); if (!isCard) { couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); } else { @@ -1336,6 +1340,7 @@ public class WxOrderServiceImpl implements WxOrderService { record.setOrderNumber(orderNumber); record.setProductId(couponId); record.setType(EnumOrderType.COUPON.getCode()); + record.setPayVendor(payWay.getCode()); record.setCUserId(user.getId()); record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); record.setPayment(payment); @@ -1410,6 +1415,7 @@ public class WxOrderServiceImpl implements WxOrderService { record.setOrderNumber(orderNumber); record.setProductId(couponId); record.setType(EnumOrderType.COUPON.getCode()); + record.setPayVendor(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()); record.setCUserId(user.getId()); record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); record.setPayment(coupon.getSalePrice()); @@ -2179,7 +2185,7 @@ public class WxOrderServiceImpl implements WxOrderService { } } else { // 有价券 - order = proxy.saveNoFreeOrderForCoupon(allowUnPayOrder,composeOrder,user, orderdto.getWxCoupon(),perCouponNumber, orderdto); + order = proxy.saveNoFreeOrderForCoupon(allowUnPayOrder,composeOrder,user, orderdto.getWxCoupon(),perCouponNumber, orderdto,payWay); } // couponActionLog // try { @@ -2225,6 +2231,7 @@ public class WxOrderServiceImpl implements WxOrderService { WxOrder record = new WxOrder(); record.setCouponChannelId(couponChannelId); record.setType(orderType); + record.setPayVendor(payWay.getCode()); record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); record.setPayment(0); @@ -2265,7 +2272,7 @@ public class WxOrderServiceImpl implements WxOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveNoFreeOrderForCoupon(boolean allowUnPayOrder,WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber,OrderComposeSaveDto orderdto) { + public WxOrder saveNoFreeOrderForCoupon(boolean allowUnPayOrder,WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber,OrderComposeSaveDto orderdto,EnumPayWay payWay) { WxOrderServiceImpl proxy = (WxOrderServiceImpl) AopContext.currentProxy(); String couponIdStr = String.valueOf(coupon.getId()); // 3. 减库存操作 @@ -2291,6 +2298,7 @@ public class WxOrderServiceImpl implements WxOrderService { // 4.2 保存订单 WxOrder record = new WxOrder(); record.setType(orderType); + record.setPayVendor(payWay.getCode()); record.setCouponChannelId(orderdto.getSignleOrder().getCouponChannelId()); record.setOrderGroupId(orderdto.getSignleOrder().getOrderGroupId()); record.setFormId(orderdto.getSignleOrder().getFormId()); @@ -2358,6 +2366,7 @@ public class WxOrderServiceImpl implements WxOrderService { WxOrder record = new WxOrder(); record.setCouponChannelId(couponChannelId); record.setType(orderType); + record.setPayVendor(EnumPayWay.PAY_WAY_NOT_UNPAY_OUTER.getCode()); record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); record.setPayment(0); diff --git a/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java b/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java index 6e660c452..11c8b5ea8 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java @@ -3,6 +3,7 @@ package com.iformall.service.pay; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.iformall.service.pay.service.pay.douyin.miniApp.TtMiniAppPayAdapterService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.iformall.common.ErrorCode; @@ -39,8 +40,10 @@ public class PayServiceFactory { WxMiniMaPayAdapterService wxMiniAppMaPayService; @Autowired WxH5PayService wxH5PayService; - - + + @Autowired + TtMiniAppPayAdapterService ttMiniAppPayService; + @Autowired WxPayShareService wxShareService; @@ -59,6 +62,7 @@ public class PayServiceFactory { serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode(), wxMiniAppPayService); serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode(), wxMiniAppMaPayService); serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode(), wxH5PayService); + serviceMap.put(EnumPayWay.PAY_WAY_TT.getCode(),ttMiniAppPayService); } return serviceMap; } diff --git a/mallinkService/src/main/java/com/iformall/service/pay/service/pay/douyin/BaseTtPayAdapterService.java b/mallinkService/src/main/java/com/iformall/service/pay/service/pay/douyin/BaseTtPayAdapterService.java new file mode 100644 index 000000000..66fcda1d9 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/service/pay/douyin/BaseTtPayAdapterService.java @@ -0,0 +1,248 @@ +package com.iformall.service.pay.service.pay.douyin; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; +import com.iformall.enums.EnumPayMode; +import com.iformall.exception.MallinkException; +import com.iformall.pay.WxPay; +import com.iformall.pay.WxPayOrderQ; +import com.iformall.pay.WxPayOrderSQ; +import com.iformall.pay.WxPayment; +import com.iformall.service.helper.WxPayOrderServiceHelper; +import com.iformall.service.pay.service.pay.entity.PayAdapterResult; +import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; +import com.iformall.utils.BeanUtils; +import com.iformall.utils.MaUtil; +import com.iformall.utils.QRCodeUtils; +import com.iformall.utils.Utility; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.open.api.WxOpenService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.File; +import java.util.Map; + +@Slf4j +public class BaseTtPayAdapterService { + + protected PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) + throws Exception { + Map retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, appInfo, payAccount); + int code = WxPayOrderServiceHelper.getPayStatusFromMap(retMap,oldRecord.getPayOrderNo()); + String msg = WxPayOrderServiceHelper.getPayStatusMsg(retMap, oldRecord.getPayOrderNo()); + PayQueryAdapterResult result = new PayQueryAdapterResult(code, msg, retMap,retMap.get("transaction_id"),retMap.get("time_end")); + return result; + } + + protected int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { + return WxPayOrderServiceHelper.getPayStatusFromMap((Map) statusObject.getData(),orderOutNo); + } + + protected int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) + throws Exception { + return WxPayOrderServiceHelper.wxOrderPayStatus(oldRecord, appInfo, payAccount); + } + + JSONObject errorMapClose = JSON.parseObject("{" + + "\"ORDERPAID\":{\"detail\":\"订单已支付\",\"reason\":\"订单已支付,不能发起关单\",\"resolution\":\"订单已支付,不能发起关单,请当作已支付的正常交易\"}," + + "\"SYSTEMERROR\":{\"detail\":\"系统错误\",\"reason\":\"系统错误\",\"resolution\":\"系统异常,请重新调用该API\"}," + + "\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"订单已关闭,无法重复关闭\",\"resolution\":\"订单已关闭,无需继续调用\"}," + + "\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"}," + + "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + + "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"reason\":\"请检查XML参数格式是否正确\"}}"); + + protected PayAdapterResult closeOrder(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { + String response = closeOrderWx(appInfo, record,payAccount); + log.info("pay order close, " + record.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + String return_code = returnMap.get("return_code"); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equalsIgnoreCase(return_code)) { + if ("SUCCESS".equals(result_code)) { + return new PayAdapterResult(true, "success", returnMap, null); + } else { + String errMsg = ""; + JSONObject errObj = errorMapClose.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + } else { + errMsg = returnMap.get("return_msg"); + } + return new PayAdapterResult(false, errMsg, returnMap, null); + } + } else { + String errMsg = returnMap.get("return_msg"); + return new PayAdapterResult(false, errMsg, returnMap, null); + } + + } + + private String closeOrderWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { + // get payAccount + if (payAccount.getType() == EnumPayMode.MCH.getCode()) { + // 普通商户号模式 + WxPayOrderQ payOrderC = new WxPayOrderQ(); + String noncestr = Utility.generate32UUID(); + payOrderC.setAppid(appInfo.getAppId()); + payOrderC.setMch_id(payAccount.getMchId()); + payOrderC.setNonce_str(noncestr); + payOrderC.setOut_trade_no(record.getPayOrderNo()); + + try { + Map map = BeanUtils.toStringMap(payOrderC); + payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); + map = BeanUtils.toStringMap(payOrderC); + String response = WxPay.closeOrder(map); + log.info("request:" + map.toString() + "\nresponse:" + response); + return response; + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } else { + // 服务商模式 + WxPayOrderSQ payOrderSC = new WxPayOrderSQ(); + String noncestr = Utility.generate32UUID(); + payOrderSC.setAppid(appInfo.getParentAppId()); + payOrderSC.setSub_appid(appInfo.getAppId()); + payOrderSC.setMch_id(payAccount.getMchId()); + payOrderSC.setSub_mch_id(payAccount.getSubMchId()); + payOrderSC.setNonce_str(noncestr); + payOrderSC.setOut_trade_no(record.getPayOrderNo()); + payOrderSC.setSign_type("HMAC-SHA256"); + + try { + Map map = BeanUtils.toStringMap(payOrderSC); + payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); + map = BeanUtils.toStringMap(payOrderSC); + String response = WxPay.closeOrder(map); + log.info("request:" + map.toString() + "\nresponse:" + response); + return response; + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } + } + + + protected PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { + String response = payOrderReverseWx(appInfo, record,payAccount); + log.info("pay order reverse, " + record.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + String return_code = returnMap.get("return_code"); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equalsIgnoreCase(return_code)) { + if ("SUCCESS".equals(result_code)) { + return new PayAdapterResult(true, "订单撤销成功", returnMap, null); + } else { + String errMsg = ""; + JSONObject errObj = errorMapClose.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + } else { + errMsg = returnMap.get("return_msg"); + } + return new PayAdapterResult(false, errMsg, returnMap, null); + } + } else { + String errMsg = returnMap.get("return_msg"); + return new PayAdapterResult(false, errMsg, returnMap, null); + } + } + + private String payOrderReverseWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { + // get payAccount + if (payAccount.getType() == EnumPayMode.MCH.getCode()) { + // 普通商户号模式 + WxPayOrderQ payOrderC = new WxPayOrderQ(); + String noncestr = Utility.generate32UUID(); + payOrderC.setAppid(appInfo.getAppId()); + payOrderC.setMch_id(payAccount.getMchId()); + payOrderC.setNonce_str(noncestr); + payOrderC.setOut_trade_no(record.getPayOrderNo()); + + try { + Map map = BeanUtils.toStringMap(payOrderC); + payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); + map = BeanUtils.toStringMap(payOrderC); + String response = WxPay.orderReverse(map, payAccount.getCertPath(), payAccount.getMchId()); + log.info("request:" + map.toString() + "\nresponse:" + response); + return response; + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } else { + // 服务商模式 + WxPayOrderSQ payOrderSC = new WxPayOrderSQ(); + String noncestr = Utility.generate32UUID(); + payOrderSC.setAppid(appInfo.getParentAppId()); + payOrderSC.setSub_appid(appInfo.getAppId()); + payOrderSC.setMch_id(payAccount.getMchId()); + payOrderSC.setSub_mch_id(payAccount.getSubMchId()); + payOrderSC.setNonce_str(noncestr); + payOrderSC.setOut_trade_no(record.getPayOrderNo()); + payOrderSC.setSign_type("HMAC-SHA256"); + + try { + Map map = BeanUtils.toStringMap(payOrderSC); + payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); + map = BeanUtils.toStringMap(payOrderSC); + String response = WxPay.orderReverse(map, payAccount.getCertPath(), payAccount.getMchId()); + log.info("request:" + map.toString() + "\nresponse:" + response); + return response; + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } + } + + + @Autowired + WxOpenService openService; + + @Autowired + MaUtil maUtil; + + protected File getQrCode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws WxErrorException { + boolean isFmOpen = false; + WxMaService wxMaService; + if(isFmOpen) { + wxMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appinfo.getAppId()); + } else { + wxMaService = maUtil.getWeappService(appinfo); + } + + boolean autoColor = false; + boolean isHyaline = true; + WxMaCodeLineColor color = new WxMaCodeLineColor("0", "0", "0"); + + String pathStr = ""; + if (StringUtils.isNotBlank(sceneParam)) { + pathStr = pageUrl + "?scene="+sceneParam; + } else { + pathStr = pageUrl; + } + if(type == 0) { + final File codeFile = wxMaService.getQrcodeService().createQrcode(pathStr, QRCodeUtils.QR_WIDTH); + return codeFile; + }else { + final File codeFile = wxMaService.getQrcodeService().createWxaCodeUnlimit(sceneParam, pageUrl, QRCodeUtils.QR_WIDTH, autoColor, color, isHyaline); + return codeFile; + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/service/pay/douyin/miniApp/TtMiniAppPayAdapterService.java b/mallinkService/src/main/java/com/iformall/service/pay/service/pay/douyin/miniApp/TtMiniAppPayAdapterService.java new file mode 100644 index 000000000..0bf426569 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/service/pay/douyin/miniApp/TtMiniAppPayAdapterService.java @@ -0,0 +1,269 @@ +package com.iformall.service.pay.service.pay.douyin.miniApp; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; +import com.iformall.enums.EnumPayMode; +import com.iformall.enums.EnumPayShare; +import com.iformall.enums.EnumPayStatus; +import com.iformall.exception.MallinkException; +import com.iformall.pay.WxPay; +import com.iformall.pay.WxPayOrderP; +import com.iformall.pay.WxPayOrderSP; +import com.iformall.pay.WxPayment; +import com.iformall.service.order.entity.WxComposeOrder; +import com.iformall.service.pay.entity.PayExtraParam; +import com.iformall.service.pay.service.pay.CDrivingPayService; +import com.iformall.service.pay.service.pay.douyin.BaseTtPayAdapterService; +import com.iformall.service.pay.service.pay.entity.PayAdapterResult; +import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; +import com.iformall.utils.BeanUtils; +import com.iformall.utils.MapUtil; +import com.iformall.utils.Utility; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.Date; +import java.util.Map; + +@Slf4j +@Service +public class TtMiniAppPayAdapterService extends BaseTtPayAdapterService implements CDrivingPayService{ + + + JSONObject errorMap = JSON.parseObject("{" + + "\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + + "\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"用户帐号余额不足\",\"resolution\":\"用户帐号余额不足,请用户充值或更换支付卡后再支付\"}," + + "\"ORDERPAID\":{\"detail\":\"商户订单已支付\",\"reason\":\"商户订单已支付,无需重复操作\",\"resolution\":\"商户订单已支付,无需更多操作\"}," + + "\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"当前订单已关闭,无法支付\",\"resolution\":\"当前订单已关闭,请重新下单\"}," + + "\"SYSTEMERROR\":{\"detail\":\"系统错误\t\",\"reason\":\"系统超时\",\"resolution\":\"系统异常,请用相同参数重新调用\"}," + + "\"APPID_NOT_EXIST\":{\"detail\":\"APPID不存在\",\"reason\":\"参数中缺少APPID\",\"resolution\":\"请检查APPID是否正确\"}," + + "\"MCHID_NOT_EXIST\":{\"detail\":\"MCHID不存在\",\"reason\":\"参数中缺少MCHID\",\"resolution\":\"请检查MCHID是否正确\"}," + + "\"APPID_MCHID_NOT_MATCH\":{\"detail\":\"appid和mch_id不匹配\",\"reason\":\"appid和mch_id不匹配\",\"resolution\":\"请确认appid和mch_id是否匹配\"}," + + "\"LACK_PARAMS\":{\"detail\":\"缺少参数\t\",\"reason\":\"缺少必要的请求参数\",\"resolution\":\"请检查参数是否齐全\"}," + + "\"OUT_TRADE_NO_USED\":{\"detail\":\"商户订单号重复\",\"reason\":\"同一笔交易不能多次提交\",\"resolution\":\"请核实商户订单号是否重复提交\"}," + + "\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"}," + + "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"resolution\":\"请检查XML参数格式是否正确\"}," + + "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + + "\"POST_DATA_EMPTY\":{\"detail\":\"post数据为空\",\"reason\":\"post数据不能为空\",\"resolution\":\"请检查post数据是否为空\"}," + + "\"NOT_UTF8\":{\"detail\":\"编码格式错误\",\"reason\":\"未使用指定编码格式\",\"resolution\":\"请使用UTF-8编码格式\"}}"); + + + private WxPayOrderP generateWxPayOrderP(WxPayAccount payAccount,WxComposeOrder composeOrder,String productName, WxPayOrder record,String openId,String appId,Date currentDate) throws Exception { + // 统一下单 普通商户模式 + String noncestr = Utility.generate32UUID(); + WxPayOrderP wxPayOrderP = new WxPayOrderP(); + wxPayOrderP.setOpenid(openId); + wxPayOrderP.setAppid(appId); + wxPayOrderP.setMch_id(payAccount.getMchId()); + wxPayOrderP.setNonce_str(noncestr); + wxPayOrderP.setBody(productName); + wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderP.setTotal_fee(composeOrder.getPayment()); + wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderP.setGoods_tag(productName); + wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderP.setProduct_id(String.valueOf(composeOrder.getMainOrderId())); // 订单ID + wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); + Date futureDate = new Date(); + futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); + wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 + Map payOrderMap = BeanUtils.toStringMap(wxPayOrderP); + wxPayOrderP.setSign(WxPayment.createSign(payOrderMap, payAccount.getApiKey())); + return wxPayOrderP; + } + + private PayAdapterResult getOrderPResult(Map returnMap,WxPayOrder record,WxPayAccount payAccount,String noncestr) { + PayAdapterResult par = new PayAdapterResult(); + returnMap.put("payOrderId", String.valueOf(record.getId())); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + par.setSuccess(true); + par.setMsg("success."); + par.setData(returnMap); + String prepay_id = returnMap.get("prepay_id"); + // update payOrder with prepay_id + record.setPrepayId(prepay_id); + record.setUpdateTime(new Date()); + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); + + String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); + Map sighMap = MapUtil.getOrderMap(); + sighMap.put("appId", returnMap.get("appid")); + sighMap.put("timeStamp", timestamp); + sighMap.put("nonceStr", noncestr); + sighMap.put("package", "prepay_id=" + prepay_id); + sighMap.put("signType", "MD5"); + String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); + returnMap.put("timeStamp", timestamp); + returnMap.put("nonceStr", noncestr); + returnMap.put("package", "prepay_id=" + prepay_id); + returnMap.put("paySign", signAgent); + log.info("back to UI: " + returnMap.toString()); + } else { + String errMsg = ""; + JSONObject errObj = errorMap.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + record.setFailReason(errMsg); + } else { + errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + } + record.setUpdateTime(new Date()); + + par.setSuccess(false); + par.setMsg(errMsg); + par.setData(returnMap); + } + + return par; + } + + + + private WxPayOrderSP generateWxPayOrderSP(WxPayAccount payAccount, WxComposeOrder composeOrder,String productName,WxPayOrder record,WxAppinfo appInfo,String openId,String appId,Date currentDate,EnumPayShare isShare) throws Exception { + String noncestr = Utility.generate32UUID(); + WxPayOrderSP wxPayOrderSP = new WxPayOrderSP(); + wxPayOrderSP.setSub_openid(openId); + wxPayOrderSP.setAppid(appInfo.getParentAppId()); + wxPayOrderSP.setMch_id(payAccount.getMchId()); + wxPayOrderSP.setSub_appid(appId); + wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId()); + wxPayOrderSP.setNonce_str(noncestr); + wxPayOrderSP.setBody(productName); + wxPayOrderSP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderSP.setTotal_fee(composeOrder.getPayment().toString()); + wxPayOrderSP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderSP.setGoods_tag(productName); // 券ID + wxPayOrderSP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderSP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderSP.setProduct_id(String.valueOf(composeOrder.getMainOrderId())); // + wxPayOrderSP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); + Date futureDate = new Date(); + futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); + wxPayOrderSP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 + wxPayOrderSP.setSign_type("HMAC-SHA256"); + wxPayOrderSP.setProfit_sharing(null); + if (isShare == EnumPayShare.YES) { + wxPayOrderSP.setProfit_sharing("Y"); + } + Map payOrderMap = BeanUtils.toStringMap(wxPayOrderSP); + wxPayOrderSP.setSign(WxPayment.createSignHMAC(payOrderMap, payAccount.getApiKey())); + return wxPayOrderSP; + } + + private PayAdapterResult getOrderSPResult(Map returnMap,WxPayOrder record,WxPayAccount payAccount,WxAppinfo appInfo,String noncestr) { + PayAdapterResult par = new PayAdapterResult(); + returnMap.put("payOrderId", String.valueOf(record.getId())); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + par.setSuccess(true); + par.setMsg("success."); + par.setData(returnMap); + + String prepay_id = returnMap.get("prepay_id"); + // update payOrder with prepay_id + record.setPrepayId(prepay_id); + record.setUpdateTime(new Date()); + + String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); + Map sighMap = MapUtil.getOrderMap(); + sighMap.put("appId", appInfo.getAppId()); + sighMap.put("timeStamp", timestamp); + sighMap.put("nonceStr", noncestr); + sighMap.put("package", "prepay_id=" + prepay_id); + sighMap.put("signType", "HMAC-SHA256"); + String signAgent = WxPayment.createSignHMAC(sighMap, payAccount.getApiKey()); + returnMap.put("timeStamp", timestamp); + returnMap.put("nonceStr", noncestr); + returnMap.put("package", "prepay_id=" + prepay_id); + returnMap.put("paySign", signAgent); + returnMap.put("signType", "HMAC-SHA256"); + log.info("back to UI: " + returnMap.toString()); + } else { + String errMsg = ""; + JSONObject errObj = errorMap.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + record.setFailReason(errMsg); + } else { + errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + } + record.setUpdateTime(new Date()); + par.setSuccess(false); + par.setMsg(errMsg); + par.setData(returnMap); + } + return par; + } + + + @Override + public PayAdapterResult pay(WxPayAccount payAccount, WxPayOrder record,WxComposeOrder composeOrder,String productName,EnumPayShare isShare,WxAppinfo appInfo,Date currentDate, PayExtraParam params) throws Exception { + if (null == params ) { + throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"openId为空"); + } + String openId = (String) params.getValue("openId"); + if (StringUtils.isBlank(openId) ) { + throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"openId为空"); + } + //普通商户模式 + if (payAccount.getType() == EnumPayMode.MCH.getCode()) { + WxPayOrderP wxPayOrderP = generateWxPayOrderP(payAccount,composeOrder,productName,record,openId,appInfo.getAppId(),currentDate); + String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); + log.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); + return getOrderPResult(returnMap,record,payAccount,wxPayOrderP.getNonce_str()); + + } else { + // 统一下单 // 服务商模式 + WxPayOrderSP wxPayOrderSP = generateWxPayOrderSP(payAccount,composeOrder,productName,record,appInfo,openId,appInfo.getAppId(),currentDate,isShare); + String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderSP)); + log.info("pay order, wechat pushOrder, " + wxPayOrderSP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); + return getOrderSPResult(returnMap,record,payAccount,appInfo,wxPayOrderSP.getNonce_str()); + } + } + + @Override + public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, + WxPayAccount payAccount) throws Exception { + return super.queryPayStatus(oldRecord,appInfo, payAccount); + } + + @Override + public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { + return super.queryPayStatus(statusObject, orderOutNo); + } + + @Override + public int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) + throws Exception { + return super.queryPayStatusCode(oldRecord, appInfo, payAccount); + } + + @Override + public PayAdapterResult payOrderClose(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { + return super.closeOrder(appInfo, record, payAccount); + } + + @Override + public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) + throws Exception { + return super.payOrderReverse(appInfo, record, payAccount); + } + + @Override + public File getQrcode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws Exception{ + return super.getQrCode(appinfo, pageUrl, type, sceneParam); + } + +} diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index 01adaa994..6e95c6bc1 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -10,6 +10,7 @@ + @@ -33,7 +34,7 @@ - `id`,`order_number`,`tenant_id`,`parent_tenant_id`,`c_user_id`,`coupon_channel_id`,`product_id`,`type`,`payment_type`,`payment`,`payment_time`,`freight_price`,`order_status`,`create_date`,`update_date`,`detail`, + `id`,`order_number`,`tenant_id`,`parent_tenant_id`,`c_user_id`,`coupon_channel_id`,`product_id`,`type`,`pay_vendor`,`payment_type`,`payment`,`payment_time`,`freight_price`,`order_status`,`create_date`,`update_date`,`detail`, `press_end_date`,`press_current_num`,`press_current_value`,`order_group_id`,`form_id`,`total_payment`,`compose_order_id`,`coupon_number`,`compose_order_type`,`shipping_type`,`shipping_address`,`parent_order_id` @@ -70,6 +71,9 @@ and `type` = #{type} + + and `pay_vendor` = #{payVendor} + and `payment_type` = #{paymentType} @@ -191,6 +195,9 @@ and o.type = #{type} + + and o.pay_vendor = #{payVendor} + and o.order_status in @@ -210,6 +217,9 @@ AND type = #{type,jdbcType=TINYINT} + + AND pay_vendor = #{payVendor,jdbcType=TINYINT} + AND unix_timestamp(`create_date`) > unix_timestamp(#{startDate,jdbcType=TIMESTAMP}) @@ -226,6 +236,9 @@ AND type = #{type,jdbcType=TINYINT} + + AND pay_vendor = #{payVendor,jdbcType=TINYINT} + AND unix_timestamp(`create_date`) > unix_timestamp(#{startDate,jdbcType=TIMESTAMP}) @@ -242,6 +255,9 @@ AND type = #{type,jdbcType=TINYINT} + + AND pay_vendor = #{payVendor,jdbcType=TINYINT} + AND unix_timestamp(`create_date`) > unix_timestamp(#{startDate,jdbcType=TIMESTAMP}) @@ -258,6 +274,9 @@ AND type = #{type,jdbcType=TINYINT} + + AND pay_vendor = #{payVendor,jdbcType=TINYINT} + AND unix_timestamp(`create_date`) > unix_timestamp(#{startDate,jdbcType=TIMESTAMP}) @@ -269,7 +288,7 @@ o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status,o.create_date,o.update_date, - c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.detail,c.remark,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date,c.gift_list, + c.type,c.pay_vendor,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.detail,c.remark,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date,c.gift_list, co.id as coupon_order_id,co.coupon_order_status,c.support_transfer,c.subsidy_num,o.compose_order_type,o.compose_order_id,o.parent_order_id, o.`coupon_number`,o.`freight_price`,o.`shipping_type`,o.`shipping_address`,co.`shipping_status`,co.`delivery_info` @@ -330,6 +349,7 @@ + @@ -383,6 +403,7 @@ + @@ -433,7 +454,7 @@ o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status,o.create_date,o.update_date, - c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, + c.type,c.pay_vendor,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, o.compose_order_type,o.compose_order_id, o.`coupon_number`,o.`freight_price`,o.`shipping_type`,o.`shipping_address`,o.parent_order_id @@ -463,6 +484,9 @@ AND o.order_status = #{orderStatus} + + and o.pay_vendor = #{payVendor} + order by ${sortColumns} @@ -471,7 +495,7 @@ select 0 level,o.compose_order_type,o.compose_order_id,o.payment,o.order_status,o.create_date, o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment_time,o.update_date, - c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, + c.type,c.pay_vendor,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, o.`coupon_number`,o.`freight_price`,o.`shipping_type`,o.`shipping_address` from wx_coupon c,wx_order o where o.product_id = c.id and o.order_status in (0,2) @@ -490,12 +514,15 @@ AND o.order_status = #{orderStatus} + + and o.pay_vendor = #{payVendor} + union all select 0 level, o.compose_order_type,o.compose_order_id,o.payment,o.order_status,o.create_date, o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment_time,o.update_date, - c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, + c.type,c.pay_vendor,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, o.`coupon_number`,o.`freight_price`,o.`shipping_type`,o.`shipping_address` from wx_coupon c,wx_order o where o.product_id = c.id and o.order_status in (1,3,4,5) @@ -513,12 +540,15 @@ AND o.order_status = #{orderStatus} + + and o.pay_vendor = #{payVendor} + union all select 1 level,o.compose_order_type,o.compose_order_id,sum(o.payment) payment,o.order_status,min(create_date) create_date, null ,null ,null ,null ,null ,null ,null ,null ,null ,null , - null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null , + null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null , null ,null ,null ,null from wx_order o where o.order_status in (0,2) @@ -537,6 +567,9 @@ AND o.order_status = #{orderStatus} + + and o.pay_vendor = #{payVendor} + group by o.compose_order_type,o.compose_order_id ) a @@ -587,6 +620,10 @@ and o.`parent_tenant_id` = #{parentTenantId} + + and o.pay_vendor = #{payVendor} + + and bu.`merchant_id` = #{merchantId} @@ -625,6 +662,7 @@ + @@ -644,7 +682,7 @@ - o.`id`,o.`order_number`,o.`tenant_id`,o.`parent_tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, + o.`id`,o.`order_number`,o.`tenant_id`,o.`parent_tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`,o.`pay_vendor`, o.`payment_type`,o.`payment`,o.`payment_time`,o.`freight_price`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, m.name as merchant_name, bu.name, bu.phone as bphone, cubi.phone, cubi.nick_name, cubi.name c_user_name @@ -664,6 +702,9 @@ and o.`parent_tenant_id` = #{parentTenantId} + + and o.pay_vendor = #{payVendor} + and bu.`merchant_id` = #{merchantId} @@ -687,6 +728,7 @@ + @@ -708,7 +750,7 @@ - o.`id`,o.`order_number`,o.`tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, + o.`id`,o.`order_number`,o.`tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`,o.`pay_vendor`, o.`payment_type`,o.`payment`,o.`payment_time`,o.`freight_price`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, m.name as merchant_name, bu.name, bu.phone as bphone, cubi.phone, cubi.nick_name, cubi.name c_user_name, @@ -730,6 +772,9 @@ and o.`parent_tenant_id` = #{parentTenantId} + + and o.pay_vendor = #{payVendor} + and bu.`merchant_id` = #{merchantId} @@ -751,6 +796,9 @@ SELECT * from wx_order${tenantEntity.shardTableSuffix} ) o where o.`type` = #{type} + + and o.pay_vendor = #{payVendor} + and o.`tenant_id` = #{tenantId} @@ -782,6 +830,9 @@ and o.`type` = #{type} + + and o.pay_vendor = #{payVendor} + and o.`order_status` = #{orderStatus} @@ -797,6 +848,9 @@ inner join wx_merchant_b_user bu on bu.id = o.product_id inner join wx_merchant m on m.id = bu.merchant_id where m.`id` = #{merchantId} and o.tenant_id = #{tenantId} and o.`type` = 1 and o.`order_status` = 1 + + and o.pay_vendor = #{payVendor} + and o.`create_date` BETWEEN #{startTime} and #{endTime} @@ -838,6 +892,9 @@ and m.id = bu.merchant_id and o.order_status = '1' and o.type = 1 + + and o.pay_vendor = #{payVendor} + AND o.create_date > #{wxOrderReportDto.startTime} @@ -865,6 +922,7 @@ +