### 苹果支付是前段发起支付,后端只负责接收 ``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 | 取消购买的日期 |