苹果内购之PHP服务器端验证

本文详细解析了苹果内购流程,包括前端支付凭证的验证、服务器请求苹果服务器的步骤及注意事项,强调了product_id和bundle_id的重要性,以防凭证被篡改。

针对苹果内购,看了 大量的 其他blog和阅读官方文档才发现,其实 苹果内购服务器做的工作很少,

基本上所有的 操作都可以再前端完成操作,包括对支付凭证的验证,但是如果在客户端验证凭证可能存在被篡改的危险,

服务器去重验证和加款,是建立在 用户已经在前端支付成功,然后由ios会得到一个字节流,然后 base64后转给 后台。

后台通过这个字符串 去请求苹果的服务器,然后得到一个json字符串去给用户加款,其中注意事项为

//沙箱static final String testUrl = "https://sandbox.itunes.apple.com/verifyReceipt";
//正式 static final String product =  "https://buy.itunes.apple.com/verifyReceipt";

请求苹果地址 返回的 内容为

conten-type = application/json

请求的苹果的内容为String param = "{\"receipt-data\":\""+客户端返回的base64+"\"}";

{
    "receipt": {
        "receipt_type": "ProductionSandbox",
        "adam_id": 0,
        "app_item_id": 0,
        "bundle_id": "com.rtjk.xshl",//当前的产品的包名,一定要验证返回的包名和此包名要一致
        "application_version": "2018101001",
        "download_id": 0,
        "version_external_identifier": 0,
        "receipt_creation_date": "2018-10-19 10:50:48 Etc/GMT",
        "receipt_creation_date_ms": "1539946248000",
        "receipt_creation_date_pst": "2018-10-19 03:50:48 America/Los_Angeles",
        "request_date": "2018-10-31 01:58:21 Etc/GMT",
        "request_date_ms": "1540951101844",
        "request_date_pst": "2018-10-30 18:58:21 America/Los_Angeles",
        "original_purchase_date": "2013-08-01 07:00:00 Etc/GMT",
        "original_purchase_date_ms": "1375340400000",
        "original_purchase_date_pst": "2013-08-01 00:00:00 America/Los_Angeles",
        "original_application_version": "1.0",
        "in_app": [
            {
                "quantity": "1",
                "product_id": "6hongliao",//对应产品id,自己做一个金额的映射就行,对应到具体的金额,建议命名要规则
                "transaction_id": "1000000460004095",//一定要进行去重验证,一个订单号只能加一次款
                "original_transaction_id": "1000000460004095",
                "purchase_date": "2018-10-19 10:50:48 Etc/GMT",
                "purchase_date_ms": "1539946248000",
                "purchase_date_pst": "2018-10-19 03:50:48 America/Los_Angeles",
                "original_purchase_date": "2018-10-19 10:50:48 Etc/GMT",
                "original_purchase_date_ms": "1539946248000",
                "original_purchase_date_pst": "2018-10-19 03:50:48 America/Los_Angeles",
                "is_trial_period": "false"
            }
        ]
    },
    "status": 0, //表示当前请求返回正常
    "environment": "Sandbox"
}

 

为什么要做 product_id,bundle_id,因为 客户端传递过来的 凭证,是不可信的,有可能是别人篡改后的结果。

比如,他们有个自己的内购,我们把这个凭证发到苹果是可以拿到返回结果的,但是 product_id,bundle_id没办法一样。
 

苹果验证的流程和方法如下: ### 苹果流程 1. **选择商品或服务**:用户在APP中选择想要买的商品或服务。 2. **确认支付并调用接口创建订单记录**:用户确认支付后,APP调用接口在服务器端创建订单记录。 3. **调起APP内苹果支付并进行买支付流程**:APP调起苹果支付,用户完成支付操作。 4. **向服务器发起验证凭证以及支付结果的请求**:支付完成后,APP将支付凭证发送到服务器,服务器对凭证进行验证,并获取支付结果[^1]。 ### 服务端处理流程 1. **创建订单记录**:在用户确认支付时,服务器创建订单记录,用于跟踪和管理订单信息。 2. **验证票据**:服务器接收到APP发送的支付凭证后,需要向苹果服务器发送验证请求。苹果提供了两个验证URL,一个用于沙箱环境,另一个用于正式环境: - 沙箱环境:`https://sandbox.itunes.apple.com/verifyReceipt` - 正式环境:`https://buy.itunes.apple.com/verifyReceipt` [^3] ### 验证方法示例(以PHP为例) 以下是一个简单的PHP示例代码,用于向苹果服务器发送验证请求: ```php <?php // 支付凭证 $receipt_data = 'your_receipt_data'; // 验证URL,根据环境选择 $verify_url = 'https://sandbox.itunes.apple.com/verifyReceipt'; // 构建请求数据 $post_data = json_encode(array( 'receipt-data' => $receipt_data )); // 初始化curl $ch = curl_init($verify_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // 执行请求 $response = curl_exec($ch); curl_close($ch); // 解析响应 $response_data = json_decode($response, true); // 处理验证结果 if ($response_data['status'] == 0) { // 验证成功 echo "验证成功"; } else { // 验证失败 echo "验证失败,状态码: " . $response_data['status']; } ?> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值