| @@ -0,0 +1,17 @@ | |||
| --加商户提现菜单 | |||
| INSERT INTO `mall_permission`(`id`, `name`, `parent_id`, `available`, `permission`, `resource_type`, `module_color`, `module_color_num`, `url`, `icon`, `version_type`, `sort`) VALUES (614, '商户提现', 6, 'Y', NULL, 1, NULL, NULL, 'merchantCashout', 'icon-tixian', 0, 610); | |||
| --销售类型加权限 | |||
| update mall_sale_type set menus = '[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 50, 101, 102, 103, 104, 105, 106, 107, 108, 201, 202, 203, 204, 205, 206, 209, 211, 212, 221, 222, 251, 299, 300, 301, 302, 303, 304, 305, 306, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513, 514, 521, 522, 523, 531, 532, 533, 591, 592, 595, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 621, 622, 623, 624, 625, 626, 627, 641, 642, 643, 644, 645, 646, 651, 661, 662, 663, 664, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 704, 711, 712, 713, 901, 902, 903, 904, 905, 931, 932, 951, 952, 961, 962, 963, 965, 966, 967, 968, 1001, 1002, 1003, 1004, 60701, 60702]' where id=1; | |||
| update mall_sale_type set menus = '[1, 2, 4, 5, 6, 7, 8, 9, 10, 50, 101, 102, 103, 104, 105, 106, 107, 201, 202, 203, 204, 205, 209, 211, 212, 221, 222, 251, 409, 410, 411, 416, 418, 501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513, 514, 521, 522, 523, 531, 532, 533, 591, 592, 595, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 621, 622, 623, 624, 625, 626, 627, 641, 642, 643, 644, 645, 646, 651, 661, 662, 663, 664, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 704, 711, 712, 713, 901, 902, 903, 904, 905, 931, 932, 951, 961, 60701, 60702]' where id=2; | |||
| update mall_sale_type set menus = '[2, 4, 5, 6, 7, 10, 50, 201, 202, 205, 211, 212, 221, 222, 251, 409, 410, 411, 416, 418, 501, 502, 503, 504, 505, 506, 507, 508, 511, 512, 513, 514, 521, 522, 523, 531, 532, 533, 591, 592, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 621, 622, 623, 624, 625, 626, 641, 642, 643, 644, 645, 646, 651, 661, 662, 663, 664, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 704, 711, 712, 713, 901, 902, 903, 904, 905, 931, 932, 60701, 60702]' where id=3; | |||
| update mall_sale_type set menus = '[2, 4, 5, 6, 7, 10, 50, 201, 202, 205, 211, 212, 221, 222, 251, 409, 410, 411, 416, 418, 501, 502, 503, 504, 505, 506, 507, 508, 511, 512, 513, 514, 521, 522, 523, 531, 532, 591, 601, 602, 604, 605, 606, 607, 608, 610, 611, 612, 613, 614, 622, 623, 624, 625, 626, 641, 642, 643, 644, 661, 662, 663, 664, 671, 672, 674, 675, 681, 682, 684, 685, 686, 691, 692, 693, 694, 695, 711, 901, 902, 904, 905, 931, 932, 60701, 60702]' where id=4; | |||
| --所有广场管理员角色加权限 | |||
| INSERT INTO `mall_role_permission`(`id`, `tenant_id`, `parent_tenant_id`, `permission_id`, `role_id`) | |||
| select CEILING(RAND()*90000000000+10000000000) ,mui.tenant_id,mui.parent_tenant_id, 614,mur.role_id | |||
| from mall_user_info mui | |||
| left join mall_user_role mur on mui.id = mur.uid | |||
| where mui.is_admin = 1 and mur.role_id is not null GROUP BY mur.role_id; | |||
| @@ -108,7 +108,7 @@ public class ShiroConfig { | |||
| filterChainDefinitionMap.put("/wxPay/notify/**", "anon"); // 支付回调 | |||
| filterChainDefinitionMap.put("/wxPayBill/notify/**", "anon"); | |||
| filterChainDefinitionMap.put("/business/**", "anon"); // 商圈回调 | |||
| filterChainDefinitionMap.put("/business/circle/**", "anon"); // 商圈回调 | |||
| filterChainDefinitionMap.put("/alipay/notify/**", "anon"); | |||
| @@ -14,6 +14,7 @@ import com.iformall.interceptor.BodyReaderHttpServletRequestWrapper; | |||
| import com.iformall.service.WxBusinessCircleOrderService; | |||
| import com.iformall.service.WxMallService; | |||
| import com.iformall.service.WxPayAccountService; | |||
| import com.iformall.utils.MaUtil; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| @@ -28,7 +29,7 @@ import java.util.Locale; | |||
| import java.util.Map; | |||
| @RestController | |||
| @RequestMapping("/business") | |||
| @RequestMapping("/business/circle") | |||
| public class WxBusinessOrderController extends BaseController { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| @@ -46,28 +47,28 @@ public class WxBusinessOrderController extends BaseController { | |||
| /** | |||
| * | |||
| * @return 微信商圈支付结果通知 | |||
| * @return 微信商圈支付通知 | |||
| */ | |||
| @PostMapping(value = "/order/{tenantId}") | |||
| @ResponseBody | |||
| public Map<String,String> createOrder(@PathVariable String tenantId, HttpServletRequest request){ | |||
| logger.info("[" +getIpAddr() + "]微信商圈支付结果通知-----"+tenantId); | |||
| logger.info("[" +getIpAddr() + "]微信商圈通知-----"+tenantId); | |||
| Map<String,String> resultMap = new HashMap<>(); | |||
| if(StringUtils.isBlank(tenantId)){ | |||
| logger.error("微信商圈支付结果通知-----tenantId为空"); | |||
| logger.error("微信商圈通知-----tenantId为空"); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } | |||
| TenantEntity tenantEntity = wxMallService.getByTenantId(tenantId); | |||
| if(tenantEntity == null){ | |||
| logger.error("微信商圈支付结果通知-----获取tenantEntity为null"); | |||
| logger.error("微信商圈通知-----获取tenantEntity为null"); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } | |||
| WxPayService wxPayService = wxPayAccountService.getWxPayService(tenantId); | |||
| if(wxPayService == null){ | |||
| logger.error("微信商圈支付结果通知-----获取wxPayService失败"); | |||
| logger.error("微信商圈通知-----获取wxPayService失败"); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } | |||
| @@ -75,117 +76,74 @@ public class WxBusinessOrderController extends BaseController { | |||
| try { | |||
| //----------------签名验证----------- | |||
| BusinessCircleNotifyData notifyData = verifySignature(request,wxPayService); | |||
| logger.info("微信商圈支付结果通知---回调通知对象{}"+notifyData.toString()); | |||
| //解密 | |||
| PaidResult result = wxPayService.getBusinessCircleService().decryptPaidNotifyDataResource(notifyData); | |||
| logger.info("微信商圈支付结果通知---解密结果{}"+notifyData.toString()); | |||
| logger.info("微信商圈通知---回调通知对象{}"+notifyData.toString()); | |||
| WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); | |||
| wxBusinessCircleOrder.updateTenantInfo(tenantEntity); | |||
| wxBusinessCircleOrder.setSourceType(EnumThirdPartyConfigType.WEIXIN.getCode()); | |||
| wxBusinessCircleOrder.setNoticeId(notifyData.getId()); | |||
| wxBusinessCircleOrder.setNoticeCreateTime(sdf.parse(notifyData.getCreateTime())); | |||
| wxBusinessCircleOrder.setNoticeEventType(notifyData.getEventType()); | |||
| wxBusinessCircleOrder.setNoticeResourceType(notifyData.getResourceType()); | |||
| wxBusinessCircleOrder.setSummary(notifyData.getSummary()); | |||
| wxBusinessCircleOrder.setWxMchid(result.getMchid()); | |||
| wxBusinessCircleOrder.setWxMerchantName(result.getMerchantName()); | |||
| wxBusinessCircleOrder.setWxShopName(result.getShopName()); | |||
| wxBusinessCircleOrder.setWxShopNumber(result.getShopNumber()); | |||
| wxBusinessCircleOrder.setAppid(result.getAppid()); | |||
| wxBusinessCircleOrder.setOpenid(result.getOpenid()); | |||
| wxBusinessCircleOrder.setTimeEnd(sdf.parse(result.getTimeEnd())); | |||
| wxBusinessCircleOrder.setAmount(result.getAmount()); | |||
| wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); | |||
| wxBusinessCircleOrder.setCommitTag(result.getCommitTag()); | |||
| wxBusinessCircleOrderService.createOrder(wxBusinessCircleOrder); | |||
| resultMap.put("code","SUCCESS"); | |||
| return resultMap; | |||
| } catch (WxPayException e) { | |||
| e.printStackTrace(); | |||
| logger.error(e.getCustomErrorMsg()); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } catch (ParseException e) { | |||
| e.printStackTrace(); | |||
| //解密 | |||
| if(MaUtil.noticeEventType.equals(notifyData.getEventType())){ | |||
| PaidResult result = wxPayService.getBusinessCircleService().decryptPaidNotifyDataResource(notifyData); | |||
| logger.info("微信商圈支付成功通知---解密结果{}"+notifyData.toString()); | |||
| wxBusinessCircleOrder.setNoticeId(notifyData.getId()); | |||
| wxBusinessCircleOrder.setNoticeCreateTime(sdf.parse(notifyData.getCreateTime())); | |||
| wxBusinessCircleOrder.setNoticeEventType(notifyData.getEventType()); | |||
| wxBusinessCircleOrder.setNoticeResourceType(notifyData.getResourceType()); | |||
| wxBusinessCircleOrder.setSummary(notifyData.getSummary()); | |||
| wxBusinessCircleOrder.setWxMchid(result.getMchid()); | |||
| wxBusinessCircleOrder.setWxMerchantName(result.getMerchantName()); | |||
| wxBusinessCircleOrder.setWxShopName(result.getShopName()); | |||
| wxBusinessCircleOrder.setWxShopNumber(result.getShopNumber()); | |||
| wxBusinessCircleOrder.setAppid(result.getAppid()); | |||
| wxBusinessCircleOrder.setOpenid(result.getOpenid()); | |||
| wxBusinessCircleOrder.setTimeEnd(sdf.parse(result.getTimeEnd())); | |||
| wxBusinessCircleOrder.setAmount(result.getAmount()); | |||
| wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); | |||
| wxBusinessCircleOrder.setCommitTag(result.getCommitTag()); | |||
| wxBusinessCircleOrderService.createOrder(wxBusinessCircleOrder); | |||
| resultMap.put("code","SUCCESS"); | |||
| return resultMap; | |||
| }else if(MaUtil.refundEventType.equals(notifyData.getEventType())){ | |||
| RefundResult result = wxPayService.getBusinessCircleService().decryptRefundNotifyDataResource(notifyData); | |||
| logger.info("微信商圈退款成功通知---解密结果{}"+result.toString()); | |||
| wxBusinessCircleOrder.setRefundNoticeId(notifyData.getId()); | |||
| wxBusinessCircleOrder.setRefundCreateTime(sdf.parse(notifyData.getCreateTime())); | |||
| wxBusinessCircleOrder.setRefundEventType(notifyData.getEventType()); | |||
| wxBusinessCircleOrder.setRefundResourceType(notifyData.getResourceType()); | |||
| wxBusinessCircleOrder.setRefundSummary(notifyData.getSummary()); | |||
| wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); | |||
| wxBusinessCircleOrder.setWxMchid(result.getMchid()); | |||
| wxBusinessCircleOrder.setWxMerchantName(result.getMerchantName()); | |||
| wxBusinessCircleOrder.setWxShopName(result.getShopName()); | |||
| wxBusinessCircleOrder.setWxShopNumber(result.getShopNumber()); | |||
| wxBusinessCircleOrder.setAppid(result.getAppid()); | |||
| wxBusinessCircleOrder.setOpenid(result.getOpenid()); | |||
| wxBusinessCircleOrder.setRefundTime(sdf.parse(result.getRefundTime())); | |||
| wxBusinessCircleOrder.setRefundAmount(result.getRefundAmount()); | |||
| wxBusinessCircleOrder.setRefundId(result.getRefundId()); | |||
| wxBusinessCircleOrderService.updateRefundOrder(wxBusinessCircleOrder); | |||
| resultMap.put("code","SUCCESS"); | |||
| return resultMap; | |||
| } | |||
| logger.error("时间转换异常"); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } | |||
| } | |||
| /** | |||
| * | |||
| * @return 微信商圈退款成功通知 | |||
| */ | |||
| @PostMapping(value = "/refundOrder/{tenantId}") | |||
| @ResponseBody | |||
| public Map<String,String> updateRefundOrder(@PathVariable String tenantId, HttpServletRequest request){ | |||
| logger.info("[" +getIpAddr() + "]微信商圈退款成功通知-----"+tenantId); | |||
| Map<String,String> resultMap = new HashMap<>(); | |||
| if(StringUtils.isBlank(tenantId)){ | |||
| logger.error("微信商圈退款成功通知-----tenantId为空"); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } | |||
| TenantEntity tenantEntity = wxMallService.getByTenantId(tenantId); | |||
| if(tenantEntity == null){ | |||
| logger.error("微信商圈退款成功通知-----获取tenantEntity为null"); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } | |||
| WxPayService wxPayService = wxPayAccountService.getWxPayService(tenantId); | |||
| if(wxPayService == null){ | |||
| logger.error("微信商圈退款成功通知-----获取wxPayService失败"); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } | |||
| try { | |||
| //----------------签名验证----------- | |||
| BusinessCircleNotifyData notifyData = verifySignature(request,wxPayService); | |||
| logger.info("微信商圈退款成功通知---回调通知对象{}"+notifyData.toString()); | |||
| //解密 | |||
| RefundResult result = wxPayService.getBusinessCircleService().decryptRefundNotifyDataResource(notifyData); | |||
| logger.info("微信商圈退款成功通知---解密结果{}"+result.toString()); | |||
| WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); | |||
| wxBusinessCircleOrder.updateTenantInfo(tenantEntity); | |||
| wxBusinessCircleOrder.setSourceType(EnumThirdPartyConfigType.WEIXIN.getCode()); | |||
| wxBusinessCircleOrder.setRefundNoticeId(notifyData.getId()); | |||
| wxBusinessCircleOrder.setRefundCreateTime(sdf.parse(notifyData.getCreateTime())); | |||
| wxBusinessCircleOrder.setRefundEventType(notifyData.getEventType()); | |||
| wxBusinessCircleOrder.setRefundResourceType(notifyData.getResourceType()); | |||
| wxBusinessCircleOrder.setRefundSummary(notifyData.getSummary()); | |||
| wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); | |||
| wxBusinessCircleOrder.setWxMchid(result.getMchid()); | |||
| wxBusinessCircleOrder.setWxMerchantName(result.getMerchantName()); | |||
| wxBusinessCircleOrder.setWxShopName(result.getShopName()); | |||
| wxBusinessCircleOrder.setWxShopNumber(result.getShopNumber()); | |||
| wxBusinessCircleOrder.setAppid(result.getAppid()); | |||
| wxBusinessCircleOrder.setOpenid(result.getOpenid()); | |||
| wxBusinessCircleOrder.setRefundTime(sdf.parse(result.getRefundTime())); | |||
| wxBusinessCircleOrder.setRefundAmount(result.getRefundAmount()); | |||
| wxBusinessCircleOrder.setRefundId(result.getRefundId()); | |||
| wxBusinessCircleOrderService.updateRefundOrder(wxBusinessCircleOrder); | |||
| resultMap.put("code","SUCCESS"); | |||
| return resultMap; | |||
| } catch (WxPayException e) { | |||
| e.printStackTrace(); | |||
| logger.error(e.getCustomErrorMsg()); | |||
| logger.error("微信商圈通知---"+e.getCustomErrorMsg()); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } catch (ParseException e) { | |||
| e.printStackTrace(); | |||
| logger.error("时间转换异常"); | |||
| logger.error("微信商圈通知---时间转换异常"); | |||
| resultMap.put("code","FAIL"); | |||
| return resultMap; | |||
| } | |||
| @@ -193,6 +151,7 @@ public class WxBusinessOrderController extends BaseController { | |||
| } | |||
| /** | |||
| * 验签 | |||
| */ | |||
| @@ -48,6 +48,9 @@ public class MqBaseConsumer { | |||
| @Autowired | |||
| private FmInsideCashOutMsgServiceImpl fmInsideCashOutMsgService; | |||
| @Autowired | |||
| private FmInsideBusinessCircleMsgServiceImpl fmInsideBusinessCircleMsgService; | |||
| @@ -117,6 +120,11 @@ public class MqBaseConsumer { | |||
| //} | |||
| //baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode()); | |||
| //wxMsgRecordMapper.updateByBaseMsg(baseMsg); | |||
| else if(EnumMsgRecordType.BUSINESS_CIRCLE_NOTICE.getCode().equals(baseMsg.getMsgType())) { | |||
| // 商圈通知 | |||
| FmInsideBusinessCircleMsg msg = (FmInsideBusinessCircleMsg)JsonUtil.readValue(message, FmInsideBusinessCircleMsg.class); | |||
| fmInsideBusinessCircleMsgService.send(msg); | |||
| } | |||
| }catch (Throwable e){ | |||
| log.error("consum received error: ", e); | |||
| /** | |||
| @@ -7,6 +7,7 @@ import com.iformall.domain.po.base.TenantEntity; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import lombok.ToString; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| /** | |||
| @@ -72,4 +73,11 @@ public class BaseMsg extends BaseEntity { | |||
| }}; | |||
| } | |||
| public String getFinalTenantId() { | |||
| if (!StringUtils.isBlank(parentTenantId)) { | |||
| return parentTenantId; | |||
| } | |||
| return tenantId; | |||
| } | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| package com.iformall.domain.po.msg; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import lombok.ToString; | |||
| @Data | |||
| @ToString(callSuper = true) | |||
| @EqualsAndHashCode(callSuper = true) | |||
| public class FmInsideBusinessCircleMsg extends BaseMsg{ | |||
| private static final long serialVersionUID = 1L; | |||
| @io.swagger.annotations.ApiModelProperty(value="商圈支付结果通知类型",name="eventType") | |||
| private String eventType; | |||
| @io.swagger.annotations.ApiModelProperty(value="商圈订单Id",name="businessCircleOrderId") | |||
| private Long businessCircleOrderId; | |||
| @io.swagger.annotations.ApiModelProperty(value="门店Id",name="merchantId") | |||
| private Long merchantId; | |||
| @io.swagger.annotations.ApiModelProperty(value="c端会员id",name="cUserId") | |||
| private Long cUserId; | |||
| @io.swagger.annotations.ApiModelProperty(value="门店名称,商圈在商圈小程序上圈店时填写的门店名称",name="wxShopName") | |||
| private String wxShopName; | |||
| @io.swagger.annotations.ApiModelProperty(value="用户实际消费金额,单位(分)",name="amount") | |||
| private Integer amount; | |||
| } | |||
| @@ -15,11 +15,12 @@ public enum EnumMsgRecordType { | |||
| WEBSOCKET_APP(8, "小程序websocket"), | |||
| INSIDE_ORDER_SUCCESS(100, "下订单成功"), | |||
| INSIDE_COUPON_VERIFY(101, "券核销"), | |||
| INSIDE_C_LOGIN(102, "C端用户登录"), | |||
| INSIDE_C_LOGIN(102, "C端用户登录"),//内部消息,加积分等 | |||
| //INSIDE_NOTIFY_PAY_SUCCESS(103, "微信支付回调"), | |||
| INSIDE_NOTIFY_REFUND_SUCCESS(104, "微信退款回调"), | |||
| COUPON_STOCK(105, "券库存更新"), | |||
| CASH_OUT(106,"商户提现") | |||
| CASH_OUT(106,"商户提现"), | |||
| BUSINESS_CIRCLE_NOTICE(107, "商圈支付通知"),//内部消息,加积分+积分同步 | |||
| ; | |||
| public static EnumMsgRecordType getEnum(Integer code) { | |||
| @@ -29,6 +29,8 @@ public enum EnumScoreType { | |||
| QUESTION_ADD_CREDIT(21, "问卷奖励积分"), | |||
| REFUND_CONSUMPTION(22, "消费退款"), | |||
| ; | |||
| public static EnumScoreType getEnum(Integer code) { | |||
| @@ -5,7 +5,9 @@ public enum EnumUserType { | |||
| CUSER(1, "C端用户"), | |||
| CUSERBASIC(2, "C端用户(会员)"), | |||
| BUSER(3, "B端用户"), | |||
| MALLUSER(4, "A端用户") | |||
| MALLUSER(4, "A端用户"), | |||
| BUSINESS_CIRCLE(5, "微信商圈") | |||
| ; | |||
| public static EnumUserType getEnum(Integer code) { | |||
| @@ -9,6 +9,8 @@ public interface WxBusinessCircleOrderMapper extends CommonMapper<WxBusinessCirc | |||
| List<WxBusinessCircleOrder> findList(WxBusinessCircleOrder record); | |||
| WxBusinessCircleOrder getById(WxBusinessCircleOrder wxBusinessCircleOrder); | |||
| WxBusinessCircleOrder getByTransactionId(WxBusinessCircleOrder wxBusinessCircleOrder); | |||
| /** | |||
| @@ -39,4 +41,6 @@ public interface WxBusinessCircleOrderMapper extends CommonMapper<WxBusinessCirc | |||
| * @param wxBusinessCircleOrder | |||
| */ | |||
| void updateRefundPoints(WxBusinessCircleOrder wxBusinessCircleOrder); | |||
| } | |||
| @@ -16,8 +16,40 @@ public interface WxBusinessCircleOrderService { | |||
| */ | |||
| PageInfo<WxBusinessCircleOrder> listAsPage(WxBusinessCircleOrder record, Integer pageIndex, Integer pageSize); | |||
| /** | |||
| * id+tenantId | |||
| * @param | |||
| * @return | |||
| */ | |||
| WxBusinessCircleOrder getById(Long id, String tenantId); | |||
| /** | |||
| * transactionId+tenantId | |||
| * @param | |||
| * @return | |||
| */ | |||
| WxBusinessCircleOrder getByTransactionId(String transactionId, String tenantId); | |||
| void createOrder(WxBusinessCircleOrder wxBusinessCircleOrder); | |||
| void updateRefundOrder(WxBusinessCircleOrder wxBusinessCircleOrder); | |||
| /** | |||
| * 加积分 | |||
| * @param wxBusinessCircleOrder | |||
| */ | |||
| void updateAddPoints(WxBusinessCircleOrder wxBusinessCircleOrder); | |||
| /** | |||
| * 积分同步状态修改 | |||
| */ | |||
| void updateIsPointsNotify(WxBusinessCircleOrder wxBusinessCircleOrder); | |||
| /** | |||
| * 退积分 | |||
| * @param wxBusinessCircleOrder | |||
| */ | |||
| void updateRefundPoints(WxBusinessCircleOrder wxBusinessCircleOrder); | |||
| } | |||
| @@ -6,7 +6,12 @@ import com.iformall.common.IdWorker; | |||
| import com.iformall.domain.po.WxBusinessCircleOrder; | |||
| import com.iformall.domain.po.WxCUser; | |||
| import com.iformall.domain.po.WxMerchant; | |||
| import com.iformall.domain.po.msg.FmInsideBusinessCircleMsg; | |||
| import com.iformall.enums.EnumMsgMqKey; | |||
| import com.iformall.enums.EnumMsgMqTag; | |||
| import com.iformall.enums.EnumMsgMqTopic; | |||
| import com.iformall.mapper.WxBusinessCircleOrderMapper; | |||
| import com.iformall.mq.MqBaseProducer; | |||
| import com.iformall.service.WxBusinessCircleOrderService; | |||
| import com.iformall.service.WxCUserService; | |||
| import com.iformall.service.WxMerchantService; | |||
| @@ -30,12 +35,31 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe | |||
| @Autowired | |||
| WxCUserService wxCUserService; | |||
| @Autowired | |||
| MqBaseProducer mqBaseProducer; | |||
| @Override | |||
| public PageInfo<WxBusinessCircleOrder> listAsPage(WxBusinessCircleOrder record, Integer pageIndex, Integer pageSize) { | |||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxBusinessCircleOrderMapper.findList(record)); | |||
| } | |||
| @Override | |||
| public WxBusinessCircleOrder getById(Long id, String tenantId) { | |||
| WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); | |||
| wxBusinessCircleOrder.setId(id); | |||
| wxBusinessCircleOrder.setTenantId(tenantId); | |||
| return wxBusinessCircleOrderMapper.getById(wxBusinessCircleOrder); | |||
| } | |||
| @Override | |||
| public WxBusinessCircleOrder getByTransactionId(String transactionId, String tenantId) { | |||
| WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); | |||
| wxBusinessCircleOrder.setTransactionId(transactionId); | |||
| wxBusinessCircleOrder.setTenantId(tenantId); | |||
| return wxBusinessCircleOrderMapper.getByTransactionId(wxBusinessCircleOrder); | |||
| } | |||
| @Override | |||
| public void createOrder(WxBusinessCircleOrder wxBusinessCircleOrder) { | |||
| WxBusinessCircleOrder byTransactionId = wxBusinessCircleOrderMapper.getByTransactionId(wxBusinessCircleOrder); | |||
| @@ -66,13 +90,31 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe | |||
| wxBusinessCircleOrderMapper.insertNoticeOrder(wxBusinessCircleOrder); | |||
| // TODO: 2021/4/21 mq 新增积分 积分同步 | |||
| this.sendMessage(wxBusinessCircleOrder,wxBusinessCircleOrder.getNoticeEventType()); | |||
| } | |||
| } | |||
| /** | |||
| * | |||
| * @param wxBusinessCircleOrder | |||
| * @param eventType | |||
| */ | |||
| private void sendMessage(WxBusinessCircleOrder wxBusinessCircleOrder,String eventType){ | |||
| FmInsideBusinessCircleMsg msg = new FmInsideBusinessCircleMsg(); | |||
| msg.updateTenantInfo(wxBusinessCircleOrder); | |||
| msg.setEventType(eventType); | |||
| msg.setBusinessCircleOrderId(wxBusinessCircleOrder.getId()); | |||
| msg.setMerchantId(wxBusinessCircleOrder.getMerchantId()); | |||
| msg.setCUserId(wxBusinessCircleOrder.getCUserId()); | |||
| msg.setWxShopName(wxBusinessCircleOrder.getWxShopName()); | |||
| msg.setAmount(wxBusinessCircleOrder.getAmount()); | |||
| mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); | |||
| } | |||
| @Override | |||
| public void updateRefundOrder(WxBusinessCircleOrder wxBusinessCircleOrder) { | |||
| WxBusinessCircleOrder byTransactionId = wxBusinessCircleOrderMapper.getByTransactionId(wxBusinessCircleOrder); | |||
| WxBusinessCircleOrder byTransactionId = this.getByTransactionId(wxBusinessCircleOrder.getTransactionId(),wxBusinessCircleOrder.getTenantId()); | |||
| if(byTransactionId == null){ | |||
| logger.error("--商圈退款--付款消息未找到--"); | |||
| }else{ | |||
| @@ -82,8 +124,27 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe | |||
| wxBusinessCircleOrderMapper.updateRefundNoticeOrder(wxBusinessCircleOrder); | |||
| // TODO: 2021/4/21 mq 退积分 | |||
| this.sendMessage(wxBusinessCircleOrder,wxBusinessCircleOrder.getRefundEventType()); | |||
| } | |||
| } | |||
| @Override | |||
| public void updateAddPoints(WxBusinessCircleOrder wxBusinessCircleOrder) { | |||
| wxBusinessCircleOrder.setUpdateTime(new Date()); | |||
| wxBusinessCircleOrderMapper.updateAddPoints(wxBusinessCircleOrder); | |||
| } | |||
| @Override | |||
| public void updateIsPointsNotify(WxBusinessCircleOrder wxBusinessCircleOrder) { | |||
| wxBusinessCircleOrder.setUpdateTime(new Date()); | |||
| wxBusinessCircleOrderMapper.updateIsPointsNotify(wxBusinessCircleOrder); | |||
| } | |||
| @Override | |||
| public void updateRefundPoints(WxBusinessCircleOrder wxBusinessCircleOrder) { | |||
| wxBusinessCircleOrder.setUpdateTime(new Date()); | |||
| wxBusinessCircleOrderMapper.updateRefundPoints(wxBusinessCircleOrder); | |||
| } | |||
| } | |||
| @@ -283,7 +283,7 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService { | |||
| // if (total > Integer.MAX_VALUE) { | |||
| // throw new MallinkException(ErrorCode.OUT_OF_CREDIT); | |||
| // } | |||
| if (total < 0) { | |||
| if (total < 0 && !Objects.equals(record.getCreditType(),EnumScoreType.REFUND_CONSUMPTION.getCode())) { | |||
| throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); | |||
| } | |||
| //如果为导入的会员 则直接覆盖总积分和操作积分明细 | |||
| @@ -448,6 +448,10 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService { | |||
| return record.getCreditNum(); | |||
| } | |||
| if (record.getCreditType() == EnumScoreType.REFUND_CONSUMPTION.getCode()) { | |||
| return reduceCredit(record); | |||
| } | |||
| return 0; | |||
| } | |||
| @@ -0,0 +1,147 @@ | |||
| package com.iformall.service.msg.impl; | |||
| import com.github.binarywang.wxpay.bean.businesscircle.PointsNotifyRequest; | |||
| import com.github.binarywang.wxpay.service.WxPayService; | |||
| import com.iformall.domain.po.WxBusinessCircleOrder; | |||
| import com.iformall.domain.po.WxCUserBasicInfo; | |||
| import com.iformall.domain.po.WxCreditHistory; | |||
| import com.iformall.domain.po.WxMerchant; | |||
| import com.iformall.domain.po.msg.BaseMsg; | |||
| import com.iformall.domain.po.msg.FmInsideBusinessCircleMsg; | |||
| import com.iformall.enums.EnumBusiness; | |||
| import com.iformall.enums.EnumScoreType; | |||
| import com.iformall.enums.EnumUserType; | |||
| import com.iformall.service.*; | |||
| import com.iformall.service.msg.MsgSendService; | |||
| import com.iformall.utils.MaUtil; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Date; | |||
| import java.util.Locale; | |||
| /** | |||
| * | |||
| * | |||
| */ | |||
| @Service | |||
| public class FmInsideBusinessCircleMsgServiceImpl implements MsgSendService { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'+'mm:ss", Locale.CHINA); | |||
| @Autowired | |||
| WxMerchantService wxMerchantService; | |||
| @Autowired | |||
| WxCreditHistoryService creditHistoryService; | |||
| @Autowired | |||
| WxCUserBasicInfoService cUserBasicInfoService; | |||
| WxBusinessCircleOrderService businessCircleOrderService; | |||
| @Autowired | |||
| WxPayAccountService wxPayAccountService; | |||
| @Override | |||
| public void send(BaseMsg baseMsg) throws Exception { | |||
| FmInsideBusinessCircleMsg msg = (FmInsideBusinessCircleMsg)baseMsg; | |||
| if(msg.getCUserId() == null){ | |||
| return; | |||
| } | |||
| WxCUserBasicInfo user = cUserBasicInfoService.getById(msg.getCUserId(), msg.getFinalTenantId()); | |||
| if(user == null){ | |||
| return; | |||
| } | |||
| WxBusinessCircleOrder wxBusinessCircleOrder = businessCircleOrderService.getById(msg.getBusinessCircleOrderId(),msg.getTenantId()); | |||
| if(wxBusinessCircleOrder == null){ | |||
| return; | |||
| } | |||
| if(msg.getMerchantId() == null){ | |||
| return; | |||
| } | |||
| Integer businessId = EnumBusiness.BUSINESS_ID6.getCode(); | |||
| WxMerchant wxMerchant = wxMerchantService.getById(msg.getMerchantId()); | |||
| if(wxMerchant != null){ | |||
| businessId = wxMerchant.getBusinessId(); | |||
| } | |||
| WxCreditHistory creditHistory = new WxCreditHistory(); | |||
| creditHistory.setTenantId(msg.getFinalTenantId()); | |||
| creditHistory.setOperatorType(EnumUserType.BUSINESS_CIRCLE.getCode()); | |||
| creditHistory.setOperatorId(msg.getCUserId()); | |||
| creditHistory.setCUserId(msg.getCUserId()); | |||
| creditHistory.setCreateDate(new Date()); | |||
| creditHistory.setCouponId(msg.getBusinessCircleOrderId()); | |||
| creditHistory.setBusinessId(businessId); | |||
| creditHistory.setMerchantId(msg.getMerchantId()); | |||
| if(MaUtil.noticeEventType.equals(msg.getEventType())){ | |||
| creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode()); | |||
| creditHistory.setSpend(msg.getAmount()); | |||
| creditHistory.setChangePurpose("商圈消费:消费商户["+msg.getWxShopName()+"] ("+creditHistory.getSpendStr()+"元) "); | |||
| creditHistory = creditHistoryService.saveOrUpdate(creditHistory,msg.getTenantId()); | |||
| Integer creditNum = 0; | |||
| if (creditHistory.getCreditNum() != null) { | |||
| creditNum = creditHistory.getCreditNum(); | |||
| } | |||
| if(creditNum == 0){ | |||
| return; | |||
| } | |||
| wxBusinessCircleOrder.setIncreasedPoints(creditNum); | |||
| wxBusinessCircleOrder.setPointsUpdateTime(creditHistory.getCreateDate()); | |||
| businessCircleOrderService.updateAddPoints(wxBusinessCircleOrder); | |||
| this.notifyPoints(wxBusinessCircleOrder); | |||
| }else if(MaUtil.refundEventType.equals(msg.getEventType())){ | |||
| creditHistory.setCreditType(EnumScoreType.REFUND_CONSUMPTION.getCode()); | |||
| creditHistory.setCreditNum(wxBusinessCircleOrder.getIncreasedPoints()); | |||
| creditHistory.setSpend(0-msg.getAmount()); | |||
| creditHistory.setChangePurpose("商圈消费退款:消费商户["+msg.getWxShopName()+"] ("+creditHistory.getSpendStr()+"元) ");// | |||
| creditHistory = creditHistoryService.saveOrUpdate(creditHistory,msg.getTenantId()); | |||
| Integer creditNum = 0; | |||
| if (creditHistory.getCreditNum() != null) { | |||
| creditNum = creditHistory.getCreditNum(); | |||
| } | |||
| if(creditNum == 0){ | |||
| return; | |||
| } | |||
| wxBusinessCircleOrder.setRefundPointsTime(creditHistory.getCreateDate()); | |||
| businessCircleOrderService.updateRefundPoints(wxBusinessCircleOrder); | |||
| } | |||
| } | |||
| private void notifyPoints(WxBusinessCircleOrder wxBusinessCircleOrder) throws Exception{ | |||
| //添加积分成功,做积分同步 | |||
| WxPayService wxPayService = wxPayAccountService.getWxPayService(wxBusinessCircleOrder.getTenantId()); | |||
| PointsNotifyRequest request = new PointsNotifyRequest(); | |||
| request.setSubMchid(wxPayService.getConfig().getSubMchId()); | |||
| request.setTransactionId(wxBusinessCircleOrder.getTransactionId()); | |||
| request.setOpenid(wxBusinessCircleOrder.getOpenid()); | |||
| request.setEarnPoints(true); | |||
| request.setIncreasedPoints(wxBusinessCircleOrder.getIncreasedPoints()); | |||
| request.setPointsUpdateTime(sdf.format(new Date())); | |||
| String result = wxPayService.getBusinessCircleService().notifyPoints(request); | |||
| logger.info("微信商圈同步积分请求结果----"+result); | |||
| businessCircleOrderService.updateIsPointsNotify(wxBusinessCircleOrder); | |||
| } | |||
| } | |||
| @@ -13,6 +13,9 @@ import org.apache.commons.lang3.StringUtils; | |||
| public class MaUtil { | |||
| public static final String noticeEventType = "MALL_TRANSACTION.SUCCESS"; | |||
| public static final String refundEventType = "MALL_REFUND.SUCCESS"; | |||
| static public WxMaService getWeappService(WxAppinfo appinfo) { | |||
| WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); | |||
| config.setAppid(appinfo.getAppId()); | |||
| @@ -40,13 +43,13 @@ public class MaUtil { | |||
| config.setKeyPath(payAccount.getCertPath()); | |||
| //以下是apiv3以及支付分相关 | |||
| // config.setServiceId(); | |||
| // config.setPayScoreNotifyUrl(); | |||
| // TODO: 2021/4/20 | |||
| config.setPrivateKeyPath(null);//apiv3 商户apiclient_key.pem 商户私钥 | |||
| config.setPrivateCertPath(null);//apiv3 商户apiclient_cert.pem | |||
| config.setCertSerialNo(null);//证书序列号 | |||
| config.setApiV3Key(null);//apiV3秘钥 | |||
| // config.setServiceId(payAccount.getServiceId()); | |||
| // config.setPayScoreNotifyUrl(payAccount.getPayScoreNotifyUrl()); | |||
| config.setPrivateKeyPath(payAccount.getPrivateKeyPath());//apiv3 商户apiclient_key.pem 商户私钥 | |||
| config.setPrivateCertPath(payAccount.getPrivateCertPath());//apiv3 商户apiclient_cert.pem | |||
| config.setCertSerialNo(payAccount.getCertSerialNo());//证书序列号 | |||
| config.setApiV3Key(payAccount.getApiV3Key());//apiV3秘钥 | |||
| WxPayService wxPayService = new WxPayServiceImpl(); | |||
| wxPayService.setConfig(config); | |||
| @@ -165,6 +165,14 @@ | |||
| <include refid="dynamicWhereConditions"/> | |||
| </select> | |||
| <select id="getById" parameterType="com.iformall.domain.po.WxBusinessCircleOrder" resultMap="BaseResultMap"> | |||
| select | |||
| <include refid="allColumns"/> | |||
| from wx_business_circle_order | |||
| where `id` = #{id} | |||
| and tenant_id=#{tenantId} | |||
| </select> | |||
| <select id="getByTransactionId" parameterType="com.iformall.domain.po.WxBusinessCircleOrder" resultMap="BaseResultMap"> | |||
| select | |||
| <include refid="allColumns"/> | |||