From 523797c2e9e4e8934751327db754f1f77763f356 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期日, 26 一月 2025 16:24:30 +0800 Subject: [PATCH] 全部代码、数据库提交 --- xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 226 insertions(+), 4 deletions(-) diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java index 458a72c..0e6e7d2 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java @@ -1,6 +1,8 @@ package com.xinquan.order.controller.client; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSONObject; import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; @@ -31,6 +33,7 @@ import com.xinquan.order.service.OrderPaymentRecordService; import com.xinquan.order.service.OrderService; import com.xinquan.course.api.domain.OrderCourseVO; +import com.xinquan.order.utils.IosVerifyUtil; import com.xinquan.order.utils.OrderUtil; import com.xinquan.system.api.domain.AppUser; import com.xinquan.system.api.domain.AppUserCourse; @@ -52,6 +55,8 @@ import javax.annotation.Resource; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; @@ -94,7 +99,7 @@ private SysUserClient sysUserClient; @Autowired private TokenService tokenService; - + private static final String certificateUrl = "https://buy.itunes.apple.com/verifyReceipt"; @ResponseBody @PostMapping("/queryPayment") @ApiOperation(value = "查询订单支付状态", tags = "查询订单支付状态") @@ -466,6 +471,21 @@ return R.ok(); } + private static final TrustManager myX509TrustManager = new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + }; + @ResponseBody @PostMapping("/placeOrderApple") @ApiOperation(value = "苹果支付", notes = "苹果支付") @@ -476,6 +496,7 @@ @ApiImplicitParam(name = "balanceFlag", value = "是否使用余额抵扣 1=是 2=否", dataType = "Integer", required = false), @ApiImplicitParam(name = "amount", value = "购买会员的金额/充值金额", dataType = "BigDecimal", required = false), @ApiImplicitParam(name = "transactionIdentifier", value = "苹果订单id"), + @ApiImplicitParam(name = "originTransactionIdentifier", value = "原苹果订单id"), @ApiImplicitParam(name = "vipType", value = "订单类型为会员时 必传 会员类型 1月度 2季度 3年度", dataType = "Integer", required = false), }) public R placeOrderApple( @@ -485,12 +506,213 @@ @RequestParam(value = "balanceFlag", required = false) Integer balanceFlag, @RequestParam(value = "amount", required = false) BigDecimal amount, @RequestParam(value = "vipType", required = false) Integer vipType, - @RequestParam(value = "transactionIdentifier")String transactionIdentifier) + @RequestParam(value = "transactionIdentifier")String transactionIdentifier, + @RequestParam(value = "originTransactionIdentifier", required = false)String originTransactionIdentifier, + @RequestParam(value = "receipt", required = false)String receipt + ) throws Exception { - + System.err.println("普通:"+transactionIdentifier); + System.err.println("原:"+originTransactionIdentifier); + System.err.println("receipt:"+receipt); return R.ok(orderService.placeOrderApple(targetId, orderFrom, receiverId, - balanceFlag,amount,vipType,transactionIdentifier)); + balanceFlag,amount,vipType,transactionIdentifier,originTransactionIdentifier,receipt)); + } + @ResponseBody + @PostMapping("/queryPlaceOrderApple") + @ApiOperation(value = "查询苹果支付结果", notes = "查询苹果支付结果") + @ApiImplicitParams({ + @ApiImplicitParam(name = "transactionId", value = "苹果流水号", dataType = "Long", required = false), + @ApiImplicitParam(name = "receipt", value = "支付凭证", dataType = "Integer", required = true), + }) + public R queryPlaceOrderApple( + @RequestParam(value = "transactionId") String transactionId, + @RequestParam(value = "receipt") String receipt) { + System.err.println("手动查询苹果流水号"+transactionId); + String verifyResult = IosVerifyUtil.buyAppVerify(receipt, 1); + //苹果服务器没有返回验证结果 + if (verifyResult == null) { + return R.fail("未查询到订单信息"); + } + // 苹果验证有返回结果 + System.err.println("线上,苹果平台返回JSON:" + verifyResult); + JSON job = JSONUtil.parse(verifyResult); + String states = job.getByPath("status").toString(); + //0 正常 + //21000 App Store不能读取你提供的JSON对象 + //21002 receipt-data域的数据有问题 + //21003 receipt无法通过验证 + //21004 提供的shared secret不匹配你账号中的shared secret + //21005 receipt服务器当前不可用 + //21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送 + //21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务 + //21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务 + if ("21007".equals(states)) { //是沙盒环境,应沙盒测试,否则执行下面 + //2.再沙盒测试 发送平台验证 + verifyResult = IosVerifyUtil.buyAppVerify(receipt, 0); + System.err.println("沙盒环境,苹果平台返回JSON:" + verifyResult); + + job = JSONUtil.parse(verifyResult); + states = job.getByPath("status").toString(); + } + System.err.println("苹果平台返回值:job" + job); + if (states.equals("0")) { // 前端所提供的收据是有效的 验证成功 + JSON inAppJson = JSONUtil.parse(JSONUtil.getByPath(job, "receipt.in_app")); + List<JSON> jsons = JSONUtil.toList(inAppJson.toString(), JSON.class); + System.err.println("支付订单列表"+jsons); + //所有支付成功的订单号 + List<String> transaction_id = + jsons.stream().map(t -> t.getByPath("transaction_id").toString()) + .distinct().collect(Collectors.toList()); + if(transaction_id.contains(transactionId)){ + OrderPaymentRecord two = orderPaymentRecordService.lambdaQuery() + .eq(OrderPaymentRecord::getPayOrderNo, transactionId).ne(OrderPaymentRecord::getPaymentStatus, 2).one(); + if (two != null) { + Order one = orderService.getById(two.getOrderId()); + if (one.getPaymentStatus() == 2) { + return R.ok("当前订单已完成支付"); + } + one.setPaymentStatus(2); + one.setPaymentTime(LocalDateTime.now()); + orderService.updateById(one); + OrderPaymentRecord one2 = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, one.getId()) + .ne(OrderPaymentRecord::getPaymentType, 4).one(); + if (one2 != null) { + one2.setPaymentStatus(2); + orderPaymentRecordService.updateById(one2); + } + // 实际支付金额 + BigDecimal realPayAmount = one.getRealPayAmount(); + // 判断订单所属用户是否有上级 是否需要做分佣处理 + AppUser data9 = remoteAppUserService.getAppUserById(one.getAppUserId() + "").getData(); + if (one.getGiveUserId() != null) { + remoteAppUserService.addNotice(one.getGiveUserId() + "", one.getBusinessId() + "", + one.getAppUserId() + "", one.getTotalAmount() + ""); + } + + if (data9.getInviteUserId() != null) { + + if (one.getOrderFrom() == 1 || one.getOrderFrom() == 2 || one.getOrderFrom() == 3) { + // 查询实际支付价格 不包含余额抵扣价格 + OrderPaymentRecord one1 = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, one.getId()) + .ne(OrderPaymentRecord::getPaymentType, 4).one(); + // 分佣给上级 先远程查询分佣比例 + CommissionRule data1 = sysUserClient.getCommission().getData(); + if (data1 != null) { + if (data1.getProportion() != null) { + + BigDecimal bigDecimal = one1.getPayAmount().multiply(data1.getProportion()).divide(new BigDecimal("100")) + .setScale(2, BigDecimal.ROUND_DOWN); + // 上级获取的分佣金额 + AppUser appUserById = remoteAppUserService.getAppUserById(data9.getInviteUserId() + "").getData(); + // 更新用户余额 +// remoteAppUserService.updateAppUser( +// AppUserDTO.builder().balance( +// appUserById.getBalance().add(bigDecimal)) +// .build(), SecurityConstants.INNER); + // 新增分佣流水明细 + AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord(); + appUserWalletRecord.setAppUserId(data9.getInviteUserId()); + appUserWalletRecord.setChangeType(1); + appUserWalletRecord.setReason("分佣收益"); + appUserWalletRecord.setAmount(bigDecimal); + appUserWalletRecord.setChildAppUserId(one.getAppUserId()); + appUserWalletRecord.setOrderId(one.getId()); + remoteAppUserService.addBalanceRecord(appUserWalletRecord); + one.setCommissionAmount(bigDecimal); + one.setCommissionId(data9.getInviteUserId()); + orderService.updateById(one); + } + } + } + } + if (one.getPayType() == 4 || one.getPayType() == 5 || one.getPayType() == 6 || one.getPayType() == 7) { + // 涉及到余额支付 新增一条余额支付记录 + OrderPaymentRecord one1 = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, one.getId()) + .eq(OrderPaymentRecord::getPaymentType, 4).one(); + AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord(); + appUserWalletRecord.setAppUserId(data9.getInviteUserId()); + String reason = null; + switch (one.getOrderFrom()) { + case 1: + Meditation data1 = remoteMeditationService.getMeditationById(one.getBusinessId()).getData(); + appUserWalletRecord.setChangeType(2); + reason = "购买疗愈【" + data1.getMeditationTitle() + "】"; + + break; + case 2: + Course data2 = remoteCourseService.getCourseById(one.getBusinessId()).getData(); + reason = "购买课程【" + data2.getCourseTitle() + "】"; + appUserWalletRecord.setChangeType(2); + // 增加用户与课程的关系表 + if (one.getGiveUserId() != null) { + remoteAppUserService.addAppUserCourse(one.getBusinessId(), one.getGiveUserId(), one.getId(), 1); + } else { + // 自己购买 + remoteAppUserService.addAppUserCourse(one.getBusinessId(), one.getAppUserId(), one.getId(), 2); + } + break; + case 3: + // 会员 + reason = "购买会员【" + one.getBuyContent() + "】"; + appUserWalletRecord.setChangeType(2); + break; + case 4: + // 充值 + reason = "充值"; + appUserWalletRecord.setChangeType(1); + break; + } + appUserWalletRecord.setReason(reason); + appUserWalletRecord.setAmount(one1.getPayAmount()); + appUserWalletRecord.setChildAppUserId(one.getAppUserId()); + appUserWalletRecord.setOrderId(one.getId()); + remoteAppUserService.addBalanceRecord(appUserWalletRecord); + } else { + switch (one.getOrderFrom()) { + case 2: + Course data2 = remoteCourseService.getCourseById(one.getBusinessId()).getData(); + // 增加用户与课程的关系表 + if (one.getGiveUserId() != null) { + remoteAppUserService.addAppUserCourse(one.getBusinessId(), one.getGiveUserId(), one.getId(), 1); + } else { + // 自己购买 + remoteAppUserService.addAppUserCourse(one.getBusinessId(), one.getAppUserId(), one.getId(), 2); + } + break; + case 3: + // 会员 + if (one.getBuyContent().contains("月")) { + + remoteAppUserService.addVipExpireTime(one.getAppUserId(), 1); + } else if (one.getBuyContent().contains("季")) { + remoteAppUserService.addVipExpireTime(one.getAppUserId(), 2); + } else if (one.getBuyContent().contains("年")) { + remoteAppUserService.addVipExpireTime(one.getAppUserId(), 3); + } + break; + case 4: + System.err.println("进入充值"); + remoteAppUserService.addBalance(one.getAppUserId(), one.getTotalAmount()); + AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord(); + appUserWalletRecord.setAppUserId(one.getAppUserId()); + appUserWalletRecord.setChangeType(1); + appUserWalletRecord.setReason("充值"); + appUserWalletRecord.setAmount(one.getTotalAmount()); + appUserWalletRecord.setChildAppUserId(one.getAppUserId()); + appUserWalletRecord.setOrderId(one.getId()); + remoteAppUserService.addBalanceRecord(appUserWalletRecord); + break; + } + } + } + return R.ok("支付成功"); + }else{ + return R.fail("未查询到订单信息"); + } + } else { + return R.fail("支付凭证receipt无效"); + } } @ResponseBody @PostMapping("/gvieCourse") -- Gitblit v1.7.1