• 苹果服务器退款通知处理notificationType为CONSUMPTION_REQUEST


    配置苹果服务器通知URL后

    在该API中获取苹果通知数据

    版本2(version 2 notification)的通知,版本二通知是jwt编码实现

    根据解码得到的notificationType

    以下主要是处理notificationType为 CONSUMPTION_REQUEST 时需要

    用户申请退款后,苹果通知服务器(类型:CONSUMPTION_REQUEST),我们需要提供用户的数据,以供协助“退款决策系统” 来判断可以给用户退款。

    提供用户数据 请求苹果服务器API文档 官方文档:Apple Developer Documentation

    API: https://api.storekit.itunes.apple.com/inApps/v1/transactions/consumption/

    具体请求:

    1. //参数
    2. $request_data = [
    3. 'accountTenure' => '',//用户账户的年龄
    4. 'appAccountToken' => '',
    5. 'consumptionStatus' => '',//消耗状态 0:不确定;1:没消耗;2:部分消耗;3:完全消耗
    6. 'customerConsented' => true,//用户是否同意提供消费数据 true:同意
    7. 'deliveryStatus' => 0,//应用是否成功交付了正常运行的应用内购买
    8. 'lifetimeDollarsPurchased' => '',//计算用户所有充值的总金额
    9. 'lifetimeDollarsRefunded' => '',//计算用户所有退款的总金额
    10. 'platform' => 1,
    11. 'playTime' => 0,
    12. 'sampleContentProvided' => false,
    13. 'userStatus' => 1,
    14. ];
    15. $url = 'https://api.storekit.itunes.apple.com/inApps/v1/transactions/consumption/'.{originalTransactionId};
    16. $ch = curl_init($url);
    17. $data_query = json_encode($request_data);
    18. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    19. curl_setopt($ch, CURLOPT_HEADER, true);
    20. $token = $apple_jwt_token;
    21. if(!$token)
    22. {
    23. return;
    24. }
    25. $header = [
    26. "Authorization: Bearer $token",
    27. "Content-Type: application/json",
    28. ];
    29. curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
    30. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    31. curl_setopt($ch, CURLOPT_POSTFIELDS, $data_query);
    32. curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    33. $response = curl_exec($ch);
    34. // var_dump($response);
    35. //Response Codes 202 Accepted 视为请求成功
    36. if ($response === false){
    37. }
    38. curl_close($ch);
    39. return $response;

    apple_jwt_token 需要获取Jwt 签名 的token;用python 获取

    1. import time, jwt
    2. # 1.JWT header
    3. header = {
    4. "alg": "ES256",
    5. "kid": "", # Apple Store 密钥Id
    6. "typ": "JWT"
    7. }
    8. # 2.JWT payload
    9. payload = {
    10. "iss": "", # Apple Store iss-id
    11. "iat": int(time.time()),
    12. "exp": int(time.time()) + 60*60,
    13. "aud": "appstoreconnect-v1",
    14. "bid": "" # Apple Store bid-id
    15. }
    16. # AuthKey_XXXXX.p8 为 Apple Store 密钥 Id 关联的私钥对令牌
    17. privatekey = open('./AuthKey_XXXXX.p8', 'r').read()
    18. # 3. JWT Token
    19. token = jwt.encode(payload, privatekey, algorithm='ES256', headers=header)
    20. return token

    参考文档 苹果 iOS 内购三步曲:App 内退款、历史订单查询、绑定用户防掉单-技术圈

  • 相关阅读:
    Leecode热题100中图论章节 200. 岛屿数量 994. 腐烂的橘子 207. 课程表 208. 实现 Trie (前缀树)
    [yolov5] yolo的数据标签格式
    wchar_t* argv[] 数组赋值
    Flutter 中的 ButtonBarTheme 小部件:全面指南
    rocketmq
    Java SE 19 新增特性
    Redis源码与设计剖析 -- 10.列表对象
    C++语言的广泛应用领域
    微服务拆分的思考
    界面组件Telerik UI for WPF入门指南 - 如何使用主题切换自定义样式
  • 原文地址:https://blog.csdn.net/ljwaheng/article/details/126013374