Springboot之苹果内购支付

本文解析了苹果支付的具体实现过程,对比微信和支付宝支付流程,详细介绍了客户端如何通过交易凭证完成苹果内购验证,并进行后续业务操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class ApplePayment extends BasePayment {
    private static final Logger log = LoggerFactory.getLogger(ApplePayment.class);
    /**
     * 沙箱url
     */
    private final String SAND_BOX_URL = "https://sandbox.itunes.apple.com/verifyReceipt";
    /**
     * 正式URL
     */
    private final String OFFICAL_URL = "https://buy.itunes.apple.com/verifyReceipt";
    @Resource
    ProducerBean producerBean;
    @Autowired
    RocketMqConfig rocketMqConfig;

    @Override
    public PayContext createContext(BaseRequest request) {
        return null;
    }

    @Override
    public void preProcess(BaseRequest request, PayContext context) {

    }

    @Override
    public BaseResponse coreProcess(BaseRequest request, PayContext context) {
        /**
         * 苹果支付只返回订单编号
         */
        PaymentRequest req = (PaymentRequest) request;
        ApplePayResponse response = new ApplePayResponse();
        response.setOrderSn(req.getPaymentSn());
        return response;
    }

    @Override
    public void afterProcess() {

    }

    @Override
    public String getPayChannel() {
        return PayChannelEnum.APPLE_PAY.name();
    }

    @Override
    public PaymentResponse refund(BaseRequest request) {
        return null;
    }

    @Override
    public BaseResponse completePayment(BaseRequest request) {
        ApplePayNotifyRequest req = (ApplePayNotifyRequest) request;
        String orderSn = req.getOrderSn();
        String receiptData = req.getReceiptData();
        JSONObject jsonObject = new JSONObject();
        //ios会得到一个字节流,然后 base64
        //receiptData: 客户端返回的base64
        jsonObject.put("receipt-data", receiptData);
        String result = HttpClientUtils.httpPost(OFFICAL_URL, jsonObject.toJSONString());

        JSONObject res = JSON.parseObject(result);
        if ((int) res.get("status") == 21007) {
            result = HttpClientUtils.httpPost(SAND_BOX_URL, jsonObject.toJSONString());
            res = JSON.parseObject(result);
        }
        if ((int) res.get("status") != 0) {
            throw new BaseException(PayExceptionEnum.APPLE_VERIFY_FAIL);
        }
        String receiptJson = res.getString("receipt");
        JSONObject receipt = JSON.parseObject(receiptJson);
        JSONArray array = receipt.getJSONArray("in_app");
        String tradeNo ="";
        for (int i = 0; i < array.size(); i++) {
            JSONObject targetOrder = (JSONObject) array.get(i);
            tradeNo = targetOrder.getString("transaction_id");
        }
        PayNotifyResponse response = new PayNotifyResponse();
        //TODO::发送消息执行更新订单相关信息
        NotifyOrder notifyOrder = new NotifyOrder();
        notifyOrder.setOrderSn(orderSn);
        notifyOrder.setTradeNo(tradeNo);
        log.info("苹果支付发送消息:[{}]", JSON.toJSONString(notifyOrder));
        Message message = new Message(rocketMqConfig.getTopic(), rocketMqConfig.getTag(), "", JSON.toJSONBytes(notifyOrder));
        SendResult sendResult = producerBean.send(message);
        log.info("苹果支付发送消息成功[{}],[{}]", sendResult.getMessageId(), sendResult.getTopic());
        response.setBody("SUCCESS");
        return response;
    }
}

苹果内购和微信、支付宝支付流程有所不同。
微信和支付宝都是通过各自的统一下单接口,拿到客户端所要的参数,之后返回给客户端,客户端支付完成进行回调并进行业务操作。
苹果内购是客户端直接支付完成之后通过客户端传过来的交易凭证(base64字符串),进行服务端苹果内购校验并进行业务操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值