苹果支付php相关代码,苹果支付 · fastadmin常用 · 看云

### 苹果支付是前段发起支付,后端只负责接收 ``transactionReceipt``数据然后进行验证和后台操作

写入public下的pay.log日志

```

public function test(){

$data = file_get_contents("php://input");

$data = json_encode($_POST);

file_put_contents("pay.log",date('Y-m-d H:i:s')." ". $data.PHP_EOL,FILE_APPEND);

}

```

发起测试

```

public function test(){

// data是 `transactionReceipt` 的数据

$data = 'ewoJInNpZ25hdHVyZSIgPSAiQTBYZmNYMitCb25GSGlQb05CUHlRcy91czB0TERhT3Q0SldPbzhzM3BnRUplWisyTzJ5TURIVGtOYkdQMGVmL1pPMSs5SklHaVl5bnNyem4xaEZRWjgrbWdEM3BFRXFCTER4ek11alVtS1ovMHZjVFgvOWhaMmt3cCtVZENNV3VkSk5qQXdSZVhVS2tRaW9iRkJhUkQ3L09GSTIvZFpEQ0EyL2VZMHFjaitmSGYrRmJEU0E3Vnd3ZXhiZ2QwcFFCWEduVTBoMWYyWEtjek8zMTYxOVN4Qk81TmVWODVaZy9UZVpKeFh6Q0JUNnZzMlJpY0FkQ04xb21WaTJaZTB6aUsydTJoQmpKOWtkUm5QQWRsMkJNOGI5N2U2L0Z0R1VIVEx5OHArWUwrcEMrdUlWRlo2Yk85MHRxV3k2T1ZGU281c0lFenZKTUZEZWZhZEd5OU5EdjJuMEFBQVdBTUlJRmZEQ0NCR1NnQXdJQkFnSUlEdXRYaCtlZUNZMHdEUVlKS29aSWh2Y05BUUVGQlFBd2daWXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1Td3dLZ1lEVlFRTERDTkJjSEJzWlNCWGIzSnNaSGRwWkdVZ1JHVjJaV3h2Y0dWeUlGSmxiR0YwYVc5dWN6RkVNRUlHQTFVRUF3dzdRWEJ3YkdVZ1YyOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVFV4TVRFek1ESXhOVEE1V2hjTk1qTXdNakEzTWpFME9EUTNXakNCaVRFM01EVUdBMVVFQXd3dVRXRmpJRUZ3Y0NCVGRHOXlaU0JoYm1RZ2FWUjFibVZ6SUZOMGIzSmxJRkpsWTJWcGNIUWdVMmxuYm1sdVp6RXNNQ29HQTFVRUN3d2pRWEJ3YkdVZ1YyOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTXhFekFSQmdOVkJBb01Da0Z3Y0d4bElFbHVZeTR4Q3pBSkJnTlZCQVlUQWxWVE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcGMrQi9TV2lnVnZXaCswajJqTWNqdUlqd0tYRUpzczl4cC9zU2cxVmh2K2tBdGVYeWpsVWJYMS9zbFFZbmNRc1VuR09aSHVDem9tNlNkWUk1YlNJY2M4L1cwWXV4c1FkdUFPcFdLSUVQaUY0MWR1MzBJNFNqWU5NV3lwb041UEM4cjBleE5LaERFcFlVcXNTNCszZEg1Z1ZrRFV0d3N3U3lvMUlnZmRZZUZScjZJd3hOaDlLQmd4SFZQTTNrTGl5a29sOVg2U0ZTdUhBbk9DNnBMdUNsMlAwSzVQQi9UNXZ5c0gxUEttUFVockFKUXAyRHQ3K21mNy93bXYxVzE2c2MxRkpDRmFKekVPUXpJNkJBdENnbDdaY3NhRnBhWWVRRUdnbUpqbTRIUkJ6c0FwZHhYUFEzM1k3MkMzWmlCN2o3QWZQNG83UTAvb21WWUh2NGdOSkl3SURBUUFCbzRJQjF6Q0NBZE13UHdZSUt3WUJCUVVIQVFFRU16QXhNQzhHQ0NzR0FRVUZCekFCaGlOb2RIUndPaTh2YjJOemNDNWhjSEJzWlM1amIyMHZiMk56Y0RBekxYZDNaSEl3TkRBZEJnTlZIUTRFRmdRVWthU2MvTVIydDUrZ2l2Uk45WTgyWGUwckJJVXdEQVlEVlIwVEFRSC9CQUl3QURBZkJnTlZIU01FR0RBV2dCU0lKeGNKcWJZWVlJdnM2N3IyUjFuRlVsU2p0ekNDQVI0R0ExVWRJQVNDQVJVd2dnRVJNSUlCRFFZS0tvWklodmRqWkFVR0FUQ0IvakNCd3dZSUt3WUJCUVVIQWdJd2diWU1nYk5TWld4cFlXNWpaU0J2YmlCMGFHbHpJR05sY25ScFptbGpZWFJsSUdKNUlHRnVlU0J3WVhKMGVTQmhjM04xYldWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElIUm9aVzRnWVhCd2JHbGpZV0pzWlNCemRHRnVaR0Z5WkNCMFpYSnRjeUJoYm1RZ1kyOXVaR2wwYVc5dWN5QnZaaUIxYzJVc0lHTmxjblJwWm1sallYUmxJSEJ2YkdsamVTQmhibVFnWTJWeWRHbG1hV05oZEdsdmJpQndjbUZqZEdsalpTQnpkR0YwWlcxbGJuUnpMakEyQmdnckJnRUZCUWNDQVJZcWFIUjBjRG92TDNkM2R5NWhjSEJzWlM1amIyMHZZMlZ5ZEdsbWFXTmhkR1ZoZFhSb2IzSnBkSGt2TUE0R0ExVWREd0VCL3dRRUF3SUhnREFRQmdvcWhraUc5Mk5rQmdzQkJBSUZBREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRGFZYjB5NDk0MXNyQjI1Q2xtelQ2SXhETUlKZjRGelJqYjY5RDcwYS9DV1MyNHlGdzRCWjMrUGkxeTRGRkt3TjI3YTQvdncxTG56THJSZHJqbjhmNUhlNXNXZVZ0Qk5lcGhtR2R2aGFJSlhuWTR3UGMvem83Y1lmcnBuNFpVaGNvT0FvT3NBUU55MjVvQVE1SDNPNXlBWDk4dDUvR2lvcWJpc0IvS0FnWE5ucmZTZW1NL2oxbU9DK1JOdXhUR2Y4YmdwUHllSUdxTktYODZlT2ExR2lXb1IxWmRFV0JHTGp3Vi8xQ0tuUGFObVNBTW5CakxQNGpRQmt1bGhnd0h5dmozWEthYmxiS3RZZGFHNllRdlZNcHpjWm04dzdISG9aUS9PamJiOUlZQVlNTnBJcjdONFl0UkhhTFNQUWp2eWdhWndYRzU2QWV6bEhSVEJoTDhjVHFBPT0iOwoJInB1cmNoYXNlLWluZm8iID0gImV3b0pJbTl5YVdkcGJtRnNMWEIxY21Ob1lYTmxMV1JoZEdVdGNITjBJaUE5SUNJeU1ESXhMVEF5TFRJNElEQXhPakV6T2pNNElFRnRaWEpwWTJFdlRHOXpYMEZ1WjJWc1pYTWlPd29KSW5WdWFYRjFaUzFwWkdWdWRHbG1hV1Z5SWlBOUlDSTNPVFk0WVdVNVptTXhNRGRpWXpVME56Qm1ZbUUxWmpBMlpUWXdOV1k0TlRobFpHSmpaVEpsSWpzS0NTSnZjbWxuYVc1aGJDMTBjbUZ1YzJGamRHbHZiaTFwWkNJZ1BTQWlNVEF3TURBd01EYzRNalkzTURRNE1pSTdDZ2tpWW5aeWN5SWdQU0FpTVRNM0lqc0tDU0owY21GdWMyRmpkR2x2YmkxcFpDSWdQU0FpTVRBd01EQXdNRGM0TWpZM01EUTRNaUk3Q2draWNYVmhiblJwZEhraUlEMGdJakVpT3dvSkltOXlhV2RwYm1Gc0xYQjFjbU5vWVhObExXUmhkR1V0YlhNaUlEMGdJakUyTVRRMU1ETTJNVGd3TURBaU93b0pJblZ1YVhGMVpTMTJaVzVrYjNJdGFXUmxiblJwWm1sbGNpSWdQU0FpUmpKQk1UYzRPREV0TmprMVJTMDBRamMwTFVGQk9ESXRSVFpDT1RrMk1FRTVPREZCSWpzS0NTSndjbTlrZFdOMExXbGtJaUE5SUNJeE1URTJJanNLQ1NKcGRHVnRMV2xrSWlBOUlDSXhOVFUxT0RFM01EY3lJanNLQ1NKaWFXUWlJRDBnSW1OdmJTNTZlbW91WW05MGRHeGxJanNLQ1NKcGN5MXBiaTFwYm5SeWJ5MXZabVpsY2kxd1pYSnBiMlFpSUQwZ0ltWmhiSE5sSWpzS0NTSndkWEpqYUdGelpTMWtZWFJsTFcxeklpQTlJQ0l4TmpFME5UQXpOakU0TURBd0lqc0tDU0p3ZFhKamFHRnpaUzFrWVhSbElpQTlJQ0l5TURJeExUQXlMVEk0SURBNU9qRXpPak00SUVWMFl5OUhUVlFpT3dvSkltbHpMWFJ5YVdGc0xYQmxjbWx2WkNJZ1BTQWlabUZzYzJVaU93b0pJbkIxY21Ob1lYTmxMV1JoZEdVdGNITjBJaUE5SUNJeU1ESXhMVEF5TFRJNElEQXhPakV6T2pNNElFRnRaWEpwWTJFdlRHOXpYMEZ1WjJWc1pYTWlPd29KSW05eWFXZHBibUZzTFhCMWNtTm9ZWE5sTFdSaGRHVWlJRDBnSWpJd01qRXRNREl0TWpnZ01EazZNVE02TXpnZ1JYUmpMMGROVkNJN0NuMD0iOwoJImVudmlyb25tZW50IiA9ICJTYW5kYm94IjsKCSJwb2QiID0gIjEwMCI7Cgkic2lnbmluZy1zdGF0dXMiID0gIjAiOwp9';

$res = $this->getReceiptData($data,true);

halt($res);

}

```

