Kaynağa Gözat

wxbusiness

release_toaliyun_real
xhxu 5 yıl önce
ebeveyn
işleme
52921e7f6a
16 değiştirilmiş dosya ile 404 ekleme ve 116 silme
  1. +17
    -0
      mallinkAdmin/src/main/resources/db/migration/V202104220001__add_merchant_Cash-out.sql
  2. +1
    -1
      mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java
  3. +62
    -103
      mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java
  4. +8
    -0
      mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java
  5. +8
    -0
      mallinkService/src/main/java/com/iformall/domain/po/msg/BaseMsg.java
  6. +32
    -0
      mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideBusinessCircleMsg.java
  7. +3
    -2
      mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java
  8. +2
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java
  9. +3
    -1
      mallinkService/src/main/java/com/iformall/enums/EnumUserType.java
  10. +4
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxBusinessCircleOrderMapper.java
  11. +32
    -0
      mallinkService/src/main/java/com/iformall/service/WxBusinessCircleOrderService.java
  12. +62
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java
  13. +5
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java
  14. +147
    -0
      mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideBusinessCircleMsgServiceImpl.java
  15. +10
    -7
      mallinkService/src/main/java/com/iformall/utils/MaUtil.java
  16. +8
    -0
      mallinkService/src/main/resources/mapper/WxBusinessCircleOrderMapper.xml

+ 17
- 0
mallinkAdmin/src/main/resources/db/migration/V202104220001__add_merchant_Cash-out.sql Dosyayı Görüntüle

@@ -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;

+ 1
- 1
mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java Dosyayı Görüntüle

@@ -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");



+ 62
- 103
mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java Dosyayı Görüntüle

@@ -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 {
}



/**
* 验签
*/


+ 8
- 0
mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java Dosyayı Görüntüle

@@ -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);
/**


+ 8
- 0
mallinkService/src/main/java/com/iformall/domain/po/msg/BaseMsg.java Dosyayı Görüntüle

@@ -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;
}

}

+ 32
- 0
mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideBusinessCircleMsg.java Dosyayı Görüntüle

@@ -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;


}

+ 3
- 2
mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java Dosyayı Görüntüle

@@ -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) {


+ 2
- 0
mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java Dosyayı Görüntüle

@@ -29,6 +29,8 @@ public enum EnumScoreType {

QUESTION_ADD_CREDIT(21, "问卷奖励积分"),

REFUND_CONSUMPTION(22, "消费退款"),

;

public static EnumScoreType getEnum(Integer code) {


+ 3
- 1
mallinkService/src/main/java/com/iformall/enums/EnumUserType.java Dosyayı Görüntüle

@@ -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) {


+ 4
- 0
mallinkService/src/main/java/com/iformall/mapper/WxBusinessCircleOrderMapper.java Dosyayı Görüntüle

@@ -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);


}

+ 32
- 0
mallinkService/src/main/java/com/iformall/service/WxBusinessCircleOrderService.java Dosyayı Görüntüle

@@ -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);


}

+ 62
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java Dosyayı Görüntüle

@@ -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);
}


}

+ 5
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java Dosyayı Görüntüle

@@ -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;
}



+ 147
- 0
mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideBusinessCircleMsgServiceImpl.java Dosyayı Görüntüle

@@ -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);
}

}

+ 10
- 7
mallinkService/src/main/java/com/iformall/utils/MaUtil.java Dosyayı Görüntüle

@@ -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);


+ 8
- 0
mallinkService/src/main/resources/mapper/WxBusinessCircleOrderMapper.xml Dosyayı Görüntüle

@@ -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"/>


Yükleniyor…
İptal
Kaydet