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