和苹果服务器进行验证

```

//去苹果服务器二次验证代码

public function getReceiptData($receipt, $isSandbox = false)

{

if ($isSandbox) {

$endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';//沙箱地址

} else {

$endpoint = 'https://buy.itunes.apple.com/verifyReceipt';//真实运营地址

}

$postData = json_encode(

array('receipt-data' => $receipt)

);

$ch = curl_init($endpoint);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_POST, true);

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //这两行一定要加,不加会报SSL 错误

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

$response = curl_exec($ch);

$errno = curl_errno($ch);

//$errmsg = curl_error($ch);

curl_close($ch);

if ($errno != 0) {//curl请求有错误

return [

'errNo' => 1,

'errMsg' => '请求超时,请稍后重试',

];

} else {

$data = json_decode($response, true);

if (!is_array($data)) {

return [

'errNo' => 2,

'errMsg' => '苹果返回数据有误,请稍后重试',

];

}

//判断购买时候成功

if (!isset($data['status']) || $data['status'] != 0) {

return [

'errNo' => 3,

'errMsg' => '购买失败',

];

}

//返回产品的信息

$order = $data['receipt'];

$order['errNo'] = 0;

return $order;

}

}

```

成功后返回的数据

```

array(2) {

["receipt"] => array(17) {

["original_purchase_date_pst"] => string(39) "2021-02-28 01:13:38 America/Los_Angeles"

["purchase_date_ms"] => string(13) "1614503618000"

["unique_identifier"] => string(40) "7968ae9fc107bc5470fba5f06e605f858edbce2e"

["original_transaction_id"] => string(16) "1000000782670482"

["bvrs"] => string(3) "137"

["transaction_id"] => string(16) "1000000782670482"

["quantity"] => string(1) "1"

["unique_vendor_identifier"] => string(36) "F2A17881-695E-4B74-AA82-E6B9960A981A"

["item_id"] => string(10) "1555817072"

["original_purchase_date"] => string(27) "2021-02-28 09:13:38 Etc/GMT"

["is_in_intro_offer_period"] => string(5) "false"

["product_id"] => string(4) "1116"

["purchase_date"] => string(27) "2021-02-28 09:13:38 Etc/GMT"

["is_trial_period"] => string(5) "false"

["purchase_date_pst"] => string(39) "2021-02-28 01:13:38 America/Los_Angeles"

["bid"] => string(14) "com.zzj.bottle"

["original_purchase_date_ms"] => string(13) "1614503618000"

}

["status"] => int(0)

}

```

