From f822ef20465b3e940673342c25aa44c73eb8b8a6 Mon Sep 17 00:00:00 2001 From: Paidax Date: Tue, 11 Mar 2025 08:42:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v/nutz/base/constant/RedisConstant.java | 2 + .../payment/model/PaymentTransaction.java | 5 + .../base/payment/wxpay/bean/WxPayV3Bean.java | 6 + .../controller/WxPayCommonController.java | 37 ++++ .../wxpay/service/WxPayCommonService.java | 8 + .../service/impl/WxPayCommonServiceImpl.java | 44 +++- .../base/payment/wxpay/util/WeChatUtils.java | 109 ++++++++++ .../payment/wxpay/vo/WxPayNeedParamVo.java | 5 + .../platform/sys/SysWechatController.java | 193 ++++++++++++++++++ .../java/io/v/nutz/sys/models/Sys_user.java | 5 + .../MemberPaymentTestController.java | 82 ++++++++ .../views/platform/membercost/test/index.html | 48 +++++ 12 files changed, 541 insertions(+), 3 deletions(-) create mode 100644 src/main/java/io/v/nutz/base/payment/wxpay/controller/WxPayCommonController.java create mode 100644 src/main/java/io/v/nutz/base/payment/wxpay/util/WeChatUtils.java create mode 100644 src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentTestController.java create mode 100644 src/main/resources/views/platform/membercost/test/index.html diff --git a/src/main/java/io/v/nutz/base/constant/RedisConstant.java b/src/main/java/io/v/nutz/base/constant/RedisConstant.java index 6d464bf..54137ba 100644 --- a/src/main/java/io/v/nutz/base/constant/RedisConstant.java +++ b/src/main/java/io/v/nutz/base/constant/RedisConstant.java @@ -18,6 +18,8 @@ public class RedisConstant { //企业微信TOKEN public final static String REDIS_KEY_QIYE_WECHAT_ACCESS_TOKEN = "qiyewx:token:"; + // 微信公众号TOKEN + public final static String REDIS_KEY_WECHAT_ACCESS_TOKEN = "wechat:token:"; //健步走小程序TOKEN public final static String REDIS_KEY_WE_APP_ACCESS_TOKEN = "weapp:token:"; diff --git a/src/main/java/io/v/nutz/base/payment/model/PaymentTransaction.java b/src/main/java/io/v/nutz/base/payment/model/PaymentTransaction.java index 12ec042..9b17168 100644 --- a/src/main/java/io/v/nutz/base/payment/model/PaymentTransaction.java +++ b/src/main/java/io/v/nutz/base/payment/model/PaymentTransaction.java @@ -49,6 +49,11 @@ public class PaymentTransaction extends BaseModel { @ColDefine(type = ColType.VARCHAR,width = 30) private String tradingType; + @Column + @Comment("交易状态") + @ColDefine(type = ColType.VARCHAR,width = 50) + private String tradingState; + @Column @Comment("用户ID") @ColDefine(type = ColType.VARCHAR,width = 32) diff --git a/src/main/java/io/v/nutz/base/payment/wxpay/bean/WxPayV3Bean.java b/src/main/java/io/v/nutz/base/payment/wxpay/bean/WxPayV3Bean.java index ea01f2f..2f9c1e0 100644 --- a/src/main/java/io/v/nutz/base/payment/wxpay/bean/WxPayV3Bean.java +++ b/src/main/java/io/v/nutz/base/payment/wxpay/bean/WxPayV3Bean.java @@ -16,6 +16,12 @@ import lombok.NoArgsConstructor; @NoArgsConstructor public class WxPayV3Bean { + /** + * 服务号 + * appid: wxf12fa6175ec7c75f + * app_secret: f65bbb41d3de4a93c8c93d8e2fd50369 + */ + private String appId; private String keyPath; private String publicKeyPath; diff --git a/src/main/java/io/v/nutz/base/payment/wxpay/controller/WxPayCommonController.java b/src/main/java/io/v/nutz/base/payment/wxpay/controller/WxPayCommonController.java new file mode 100644 index 0000000..5084140 --- /dev/null +++ b/src/main/java/io/v/nutz/base/payment/wxpay/controller/WxPayCommonController.java @@ -0,0 +1,37 @@ +package io.v.nutz.base.payment.wxpay.controller; + +import io.v.nutz.base.annontation.ViReturn; +import io.v.nutz.base.payment.wxpay.service.WxPayCommonService; +import lombok.extern.slf4j.Slf4j; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @version 1.0 + * @Author zzr + * @name:WxPayCommonController + * @Date 2025/3/10 19:28 + * @注释 + */ +@Slf4j +@IocBean +@Ok("json:full") +@At("/platform/wxPay") +public class WxPayCommonController { + + @Inject + private WxPayCommonService wxPayCommonService; + + + @At + @Ok("void") + @ViReturn + public void notifyMessage(HttpServletRequest request, HttpServletResponse response){ + wxPayCommonService.payNotify(request, response); + } +} diff --git a/src/main/java/io/v/nutz/base/payment/wxpay/service/WxPayCommonService.java b/src/main/java/io/v/nutz/base/payment/wxpay/service/WxPayCommonService.java index 25215d9..d02e506 100644 --- a/src/main/java/io/v/nutz/base/payment/wxpay/service/WxPayCommonService.java +++ b/src/main/java/io/v/nutz/base/payment/wxpay/service/WxPayCommonService.java @@ -66,4 +66,12 @@ public interface WxPayCommonService { * @param response 响应 */ void refundNotify(HttpServletRequest request, HttpServletResponse response); + + + /** + * 获取openId + * @param code 用户授权后的Code,可以获取用户信息 + * @return + */ + String getOpenId(String code); } diff --git a/src/main/java/io/v/nutz/base/payment/wxpay/service/impl/WxPayCommonServiceImpl.java b/src/main/java/io/v/nutz/base/payment/wxpay/service/impl/WxPayCommonServiceImpl.java index 66c294a..3a8b02e 100644 --- a/src/main/java/io/v/nutz/base/payment/wxpay/service/impl/WxPayCommonServiceImpl.java +++ b/src/main/java/io/v/nutz/base/payment/wxpay/service/impl/WxPayCommonServiceImpl.java @@ -20,18 +20,24 @@ import com.ijpay.wxpay.enums.WxDomainEnum; import com.ijpay.wxpay.enums.v3.BasePayApiEnum; import com.ijpay.wxpay.model.v3.*; import io.v.nutz.base.payment.enums.TradingChannelEnum; +import io.v.nutz.base.payment.enums.TradingStateEnum; import io.v.nutz.base.payment.enums.TradingTypeEnum; import io.v.nutz.base.payment.enums.WxPayResultCode; import io.v.nutz.base.payment.model.PaymentTransaction; import io.v.nutz.base.payment.wxpay.bean.WxPayV3Bean; import io.v.nutz.base.payment.wxpay.service.WxPayCommonService; +import io.v.nutz.base.payment.wxpay.util.WeChatUtils; import io.v.nutz.base.payment.wxpay.vo.WxPayNeedParamVo; import io.v.nutz.base.result.Result; import io.v.nutz.sys.models.User; import io.v.nutz.sys.services.SysUserService; import io.v.nutz.web.commons.utils.ShiroUtil; +import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo; import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; import org.nutz.dao.Cnd; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.random.R; @@ -85,6 +91,8 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { @Inject private SysUserService sysUserService; + @Inject + private WeChatUtils weChatUtils; /** * 微信扫描二维码支付 @@ -93,6 +101,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { * @return */ @Override + @Aop(TransAop.READ_COMMITTED) public Result nativePay(WxPayNeedParamVo paramVo) { try { // 商户订单号,存储当前用户的订单 @@ -148,6 +157,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { @Override + @Aop(TransAop.READ_COMMITTED) public Result jsApiPay(WxPayNeedParamVo paramVo) { try { // 商户订单号,存储当前用户的订单 @@ -187,7 +197,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { Map map = WxPayKit.jsApiCreateSign(WX_PAY_V3_BEAN.getAppId(), prepayId, WX_PAY_V3_BEAN.getKeyPath()); log.info("唤起支付参数:{}", map); // 唤起支付成功,向数据库插入订单参数 - + insertTradingOrder(paramVo, outTradeNo, body); return Result.success(JSONUtil.toJsonStr(map)); } // return JSONUtil.toJsonStr(response); @@ -200,6 +210,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { @Override + @Aop(TransAop.READ_COMMITTED) public Result wapPay(WxPayNeedParamVo paramVo) { try { // 商户订单号,存储当前用户的订单 @@ -238,10 +249,11 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { log.info("verifySignature: {}", verifySignature); if (response.getStatus() == OK && verifySignature) { String body = response.getBody(); + insertTradingOrder(paramVo, outTradeNo, body); return Result.success(JSONUtil.toJsonStr(body)); } // return JSONUtil.toJsonStr(response); - return null; + return Result.error(); } catch (Exception e) { log.error("系统异常", e); return Result.error(e.getMessage()); @@ -276,8 +288,21 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { // WX_PAY_V3_BEAN.getApiKey3(), WX_PAY_V3_BEAN.getPlatformCertPath()); // } log.info("支付通知明文 {}", plainText); - if (StrUtil.isNotEmpty(plainText)) { + // 支付结果 + JSONObject jsonResult = JSONUtil.parseObj(plainText); + // 获取缴费记录,并修改缴费结果 + PaymentTransaction transaction = sysUserService.dao().fetch(PaymentTransaction.class, Cnd.where("outTradeNo", "=", jsonResult.getStr("out_trade_no"))); + transaction.setTradingState(TradingStateEnum.PAY_SUCCESS.getTrdingStateName()); + transaction.setTradingOrderNo(jsonResult.getStr("transaction_id")); + sysUserService.dao().update(transaction); + + sysUserService.dao().update(MemberPaymentInfo.class, + Chain.make("isPayment", true).add("paymentTime", DateUtil.date(jsonResult.getLong("success_time"))) + .add("paymentMoney", String.valueOf(transaction.getTradingOrderNo())), + Cnd.where("payId", "=", transaction.getId()) + ); + response.setStatus(200); map.put("code", "SUCCESS"); map.put("message", "SUCCESS"); @@ -285,7 +310,10 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { response.setStatus(500); map.put("code", "ERROR"); map.put("message", "签名错误"); + log.error("签名错误"); } + + // 支付回调,返回给微信,自己也接收不到结果,这里的返回完全没用 response.setHeader("Content-type", ContentType.JSON.toString()); response.getOutputStream().write(JSONUtil.toJsonStr(map).getBytes(StandardCharsets.UTF_8)); response.flushBuffer(); @@ -404,6 +432,12 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { } + @Override + public String getOpenId(String code) { + JSONObject jsonObject = weChatUtils.getWebAccessTokenAndOpenid(code); + return jsonObject.getStr("openid"); + } + /** * 公共方法,获取证书序列号 * @return @@ -522,6 +556,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { transaction.setUserName(user.getUsername()); transaction.setUnitName(user.getUnitname()); transaction.setUnionName(user.getUnionname()); + transaction.setTradingState(TradingStateEnum.WAITING_FOR_PAYMENT.name()); // 获取订单金额 int total = paramVo.getAmount().getTotal(); BigDecimal bigDecimalValue = new BigDecimal(String.valueOf(total)); @@ -534,5 +569,8 @@ public class WxPayCommonServiceImpl implements WxPayCommonService { transaction.setOpenId(null); transaction.setResultJson(result); sysUserService.dao().insert(transaction); + + sysUserService.dao().update(MemberPaymentInfo.class, + Chain.make("payId", transaction.getId()), Cnd.where("id", "=", paramVo.getMemberPaymentInfoId())); } } diff --git a/src/main/java/io/v/nutz/base/payment/wxpay/util/WeChatUtils.java b/src/main/java/io/v/nutz/base/payment/wxpay/util/WeChatUtils.java new file mode 100644 index 0000000..e1dd698 --- /dev/null +++ b/src/main/java/io/v/nutz/base/payment/wxpay/util/WeChatUtils.java @@ -0,0 +1,109 @@ +package io.v.nutz.base.payment.wxpay.util; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import io.v.nutz.base.constant.RedisConstant; +import lombok.extern.slf4j.Slf4j; +import org.nutz.http.Http; +import org.nutz.integration.jedis.RedisService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; + +import java.net.URLEncoder; + +/** + * @version 1.0 + * @Author zzr + * @name:WeChatUtils + * @Date 2025/3/10 14:13 + * @注释 + */ +@Slf4j +@IocBean +public class WeChatUtils { + + @Inject + private RedisService redisService; + + public static final String APPID = "wxf12fa6175ec7c75f"; + + public static final String SECRET = "f65bbb41d3de4a93c8c93d8e2fd50369"; + + // 获取code + public final static String CODE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; + + //获取网页access_token的接口地址 + public final static String WEB_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code"; + + + //获取用户信息地址 + public final static String USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN"; + + // 获取access_token的接口地址(GET) 限2000(次/天) + public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; + // 发送模板消息 + public static final String SEND_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN"; + + + /** + * 生成获取code的url + * + * @param redirectUrl + * @return + */ + public String getCodeUrl(String redirectUrl, String state) { + String requestUrl = null; + state = state == null ? "" : state; + try { + requestUrl = CODE_URL.replace("APPID", APPID).replace("REDIRECT_URI", URLEncoder.encode(redirectUrl, "UTF-8")).replace("STATE", state); + } catch (Exception e) { + e.printStackTrace(); + } + return requestUrl; + } + + /** + * 获取微信网页access_token 和 openid + * + * @param code + * @return + */ + public JSONObject getWebAccessTokenAndOpenid(String code) { + String requestUrl = WEB_ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", SECRET).replace("CODE", code); + return JSONUtil.parseObj(HttpUtil.post(requestUrl, new JSONObject())); + } + + /** + * 网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了 + * ... + * + * @param webAccessToken + * @param openid + * @return + */ + public JSONObject getUserInfo(String webAccessToken, String openid) { + String requestUrl = USERINFO_URL.replace("ACCESS_TOKEN", webAccessToken).replace("OPENID", openid); + return JSONUtil.parseObj(HttpUtil.post(requestUrl, new JSONObject())); + } + + /** + * 获取access_token 先从Redis获取,如果没有再调微信获取并存Redis + * + * @return + */ + public String getAccessToken() { + String token = redisService.get(RedisConstant.REDIS_KEY_WECHAT_ACCESS_TOKEN); + if (StrUtil.isNotBlank(token)) { + return token; + } + String accessTokenUrl = ACCESS_TOKEN_URL.formatted(APPID, SECRET); + String accessToken = Json.fromJson(NutMap.class, Http.get(accessTokenUrl).getContent()).getString("access_token"); + redisService.setex(RedisConstant.REDIS_KEY_WECHAT_ACCESS_TOKEN, 60 * 60 * 2, accessToken); + return accessToken; + } + +} diff --git a/src/main/java/io/v/nutz/base/payment/wxpay/vo/WxPayNeedParamVo.java b/src/main/java/io/v/nutz/base/payment/wxpay/vo/WxPayNeedParamVo.java index 8b374a0..d1c0009 100644 --- a/src/main/java/io/v/nutz/base/payment/wxpay/vo/WxPayNeedParamVo.java +++ b/src/main/java/io/v/nutz/base/payment/wxpay/vo/WxPayNeedParamVo.java @@ -36,4 +36,9 @@ public class WxPayNeedParamVo { * 其余参数可忽略 */ private Payer payer; + + /** + * 会员支付信息ID,必填 + */ + private String memberPaymentInfoId; } diff --git a/src/main/java/io/v/nutz/sys/controllers/platform/sys/SysWechatController.java b/src/main/java/io/v/nutz/sys/controllers/platform/sys/SysWechatController.java index 6b7ca00..81e217b 100644 --- a/src/main/java/io/v/nutz/sys/controllers/platform/sys/SysWechatController.java +++ b/src/main/java/io/v/nutz/sys/controllers/platform/sys/SysWechatController.java @@ -1,6 +1,37 @@ package io.v.nutz.sys.controllers.platform.sys; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.socket.SocketUtil; +import io.v.nutz.base.payment.wxpay.util.WeChatUtils; +import io.v.nutz.base.utils.LoginUtil; +import io.v.nutz.sys.models.Sys_user; +import io.v.nutz.sys.services.SysUserService; +import io.v.nutz.web.commons.base.Globals; +import io.v.nutz.web.commons.slog.SLogService; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.UnknownAccountException; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.integration.jedis.RedisService; +import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.net.InetAddress; +import java.net.Socket; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Optional; /** * 微信公众号 @@ -9,5 +40,167 @@ import org.nutz.ioc.loader.annotation.IocBean; * @date 2023/07/06 */ @IocBean +@At("/platform/wechat") public class SysWechatController { + + private static String ACCESS_TOKEN_URL = "https://%s/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code"; + + private static final String APPID = "wxf12fa6175ec7c75f"; + + private static final String SECRET = "f65bbb41d3de4a93c8c93d8e2fd50369"; + + + @Inject + private Dao dao; + @Inject + private WeChatUtils weChatUtils; + @Inject + private SysUserService sysUserService; + @Inject + private RedisService redisService; + @Inject + private SLogService sLogService; + @Inject + private LoginUtil loginUtil; + + /** + * oauth + * + * @return {@link String} + */ + @At + @Ok("re") + public String oauth(@Param("redirectUrl") String redirectUrl) { + String redirect = Globals.AppDomain + "/platform/wechat/getCode"; + if (StrUtil.isNotBlank(redirect)) { + redirect += "?redirect=" + redirect; + } + String codeUrl = weChatUtils.getCodeUrl(redirect, ""); + return "redirect:" + codeUrl; + } + + /** + * 获取code 登录用户 + * + * @param code 代码 + * @return {@link String} + */ + @At + @Ok("re") + public String getCode(@Param("code") String code, @Param("redirect") String redirect, HttpSession session, HttpServletRequest request) { + String host; + try { + Socket socket = SocketUtil.connect("api.weixin.qq.com", 443, 1000); + if (socket.isConnected()) { + host = "api.weixin.qq.com"; + } else { + InetAddress inetAddress = InetAddress.getLocalHost(); + host = inetAddress.getHostAddress(); + } + } catch (Exception e) { + host = "api.weixin.qq.com"; + } + String tokenUrl = ACCESS_TOKEN_URL.formatted(host, APPID, SECRET, code); + + NutMap resMap = Json.fromJson(NutMap.class, HttpUtil.get(tokenUrl)); + String openid = resMap.getString("openid"); + Sys_user sysUser = dao.fetch(Sys_user.class, Cnd.where("openId", "=", openid)); + + if (sysUser == null) { + String s = Globals.AppDomain + "/platform/wechat/doLogin?openid=" + openid; + if (StrUtil.isNotBlank(redirect)) { + s += "&redirect=" + URLEncoder.encode(redirect, StandardCharsets.UTF_8); + } +// return ">>:" + Globals.CasAddress + "/login?service=" + URLEncoder.encode(s, StandardCharsets.UTF_8); + return ">>:" + s; + } + + String loginName = Optional.ofNullable(sysUser).map(x -> x.getLoginname()).orElse(null); + + try { + loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN); + if (StrUtil.isNotBlank(redirect)) { + return ">>:" + redirect; + } + return ">>:" + Globals.AppDomain + "/platform/home"; + } catch (LockedAccountException e) { + request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试"); + return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError"; + } catch (UnknownAccountException e) { + request.setAttribute("errMsg", "系统中没有此用户"); + return ">>:" + Globals.AppDomain + "/error/UnknownAccountError.html"; + } catch (AuthenticationException e) { + request.setAttribute("errMsg", "系统中没有此用户"); + return ">>:" + Globals.AppDomain + "/error/UnknownAccountError.html"; + } catch (Exception e) { + request.setAttribute("errMsg", "用户名或密码错误"); + return ">>:" + Globals.AppDomain + "/error/500.html"; + } + } + + + @At + @Ok("re") + public Object doLogin(@Attr("platformLoginToken") AuthenticationToken token, + HttpServletRequest request, HttpSession session, + @Param("redirect") String redirect, @Param("openid") String openid) { +// int errCount = NumberUtils.toInt(Strings.sNull(SecurityUtils.getSubject().getSession(true).getAttribute("platformErrCount"))); +// try { +// loginUtil.doLogin(token, request, session, LoginUtil.LoginOrigin.WEI_XIN); +// +// return Result.success("login.success"); +// } catch (CaptchaIncorrectException e) { +// return Result.error(1, "login.error.captcha"); +// } catch (CaptchaEmptyException e) { +// return Result.error(2, "login.error.captcha"); +// } catch (LockedAccountException e) { +// return Result.error(3, "login.error.locked"); +// } catch (UnknownAccountException e) { +// errCount++; +// SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount); +// return Result.error(4, "login.error.user"); +// } catch (AuthenticationException e) { +// errCount++; +// SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount); +// return Result.error(5, "login.error.user"); +// } catch (Exception e) { +// errCount++; +// SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount); +// return Result.error(6, "login.error.system"); +// } + + +// Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION); +// if (assertion == null) { +// return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError"; +// } +// +// String principal = assertion.getPrincipal().toString(); +// //工号 手机号 身份证 +// Sys_user user = dao.fetch(Sys_user.class, Cnd.NEW().and("loginname", "=", principal).or("mobile", "=", principal).or("idcard", "=", principal)); +// String loginName = Optional.ofNullable(user).map(v -> v.getLoginname()).orElse(null); +// +// try { +// loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN); +// //绑定openId +// if (StrUtil.isNotBlank(openid)) { +// dao.update(Sys_user.class, Chain.make("openId", openid), Cnd.where("loginName", "=", loginName)); +// } +// if (StrUtil.isNotBlank(redirect)) { +// return ">>:" + redirect; +// } +// return ">>:" + Globals.AppDomain + "/mobile/index"; +// } catch (LockedAccountException e) { +// request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试"); +// return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError"; +// } catch (UnknownAccountException e) { +// request.setAttribute("errMsg", "系统中没有此用户"); +// return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError"; +// } catch (Exception e) { +// request.setAttribute("errMsg", "用户名或密码错误"); +// return ">>:" + Globals.AppDomain + "/platform/home/500"; +// } + return null; + } + } diff --git a/src/main/java/io/v/nutz/sys/models/Sys_user.java b/src/main/java/io/v/nutz/sys/models/Sys_user.java index a38395e..3fbe0b4 100644 --- a/src/main/java/io/v/nutz/sys/models/Sys_user.java +++ b/src/main/java/io/v/nutz/sys/models/Sys_user.java @@ -626,6 +626,11 @@ public class Sys_user extends BaseModel implements Serializable { @ColDefine(type = ColType.VARCHAR, width = 300) private String weAppOpenid; + @Column + @Comment("微信openId") + @ColDefine(type = ColType.VARCHAR, width = 300) + private String openId; + /** * 2021-05-18 end */ diff --git a/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentTestController.java b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentTestController.java new file mode 100644 index 0000000..5a52550 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentTestController.java @@ -0,0 +1,82 @@ +package io.v.nutz.zhgh.memberCost.controller; + +import io.v.nutz.base.payment.wxpay.service.WxPayCommonService; +import io.v.nutz.base.payment.wxpay.util.WeChatUtils; +import io.v.nutz.zhgh.memberCost.service.MemberPaymentService; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.dao.Dao; +import org.nutz.integration.jedis.RedisService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +/** + * @version 1.0 + * @Author zzr + * @name:MemberPaymentTestController + * @Date 2025/3/10 14:55 + * @注释 + */ +@Slf4j +@IocBean +@Ok("json:full") +@At("/platform/member/payment/test") +public class MemberPaymentTestController { + + @Inject + private Dao dao; + @Inject + private WeChatUtils weChatUtils; + @Inject + private RedisService redisService; + @Inject + private WxPayCommonService wxPayCommonService; + @Inject + private MemberPaymentService memberPaymentService; + + @At("") + @Ok("beetl:/platform/membercost/test/index.html") + @RequiresPermissions("member.payment.test") + public void index() { + } + + + /** + * 微信jsapi支付需要网页授权认证 + * @param redirect + * @param userId + * @return + */ + @At + @Ok("re") + public String oauth(String redirect, String userId){ + String url = weChatUtils.getCodeUrl("https://schoolhd.top/platform/wxPay/getCode", userId); + redisService.setex("wx_pay_redirect_url", 60 * 60, "https://schoolhd.top/" + redirect); + return "redirect:" + url; + } + + /** + * 上面授权后会转到这个地址,然后去改数据库的openId, + * 后续对微信做一个免登录 + * @param code + * @param state + * @return + */ + @At + @Ok("re") + public String getCode(@Param("code") String code, @Param("state") String state){ + String openId = wxPayCommonService.getOpenId(code); +// WxPayNeedParamVo paramVo = new WxPayNeedParamVo(); +// paramVo.setDescription("支付"); +// paramVo.setAttach(""); +// paramVo.setAmount(new Amount().setTotal(1)); +// paramVo.setPayer(new Payer().setOpenid(openId)); +// Result result = wxPayCommonService.jsApiPay(paramVo); + return null; +// return "redirect:" + redisService.get("wx_pay_redirect_url"); + } + +} diff --git a/src/main/resources/views/platform/membercost/test/index.html b/src/main/resources/views/platform/membercost/test/index.html new file mode 100644 index 0000000..2bd49b8 --- /dev/null +++ b/src/main/resources/views/platform/membercost/test/index.html @@ -0,0 +1,48 @@ + +
+ +
+ + +