Java服务端接入苹果实现VIP自动续费。实现票据二次校验、配置接收通知

1. 简介

Java服务端接入苹果实现VIP自动续费。

2. 获取支付票据

由前端完成付款操作后,苹果会返回票据给前端,再由前端传给后端进行业务处理。后端需要携带票据信息和秘钥向苹果进行二次票据验证,验证成功后可继续进行剩余的业务逻辑。

3. 票据验证

票据是苹果将支付的相关信息,整理成了一个json返回给我们。里面包含比较常用的一些数据段是商品ID、支付时间、苹果的订单ID(transactionId),以及自动订阅商品的优惠政策、过期时间、续订时间等。
苹果有两个票据校验的接口,一个是沙盒环境,一个是正式环境。在测试阶段和上线后需要用不同的接口去校验。正式票据到沙盒环境校验会报 (21007) 的错误码。

注意:必须要传输 ”共享密钥” 和 ”票据” 参数,共享密钥可在APP Store中获取。

官方文接口文档:
https://developer.apple.com/documentation/appstorereceipts/verifyreceipt
https://developer.apple.com/documentation/appstorereceipts/requestbody

4. 服务端验证票据

4.1 验证票据

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.yizu.wnxs.beans.Vip_user;
import com.yizu.wnxs.mapper.UserMapper;
import com.yizu.wnxs.service.ApplePayService;
import com.yizu.wnxs.utils.IosVerifyUtil;
import com.yizu.wnxs.utils.ResultsUtil;
import lombok.extern.log4j.Log4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.*;


/**
 * @ClassName ApplePayController
 * @Description TODO
 * @Author dengyuehang_plus
 * @Date 2022/9/21 17:45
 * @Version 1.0
 **/
@Log4j
@RestController
@RequestMapping("/iphone")
public class ApplePayController {

    /**
     * 苹果内购交易ID
     * @param transactionId 苹果内购交易ID
     * @param payload 校验体(base64字符串)
     * @return ResultsUtil 返回给前端的工具类
     */
    @PostMapping("/iphones")
    @ResponseBody
    public ResultsUtil iosPay(String transactionId, String payload) {
        log.info("苹果内购校验开始,交易ID:" + transactionId + " base64校验体:" + payload);
//        Shipper shipper = getLoginShipper();
//        if (shipper == null) {
//            return failure("未登录");
//        }
        ResultsUtil resultsUtil = new ResultsUtil();
        //线上环境验证
        String verifyResult = IosVerifyUtil.buyAppVerify(payload, 1);
        if (verifyResult == null) {
            resultsUtil.setMsg("苹果验证失败,返回数据为空");
            return resultsUtil;
        } else {
            log.info("线上,苹果平台返回JSON:" + verifyResult);
            JSONObject appleReturn = JSONObject.parseObject(verifyResult);
            String states = appleReturn.getString("status");
            //无数据则沙箱环境验证
            if ("21007".equals(states)) {
                verifyResult = IosVerifyUtil.buyAppVerify(payload, 0);
                log.info("沙盒环境,苹果平台返回JSON:" + verifyResult)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用Java中的Socket和InputStream来实现HTTP服务端接收16进制数据。下面是一个简单的示例代码: ```java import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class HttpServer { public static void main(String[] args) { int port = 8080; // 设置监听端口 try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("服务器已启动,正在监听端口 " + port + "..."); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("接收到来自客户端 " + clientSocket.getInetAddress() + " 的连接"); // 读取客户端发送的数据 try (InputStream inputStream = clientSocket.getInputStream()) { byte[] buffer = new byte[1024]; int bytesRead; StringBuilder hexData = new StringBuilder(); while ((bytesRead = inputStream.read(buffer)) != -1) { // 将字节数据转换为16进制字符串 for (int i = 0; i < bytesRead; i++) { hexData.append(String.format("%02X ", buffer[i])); } // 可以在此处进行处理接收到的16进制数据 } System.out.println("接收到的16进制数据:" + hexData.toString()); } catch (IOException e) { e.printStackTrace(); } clientSocket.close(); System.out.println("与客户端的连接已关闭"); } } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们使用`ServerSocket`监听指定端口,并通过`accept()`方法接受客户端的连接。然后,我们使用`getInputStream()`方法从客户端`Socket`中获取输入流,并读取客户端发送的数据。读取到的字节数据会被转换为16进制字符串,并可以在适当的位置对接收到的16进制数据进行处理。 请注意,这只是一个简单的示例代码,真实场景中可能需要更复杂的处理逻辑和错误处理。另外,该示例只处理了一读取的数据,如果要处理多读取,可以在循环中继续处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值