feat(微信): 添加微信JS-SDK使用权限签名接口

- 新增微信JS-SDK使用权限签名接口,用于获取微信分享等操作所需的签名信息
- 在应用配置中添加相关URL的免登录访问权限
- 重构订单相关接口,将订单服务拆分为ITpNewOrderService和ITpOrderService两个接口
This commit is contained in:
清晨
2025-04-11 10:47:09 +08:00
parent 38ca0152a1
commit f9206bc3da
9 changed files with 625 additions and 411 deletions

View File

@@ -24,6 +24,7 @@ import org.dromara.system.domain.vo.SysPictureVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysPictureService;
import org.dromara.system.service.ISysUserService;
import org.dromara.web.utils.WxXcxUtils;
import org.dromara.work.domain.TpReceipt;
import org.dromara.work.domain.bo.OrderRankingBo;
import org.dromara.work.domain.bo.TpProdBo;
@@ -66,6 +67,8 @@ public class IndexController {
private final IOrderService orderService;
private final ITpNewOrderService tpNewOrderService;
private final ISysPictureService sysPictureService;
private final ITpProdService tpProdService;
@@ -112,6 +115,14 @@ public class IndexController {
return R.ok(tpProdService.queryById(id));
}
/**
* 根据url获取微信JS-SDK使用权限签名
*/
@PostMapping("/wx/jssdk")
public R<Map<String, String>> getWxJssdk(@RequestParam String url) {
return R.ok(WxXcxUtils.generateSignature(url));
}
/**
* 银盛支付回调
* @param params
@@ -211,7 +222,7 @@ public class IndexController {
@GetMapping("/rankingListKF")
public TableDataInfo<OrderRankingVo> rankingListKF(OrderRankingBo bo, PageQuery pageQuery) {
bo.setType(1);
return tpOrderService.rankingList(bo, pageQuery);
return tpNewOrderService.rankingList(bo, pageQuery);
}
/**
@@ -221,7 +232,7 @@ public class IndexController {
@GetMapping("/rankingListKFSum")
public R<OrderRankingSumVo> rankingListKFSum(OrderRankingBo bo) {
bo.setType(1);
return R.ok(tpOrderService.rankingListKFSum(bo));
return R.ok(tpNewOrderService.rankingListKFSum(bo));
}
/**
@@ -231,7 +242,7 @@ public class IndexController {
@GetMapping("/rankingListJS")
public TableDataInfo<OrderRankingVo> rankingListJS(OrderRankingBo bo, PageQuery pageQuery) {
bo.setType(2);
return tpOrderService.rankingListJS(bo, pageQuery);
return tpNewOrderService.rankingListJS(bo, pageQuery);
}
/**
@@ -241,7 +252,7 @@ public class IndexController {
@GetMapping("/rankingListJSSum")
public R<OrderRankingSumVo> rankingListJSSum(OrderRankingBo bo) {
bo.setType(2);
return R.ok(tpOrderService.rankingListJSSum(bo));
return R.ok(tpNewOrderService.rankingListJSSum(bo));
}
/**
@@ -286,7 +297,7 @@ public class IndexController {
@SaCheckPermission("index:order:khRankingList")
@GetMapping("/khRankingList")
public TableDataInfo<OrderRankingVo> khRankingList(OrderRankingBo bo, PageQuery pageQuery) {
return tpOrderService.khRankingList(bo, pageQuery);
return tpNewOrderService.khRankingList(bo, pageQuery);
}
/**
@@ -295,7 +306,7 @@ public class IndexController {
@SaCheckPermission("index:order:khRankingList")
@GetMapping("/khRankingListSum")
public R<OrderRankingSumVo> khRankingListSum(OrderRankingBo bo) {
return R.ok(tpOrderService.khRankingListSum(bo));
return R.ok(tpNewOrderService.khRankingListSum(bo));
}
/**

View File

@@ -0,0 +1,90 @@
package org.dromara.web.utils;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
/**
* 微信小程序工具类
* @author Maosw
*/
public class WxXcxUtils {
private static final String APPID = "wx35c33a8a60d06fa9";
private static final String SECRET = "0c96a172d7bbe2bd8aa7dcee4ccbfb46";
private static final String TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
/**
* 获取access_token
*/
public static String getAccessToken(){
String url = TOKEN_URL + "?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET;
String result = HttpUtil.get(url);
JSONObject jsonObject = JSONObject.parseObject(result);
return jsonObject.getString("access_token");
}
/**
* 获取jsapi_ticket
*/
public static String getJsapiTicket() {
String accessToken = getAccessToken();
String url = TICKET_URL + "?access_token=" + accessToken + "&type=jsapi";
String result = HttpUtil.get(url);
JSONObject jsonObject = JSONObject.parseObject(result);
return jsonObject.getString("ticket");
}
/**
* 生成签名
* @param url 当前网页的URL
* @return 签名信息
*/
public static Map<String, String> generateSignature(String url) {
if (StringUtils.isEmpty(url)) {
throw new IllegalArgumentException("URL不能为空");
}
// 获取jsapi_ticket
String jsapiTicket = getJsapiTicket();
// 生成随机字符串
String nonceStr = RandomUtil.randomString(16);
// 生成时间戳
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
// 准备签名参数
Map<String, String> params = new TreeMap<>();
params.put("jsapi_ticket", jsapiTicket);
params.put("noncestr", nonceStr);
params.put("timestamp", timestamp);
params.put("url", url);
// 拼接字符串
StringBuilder stringBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
stringBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
String string1 = stringBuilder.substring(0, stringBuilder.length() - 1);
// 生成签名
String signature = DigestUtil.sha1Hex(string1);
// 返回结果
Map<String, String> result = new HashMap<>();
result.put("timestamp", timestamp);
result.put("nonceStr", nonceStr);
result.put("signature", signature);
result.put("appId", APPID);
return result;
}
}

View File

@@ -128,6 +128,7 @@ security:
- /notifyCheckSign
- /system/dict/data/**
- /work/panorama/listByOrderId
- /wx/jssdk
# 多租户配置
tenant:

View File

@@ -1,61 +1,61 @@
#错误消息
not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=对不起, 您的账号:{0} 不存在.
user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
user.password.delete=对不起,您的账号:{0} 已被删除
user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员
role.blocked=角色已封禁,请联系管理员
user.logout.success=退出成功
length.not.valid=长度必须在{min}{max}个字符之间
user.username.not.blank=用户名不能为空
user.username.not.valid=* 220个汉字、字母、数字或下划线组成,且必须以非数字开头
user.username.length.valid=账户长度必须在{min}{max}个字符之间
user.password.not.blank=用户密码不能为空
user.password.length.valid=用户密码长度必须在{min}{max}个字符之间
user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误
user.email.not.blank=邮箱不能为空
user.phonenumber.not.blank=用户手机号不能为空
user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功
user.register.success=注册成功
user.register.save.error=保存用户 {0} 失败,注册账号已存在
user.register.error=注册失败,请联系系统管理人员
user.notfound=请重新登录
user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
auth.grant.type.error=认证权限类型错误
auth.grant.type.blocked=认证权限类型已禁用
auth.grant.type.not.blank=认证权限类型不能为空
auth.clientid.not.blank=认证客户端id不能为空
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
repeat.submit.message=不允许重复提交,请稍候再试
rate.limiter.message=访问过于频繁,请稍候再试
sms.code.not.blank=短信验证码不能为空
sms.code.retry.limit.count=短信验证码输入错误{0}
sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟
email.code.not.blank=邮箱验证码不能为空
email.code.retry.limit.count=邮箱验证码输入错误{0}
email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟
xcx.code.not.blank=小程序[code]不能为空
social.source.not.blank=第三方登录平台[source]不能为空
social.code.not.blank=第三方登录平台[code]不能为空
social.state.not.blank=第三方登录平台[state]不能为空
##租户
tenant.number.not.blank=租户编号不能为空
tenant.not.exists=对不起, 您的租户不存在,请联系管理员
tenant.blocked=对不起,您的租户已禁用,请联系管理员
tenant.expired=对不起,您的租户已过期,请联系管理员
#????
not.null=* ????
user.jcaptcha.error=?????
user.jcaptcha.expire=??????
user.not.exists=???, ?????{0} ???.
user.password.not.match=?????/????
user.password.retry.limit.count=??????{0}?
user.password.retry.limit.exceed=??????{0}??????{1}??
user.password.delete=?????????{0} ????
user.blocked=?????????{0} ??????????
role.blocked=????????????
user.logout.success=????
length.not.valid=?????{min}?{max}?????
user.username.not.blank=???????
user.username.not.valid=* 2?20?????????????????????????
user.username.length.valid=???????{min}?{max}?????
user.password.not.blank=????????
user.password.length.valid=?????????{min}?{max}?????
user.password.not.valid=* 5-50???
user.email.not.valid=??????
user.email.not.blank=??????
user.phonenumber.not.blank=?????????
user.mobile.phone.number.not.valid=???????
user.login.success=????
user.register.success=????
user.register.save.error=???? {0} ??????????
user.register.error=??????????????
user.notfound=?????
user.forcelogout=?????????????
user.unknown.error=??????????
auth.grant.type.error=????????
auth.grant.type.blocked=?????????
auth.grant.type.not.blank=??????????
auth.clientid.not.blank=?????id????
##??????
upload.exceed.maxSize=?????????????????<br/>???????????{0}MB?
upload.filename.exceed.length=????????{0}???
##??
no.permission=??????????????????? [{0}]
no.create.permission=????????????????????? [{0}]
no.update.permission=????????????????????? [{0}]
no.delete.permission=????????????????????? [{0}]
no.export.permission=????????????????????? [{0}]
no.view.permission=????????????????????? [{0}]
repeat.submit.message=?????????????
rate.limiter.message=????????????
sms.code.not.blank=?????????
sms.code.retry.limit.count=?????????{0}?
sms.code.retry.limit.exceed=?????????{0}??????{1}??
email.code.not.blank=?????????
email.code.retry.limit.count=?????????{0}?
email.code.retry.limit.exceed=?????????{0}??????{1}??
xcx.code.not.blank=???[code]????
social.source.not.blank=???????[source]????
social.code.not.blank=???????[code]????
social.state.not.blank=???????[state]????
##??
tenant.number.not.blank=????????
tenant.not.exists=???, ??????????????
tenant.blocked=??????????????????
tenant.expired=??????????????????

View File

@@ -1,61 +1,61 @@
#错误消息
not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=对不起, 您的账号:{0} 不存在.
user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
user.password.delete=对不起,您的账号:{0} 已被删除
user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员
role.blocked=角色已封禁,请联系管理员
user.logout.success=退出成功
length.not.valid=长度必须在{min}{max}个字符之间
user.username.not.blank=用户名不能为空
user.username.not.valid=* 220个汉字、字母、数字或下划线组成,且必须以非数字开头
user.username.length.valid=账户长度必须在{min}{max}个字符之间
user.password.not.blank=用户密码不能为空
user.password.length.valid=用户密码长度必须在{min}{max}个字符之间
user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误
user.email.not.blank=邮箱不能为空
user.phonenumber.not.blank=用户手机号不能为空
user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功
user.register.success=注册成功
user.register.save.error=保存用户 {0} 失败,注册账号已存在
user.register.error=注册失败,请联系系统管理人员
user.notfound=请重新登录
user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
auth.grant.type.error=认证权限类型错误
auth.grant.type.blocked=认证权限类型已禁用
auth.grant.type.not.blank=认证权限类型不能为空
auth.clientid.not.blank=认证客户端id不能为空
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
repeat.submit.message=不允许重复提交,请稍候再试
rate.limiter.message=访问过于频繁,请稍候再试
sms.code.not.blank=短信验证码不能为空
sms.code.retry.limit.count=短信验证码输入错误{0}
sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟
email.code.not.blank=邮箱验证码不能为空
email.code.retry.limit.count=邮箱验证码输入错误{0}
email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟
xcx.code.not.blank=小程序[code]不能为空
social.source.not.blank=第三方登录平台[source]不能为空
social.code.not.blank=第三方登录平台[code]不能为空
social.state.not.blank=第三方登录平台[state]不能为空
##租户
tenant.number.not.blank=租户编号不能为空
tenant.not.exists=对不起, 您的租户不存在,请联系管理员
tenant.blocked=对不起,您的租户已禁用,请联系管理员
tenant.expired=对不起,您的租户已过期,请联系管理员
#????
not.null=* ????
user.jcaptcha.error=?????
user.jcaptcha.expire=??????
user.not.exists=???, ?????{0} ???.
user.password.not.match=?????/????
user.password.retry.limit.count=??????{0}?
user.password.retry.limit.exceed=??????{0}??????{1}??
user.password.delete=?????????{0} ????
user.blocked=?????????{0} ??????????
role.blocked=????????????
user.logout.success=????
length.not.valid=?????{min}?{max}?????
user.username.not.blank=???????
user.username.not.valid=* 2?20?????????????????????????
user.username.length.valid=???????{min}?{max}?????
user.password.not.blank=????????
user.password.length.valid=?????????{min}?{max}?????
user.password.not.valid=* 5-50???
user.email.not.valid=??????
user.email.not.blank=??????
user.phonenumber.not.blank=?????????
user.mobile.phone.number.not.valid=???????
user.login.success=????
user.register.success=????
user.register.save.error=???? {0} ??????????
user.register.error=??????????????
user.notfound=?????
user.forcelogout=?????????????
user.unknown.error=??????????
auth.grant.type.error=????????
auth.grant.type.blocked=?????????
auth.grant.type.not.blank=??????????
auth.clientid.not.blank=?????id????
##??????
upload.exceed.maxSize=?????????????????<br/>???????????{0}MB?
upload.filename.exceed.length=????????{0}???
##??
no.permission=??????????????????? [{0}]
no.create.permission=????????????????????? [{0}]
no.update.permission=????????????????????? [{0}]
no.delete.permission=????????????????????? [{0}]
no.export.permission=????????????????????? [{0}]
no.view.permission=????????????????????? [{0}]
repeat.submit.message=?????????????
rate.limiter.message=????????????
sms.code.not.blank=?????????
sms.code.retry.limit.count=?????????{0}?
sms.code.retry.limit.exceed=?????????{0}??????{1}??
email.code.not.blank=?????????
email.code.retry.limit.count=?????????{0}?
email.code.retry.limit.exceed=?????????{0}??????{1}??
xcx.code.not.blank=???[code]????
social.source.not.blank=???????[source]????
social.code.not.blank=???????[code]????
social.state.not.blank=???????[state]????
##??
tenant.number.not.blank=????????
tenant.not.exists=???, ??????????????
tenant.blocked=??????????????????
tenant.expired=??????????????????