| 字段 | 类型 | 描述 |

| --- | --- | --- |

| transaction\_id | integer | 交易号 |

| original\_transaction\_id | integer | 原始交易号 |

| product\_id | string | 商品标识符 |

| quantity | integer | 数量 |

| purchase\_date | string | 购买日期 |

| original\_purchase\_date | string | 原始购买日期 |

| purchase\_date\_ms | integer | 购买日期(ms) |

| original\_purchase\_date\_ms | integer | 原始购买日期(ms) |

| purchase\_date\_pst | string | 购买日期(pst) |

| original\_purchase\_date\_pst | string | 原始购买日期(pst) |

| cancellation\_date | string | 取消购买的日期 |

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于 FastAdmin 或者 ThinkPHP 的 iOS 支付代码,可以按照以下步骤进行: 1. 在苹果开发者中心创建 App ID,并开通 In-App Purchase 功能。 2. 在 Xcode 中创建一个新的 iOS 项目,并在项目设置中配置好 Bundle ID 和开发者账号。 3. 添加 StoreKit.framework 和 StoreKit 库文件到项目中。 4. 在代码中导入 StoreKit 框架,并实现 SKPaymentTransactionObserver 协议和 SKProductsRequestDelegate 协议。 5. 调用 SKProductsRequest 请求商品信息,并在回调中获取到商品信息。 6. 根据商品信息调用 SKPaymentQueue 发起支付请求,并在回调中处理支付结果。 以下是一个简单的示例代码: ```swift import UIKit import StoreKit class ViewController: UIViewController, SKPaymentTransactionObserver, SKProductsRequestDelegate { override func viewDidLoad() { super.viewDidLoad() // 监听支付状态 SKPaymentQueue.default().add(self) } // 请求商品信息 func requestProductsInfo() { let productIdentifiers = Set(["com.example.product1"]) let request = SKProductsRequest(productIdentifiers: productIdentifiers) request.delegate = self request.start() } // 获取商品信息回调 func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { if response.products.count > 0 { let product = response.products[0] let payment = SKPayment(product: product) SKPaymentQueue.default().add(payment) } } // 支付状态回调 func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction in transactions { switch transaction.transactionState { case .purchased: // 支付成功 SKPaymentQueue.default().finishTransaction(transaction) break case .failed: // 支付失败 SKPaymentQueue.default().finishTransaction(transaction) break case .restored: // 恢复购买 SKPaymentQueue.default().finishTransaction(transaction) break default: break } } } } ``` 这个示例代码中,通过实现 SKPaymentTransactionObserver 协议和 SKProductsRequestDelegate 协议,请求商品信息并发起支付请求,然后在支付状态回调中处理支付结果。需要注意的是,这个示例代码中的商品 ID 需要根据实际情况进行替换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值