当前位置: 首页 > news >正文

苹果内购支付 Java 接口

 支付流程,APP支付成功后 前端调用后端接口,后端接口将前端支付成功后拿到的凭据传给苹果服务器检查,如果接口返回成功了,就视为支付。

代码,productId就是苹果开发者后台提前设置好的 产品id

    public CommonResult<String> appleRecharge(AppleRechargeVo request) {
        String receipt = request.getReceipt();
        String orderId = request.getOrderId();

        log.info("receipt -- {}", receipt);
        log.info("orderId -- {}", orderId);

        // 构造 Apple 验证请求体
        JSONObject body = new JSONObject();
        body.put("receipt-data", receipt);
        // body.put("password", "你的共享密钥(可选,用于自动订阅)");

        // 先请求正式环境
        String response = HttpUtil.post("https://buy.itunes.apple.com/verifyReceipt", body.toJSONString());

        JSONObject jsonResponse = JSONObject.parseObject(response);

        // 状态码为21007时说明是沙盒订单
        if ("21007".equals(jsonResponse.getString("status"))) {
            response = HttpUtil.post("https://sandbox.itunes.apple.com/verifyReceipt", body.toJSONString());
            jsonResponse = JSONObject.parseObject(response);
        }

        log.info("APPLE 接口返回值 -- {}", response);


        // 根据验证状态处理逻辑
        if (0 == jsonResponse.getInteger("status")) {
            // log.info("状态成功!!!");

            // 验证成功,做后续订单处理

            // 取出 in_app 数组
            JSONArray inAppArray = jsonResponse
                    .getJSONObject("receipt")
                    .getJSONArray("in_app");
            // log.info("inAppArray !!!{}", inAppArray);

            if (inAppArray != null && !inAppArray.isEmpty()) {
                JSONObject firstPurchase = inAppArray.getJSONObject(0);
                String productId = firstPurchase.getString("product_id");
                String transactionId = firstPurchase.getString("transaction_id");

                log.info("productId !!!{}", productId);
                log.info("transactionId !!!{}", transactionId);

                BigDecimal amount = null;

                switch (productId) {
                    case "xxxx":
                        amount = new BigDecimal("7");
                        break;
                    case "xxxxx":
                        amount = new BigDecimal("70");
                        break;
                    case "xxxxx":
                        amount = new BigDecimal("140");
                        break;
                    case "sdsad":
                        amount = new BigDecimal("350");
                        break;
                    case "132":
                        amount = new BigDecimal("700");
                        break;
                    case "sdsds":
                        amount = new BigDecimal("1400");
                        break;
                }


                // 加余额
                if (amount != null) {
                    Long userId = LoginUtil.getUserId();
                    if (userId != null) {
                        // 加余额
                        userMapper.update(null, Wrappers.<User>lambdaUpdate()
                                .setSql("amount = amount +" + amount)
                                .eq(User::getId, userId));

                        // 增加充值记录
                        UserWalletRecord userWalletRecord = new UserWalletRecord();
                        userWalletRecord.setUserId(userId);
                        userWalletRecord.setTitle("APP充值");
                        userWalletRecord.setAmount(amount);
                        userWalletRecord.setType("1");
                        userWalletRecordMapper.insert(userWalletRecord);
                    }
                }
            }

            return CommonResult.ok("支付成功");
        } else {
            return CommonResult.ok("验证失败");
        }
    }

相关文章:

  • 蓝桥杯:日期统计
  • 基于STM32、HAL库的CH224K 快充协议芯片简介及驱动程序设计
  • AI平台如何实现推理?数算岛是一个开源的AI平台(主要用于管理和调度分布式AI训练和推理任务。)
  • 【Java设计模式】第7章 建造者模式讲解
  • class与构造函数
  • Podman配置
  • AI在未来会不会代替人工???
  • Redis中AOF的实现方式和AOF重写
  • 运动规划实战案例 | 基于可视图的路径规划算法(附ROS C++/Python仿真)
  • 动态列表的数据渲染、新增、编辑等功能开发及数据处理
  • MySQL安装与基础配置(Windows版以及linux版)
  • RISCV GCC 4 后端优化
  • 国产数据库 YanshanDB 和 达梦数据库 的选型
  • PHP MySQL 创建数据库
  • 4S店汽车维修保养管理系统 (源码+lw+部署文档+讲解),源码可白嫖!
  • Spring MVC 操作会话属性详解(@SessionAttributes 与 @SessionAttribute)
  • 第二十五章:Python-pyecharts 库实现 3D 地图绘制
  • css单位
  • 通信协议详解(十):PSI5 —— 汽车安全传感器的“抗干扰狙击手”
  • el-input 中 select 方法使用报错:属性“select”在类型“HTMLElement”上不存在
  • 工程项目建设网站/上海百度推广排名优化
  • 域名主机 网站建设/百度的官方网站
  • 免费装修效果图网站/seo查询排名软件
  • 柳州网站建设优化推广/营销型网页设计
  • 如何手机做任务赚钱的网站/百度竞价可以自学吗
  • 用爱站工具包如何做网站地图/下载百度极速版