From bd135dca63e50d40107473e3fa09c76ab5fcfb3b Mon Sep 17 00:00:00 2001 From: xhxu Date: Mon, 10 Oct 2022 19:35:23 +0800 Subject: [PATCH] =?UTF-8?q?//=E4=BC=9A=E5=91=98=E5=8D=A1=20=E5=95=86?= =?UTF-8?q?=E5=9C=88=E7=9B=B8=E5=85=B3=E2=80=94=E2=80=941?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callback/WxBusinessOrderController.java | 109 ++++++- .../callback/WxMemberCardController.java | 290 ++++++++++++++++++ .../config/BaseMyBatisConfiguration.java | 7 + .../com/iformall/domain/po/WxMemberCard.java | 94 ++++++ .../com/iformall/domain/po/WxPayAccount.java | 10 + .../com/iformall/enums/EnumBusinessType.java | 37 +++ .../enums/EnumMemberCardActivateScene.java | 48 +++ .../enums/EnumMemberCardAuthorizeState.java | 48 +++ .../iformall/enums/EnumMemberCardStatus.java | 54 ++++ .../iformall/mapper/WxMemberCardMapper.java | 17 + .../java/com/iformall/pay/WxPayConstant.java | 14 + .../service/WxBusinessCircleOrderService.java | 14 + .../iformall/service/WxMemberCardService.java | 47 +++ .../WxBusinessCircleOrderServiceImpl.java | 64 ++++ .../service/impl/WxMemberCardServiceImpl.java | 218 +++++++++++++ .../service/impl/WxPayAccountServiceImpl.java | 8 +- .../resources/mapper/WxMemberCardMapper.xml | 133 ++++++++ .../resources/mapper/WxPayAccountMapper.xml | 6 +- 18 files changed, 1209 insertions(+), 9 deletions(-) create mode 100644 mallinkCallback/src/main/java/com/iformall/controller/callback/WxMemberCardController.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxMemberCard.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumBusinessType.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumMemberCardActivateScene.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumMemberCardAuthorizeState.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumMemberCardStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxMemberCardMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxMemberCardService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxMemberCardServiceImpl.java create mode 100644 mallinkService/src/main/resources/mapper/WxMemberCardMapper.xml diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java index c053d41b2..5fbc3bc99 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java @@ -1,21 +1,25 @@ package com.iformall.controller.callback; import com.github.binarywang.wxpay.bean.businesscircle.BusinessCircleNotifyData; +import com.github.binarywang.wxpay.bean.businesscircle.MemberCardAuthorizeNotifyResult; import com.github.binarywang.wxpay.bean.businesscircle.PaidResult; import com.github.binarywang.wxpay.bean.businesscircle.RefundResult; import com.github.binarywang.wxpay.bean.ecommerce.SignatureHeader; +import com.github.binarywang.wxpay.bean.membercard.MemberCardActivateResult; +import com.github.binarywang.wxpay.bean.membercard.MemberCardNotifyData; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import com.iformall.controller.base.BaseController; +import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxBusinessCircleOrder; +import com.iformall.domain.po.WxMemberCard; +import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.base.TenantEntity; -import com.iformall.enums.EnumThirdPartyConfigType; +import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.interceptor.BodyReaderHttpServletRequestWrapper; import com.iformall.pay.WxPayConstant; -import com.iformall.service.WxBusinessCircleOrderService; -import com.iformall.service.WxMallService; -import com.iformall.service.WxPayAccountService; +import com.iformall.service.*; import com.iformall.utils.MaUtil; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.web.servlet.ShiroHttpServletRequest; @@ -46,12 +50,109 @@ public class WxBusinessOrderController extends BaseController { @Autowired WxMallService wxMallService; + @Autowired + WxAppinfoService wxAppinfoService; + @Autowired WxPayAccountService wxPayAccountService; @Autowired WxBusinessCircleOrderService wxBusinessCircleOrderService; + @Autowired + WxMemberCardService wxMemberCardService; + + @Autowired + MaUtil maUtil; + + /** + * + * @return 商圈授权通知 + */ + @PostMapping(value = "/membercard/{tenantId}") + @ResponseBody + public Map notify(@PathVariable String tenantId, HttpServletRequest request){ + logger.info("[" +getIpAddr() + "]商圈授权通知-----"+tenantId); + Map 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; + } + + SignatureHeader header = new SignatureHeader(); + header.setSerialNo(request.getHeader("Wechatpay-Serial")); + header.setTimeStamp(request.getHeader("Wechatpay-Timestamp")); + header.setNonce(request.getHeader("Wechatpay-Nonce")); + header.setSigned(request.getHeader("Wechatpay-Signature")); + + logger.info("商圈授权通知---header{}"+header.toString()); + + try { + String body = this.getBody(request); + logger.info("商圈授权通知---body{}"+body); + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantId, EnumAppPlat.WX); + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(cAppInfo == null || payAccount == null){ + resultMap.put("code","FAIL"); + return resultMap; + } + WxPayService wxPayService = maUtil.getWxPayService(cAppInfo, payAccount); + + //----------------签名验证----------- +// BusinessCircleNotifyData notifyData = verifySignature(request,wxPayService); + BusinessCircleNotifyData notifyData = wxPayService.getBusinessCircleService().parseNotifyData(body, header); + logger.info("商圈授权通知---回调通知对象{}"+notifyData.toString()); + + MemberCardAuthorizeNotifyResult result = wxPayService.getBusinessCircleService().decryptMemberCardAuthorizeNotifyDataResource(notifyData); + logger.info("商圈授权通知---解密结果{}"+result.toString()); + + WxMemberCard memberCard = new WxMemberCard(); + memberCard.updateTenantInfo(tenantEntity); + memberCard.setAppId(cAppInfo.getAppId()); + memberCard.setCardId(payAccount.getCardId()); + memberCard.setCardCode(result.getCode()); + memberCard.setOpenId(result.getOpenid()); + + if(WxPayConstant.REGISTERED_MODE.equals(result.getAuthType())){ + memberCard.setUserCardStatus(EnumMemberCardStatus.EFFECTIVE.getCode()); + memberCard.setAuthorizeState(EnumMemberCardAuthorizeState.UNAUTHORIZED.getCode()); + wxMemberCardService.saveorupdateByCode(memberCard); + resultMap.put("code","SUCCESS"); + return resultMap; + }else if(WxPayConstant.REGISTERED_AND_AUTHORIZATION_MODE.equals(result.getAuthType())){ + memberCard.setUserCardStatus(EnumMemberCardStatus.EFFECTIVE.getCode()); + memberCard.setAuthorizeState(EnumMemberCardAuthorizeState.AUTHORIZED.getCode()); + wxMemberCardService.saveorupdateByCode(memberCard); + resultMap.put("code","SUCCESS"); + return resultMap; + } + resultMap.put("code","FAIL"); + return resultMap; + } catch (WxPayException e) { + e.printStackTrace(); + logger.error("商圈授权通知---"+e.getCustomErrorMsg()); + resultMap.put("code","FAIL"); + return resultMap; + } catch(MallinkException e){ + logger.error("商圈授权通知---"+e.getMessage()); + resultMap.put("code","FAIL"); + return resultMap; + }catch (Exception e){ + e.printStackTrace(); + logger.error("商圈授权通知---其他异常"); + resultMap.put("code","FAIL"); + return resultMap; + } + } + /** * * @return 微信商圈支付通知 diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxMemberCardController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxMemberCardController.java new file mode 100644 index 000000000..eb4a0688d --- /dev/null +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxMemberCardController.java @@ -0,0 +1,290 @@ +package com.iformall.controller.callback; + +import com.github.binarywang.wxpay.bean.businesscircle.BusinessCircleNotifyData; +import com.github.binarywang.wxpay.bean.businesscircle.PaidResult; +import com.github.binarywang.wxpay.bean.businesscircle.RefundResult; +import com.github.binarywang.wxpay.bean.ecommerce.SignatureHeader; +import com.github.binarywang.wxpay.bean.membercard.MemberCardActivateResult; +import com.github.binarywang.wxpay.bean.membercard.MemberCardNotifyData; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.iformall.controller.base.BaseController; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxBusinessCircleOrder; +import com.iformall.domain.po.WxMemberCard; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.enums.EnumAppPlat; +import com.iformall.enums.EnumMemberCardActivateScene; +import com.iformall.enums.EnumMemberCardStatus; +import com.iformall.exception.MallinkException; +import com.iformall.pay.WxPayConstant; +import com.iformall.service.*; +import com.iformall.utils.MaUtil; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +@RestController +@RequestMapping("/member/card") +public class WxMemberCardController extends BaseController { + + 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 + WxMallService wxMallService; + + @Autowired + WxAppinfoService wxAppinfoService; + + @Autowired + WxPayAccountService wxPayAccountService; + + @Autowired + WxMemberCardService wxMemberCardService; + + @Autowired + MaUtil maUtil; + + /** + * + * @return 微信会员卡通知 + */ + @PostMapping(value = "/notify/{tenantId}") + @ResponseBody + public Map notify(@PathVariable String tenantId, HttpServletRequest request){ + logger.info("[" +getIpAddr() + "]微信会员卡通知-----"+tenantId); + Map 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; + } + + SignatureHeader header = new SignatureHeader(); + header.setSerialNo(request.getHeader("Wechatpay-Serial")); + header.setTimeStamp(request.getHeader("Wechatpay-Timestamp")); + header.setNonce(request.getHeader("Wechatpay-Nonce")); + header.setSigned(request.getHeader("Wechatpay-Signature")); + + logger.info("微信会员卡通知---header{}"+header.toString()); + + try { + String body = this.getBody(request); + logger.info("微信会员卡通知---body{}"+body); + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantId, EnumAppPlat.WX); + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(cAppInfo == null || payAccount == null){ + resultMap.put("code","FAIL"); + return resultMap; + } + WxPayService wxPayService = maUtil.getWxPayService(cAppInfo, payAccount); + //----------------签名验证----------- +// BusinessCircleNotifyData notifyData = verifySignature(request,wxPayService); + MemberCardNotifyData notifyData = wxPayService.getMemberCardService().parseNotifyData(body, header); + logger.info("微信会员卡通知---回调通知对象{}"+notifyData.toString()); + + MemberCardActivateResult result = wxPayService.getMemberCardService().decryptActivateNotifyDataResource(notifyData); + logger.info("微信会员卡通知---解密结果{}"+result.toString()); + + WxMemberCard memberCard = new WxMemberCard(); + memberCard.updateTenantInfo(tenantEntity); + memberCard.setAppId(cAppInfo.getAppId()); + memberCard.setCardId(result.getCardId()); + memberCard.setCardCode(result.getCode()); + memberCard.setOpenId(result.getOpenid()); + memberCard.setUnionId(result.getUnionid()); + if(WxPayConstant.MEMBER_CARD_ACTIVATE.equals(result.getEventType())){ + memberCard.setUserCardStatus(EnumMemberCardStatus.EFFECTIVE.getCode()); + memberCard.setCreateDate(sdf.parse(result.getEventTime())); + memberCard.setActivateScene(EnumMemberCardActivateScene.getEnum(result.getActivateScene()).getCode()); +// memberCard.setOuterStr(result.getOuterStr()); + wxMemberCardService.saveorupdateByCode(memberCard); + resultMap.put("code","SUCCESS"); + return resultMap; + }else if(WxPayConstant.USER_VIEW_MEMBERCARD.equals(result.getEventType())){ + resultMap.put("code","SUCCESS"); + return resultMap; + }else if(WxPayConstant.USER_DELETE_MEMBERCARD.equals(result.getEventType())){ + memberCard.setUpdateDate(sdf.parse(result.getEventTime())); + memberCard.setUserCardStatus(EnumMemberCardStatus.DELETE.getCode()); + wxMemberCardService.delUserCardStatusByCode(memberCard); + resultMap.put("code","SUCCESS"); + return resultMap; + }else if(WxPayConstant.USER_MODIFY_INFORMATION.equals(result.getEventType())){//todo 暂未同步会员卡信息 + resultMap.put("code","SUCCESS"); + return resultMap; + } + resultMap.put("code","FAIL"); + return resultMap; + } catch (WxPayException e) { + e.printStackTrace(); + logger.error("微信会员卡通知---"+e.getCustomErrorMsg()); + resultMap.put("code","FAIL"); + return resultMap; + } catch (ParseException e) { + e.printStackTrace(); + logger.error("微信会员卡通知---时间转换异常"); + resultMap.put("code","FAIL"); + return resultMap; + } catch(MallinkException e){ + logger.error("微信会员卡通知---"+e.getMessage()); + resultMap.put("code","FAIL"); + return resultMap; + }catch (Exception e){ + e.printStackTrace(); + logger.error("微信会员卡通知---其他异常"); + resultMap.put("code","FAIL"); + return resultMap; + } + } + + + private String getBody(HttpServletRequest request) throws IOException { + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8")); + char[] charBuffer = new char[1024]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch ( + IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + return stringBuilder.toString(); + } + + +// @PostMapping(value = "/test") +// @ResponseBody +// public void createOrdertests(){ +// +//// SignatureHeader(timeStamp=1627973486, nonce=pKGTNqxLaljN9jB5DprFagpmggWIhyBA, signed=gDmv1WDCGdlIyyW9bGDJuztWNritufRsiYt5bPfudpwvPA9hHWM47eFeZYzHpgxttnxyAL10XYbPK8SngtCHSeOghS4gXHuAQoWv3RlEkTHhIcf1eg+uD4zd4PsNqJ35YlW6RyYkjv/Y8didERnkvXZPvDrzP5DKsurLXvMJBs7mzVzt6QIgZa2DuVjnhmSk4aC3wPs7lqm8ElWsEblCr8k9RSrP92PFGSTnU5owAUrTMTL1kqfwzavzwVJxafAGkXxrHbybpP5qZ5DjttAhDkRI3L2xQfPvHAFyibnwk2N9KYC9H6AOuZIuku/9eRlan+ZMDln63gaPFfvl1OB7hg==, serialNo=76EEF0C28D079D9CED85C67237F173FF825CFAE7) +// +// SignatureHeader header = new SignatureHeader(); +// header.setSerialNo("76EEF0C28D079D9CED85C67237F173FF825CFAE7"); +// header.setTimeStamp("1627973486"); +// header.setNonce("pKGTNqxLaljN9jB5DprFagpmggWIhyBA"); +// header.setSigned("gDmv1WDCGdlIyyW9bGDJuztWNritufRsiYt5bPfudpwvPA9hHWM47eFeZYzHpgxttnxyAL10XYbPK8SngtCHSeOghS4gXHuAQoWv3RlEkTHhIcf1eg+uD4zd4PsNqJ35YlW6RyYkjv/Y8didERnkvXZPvDrzP5DKsurLXvMJBs7mzVzt6QIgZa2DuVjnhmSk4aC3wPs7lqm8ElWsEblCr8k9RSrP92PFGSTnU5owAUrTMTL1kqfwzavzwVJxafAGkXxrHbybpP5qZ5DjttAhDkRI3L2xQfPvHAFyibnwk2N9KYC9H6AOuZIuku/9eRlan+ZMDln63gaPFfvl1OB7hg=="); +// +// +// logger.info("微信商圈支付通知---header{}"+header.toString()); +// String tenantId = "1019"; +// TenantEntity tenantEntity = wxMallService.getByTenantId(tenantId); +// +// try { +// // {"id":"fe9f7590-89d3-588a-a5a3-f3ca5cb6e806","create_time":"2021-08-03T14:51:23+08:00","resource_type":"encrypt-resource","event_type":"MALL_TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"mall_transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"T9VctVJB+7Zs0dhZnejwXNOvxHM/CfPt4S4C4cAtvSYsO2++8eVMN3dZky1/TLVg/mJtFBVHU4IiPavZMV+tULw3yKBs/JomTBHblb8De8GKU2/m03/wD3rxufdYejTnxXQWsdAEaWduM/zWCCtNIblayVE8Bz6p0cZtutk6jknYaDQk13sNGh1U12lpcElGf3i8LxLG0jWp+DBp2seOizBsjB8Cky/xEMjmd9OzbtrCd7K22ZtGv7gyA2C/9NY5gFT9tlcGFaD+BvOx69o7Sw1uHZ5IaXHTpI9SQlHCWCs8tGZtMZrlzgFLa/DI+TFkh//WYNcZRomhBydAbE4xQJqSWB5/81Rqa4gYT85YJPhgXRKGl+F0S/6jCYuL5cJpqUCojNz+g16znI8=","associated_data":"mall_transaction","nonce":"0GqZRhyTkcHG"}} +// +// String body = "{\"id\":\"fe9f7590-89d3-588a-a5a3-f3ca5cb6e806\",\"create_time\":\"2021-08-03T14:51:23+08:00\",\"resource_type\":\"encrypt-resource\",\"event_type\":\"MALL_TRANSACTION.SUCCESS\",\"summary\":\"支付成功\",\"resource\":{\"original_type\":\"mall_transaction\",\"algorithm\":\"AEAD_AES_256_GCM\",\"ciphertext\":\"T9VctVJB+7Zs0dhZnejwXNOvxHM/CfPt4S4C4cAtvSYsO2++8eVMN3dZky1/TLVg/mJtFBVHU4IiPavZMV+tULw3yKBs/JomTBHblb8De8GKU2/m03/wD3rxufdYejTnxXQWsdAEaWduM/zWCCtNIblayVE8Bz6p0cZtutk6jknYaDQk13sNGh1U12lpcElGf3i8LxLG0jWp+DBp2seOizBsjB8Cky/xEMjmd9OzbtrCd7K22ZtGv7gyA2C/9NY5gFT9tlcGFaD+BvOx69o7Sw1uHZ5IaXHTpI9SQlHCWCs8tGZtMZrlzgFLa/DI+TFkh//WYNcZRomhBydAbE4xQJqSWB5/81Rqa4gYT85YJPhgXRKGl+F0S/6jCYuL5cJpqUCojNz+g16znI8=\",\"associated_data\":\"mall_transaction\",\"nonce\":\"0GqZRhyTkcHG\"}}"; +// logger.info("微信商圈支付通知---body{}"+body); +// WxPayService wxPayService = wxPayAccountService.getWxPayService(tenantId); +// +// //----------------签名验证----------- +//// BusinessCircleNotifyData notifyData = verifySignature(request,wxPayService); +// BusinessCircleNotifyData notifyData = wxPayService.getBusinessCircleService().parseNotifyData(body, header); +// logger.info("微信商圈通知---回调通知对象{}"+notifyData.toString()); +// +// WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); +// wxBusinessCircleOrder.updateTenantInfo(tenantEntity); +// wxBusinessCircleOrder.setNoticeId(notifyData.getId()); +// wxBusinessCircleOrder.setNoticeCreateTime(sdf.parse(notifyData.getCreateTime())); +// wxBusinessCircleOrder.setNoticeEventType(notifyData.getEventType()); +// wxBusinessCircleOrder.setSummary(notifyData.getSummary()); +// +// //解密 +// if(WxPayConstant.NOTICE_EVENT_TYPE.equals(notifyData.getEventType())){ +// PaidResult result = wxPayService.getBusinessCircleService().decryptPaidNotifyDataResource(notifyData); +// logger.info("微信商圈支付成功通知---解密结果{}"+result.toString()); +// +// 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.setPayAmount(result.getAmount()); +// wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); +// wxBusinessCircleOrder.setCommitTag(result.getCommitTag()); +// +// +// +// }else if(WxPayConstant.REFUND_EVENT_TYPE.equals(notifyData.getEventType())){ +// RefundResult result = wxPayService.getBusinessCircleService().decryptRefundNotifyDataResource(notifyData); +// logger.info("微信商圈退款成功通知---解密结果{}"+result.toString()); +// +// 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.getRefundTime())); +// wxBusinessCircleOrder.setAmount(result.getPayAmount()); +// wxBusinessCircleOrder.setPayAmount(result.getPayAmount()); +// wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); +// +// wxBusinessCircleOrder.setRefundAmount(result.getRefundAmount()); +// wxBusinessCircleOrder.setRefundId(result.getRefundId()); +// +// +// } +// +// } catch (WxPayException e) { +// e.printStackTrace(); +// logger.error("微信商圈通知---"+e.getCustomErrorMsg()); +// +// } catch (ParseException e) { +// e.printStackTrace(); +// logger.error("微信商圈通知---时间转换异常"); +// +// } catch(MallinkException e){ +// logger.error("微信商圈通知---"+e.getMessage()); +// +// }catch (Exception e){ +// e.printStackTrace(); +// logger.error("微信商圈通知---其他异常"); +// +// } +// } + +} diff --git a/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java b/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java index 1f6881f30..287bb5a26 100644 --- a/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java +++ b/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java @@ -88,6 +88,13 @@ public class BaseMyBatisConfiguration { ttCUserSharding.setCount(100); ttCUserSharding.setRule(EnumShardingRule.HASH.getCode()); shardingList.add(ttCUserSharding); + + ShardingSphere wxMemberCardSharding = new ShardingSphere(); + wxMemberCardSharding.setColumn("tenant_id"); + wxMemberCardSharding.setTableName("wx_member_card"); + wxMemberCardSharding.setCount(100); + wxMemberCardSharding.setRule(EnumShardingRule.HASH.getCode()); + shardingList.add(wxMemberCardSharding); ShardingSphere basicInfoSharding = new ShardingSphere(); basicInfoSharding.setColumn("final_tenant_id"); diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxMemberCard.java b/mallinkService/src/main/java/com/iformall/domain/po/WxMemberCard.java new file mode 100644 index 000000000..561dab7ee --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxMemberCard.java @@ -0,0 +1,94 @@ +package com.iformall.domain.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.iformall.domain.po.base.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@TableName(value = "wx_member_card") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class WxMemberCard extends TenantEntity { + + protected Long id; + + @io.swagger.annotations.ApiModelProperty(value="会员卡ID",name="cardId") + private String cardId; + + @io.swagger.annotations.ApiModelProperty(value="会员卡code",name="cardCode") + private String cardCode; + + @io.swagger.annotations.ApiModelProperty(value="EnumMemberCardActivateScene 开卡场景",name="activateScene") + private Integer activateScene; + + @io.swagger.annotations.ApiModelProperty(value="自定义场景",name="outerStr") + private Integer outerStr; + + @io.swagger.annotations.ApiModelProperty(value="",name="openId") + private String openId; + + @io.swagger.annotations.ApiModelProperty(value="",name="unionId") + private String unionId; + + @io.swagger.annotations.ApiModelProperty(value="展示会员编号",name="membershipNumber") + private String membershipNumber; + + @io.swagger.annotations.ApiModelProperty(value="会员等级",name="level") + private String level; + + @io.swagger.annotations.ApiModelProperty(value="用户昵称",name="nickname") + private String nickname; + + @io.swagger.annotations.ApiModelProperty(value="头像",name="headImageUrl") + private String headImageUrl; + + @io.swagger.annotations.ApiModelProperty(value="会员卡背景",name="backgroundPictureUrl") + private String backgroundPictureUrl; + + @io.swagger.annotations.ApiModelProperty(value="用户储值的最新余额,单位分",name="balance") + private Integer balance; + + @io.swagger.annotations.ApiModelProperty(value="EnumMemberCardStatus 用户会员卡状态",name="userCardStatus") + private Integer userCardStatus; + + @io.swagger.annotations.ApiModelProperty(value="用户开卡时填写的个人信息{}",name="userInformation") + private String userInformation; + + @io.swagger.annotations.ApiModelProperty(value="用户当前的积分值",name="bonusValue") + private Integer bonusValue; + + @io.swagger.annotations.ApiModelProperty(value="用户当前的会员服务项内容[]",name="serviceModules") + private String serviceModules; + + @io.swagger.annotations.ApiModelProperty(value="用户会员卡详情页会员优惠栏目中的会员专享价文案",name="memberPriceWord") + private String memberPriceWord; + + @io.swagger.annotations.ApiModelProperty(value="发票栏跳转小程序的引导文案",name="fapiaoJumpWord") + private String fapiaoJumpWord; + + @io.swagger.annotations.ApiModelProperty(value="设置商家联系人员的名字、头像和联系方式[]",name="guide") + private String guide; + + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") + private Date createDate; + + @io.swagger.annotations.ApiModelProperty(value="",name="appId") + private String appId; + + @io.swagger.annotations.ApiModelProperty(value="EnumMemberCardAuthorizeState 授权商圈快速积分状态",name="authorizeState") + private Integer authorizeState; + + @io.swagger.annotations.ApiModelProperty(value="授权时间",name="authorizeTime") + private Date authorizeTime; + + @io.swagger.annotations.ApiModelProperty(value="取消授权时间",name="deauthorizeTime") + private Date deauthorizeTime; + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java b/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java index 4a2e21415..9e1a4972b 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java @@ -97,6 +97,16 @@ public class WxPayAccount extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value="平台证书密钥文件",name="privateCertPemPath") private String privateCertPemPath; + @io.swagger.annotations.ApiModelProperty(value="商圈版本",name="businessType") + private Integer businessType; + + @io.swagger.annotations.ApiModelProperty(value="品牌ID",name="brandid") + private String brandid; + + @io.swagger.annotations.ApiModelProperty(value="商圈会员卡ID",name="cardId") + private String cardId; + + // @io.swagger.annotations.ApiModelProperty(value="app平台 EnumAppPlat ",name="plat") // private Integer plat; diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumBusinessType.java b/mallinkService/src/main/java/com/iformall/enums/EnumBusinessType.java new file mode 100644 index 000000000..e775e446e --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumBusinessType.java @@ -0,0 +1,37 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumBusinessType { + + BUSINESS_0(0, "暂未开通"), + BUSINESS_1(1, "1.0"), + BUSINESS_2(2, "2.0"), + BUSINESS_3(3, "3.0"); + + public static EnumBusinessType getEnum(Integer code) { + for (EnumBusinessType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumBusinessType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardActivateScene.java b/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardActivateScene.java new file mode 100644 index 000000000..166eb6f78 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardActivateScene.java @@ -0,0 +1,48 @@ +package com.iformall.enums; + +/** + * . + */ +public enum EnumMemberCardActivateScene { + + //NEW_ACTIVATE 新开卡激活 + //RECOVER 删卡后重新领取激活 + + NEW_ACTIVATE(0, "NEW_ACTIVATE"), + RECOVER(1, "RECOVER") + ; + + public static EnumMemberCardActivateScene getEnum(Integer code) { + for (EnumMemberCardActivateScene value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + public static EnumMemberCardActivateScene getEnum(String message) { + for (EnumMemberCardActivateScene value : values()) { + if (value.getMessage().equals(message)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumMemberCardActivateScene(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardAuthorizeState.java b/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardAuthorizeState.java new file mode 100644 index 000000000..28d90a459 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardAuthorizeState.java @@ -0,0 +1,48 @@ +package com.iformall.enums; + +/** + * . + */ +public enum EnumMemberCardAuthorizeState { + + //UNAUTHORIZED:未授权 + //AUTHORIZED:已授权 + //DEAUTHORIZED:已取消授权 + UNAUTHORIZED(0, "UNAUTHORIZED"), + AUTHORIZED(1, "AUTHORIZED"), + DEAUTHORIZED(2, "DEAUTHORIZED"), + ; + + public static EnumMemberCardAuthorizeState getEnum(Integer code) { + for (EnumMemberCardAuthorizeState value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + public static EnumMemberCardAuthorizeState getEnum(String message) { + for (EnumMemberCardAuthorizeState value : values()) { + if (value.getMessage().equals(message)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumMemberCardAuthorizeState(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardStatus.java new file mode 100644 index 000000000..5492083dd --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMemberCardStatus.java @@ -0,0 +1,54 @@ +package com.iformall.enums; + +/** + * . + */ +public enum EnumMemberCardStatus { + + //NOT_ACTIVATE:未激活 + //EFFECTIVE:生效中 + //EXPIRE:已过期 + //UNAVAILABLE:已失效 + //DELETE:已删除 + //IMPORTED:已导入 + NOT_ACTIVATE(0, "NOT_ACTIVATE"), + EFFECTIVE(1, "EFFECTIVE"), + EXPIRE(2, "EFFECTIVE"), + UNAVAILABLE(3, "EFFECTIVE"), + DELETE(4, "EFFECTIVE"), + IMPORTED(5, "EFFECTIVE"), + ; + + public static EnumMemberCardStatus getEnum(Integer code) { + for (EnumMemberCardStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + public static EnumMemberCardStatus getEnum(String message) { + for (EnumMemberCardStatus value : values()) { + if (value.getMessage().equals(message)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumMemberCardStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxMemberCardMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxMemberCardMapper.java new file mode 100644 index 000000000..6ba0820f1 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxMemberCardMapper.java @@ -0,0 +1,17 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxMemberCard; + +import java.util.List; + +public interface WxMemberCardMapper extends CommonMapper { + + List findList(WxMemberCard record); + + int deleteByCode(WxMemberCard record); + + Long getIdByCode(WxMemberCard record); + + int updateByOpenId(WxMemberCard record); +} diff --git a/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java b/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java index 02a4af249..76091746a 100644 --- a/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java +++ b/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java @@ -5,6 +5,17 @@ public class WxPayConstant { public static final String NOTICE_EVENT_TYPE = "MALL_TRANSACTION.SUCCESS"; public static final String REFUND_EVENT_TYPE = "MALL_REFUND.SUCCESS"; + //微信会员卡 + public static final String MEMBER_CARD_ACTIVATE = "MEMBER_CARD_ACTIVATE";//激活会员卡 + public static final String USER_VIEW_MEMBERCARD = "USER_VIEW_MEMBERCARD";//用户查看会员卡详情 + public static final String USER_DELETE_MEMBERCARD = "USER_DELETE_MEMBERCARD";//用户删除会员卡 + public static final String USER_MODIFY_INFORMATION = "USER_MODIFY_INFORMATION";//用户修改个人信息 + + //微信商圈授权 + public static final String REGISTERED_MODE = "REGISTERED_MODE";//会员开卡(进卡包) + 未授权会员积分服务 + public static final String REGISTERED_AND_AUTHORIZATION_MODE = "REGISTERED_AND_AUTHORIZATION_MODE";//会员开卡(进卡包)+授权会员积分服务 + + public final static String REQ_KEY = "reqKey"; public final static String RES_KEY = "resKey"; @@ -167,4 +178,7 @@ public class WxPayConstant { public final static String NEU_ORDER_PAY = "0"; // 有效, 优惠券从预核销处理为核销, 卡从预支付->支付 public final static String NEU_ORDER_REFUND = "1"; // 取消 + public final static String CAR_IN = "IN"; // 入场,用户开车进入商圈 + public final static String CAR_OUT = "OUT"; // 离场,用户开车离开商圈 + } diff --git a/mallinkService/src/main/java/com/iformall/service/WxBusinessCircleOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxBusinessCircleOrderService.java index 5788bb0dc..52e40224f 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxBusinessCircleOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxBusinessCircleOrderService.java @@ -61,4 +61,18 @@ public interface WxBusinessCircleOrderService { Integer sumCirclePayment(BusinessCircleBase circleOrder); Integer sumCircleRefundAmount(BusinessCircleBase circleOrder); + + /** + * 查询待积分状态 + */ + ResultData getPointsCommitStatus(TenantEntity tenantEntity,String openId); + + /** + * 商圈同步停车状态 + * state + * IN:入场,用户开车进入商圈 + * OUT:离场,用户开车离开商圈 + */ + ResultData syncParkings(TenantEntity tenantEntity,String openId,String plate_number,String state,Date time); + } diff --git a/mallinkService/src/main/java/com/iformall/service/WxMemberCardService.java b/mallinkService/src/main/java/com/iformall/service/WxMemberCardService.java new file mode 100644 index 000000000..5aece58ed --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxMemberCardService.java @@ -0,0 +1,47 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxMemberCard; +import com.iformall.domain.po.base.TenantEntity; + +public interface WxMemberCardService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxMemberCard record, Integer pageIndex, Integer pageSize); + + ResultData saveorupdateByCode(WxMemberCard record); + + ResultData delUserCardStatusByCode(WxMemberCard record); + + /** + * 同步会员卡卡信息 + */ + ResultData syncMemberCard(TenantEntity tenantEntity,String card_id,String code); + + /** + * 同步会员卡等级 + * need_inform_level 是否发送等级变更通知 + */ + ResultData syncMemberCardLevel(TenantEntity tenantEntity,String card_id,String code, + String level,Boolean need_inform_level); + + /** + * 更新会员卡积分 + */ + ResultData syncMemberCardBonus(TenantEntity tenantEntity,String card_id,String code, + Integer bonus_value,Boolean need_inform_bonus); + + /** + * 同步授权快速积分 + */ + ResultData syncauthorizeState(TenantEntity tenantEntity,String openid); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java index 1999aaa9a..621967e86 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java @@ -1,5 +1,9 @@ package com.iformall.service.impl; +import com.github.binarywang.wxpay.bean.businesscircle.ParkingNotifyRequest; +import com.github.binarywang.wxpay.bean.businesscircle.PointsCommitStatusResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; @@ -11,6 +15,8 @@ import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.WxBusinessCircleOrderMapper; import com.iformall.service.*; +import com.iformall.utils.DateUtils; +import com.iformall.utils.MaUtil; import com.iformall.utils.RedisLock; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -60,6 +66,15 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe @Autowired WxCouponSendService wxCouponSendService; + @Autowired + WxAppinfoService wxAppinfoService; + + @Autowired + WxPayAccountService wxPayAccountService; + + @Autowired + MaUtil maUtil; + @Override public PageInfo listAsPage(WxBusinessCircleOrder record, Integer pageIndex, Integer pageSize) { @@ -390,5 +405,54 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe return sumCircleRefundAmount==null?0:sumCircleRefundAmount; } + @Override + public ResultData getPointsCommitStatus(TenantEntity tenantEntity, String openId) { + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantEntity.getTenantId(), EnumAppPlat.WX); + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(cAppInfo == null || payAccount == null){ + return new ResultData(ErrorCode.APP_ID_NOT_FOUND); + } + if(!EnumBusinessType.BUSINESS_3.getCode().equals(payAccount.getBusinessType())){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"未开通商圈或不支持此项操作"); + } + try { + WxPayService wxPayService = maUtil.getWxPayService(cAppInfo, payAccount); + PointsCommitStatusResult pointsCommitStatus = wxPayService.getBusinessCircleService().getPointsCommitStatus(payAccount.getBrandid(), openId); + return new ResultData(pointsCommitStatus); + } catch (WxPayException e) { + e.printStackTrace(); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage()); + } + } + + @Override + public ResultData syncParkings(TenantEntity tenantEntity, String openId, String plate_number, String state, Date time) { + + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantEntity.getTenantId(), EnumAppPlat.WX); + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(cAppInfo == null || payAccount == null){ + return new ResultData(ErrorCode.APP_ID_NOT_FOUND); + } + if(!EnumBusinessType.BUSINESS_3.getCode().equals(payAccount.getBusinessType())){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"未开通商圈或不支持此项操作"); + } + try { + WxPayService wxPayService = maUtil.getWxPayService(cAppInfo, payAccount); + ParkingNotifyRequest request = new ParkingNotifyRequest(); + request.setBrandid(payAccount.getBrandid()); + request.setOpenid(openId); + request.setPlateNumber(plate_number); + request.setState(state); + String formaStr = "yyyy-MM-dd'T'HH:mm:ss'+'mm:ss"; + request.setTime(DateUtils.date2String(time,formaStr)); + + wxPayService.getBusinessCircleService().notifyParkings(request); + return new ResultData(); + } catch (WxPayException e) { + e.printStackTrace(); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage()); + } + } + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMemberCardServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMemberCardServiceImpl.java new file mode 100644 index 000000000..29301a134 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMemberCardServiceImpl.java @@ -0,0 +1,218 @@ +package com.iformall.service.impl; + +import com.alibaba.fastjson.JSON; +import com.github.binarywang.wxpay.bean.businesscircle.MemberCardAuthorizeResult; +import com.github.binarywang.wxpay.bean.membercard.MemberCardResult; +import com.github.binarywang.wxpay.bean.membercard.MemberCardRightsRequest; +import com.github.binarywang.wxpay.bean.membercard.MemberCardUpdRequest; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.ResultData; +import com.iformall.domain.po.*; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.enums.*; +import com.iformall.mapper.WxMemberCardMapper; +import com.iformall.service.*; +import com.iformall.utils.DateUtils; +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.util.Date; + +@Service +public class WxMemberCardServiceImpl implements WxMemberCardService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxMemberCardMapper wxMemberCardMapper; + + @Autowired + WxAppinfoService wxAppinfoService; + + @Autowired + WxPayAccountService wxPayAccountService; + + @Autowired + MaUtil maUtil; + + @Override + public PageInfo listAsPage(WxMemberCard record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMemberCardMapper.findList(record)); + } + + @Override + public ResultData saveorupdateByCode(WxMemberCard record) { + Long id = wxMemberCardMapper.getIdByCode(record); + Date now = new Date(); + if(id == null){ + final IdWorker idWorker = IdWorker.get(); + id = idWorker.nextId(); + record.setId(id); + if(record.getCreateDate() == null){ + record.setCreateDate(now); + } + record.setUpdateDate(record.getCreateDate()); + wxMemberCardMapper.insert(record); + }else{ + record.setId(id); + if(record.getUpdateDate() == null){ + record.setUpdateDate(now); + } + wxMemberCardMapper.updateById(record); + } + return new ResultData(); + } + + @Override + public ResultData delUserCardStatusByCode(WxMemberCard record) { + record.setUserCardStatus(EnumMemberCardStatus.DELETE.getCode()); + if(record.getUpdateDate() == null){ + record.setUpdateDate(new Date()); + } + wxMemberCardMapper.deleteByCode(record); + return new ResultData(); + } + + @Override + public ResultData syncMemberCard(TenantEntity tenantEntity, String card_id, String code) { + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantEntity.getTenantId(), EnumAppPlat.WX); + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(cAppInfo == null || payAccount == null){ + return new ResultData(ErrorCode.APP_ID_NOT_FOUND); + } + if(!EnumBusinessType.BUSINESS_3.getCode().equals(payAccount.getBusinessType())){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"未开通商圈或不支持此项操作"); + } + try { + WxPayService wxPayService = maUtil.getWxPayService(cAppInfo, payAccount); + MemberCardResult memberCard = wxPayService.getMemberCardService().getMemberCard(card_id, code); + WxMemberCard record = new WxMemberCard(); + record.updateTenantInfo(tenantEntity); + record.setCardId(card_id); + record.setCardCode(code); + record.setOpenId(memberCard.getOpenid()); + record.setMembershipNumber(memberCard.getMembershipNumber()); + record.setLevel(memberCard.getLevel()); + record.setNickname(memberCard.getNickname()); + record.setHeadImageUrl(memberCard.getHeadImageUrl()); + record.setBackgroundPictureUrl(memberCard.getBackgroundPictureUrl()); + record.setBalance(memberCard.getBalance()); + EnumMemberCardStatus enumMemberCardStatus = EnumMemberCardStatus.getEnum(memberCard.getUserCardStatus()); + if(enumMemberCardStatus != null){ + record.setUserCardStatus(enumMemberCardStatus.getCode()); + } + if(memberCard.getUserInformation() != null){ + record.setUserInformation(JSON.toJSONString(memberCard.getUserInformation())); + } + record.setBonusValue(memberCard.getBonusValue()); + if(memberCard.getServiceModules() != null){ + record.setServiceModules(JSON.toJSONString(memberCard.getServiceModules())); + } + record.setMemberPriceWord(memberCard.getMemberPriceWord()); + record.setFapiaoJumpWord(memberCard.getFapiaoJumpWord()); + if(memberCard.getGuide() != null){ + record.setGuide(JSON.toJSONString(memberCard.getGuide())); + } + this.saveorupdateByCode(record); + return new ResultData(); + } catch (WxPayException e) { + e.printStackTrace(); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage()); + } + } + + @Override + public ResultData syncMemberCardLevel(TenantEntity tenantEntity, String card_id, String code, + String level, Boolean need_inform_level) { + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantEntity.getTenantId(), EnumAppPlat.WX); + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(cAppInfo == null || payAccount == null){ + return new ResultData(ErrorCode.APP_ID_NOT_FOUND); + } + if(!EnumBusinessType.BUSINESS_3.getCode().equals(payAccount.getBusinessType())){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"未开通商圈或不支持此项操作"); + } + try { + WxPayService wxPayService = maUtil.getWxPayService(cAppInfo, payAccount); + MemberCardUpdRequest request = new MemberCardUpdRequest(); + request.setLevel(level); + request.setOutRequestNo(getOutRequestNo()); + request.setNeedInformLevel(need_inform_level); + + wxPayService.getMemberCardService().updMemberCard(card_id,code,request); + return new ResultData(); + } catch (WxPayException e) { + e.printStackTrace(); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage()); + } + } + + @Override + public ResultData syncMemberCardBonus(TenantEntity tenantEntity, String card_id, String code, + Integer bonus_value, Boolean need_inform_bonus) { + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantEntity.getTenantId(), EnumAppPlat.WX); + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(cAppInfo == null || payAccount == null){ + return new ResultData(ErrorCode.APP_ID_NOT_FOUND); + } + if(!EnumBusinessType.BUSINESS_3.getCode().equals(payAccount.getBusinessType())){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"未开通商圈或不支持此项操作"); + } + try { + WxPayService wxPayService = maUtil.getWxPayService(cAppInfo, payAccount); + MemberCardRightsRequest request = new MemberCardRightsRequest(); + request.setBonusValue(bonus_value); + request.setOutRequestNo(getOutRequestNo()); + request.setNeedInformBonus(need_inform_bonus); + wxPayService.getMemberCardService().setMemberCardRights(card_id,code,request); + return new ResultData(); + } catch (WxPayException e) { + e.printStackTrace(); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage()); + } + } + + private String getOutRequestNo(){ + final IdWorker idWorker = IdWorker.get(); + String dateStr = DateUtils.date2String(new Date(), "yyyyMMddHHmmss"); + String id = Long.toString(idWorker.nextId()); + return dateStr+"_"+id; + } + + @Override + public ResultData syncauthorizeState(TenantEntity tenantEntity, String openid) { + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantEntity.getTenantId(), EnumAppPlat.WX); + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(cAppInfo == null || payAccount == null){ + return new ResultData(ErrorCode.APP_ID_NOT_FOUND); + } + if(!EnumBusinessType.BUSINESS_3.getCode().equals(payAccount.getBusinessType())){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"未开通商圈或不支持此项操作"); + } + try { + WxPayService wxPayService = maUtil.getWxPayService(cAppInfo, payAccount); + MemberCardAuthorizeResult authorizations = wxPayService.getBusinessCircleService().getAuthorizations(openid); + WxMemberCard record = new WxMemberCard(); + record.updateTenantInfo(tenantEntity); + record.setOpenId(authorizations.getOpenid()); + record.setAuthorizeState(EnumMemberCardAuthorizeState.getEnum(authorizations.getAuthorizeState()).getCode()); + String formaStr = "yyyy-MM-dd'T'HH:mm:ss'+'mm:ss"; + record.setAuthorizeTime(DateUtils.stringToDate(authorizations.getAuthorizeTime(),formaStr)); + record.setDeauthorizeTime(DateUtils.stringToDate(authorizations.getDeauthorizeTime(),formaStr)); + wxMemberCardMapper.updateByOpenId(record); + return new ResultData(record); + } catch (WxPayException e) { + e.printStackTrace(); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage()); + } + } + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountServiceImpl.java index 967b2d7e9..d2190622d 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountServiceImpl.java @@ -101,10 +101,10 @@ public class WxPayAccountServiceImpl implements WxPayAccountService { @Override public WxPayService getWxPayService(String tenantId) { - TenantEntity tenantEntity = new TenantEntity(); - tenantEntity.setTenantId(tenantId); - WxAppinfo cAppInfo = wxAppinfoService.getCAppInfo(tenantEntity, EnumAppPlat.WX); - WxPayAccount payAccount = this.getById(cAppInfo.getPayId()); +// TenantEntity tenantEntity = new TenantEntity(); +// tenantEntity.setTenantId(tenantId); + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(tenantId, EnumAppPlat.WX); + WxPayAccount payAccount = this.getByIdFromRedis(cAppInfo.getPayId()); if(cAppInfo != null && payAccount != null){ return maUtil.getWxPayService(cAppInfo,payAccount); }else{ diff --git a/mallinkService/src/main/resources/mapper/WxMemberCardMapper.xml b/mallinkService/src/main/resources/mapper/WxMemberCardMapper.xml new file mode 100644 index 000000000..2cc294d0b --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxMemberCardMapper.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`parent_tenant_id`,`card_id`,`card_code`,`activate_scene`,`outer_str`,`open_id`,`union_id`, + `membership_number`,`level`,`nickname`,`head_image_url`,`background_picture_url`,`balance`, + `user_card_status`,`user_information`,`bonus_value`,`service_modules`,`member_price_word`,`fapiao_jump_word`, + `guide`,`update_date`,`create_date`,`app_id`,`authorize_state`,`authorize_time`, `deauthorize_time` + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + and `card_id` = #{cardId} + + + + and `card_code` = #{cardCode} + + + + and `activate_scene` = #{activateScene} + + + + and `outer_str` = #{outerStr} + + + + and `open_id` = #{openId} + + + + and `union_id` = #{unionId} + + + + and `membership_number` = #{membershipnNumber} + + + + and `user_card_status` = #{userCardStatus} + + + + and `app_id` = #{appId} + + + + and `authorize_state` = #{authorizeState} + + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + update wx_member_card set `user_card_status` = #{userCardStatus},`update_date` = #{updateDate} + WHERE `tenant_id` = #{tenantId} + and `card_id` = #{cardId} + and `card_code` = #{cardCode} + and `open_id` = #{openId} + + + + update wx_member_card set `authorize_state` = #{authorizeState},`authorize_time` = #{authorizeTime},`deauthorize_time` = #{deauthorizeTime} + WHERE `tenant_id` = #{tenantId} + and `open_id` = #{openId} + + + diff --git a/mallinkService/src/main/resources/mapper/WxPayAccountMapper.xml b/mallinkService/src/main/resources/mapper/WxPayAccountMapper.xml index 58565cc8d..01dea7fdf 100644 --- a/mallinkService/src/main/resources/mapper/WxPayAccountMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxPayAccountMapper.xml @@ -34,13 +34,17 @@ + + + + `id`,`tenant_id`,`parent_tenant_id`,`mch_id`,`sub_mch_id`,`sub_app_id`,`api_key`,`merchant_api_key`,`notify_url`,`notify_token`,`cert_path`, `merchant_cert_path`,`type`,`mch_type`,`open_pay`,`share`,`rate`,`real_rate`,`is_commission`,`system_rate`,`sell_rate`, `service_id`,`pay_score_notify_url`,`api_v3_key`,`cert_serial_no`,`private_key_path`,`private_cert_pem_path`, - `merchant_key_path`,`merchant_apiv3_key`,`merchant_cert_pem_path` + `merchant_key_path`,`merchant_apiv3_key`,`merchant_cert_pem_path`,`business_type`,`brandid`,`card_id`