✨ Introducing new features. close #3532 up wxjava 4.20

#3502 【公众号】使用平台自定义微信昵称 解决公众号平台不在返回关注用户的昵称、头像信息
This commit is contained in:
lbw committed 2022-01-05 13:12:21 +08:00
1 parent f1161213b3
commit 62a099dcfd
10 files changed
+195 -48

No files matched your search

+1 -1
View File
@@ -24,7 +24,7 @@
<mysql.connector.version>8.0.27</mysql.connector.version>
<oracle.version>21.3.0.0</oracle.version>
<swagger.core.version>1.5.22</swagger.core.version>
<mp.weixin.version>3.9.0</mp.weixin.version>
<mp.weixin.version>4.2.0</mp.weixin.version>
<ijpay.version>2.7.6</ijpay.version>
<groovy.version>3.0.3</groovy.version>
<jsoup.version>1.13.1</jsoup.version>
+15
View File
@@ -13,6 +13,9 @@
<packaging>jar</packaging>
<description>微信公众号管理模块</description>
<properties>
<mock.version>1.1.2</mock.version>
</properties>
<dependencies>
<!--注册中心客户端-->
@@ -35,10 +38,16 @@
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- mysql8 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- ojdbc8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<!-- druid 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
@@ -82,6 +91,12 @@
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
</dependency>
<!--随机昵称生成-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>java-testdata-generator</artifactId>
<version>${mock.version}</version>
</dependency>
<!--web 模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
@@ -5,10 +5,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.mp.entity.WxAccountTag;
import com.pig4cloud.pigx.mp.entity.WxAutoReply;
import com.pig4cloud.pigx.mp.service.WxAccountTagService;
import lombok.AllArgsConstructor;
import org.apache.ibatis.annotations.Delete;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@@ -54,6 +53,7 @@ public class WxAccountTagController {
* @return 包含保存成功后的账户标签的API调用结果
*/
@PostMapping
@PreAuthorize("@pms.hasPermission('mp_wx_account_tag_add')")
public R<WxAccountTag> saveAccountTag(@RequestBody @Valid WxAccountTag wxAccountTag) {
return R.ok(wxAccountTagService.saveAccountTag(wxAccountTag));
}
@@ -64,13 +64,31 @@ public class WxAccountTagController {
* @return 包含修改成功后的账户标签的API调用结果
*/
@PutMapping
@PreAuthorize("@pms.hasPermission('mp_wx_account_tag_edit')")
public R<WxAccountTag> updateAccountTag(@RequestBody @Valid WxAccountTag wxAccountTag) {
return R.ok(wxAccountTagService.updateAccountTag(wxAccountTag));
}
@DeleteMapping("/{id:\\d+}")
public R<Boolean> removeAccountTagById(@PathVariable Long id) {
return R.ok(wxAccountTagService.removeAccountTagById(id));
/**
* 删除
* @param wxAccountTag 标签
* @return R
*/
@DeleteMapping
@PreAuthorize("@pms.hasPermission('mp_wx_account_tag_del')")
public R<Boolean> removeAccountTagById(@RequestBody WxAccountTag wxAccountTag) {
return R.ok(wxAccountTagService.removeAccountTagById(wxAccountTag));
}
/**
* 同步粉丝
* @param appId
* @return
*/
@PostMapping("/sync/{appId}")
@PreAuthorize("@pms.hasPermission('mp_wx_account_tag_sync')")
public R sync(@PathVariable String appId) {
return R.ok(wxAccountTagService.syncAccountTags(appId));
}
}
@@ -16,9 +16,7 @@
*/
package com.pig4cloud.pigx.mp.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.pig4cloud.pigx.common.core.sensitive.Sensitive;
import com.pig4cloud.pigx.common.core.sensitive.SensitiveTypeEnum;
@@ -89,17 +87,20 @@ public class WxAccount extends Model<WxAccount> {
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 是否删除 -1:已删除 0:正常
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
private String delFlag;
/**
@@ -1,13 +1,12 @@
package com.pig4cloud.pigx.mp.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.pig4cloud.pigx.common.data.mybatis.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
/**
* 微信公众号账号标签
@@ -17,7 +16,7 @@ import javax.validation.constraints.NotBlank;
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class WxAccountTag extends BaseEntity {
public class WxAccountTag extends Model<WxAccount> {
private static final long serialVersionUID = 1L;
@@ -33,4 +32,55 @@ public class WxAccountTag extends BaseEntity {
@NotBlank(message = "标签不能为空")
private String tag;
/**
* 标签ID , 微信公众平台返回
*/
private Long tagId;
/**
* 微信公众号ID
*/
private Long wxAccountId;
/**
* 微信公众号appid
*/
private String wxAccountAppid;
/**
* 微信公众号名
*/
private String wxAccountName;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 是否删除 1:已删除 0:正常
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
private String delFlag;
}
@@ -1,5 +1,6 @@
package com.pig4cloud.pigx.mp.handler;
import cn.binarywang.tools.generator.ChineseNameGenerator;
import cn.hutool.core.util.BooleanUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pig4cloud.pigx.mp.builder.TextBuilder;
@@ -67,12 +68,11 @@ public class SubscribeHandler extends AbstractHandler {
wxAccountFans.setSubscribeStatus(String.valueOf(BooleanUtil.toInt(wxMpUser.getSubscribe())));
wxAccountFans.setSubscribeTime(LocalDateTime
.ofInstant(Instant.ofEpochMilli(wxMpUser.getSubscribeTime() * 1000L), ZoneId.systemDefault()));
wxAccountFans.setNickname(wxMpUser.getNickname());
wxAccountFans.setGender(String.valueOf(wxMpUser.getSex()));
// 随机生成一个昵称,方便平台内部使用
String generatedName = ChineseNameGenerator.getInstance().generate();
wxAccountFans.setNickname(generatedName);
wxAccountFans.setLanguage(wxMpUser.getLanguage());
wxAccountFans.setCountry(wxMpUser.getCountry());
wxAccountFans.setProvince(wxMpUser.getProvince());
wxAccountFans.setCity(wxMpUser.getCity());
wxAccountFans.setHeadimgUrl(wxMpUser.getHeadImgUrl());
wxAccountFans.setRemark(wxMpUser.getRemark());
@@ -1,7 +1,5 @@
package com.pig4cloud.pigx.mp.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pig4cloud.pigx.mp.entity.WxAccountTag;
@@ -29,9 +27,16 @@ public interface WxAccountTagService extends IService<WxAccountTag> {
/**
* 删除账户标签
* @param id 待删除的账户标签主键
* @param wxAccountTag 待删除的账户标签
* @return 删除成功返回true,删除失败返回false
*/
Boolean removeAccountTagById(Long id);
Boolean removeAccountTagById(WxAccountTag wxAccountTag);
/**
* 同步账户标签
* @param appId appId
* @return Boolean
*/
Boolean syncAccountTags(String appId);
}
@@ -16,6 +16,7 @@
*/
package com.pig4cloud.pigx.mp.service.impl;
import cn.binarywang.tools.generator.ChineseNameGenerator;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -137,12 +138,11 @@ public class WxAccountFansServiceImpl extends ServiceImpl<WxAccountFansMapper, W
wxAccountFans.setSubscribeTime(LocalDateTime
.ofInstant(Instant.ofEpochMilli(wxMpUser.getSubscribeTime() * 1000L), ZoneId.systemDefault()));
}
wxAccountFans.setNickname(wxMpUser.getNickname());
wxAccountFans.setGender(String.valueOf(wxMpUser.getSex()));
// 随机生成一个昵称,方便平台内部使用
String generatedName = ChineseNameGenerator.getInstance().generate();
wxAccountFans.setNickname(generatedName);
wxAccountFans.setLanguage(wxMpUser.getLanguage());
wxAccountFans.setCountry(wxMpUser.getCountry());
wxAccountFans.setProvince(wxMpUser.getProvince());
wxAccountFans.setCity(wxMpUser.getCity());
wxAccountFans.setHeadimgUrl(wxMpUser.getHeadImgUrl());
wxAccountFans.setRemark(wxMpUser.getRemark());
wxAccountFans.setWxAccountId(wxAccount.getId());
@@ -3,12 +3,22 @@ package com.pig4cloud.pigx.mp.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pig4cloud.pigx.mp.config.WxMpInitConfigRunner;
import com.pig4cloud.pigx.mp.entity.WxAccount;
import com.pig4cloud.pigx.mp.entity.WxAccountTag;
import com.pig4cloud.pigx.mp.mapper.WxAccountMapper;
import com.pig4cloud.pigx.mp.mapper.WxAccountTagMapper;
import com.pig4cloud.pigx.mp.service.WxAccountTagService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.tag.WxUserTag;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
/**
* 微信账户标签服务实现类
*
@@ -16,19 +26,37 @@ import org.springframework.util.Assert;
* @date 2021/12/31
*/
@Service
@RequiredArgsConstructor
public class WxAccountTagServiceImpl extends ServiceImpl<WxAccountTagMapper, WxAccountTag>
implements WxAccountTagService {
private final WxAccountMapper accountMapper;
/**
* 保存账户标签
* @param accountTag 账户标签
* @return 保存成功true保存失败false
*/
@Override
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public WxAccountTag saveAccountTag(WxAccountTag accountTag) {
WxAccountTag wxAccountTag = baseMapper
.selectOne(Wrappers.<WxAccountTag>lambdaQuery().eq(WxAccountTag::getTag, accountTag.getTag()));
Assert.isNull(wxAccountTag, StrUtil.format("名称为[{}]的标签已经存在", accountTag.getTag()));
// 调用微信公众号接口删除
WxMpService wxMpService = WxMpInitConfigRunner.getMpServices().get(accountTag.getWxAccountAppid());
WxUserTag wxUserTag = wxMpService.getUserTagService().tagCreate(accountTag.getTag());
accountTag.setTagId(wxUserTag.getId());
// 查询公众号详细信息
WxAccount wxAccount = accountMapper
.selectOne(Wrappers.<WxAccount>lambdaQuery().eq(WxAccount::getAppid, accountTag.getWxAccountAppid()));
accountTag.setWxAccountId(wxAccount.getId());
accountTag.setWxAccountAppid(wxAccount.getAppid());
accountTag.setWxAccountName(wxAccount.getName());
baseMapper.insert(accountTag);
return accountTag;
}
@@ -39,19 +67,57 @@ public class WxAccountTagServiceImpl extends ServiceImpl<WxAccountTagMapper, WxA
* @return
*/
@Override
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public WxAccountTag updateAccountTag(WxAccountTag accountTag) {
WxAccountTag wxAccountTag = baseMapper.selectOne(Wrappers.<WxAccountTag>lambdaQuery()
.eq(WxAccountTag::getTag, accountTag.getTag()).ne(WxAccountTag::getId, accountTag.getId()));
Assert.isNull(wxAccountTag, StrUtil.format("名称为[{}]的标签已经存在", accountTag.getTag()));
baseMapper.updateById(accountTag);
// 调用微信公众号接口更新
WxMpService wxMpService = WxMpInitConfigRunner.getMpServices().get(accountTag.getWxAccountAppid());
wxMpService.getUserTagService().tagUpdate(accountTag.getTagId(), accountTag.getTag());
return accountTag;
}
@Override
public Boolean removeAccountTagById(Long id) {
WxAccountTag wxAccountTag = baseMapper.selectById(id);
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public Boolean removeAccountTagById(WxAccountTag tag) {
WxAccountTag wxAccountTag = baseMapper.selectById(tag.getId());
Assert.notNull(wxAccountTag, "要删除的标签不存在");
// 调用微信公众号接口删除
WxMpService wxMpService = WxMpInitConfigRunner.getMpServices().get(tag.getWxAccountAppid());
wxMpService.getUserTagService().tagDelete(wxAccountTag.getTagId());
return removeById(wxAccountTag.getId());
}
/**
* 同步账户标签
* @param appId appId
* @return Boolean
*/
@Override
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public Boolean syncAccountTags(String appId) {
WxMpService wxMpService = WxMpInitConfigRunner.getMpServices().get(appId);
List<WxUserTag> wxUserTags = wxMpService.getUserTagService().tagGet();
// 删除旧数据
baseMapper.delete(Wrappers.lambdaQuery());
WxAccount wxAccount = accountMapper.selectOne(Wrappers.<WxAccount>lambdaQuery().eq(WxAccount::getAppid, appId));
for (WxUserTag wxUserTag : wxUserTags) {
WxAccountTag tag = new WxAccountTag();
tag.setTag(wxUserTag.getName());
tag.setTagId(wxUserTag.getId());
tag.setWxAccountId(wxAccount.getId());
tag.setWxAccountAppid(wxAccount.getAppid());
tag.setWxAccountName(wxAccount.getName());
baseMapper.insert(tag);
}
return Boolean.TRUE;
}
}
@@ -17,11 +17,6 @@
package com.pig4cloud.pigx.pay.controller;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.ContentType;
import cn.hutool.json.JSONObject;
@@ -43,24 +38,21 @@ import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.http.HttpHeaders;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* 商品
*
@@ -157,8 +149,8 @@ public class PayGoodsOrderController {
storage.setSecret(params.getStr("secret"));
wxMpService.setWxMpConfigStorage(storage);
WxMpOAuth2AccessToken mpOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(code);
goods.setUserId(mpOAuth2AccessToken.getOpenId());
WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(code);
goods.setUserId(accessToken.getOpenId());
goods.setAmount(goods.getAmount());
modelAndView.setViewName("pay");
modelAndView.addAllObjects(payGoodsOrderService.buy(goods, false));