diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/IAppletUserService.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/IAppletUserService.java index 2e2a31f..53e00c7 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/IAppletUserService.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/IAppletUserService.java @@ -20,6 +20,14 @@ public interface IAppletUserService extends IService { */ AppletUser getByOpenid(String openid); + /** + * 根据openid查询用户 + * + * @param unionId 微信openid + * @return 用户信息 + */ + AppletUser getByUnionId(String openid, String unionId); + /** * 根据手机号查询用户 * diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/AppletUserUtil.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/AppletUserUtil.java index 69d5064..4b5f403 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/AppletUserUtil.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/AppletUserUtil.java @@ -83,7 +83,7 @@ public class AppletUserUtil { String openid = JwtUtil.getUsername(token); if (openid != null) { IAppletUserService appletUserService = SpringContextUtils.getBean(IAppletUserService.class); - return appletUserService.getByOpenid(openid); + return appletUserService.getByUnionId(openid, null); } } } catch (Exception e) { diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/AppletUser.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/AppletUser.java index f8e0527..7c32ec9 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/AppletUser.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/AppletUser.java @@ -75,9 +75,14 @@ public class AppletUser implements Serializable { /** * 第三方认证id */ - @Excel(name = "第三方认证id", width = 15) - @Schema(description = "第三方认证id") + @Excel(name = "小程序id", width = 15) + @Schema(description = "小程序id") private java.lang.String openid; + + private String officialId;//公众号id + + private String unionId;//同平id + /** * 手机号 */ diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletShiroRealm.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletShiroRealm.java index 6c39462..a234642 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletShiroRealm.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletShiroRealm.java @@ -153,7 +153,7 @@ public class AppletShiroRealm extends AuthorizingRealm { log.debug("开始获取小程序用户信息,openid: {}", openid); // 从数据库查询用户信息 - AppletUser appletUser = appletUserService.getByOpenid(openid); + AppletUser appletUser = appletUserService.getByUnionId(openid, null); if (appletUser != null) { log.debug("从数据库获取到小程序用户: {}", appletUser.getName()); return appletUser; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java index d4e44ff..4df2291 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java @@ -213,7 +213,7 @@ public class ShiroRealm extends AuthorizingRealm { throw new AuthenticationException("小程序token非法无效!"); } // 从数据库查询用户信息 - AppletUser appletUser = appletUserService.getByOpenid(openid); + AppletUser appletUser = appletUserService.getByUnionId(openid, null); if (appletUser != null) { log.debug("从数据库获取到小程序用户: {}", appletUser.getName()); diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/Final/LoginType.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/Final/LoginType.java new file mode 100644 index 0000000..f21f027 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/Final/LoginType.java @@ -0,0 +1,8 @@ +package org.jeecg.modules.applet.Final; + +public class LoginType { + + public static final String OFFICIAL = "official"; + public static final String APPLET = "applet"; + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiLoginController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiLoginController.java index 0f426fd..087892e 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiLoginController.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiLoginController.java @@ -8,6 +8,7 @@ import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.AppletUser; import org.jeecg.config.shiro.IgnoreAuth; +import org.jeecg.modules.applet.Final.LoginType; import org.jeecg.modules.applet.service.impl.AppletApiLoginService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -40,16 +41,38 @@ public class AppletApiLoginController { @IgnoreAuth public Result> wxLogin( @Parameter(description = "微信登录code", required = true) @RequestParam String code, - @Parameter(description = "邀请人") @RequestParam(required = false) String inviter) { + @Parameter(description = "邀请人") @RequestParam(required = false) String inviter, + @Parameter(description = "登录平台,默认小程序") @RequestParam(required = false, defaultValue = LoginType.APPLET) String type + ) { if (StringUtils.isBlank(code)) { return Result.error("微信登录code不能为空"); } log.info("收到小程序登录请求,code: {}", code); - return appletApiLoginService.login(code, inviter); + return appletApiLoginService.login(code, inviter, type); } + /** + * 获取公众号签名 + * + * @param url URL + * @return 结果 + */ + @PostMapping("/getSignPackage") + @Operation(summary = "获取公众号签名", description = "获取公众号签名") + @IgnoreAuth + public Result> getSignPackage(String url) { + + if (StringUtils.isBlank(url)) { + return Result.error("url网址不能为空"); + } + + log.info("收到小程序登录请求,code: {}", url); + return appletApiLoginService.getSignPackage(url); + } + + /** * 获取用户手机号 * diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiMemberController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiMemberController.java index b112e69..5ac84f8 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiMemberController.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiMemberController.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.config.shiro.IgnoreAuth; +import org.jeecg.modules.applet.Final.LoginType; import org.jeecg.modules.applet.service.AppletApiCouponService; import org.jeecg.modules.applet.service.AppletApiVipService; import org.jeecg.modules.demo.appletCoupon.entity.AppletCoupon; @@ -42,8 +43,8 @@ public class AppletApiMemberController { @Operation(summary = "开通会员", description = "参数会员id 套餐id 优惠卷id") @PostMapping(value = "/open") - public Result open(AppletMemberOrder appletMemberOrder) { - Object open = appletApiVipService.getOpe(appletMemberOrder); + public Result open(AppletMemberOrder appletMemberOrder, @RequestParam(required = false,defaultValue = LoginType.APPLET) String type) { + Object open = appletApiVipService.getOpe(appletMemberOrder, type); return Result.OK(open); } diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiPromotionController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiPromotionController.java index 0fe2df7..7798e39 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiPromotionController.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiPromotionController.java @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.AppletUser; import org.jeecg.config.shiro.IgnoreAuth; +import org.jeecg.modules.applet.Final.LoginType; import org.jeecg.modules.applet.entity.StatisticsVo; import org.jeecg.modules.applet.service.AppletApiWaterService; import org.jeecg.modules.demo.appletWater.entity.AppletWater; @@ -57,8 +58,8 @@ public class AppletApiPromotionController { @Operation(summary = "提现", description = "参数:提现人 提现金额") @PostMapping(value = "/withdraw") - public Result withdraw(AppletWithdrawal appletWithdrawal) { - AppletWithdrawal With = appletApiWaterService.getWithdraw(appletWithdrawal); + public Result withdraw(AppletWithdrawal appletWithdrawal, @RequestParam(required = false, defaultValue = LoginType.APPLET) String type) { + AppletWithdrawal With = appletApiWaterService.getWithdraw(appletWithdrawal, type); return Result.OK(With); } diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiVipService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiVipService.java index 6a276d1..a512009 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiVipService.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiVipService.java @@ -21,7 +21,7 @@ public interface AppletApiVipService { * @return */ - Object getOpe(AppletMemberOrder appletMemberOrder); + Object getOpe(AppletMemberOrder appletMemberOrder, String type); diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiWaterService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiWaterService.java index e373b5b..820be32 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiWaterService.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiWaterService.java @@ -35,7 +35,7 @@ public interface AppletApiWaterService { * @return */ - AppletWithdrawal getWithdraw(AppletWithdrawal appletWithdrawal); + AppletWithdrawal getWithdraw(AppletWithdrawal appletWithdrawal, String type); void withdrawSuccess(String id); diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java index c4cd8b2..e0b5495 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java @@ -11,6 +11,7 @@ import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.AppletUser; import org.jeecg.common.api.IAppletUserService; import org.jeecg.common.util.RedisUtil; +import org.jeecg.modules.applet.Final.LoginType; import org.jeecg.modules.common.wxUtils.WxHttpClientUtil; import org.jeecg.modules.common.wxUtils.WxHttpUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -41,6 +42,36 @@ public class AppletApiLoginService { @Autowired private RedisUtil redisUtil; + private JSONObject openLogin(String code, String type){ + log.info("开始小程序登录,code: {}", code); + // 调用微信API获取openid和session_key + String loginUrl = "https://api.weixin.qq.com/sns/jscode2session"; + Map params = new HashMap<>(); + + if (LoginType.OFFICIAL.equals(type)){ + loginUrl = "https://api.weixin.qq.com/sns/oauth2/access_token"; + params.put("appid", wxHttpUtils.getOfficialAppid()); + params.put("secret", wxHttpUtils.getOfficialSecret()); + params.put("code", code); + params.put("grant_type", "authorization_code"); + }else { + params.put("appid", wxHttpUtils.getAppid()); + params.put("secret", wxHttpUtils.getSecret()); + params.put("js_code", code); + params.put("grant_type", "authorization_code"); + } + + String response = WxHttpClientUtil.doGet(loginUrl, params); + + JSONObject jsonResponse = JSON.parseObject(response); + + // 检查微信API返回结果 + if (jsonResponse.containsKey("errcode") && jsonResponse.getInteger("errcode") != 0) { + log.error("微信登录失败: {}", response); + throw new JeecgBootException("微信登录失败: " + jsonResponse.getString("errmsg")); + } + return jsonResponse; + } /** * 小程序登录 @@ -48,27 +79,11 @@ public class AppletApiLoginService { * @param code 微信登录code * @return 登录结果 */ - public Result> login(String code,String inviter) { + public Result> login(String code, String inviter, String type) { try { - log.info("开始小程序登录,code: {}", code); - // 调用微信API获取openid和session_key - String loginUrl = "https://api.weixin.qq.com/sns/jscode2session"; - Map params = new HashMap<>(); - params.put("appid", wxHttpUtils.getAppid()); - params.put("secret", wxHttpUtils.getSecret()); - params.put("js_code", code); - params.put("grant_type", "authorization_code"); - - String response = WxHttpClientUtil.doGet(loginUrl, params); - JSONObject jsonResponse = JSON.parseObject(response); - - // 检查微信API返回结果 - if (jsonResponse.containsKey("errcode") && jsonResponse.getInteger("errcode") != 0) { - log.error("微信登录失败: {}", response); - return Result.error("微信登录失败: " + jsonResponse.getString("errmsg")); - } - + JSONObject jsonResponse = openLogin(code, type); + String openid = jsonResponse.getString("openid"); String sessionKey = jsonResponse.getString("session_key"); String unionid = jsonResponse.getString("unionid"); @@ -78,8 +93,11 @@ public class AppletApiLoginService { // 查找或创建用户 AppletUser appletUser = findOrCreateUser(openid, unionid, inviter); + if (LoginType.OFFICIAL.equals(type)){ + String access_token = jsonResponse.getString("access_token"); + setUserInfo(appletUser, access_token); + } - // 生成JWT token String token = JwtUtil.sign(appletUser.getOpenid(), appletUser.getId()); @@ -87,7 +105,6 @@ public class AppletApiLoginService { // 设置超时时间 redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000); - // 构建返回结果 Map result = new HashMap<>(); result.put("token", token); @@ -104,6 +121,20 @@ public class AppletApiLoginService { } } + private void setUserInfo(AppletUser user, String access_token) { + //开始获取用户信息 + String memberUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+user.getOfficialId()+"&lang=zh_CN"; + + String json = WxHttpClientUtil.doGet(memberUrl); + + //使用工具类 + JSONObject json_member = JSONObject.parseObject(json); + String nickname = json_member.getString("nickname"); + String headimgurl = json_member.getString("headimgurl"); + user.setName(nickname); + user.setAvatar(headimgurl); + } + /** * 获取用户手机号 * @@ -181,7 +212,7 @@ public class AppletApiLoginService { private AppletUser findOrCreateUser(String openid, String unionid, String inviter) { try { // 根据openid查找用户 - AppletUser user = appletUserService.getByOpenid(openid); + AppletUser user = appletUserService.getByUnionId(openid, unionid); if (user == null) { // 创建新用户 @@ -193,8 +224,7 @@ public class AppletApiLoginService { user.setInviter(inviter); user.setIsPromote("N"); - // TODO: 如果需要unionid字段,需要在AppletUser实体类中添加该字段 - // user.setUnionid(unionid); + user.setUnionId(unionid); // 保存到数据库 appletUserService.save(user); @@ -268,4 +298,19 @@ public class AppletApiLoginService { return Result.error("获取失败: " + e.getMessage()); } } -} \ No newline at end of file + + /** + * 获取公众号签名 + * + * @param url URL + * @return 结果 + */ + public Result> getSignPackage(String url) { + try { + return Result.ok(wxHttpUtils.getSignPackage(url)); + } catch (Exception e) { + log.error("获取公众号签名异常", e); + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiVipServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiVipServiceImpl.java index 1345bcb..a4bc954 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiVipServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiVipServiceImpl.java @@ -7,6 +7,7 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.util.AppletUserUtil; import org.jeecg.common.system.vo.AppletUser; +import org.jeecg.modules.applet.Final.LoginType; import org.jeecg.modules.applet.service.AppletApiVipService; import org.jeecg.modules.common.IdUtils; import org.jeecg.modules.demo.appletCoupon.entity.AppletCoupon; @@ -87,7 +88,7 @@ public class AppletApiVipServiceImpl implements AppletApiVipService { * @param order */ @Override - public Object getOpe(AppletMemberOrder order) { + public Object getOpe(AppletMemberOrder order, String type) { if (StringUtil.isEmpty(order.getMemberId())) { throw new JeecgBootException("会员id不能为空"); @@ -107,7 +108,12 @@ public class AppletApiVipServiceImpl implements AppletApiVipService { //获取用户id String userId = AppletUserUtil.getCurrentAppletUserId(); - String openid = AppletUserUtil.getCurrentAppletUserOpenid(); + AppletUser user = AppletUserUtil.getCurrentAppletUser(); + + String openid = user.getOpenid(); + if (LoginType.OFFICIAL.equals(type)){ + openid = user.getOfficialId(); + } order.setUserId(userId); order.setStatus("0"); diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiWaterServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiWaterServiceImpl.java index 6598909..80d4b75 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiWaterServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiWaterServiceImpl.java @@ -293,7 +293,7 @@ public class AppletApiWaterServiceImpl implements AppletApiWaterService { } @Override - public AppletWithdrawal getWithdraw(AppletWithdrawal appletWithdrawal) { + public AppletWithdrawal getWithdraw(AppletWithdrawal appletWithdrawal, String type) { if (appletWithdrawal.getMoney() == null) { throw new JeecgBootException("提现金额不能为空"); } @@ -331,6 +331,7 @@ public class AppletApiWaterServiceImpl implements AppletApiWaterService { appletWithdrawal.setWaterId(water.getId()); appletWithdrawal.setWithdrawStatus("0"); appletWithdrawal.setStatus("0"); + appletWithdrawal.setUserType(type); appletWithdrawal.setUserId(userId); // 根据提现金额设置提现方式:大于200元为线下(1),否则为微信(0) diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/WxAppletService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/WxAppletService.java index 12e0783..3c6a75e 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/WxAppletService.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/WxAppletService.java @@ -7,6 +7,7 @@ import org.jeecg.common.api.IAppletUserService; import org.jeecg.common.api.vo.Result; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.vo.AppletUser; +import org.jeecg.modules.applet.Final.LoginType; import org.jeecg.modules.common.wxUtils.WxHttpUtils; import org.jeecg.modules.common.wxUtils.transfer.TransferToUser; import org.jeecg.modules.common.wxUtils.transfer.WXPayUtility; @@ -233,7 +234,7 @@ public class WxAppletService { request.appid = appid; request.outBillNo = withdrawal.getId(); request.transferSceneId = "1005";// - request.openid = user.getOpenid(); + request.openid = LoginType.OFFICIAL.equals(withdrawal.getUserType()) ? user.getOfficialId() : user.getOpenid(); request.userName = client.encrypt(withdrawal.getName()); request.transferAmount = withdrawal.getMoney().multiply(new BigDecimal(100)).longValue();//单位为分 request.transferRemark = "佣金报酬"; diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/appletBackground/appletUser/service/impl/AppletUserServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/appletBackground/appletUser/service/impl/AppletUserServiceImpl.java index b5a9a19..ff36dc4 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/appletBackground/appletUser/service/impl/AppletUserServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/appletBackground/appletUser/service/impl/AppletUserServiceImpl.java @@ -1,5 +1,6 @@ package org.jeecg.modules.appletBackground.appletUser.service.impl; +import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.IAppletUserService; import org.jeecg.common.system.vo.AppletUser; import org.jeecg.modules.appletBackground.appletUser.mapper.AppletUserMapper; @@ -24,6 +25,23 @@ public class AppletUserServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); + + //todo 目前仅支持openid +// queryWrapper.eq(StringUtils.isNotEmpty(unionId), AppletUser::getUnionId, unionId); +//StringUtils.isEmpty(unionId), + queryWrapper.and(e -> { + e.eq(AppletUser::getOpenid, openid) + .or() + .eq(AppletUser::getOfficialId, openid); + }); +// queryWrapper.eq(StringUtils.isEmpty(unionId) && , ) + return this.getOne(queryWrapper); + } + @Override public AppletUser getByPhone(String phone) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/common/wxUtils/WxHttpUtils.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/common/wxUtils/WxHttpUtils.java index 6934bf8..0ffa58a 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/common/wxUtils/WxHttpUtils.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/common/wxUtils/WxHttpUtils.java @@ -3,17 +3,23 @@ package org.jeecg.modules.common.wxUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; +import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.Map; +import java.util.TreeMap; +@Getter @Component public class WxHttpUtils { @@ -23,31 +29,25 @@ public class WxHttpUtils { private String secret;// @Value("${wechat.merchantId}") private String mchId;// - private static String shipmentUrl = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token="; - private static final String GET_USER_PHONE_NUMBER = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; - /** - * 获取appid - */ - public String getAppid() { - return appid; - } - /** - * 获取secret - */ - public String getSecret() { - return secret; - } + @Value("${wechat.official.appid}") + private String officialAppid; + @Value("${wechat.official.appsecret}") + private String officialSecret;// + + private static String shipmentUrl = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token="; + private static final String GET_USER_PHONE_NUMBER = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; + private static String jsapiTicket = null; // 用于缓存jsapi_ticket /** * 获取令牌 * * @return */ - public String getAccessToken() { - String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret; + public String getAccessToken(String mAppId, String mSecret) { + String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + mAppId + "&secret=" + mSecret; try { // 使用增强版HTTP客户端,具有超时配置和重试机制 @@ -65,6 +65,9 @@ public class WxHttpUtils { } } + public String getAccessToken() { + return getAccessToken(appid, secret); + } public String getPhoneNumber(String code) throws Exception { URL url = new URL(GET_USER_PHONE_NUMBER + "?access_token=" + this.getAccessToken()); @@ -93,4 +96,84 @@ public class WxHttpUtils { return response.toString(); } } + + + // 获取jsapi_ticket + private String getJsApiTicket() throws Exception { + String accessToken = getAccessToken(officialAppid, officialSecret); + String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; + jsapiTicket = sendGet(url, "UTF-8"); + System.out.println("jsapiTicket=========="+jsapiTicket); + return jsapiTicket; + } + + // 发送GET请求并获取响应 + private String sendGet(String url, String encoding) throws Exception { + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setRequestMethod("GET"); + connection.connect(); + + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding)); + String inputLine; + StringBuilder content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + connection.disconnect(); + return content.toString(); + } + + /** + * 获取公众号签名 + * + * @param url URL + * @return 结果 + */ + public Map getSignPackage(String url) throws Exception { + String jsapiTicket = getJsApiTicket(); + + + JSONObject jsonObject = JSONObject.parseObject(jsapiTicket); // 解析JSON字符串 + jsapiTicket = jsonObject.getString("ticket"); // 提取access_token + + + String nonceStr = createNonceStr(); + long timestamp = System.currentTimeMillis() / 1000; + + String string1 = "jsapi_ticket=" + jsapiTicket + + "&noncestr=" + nonceStr + + "×tamp=" + timestamp + + "&url=" + url; // 确保URL是编码过的 + + String signature = sha1(string1); + + Map ret = new TreeMap<>(); + ret.put("appId", officialAppid); + ret.put("timestamp", timestamp); + ret.put("nonceStr", nonceStr); + ret.put("signature", signature); + ret.put("jsapi_ticket", jsapiTicket); + ret.put("url",url); + + return ret; + } + + // 生成随机字符串 + private String createNonceStr() { + return String.valueOf((long) (Math.random() * 100000000)); + } + + // SHA1加密 + private String sha1(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException { + MessageDigest md = MessageDigest.getInstance("SHA-1"); + byte[] messageDigest = md.digest(input.getBytes("UTF-8")); + StringBuilder hexString = new StringBuilder(); + for (byte b : messageDigest) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } } diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletWater/entity/AppletWater.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletWater/entity/AppletWater.java index 75c8f58..38815cb 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletWater/entity/AppletWater.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletWater/entity/AppletWater.java @@ -93,6 +93,9 @@ public class AppletWater implements Serializable { @Dict(dicCode = "applet_water_type") @Schema(description = "流水类型") private java.lang.String type; + + /**用户类型*/ + private java.lang.String userType; /**备注*/ @Excel(name = "备注", width = 15) @Schema(description = "备注") diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletWithdrawal/entity/AppletWithdrawal.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletWithdrawal/entity/AppletWithdrawal.java index 6530670..02114e9 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletWithdrawal/entity/AppletWithdrawal.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletWithdrawal/entity/AppletWithdrawal.java @@ -96,4 +96,7 @@ public class AppletWithdrawal implements Serializable { @Schema(description = "领取参数") private String packageInfo; + + /**用户类型*/ + private java.lang.String userType; } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index 3c5b9d5..1054ba7 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -330,6 +330,9 @@ justauth: ##配置微信##爱简收旧衣按件回收小程序 wechat: + official: # 公众号 + appid: wxd5dc792292466cf6 + appsecret: ffa6d51fe41c0e62114778267f829382 mpAppId: wx24736a3864e8f0e9 # 微信小程序appid mpAppSecret: 7a530b7bba042128e76bcfdbaedd7e71 # 微信小程序密钥 merchantId: 1724993508 # 商户号