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)