diff --git a/gather-app/src/main/java/com/ruoyi/database/controller/SmallProgramController.java b/gather-app/src/main/java/com/ruoyi/database/controller/SmallProgramController.java index cd96387..6e743a1 100644 --- a/gather-app/src/main/java/com/ruoyi/database/controller/SmallProgramController.java +++ b/gather-app/src/main/java/com/ruoyi/database/controller/SmallProgramController.java @@ -182,10 +182,7 @@ public class SmallProgramController extends BaseController { public AjaxResult payFees(@RequestBody PayFees payFees,HttpServletRequest request){ LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); - ParkingBillInfo one = parkingBillInfoService.lambdaQuery() - .eq(ParkingBillInfo::getBillCode, payFees.getBillCode()) - .last("limit 1") - .one(); + ParkingBillInfo one = parkingBillInfoService.getById(payFees.getId()); if (one == null) { return AjaxResult.error("停车记录查询失败"); } @@ -202,17 +199,19 @@ public class SmallProgramController extends BaseController { return AjaxResult.error("用户信息出错"); } String openId = null; + String userId = null; PayType payType = PayType.getByCode(payFees.getPayType()); switch (payType) { case WECHAT: openId = one1.getOpenId(); break; case ALIPAY: - openId = one1.getAlipayUserId(); + openId = one1.getAlipayOpenId(); + userId = one1.getAlipayUserId(); break; } String clientIp = wechatMiniProgramPayService.getClientIpAddress(request); - Map order = createOrder(payFees, generate, openId, one, clientIp); + Map order = createOrder(payFees, generate, openId, one, clientIp, userId); ParkingBillPaymentInfo parkingBillPaymentInfo = new ParkingBillPaymentInfo(); parkingBillPaymentInfo.setBillCode(one.getBillCode()); @@ -249,7 +248,8 @@ public class SmallProgramController extends BaseController { String orderId, String openId, ParkingBillInfo parkingBillInfo, - String clientIp) { + String clientIp, + String userId) { PayType payType = PayType.getByCode(payFees.getPayType()); switch (payType) { @@ -260,7 +260,7 @@ public class SmallProgramController extends BaseController { case ALIPAY: return alipayService.createOrder(orderId, parkingBillInfo.getPayMoneyYuan().toString(), - "常客隆智慧停车缴费",openId); + "常客隆智慧停车缴费",openId,userId); default: throw new IllegalArgumentException("不支持的登录方式: " + payType); diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/BaseCustomerInfo.java b/gather-app/src/main/java/com/ruoyi/database/domain/BaseCustomerInfo.java index 33ffba1..61c22b7 100644 --- a/gather-app/src/main/java/com/ruoyi/database/domain/BaseCustomerInfo.java +++ b/gather-app/src/main/java/com/ruoyi/database/domain/BaseCustomerInfo.java @@ -78,6 +78,12 @@ public class BaseCustomerInfo { @Excel(name = "支付宝用户ID") private String alipayUserId; + + + @ApiModelProperty("支付宝openID") + @Excel(name = "支付宝openID") + private String alipayOpenId; + /** * 手机号 */ diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/PayFees.java b/gather-app/src/main/java/com/ruoyi/database/domain/PayFees.java index 8df5725..b10ee75 100644 --- a/gather-app/src/main/java/com/ruoyi/database/domain/PayFees.java +++ b/gather-app/src/main/java/com/ruoyi/database/domain/PayFees.java @@ -8,9 +8,9 @@ import javax.validation.constraints.NotBlank; @Data public class PayFees { - @ApiModelProperty("账单编号") - @NotBlank(message = "账单编号不能为空") - private String billCode; + @ApiModelProperty("账单id") + @NotBlank(message = "账单id不能为空") + private Long id; @ApiModelProperty("支付方式: wechat 或 alipay") @NotBlank(message = "支付方式不能为空") diff --git a/gather-app/src/main/java/com/ruoyi/database/service/AlipayPhoneService.java b/gather-app/src/main/java/com/ruoyi/database/service/AlipayPhoneService.java index bd0c2ef..5860240 100644 --- a/gather-app/src/main/java/com/ruoyi/database/service/AlipayPhoneService.java +++ b/gather-app/src/main/java/com/ruoyi/database/service/AlipayPhoneService.java @@ -4,9 +4,14 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.parser.Feature; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; import com.alipay.api.internal.util.AlipayEncrypt; import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.request.AlipayUserInfoShareRequest; +import com.alipay.api.response.AlipayUserInfoShareResponse; import com.fasterxml.jackson.databind.ObjectMapper; +import com.ruoyi.config.AlipayRYConfig; import com.ruoyi.database.exception.BusinessException; import lombok.extern.slf4j.Slf4j; import org.checkerframework.checker.units.qual.A; @@ -46,6 +51,8 @@ public class AlipayPhoneService { @Value("${alipay.gateway}") private String gateway; + @Value("${alipay.publicKey}") + private String publicKey; private final String AES_STR = "LoKBapEj35+bRnC/Rrhe8g=="; @@ -84,7 +91,7 @@ public class AlipayPhoneService { /** * 获取用户id */ - private String getOpenId(String authCode) { + private Map getOpenId(String authCode) { try { Map params = buildBaseParams(); params.put("method", "alipay.system.oauth.token"); @@ -113,13 +120,31 @@ public class AlipayPhoneService { throw new BusinessException("ALIPAY_ACCESS_TOKEN_ERROR", "获取access_token失败: 响应格式错误"); } - String accessToken = (String) tokenResponse.get("open_id"); + String openId = (String) tokenResponse.get("open_id"); + String accessToken = (String) tokenResponse.get("access_token"); if (accessToken == null || accessToken.trim().isEmpty()) { throw new BusinessException("ALIPAY_ACCESS_TOKEN_ERROR", "获取access_token失败: access_token为空"); } log.info("成功获取access_token: {}", accessToken); - return accessToken; + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + appId, + privateKey, + "json", + "GBK", + publicKey, + "RSA2"); + AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest(); + AlipayUserInfoShareResponse response = alipayClient.execute(request,accessToken); + if(response.isSuccess()){ + + Map map = new HashMap<>(); + map.put("openId",openId); + map.put("userId",response.getUserId()); + return map; + }else { + return null; + } } catch (Exception e) { log.error("获取access_token异常", e); @@ -324,12 +349,10 @@ public class AlipayPhoneService { return phoneNumber.matches("^1[3-9]\\d{9}$"); } - /** - * 获取支付宝用户ID (如果需要) - */ - public String getAlipayUserId(String authCode) { + + public Map getAlipayOpenId(String authCode) { try { - String openId = getOpenId(authCode); + Map openId = getOpenId(authCode); // 在实际业务中,你可能需要根据手机号关联用户ID // 这里返回手机号作为示例,实际应该返回支付宝用户ID diff --git a/gather-app/src/main/java/com/ruoyi/database/service/AlipayService.java b/gather-app/src/main/java/com/ruoyi/database/service/AlipayService.java index 2dfa5da..0ca2b31 100644 --- a/gather-app/src/main/java/com/ruoyi/database/service/AlipayService.java +++ b/gather-app/src/main/java/com/ruoyi/database/service/AlipayService.java @@ -31,7 +31,7 @@ public class AlipayService { * @param buyerId 支付宝用户ID(相当于OpenID) * @return 支付订单字符串,用于小程序前端调起支付 */ - public Map createOrder(String orderId, String amount, String subject, String buyerId) { + public Map createOrder(String orderId, String amount, String subject, String buyerId,String userId) { try { AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); // 构造请求参数以调用接口 @@ -51,6 +51,7 @@ public class AlipayService { model.setBody(subject); // 设置买家支付宝用户唯一标识 model.setBuyerOpenId(buyerId); +// model.setBuyerId(userId); request.setBizModel(model); AlipayTradeCreateResponse response = alipayClient.execute(request); System.out.println(response.getBody()); diff --git a/gather-app/src/main/java/com/ruoyi/database/service/WechatPhoneService.java b/gather-app/src/main/java/com/ruoyi/database/service/WechatPhoneService.java index 0b78561..31d1fb4 100644 --- a/gather-app/src/main/java/com/ruoyi/database/service/WechatPhoneService.java +++ b/gather-app/src/main/java/com/ruoyi/database/service/WechatPhoneService.java @@ -154,7 +154,7 @@ public class WechatPhoneService { /** * 获取微信用户openid (如果需要) */ - public String getOpenId(String jsCode) { + public Map getOpenId(String jsCode) { try { String url = String.format( "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", @@ -174,7 +174,9 @@ public class WechatPhoneService { if (openid != null) { log.info("成功获取微信openid"); - return openid; + Map map = new HashMap<>(); + map.put("openId",openid); + return map; } else if (errcode != null) { String errmsg = (String) result.get("errmsg"); throw new BusinessException("WECHAT_OPENID_ERROR", diff --git a/gather-app/src/main/java/com/ruoyi/database/service/impl/ParkingBillInfoServiceImpl.java b/gather-app/src/main/java/com/ruoyi/database/service/impl/ParkingBillInfoServiceImpl.java index da0b432..8c96948 100644 --- a/gather-app/src/main/java/com/ruoyi/database/service/impl/ParkingBillInfoServiceImpl.java +++ b/gather-app/src/main/java/com/ruoyi/database/service/impl/ParkingBillInfoServiceImpl.java @@ -51,7 +51,10 @@ public class ParkingBillInfoServiceImpl extends ServiceImpl openId = getOpenId(request); LoginType loginType = LoginType.getByCode(request.getLoginType()); AjaxResult ajax = AjaxResult.success(); // 生成令牌 @@ -112,10 +112,11 @@ public class SysLoginController { .one(); switch (loginType) { case WECHAT: - one.setOpenId(openId); + one.setOpenId(openId.get("openId")); break; case ALIPAY: - one.setAlipayUserId(openId); + one.setAlipayUserId(openId.get("userId")); + one.setAlipayOpenId(openId.get("openId")); break; } if (one == null) { @@ -172,7 +173,7 @@ public class SysLoginController { * @param request * @return */ - private String getOpenId(LoginRequest request) { + private Map getOpenId(LoginRequest request) { LoginType loginType = LoginType.getByCode(request.getLoginType()); switch (loginType) { @@ -180,7 +181,7 @@ public class SysLoginController { return wechatPhoneService.getOpenId(request.getAuthCode()); case ALIPAY: - return alipayPhoneService.getAlipayUserId(request.getAuthCode()); + return alipayPhoneService.getAlipayOpenId(request.getAuthCode()); default: throw new IllegalArgumentException("不支持的登录方式: " + loginType);