<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## Ios蘋果支付流程: 1. 客戶端先從蘋果獲取內購Id。 2. 客戶端將內購id,金額、用戶id等傳給服務端獲取一個自己服務端生成的訂單號。 3. 客戶端向蘋果發起支付。 4. 支付成功后,客戶端從本地拿支付憑證、將支付憑證和訂單號、用戶id等參數傳給服務端;服務端拿支付憑證向蘋果發起驗證訂單是否有效,然后將結果反饋給客戶端。 5. 客戶端刷新用戶個人信息。 ## 代碼 ~~~ Copy Highlighter-hljs/** * 服務器二次驗證代碼 * @param $receipt * @param bool $isSandbox * @return array|void * @throws \Exception */ function getReceiptData($receipt, $isSandbox = false) { if ($isSandbox) { $endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt'; } else { $endpoint = 'https://buy.itunes.apple.com/verifyReceipt'; } //$receipt = str_replace(' ',"+", $receipt); $postData = json_encode(["receipt-data" => $receipt]); //$postData = '{"receipt-data":"'. $receipt .'"}'; BLog::pay("蘋果支付:postData:$postData"); $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) { return [ 'result' => false, 'txtMessage' => $errmsg, ]; } $data = json_decode($response); BLog::pay("蘋果支付:response:$response"); //此處是看到先人們的指導,又看到apple的官方說法改的。否則會審核不過貌似是審核也會走沙盒測試者, //此處先判斷一次返回的status是否=21007 這數據是從測試環境,但它發送到生產環境中進行驗證。它發送到測試環境來代替。 if ($data->status == 21007) { $this->getReceiptData($receipt, true); return; } //判斷返回的數據是否是對象 if (!is_object($data)) { throw new \Exception('Invalid response data'); } //判斷購買時候成功 if (!isset($data->status) || $data->status != 0) { throw new \Exception('Invalid receipt'); } //返回產品的信息 return (array)$data->receipt; } /** * ios 支付驗證 * @param $allData * @return array|string */ public function iosIAPPay($allData) { $receiptData = $allData['receiptData']; //獲取 App 發送過來的數據,設置時候是沙盒狀態 $receipt = $receiptData; $isSandbox = true; if ('server' == APP_ENV) { $isSandbox = false; } //開始執行驗證 try { $info = $this->getReceiptData($receipt, $isSandbox); $package_name = $info['bid'] ?? ""; if (!$package_name) { $package_name = $info['bundle_id'] ?? ""; } if (!$package_name) { return [ 'result' => false, 'txtMessage' => 'bid或bundle_id缺失', ]; } $product_id = $info['product_id'] ?? ""; if (!$product_id) { $product_id = $info['in_app'][0]->product_id ?? ""; } if (!$product_id) { return [ 'result' => false, 'txtMessage' => 'product_id缺失', ]; } $transaction_id = $info['transaction_id'] ?? ""; if (!$transaction_id) { $transaction_id = $info['in_app'][0]->transaction_id ?? ""; } if (!$transaction_id) { return [ 'result' => false, 'txtMessage' => 'transaction_id缺失', ]; } $productInfo = DB::table('ios_payment_config') ->where('package_name', $package_name) ->where('product_id', $product_id) ->first(); if (!$productInfo) { BLog::pay("蘋果支付:無該產品:" . json_encode($info)); return [ 'result' => false, 'txtMessage' => '無該產品', ]; } $user_open_id = $info['download_id'] ?? ""; $res = $this->doPay($allData['userId'], $allData['orderId'], $transaction_id, $user_open_id); BLog::pay("蘋果支付:支付結果:" . json_encode($info) . json_encode($res)); return $res; } catch (\Exception $e) { return [ 'result' => false, 'txtMessage' => $e->getMessage(), ]; } } ~~~ ## 常見錯誤碼[#](https://www.cnblogs.com/HappyTeemo/p/17148081.html#1809386724) ~~~ Copy Highlighter-hljs/** * 21000 App Store不能讀取你提供的JSON對象 * 21002 receipt-data域的數據有問題 * 21003 receipt無法通過驗證 * 21004 提供的shared secret不匹配你賬號中的shared secret * 21005 receipt服務器當前不可用 * 21006 receipt合法,但是訂閱已過期。服務器接收到這個狀態碼時,receipt數據仍然會解碼并一起發送 * 21007 receipt是Sandbox receipt,但卻發送至生產系統的驗證服務 * 21008 receipt是生產receipt,但卻發送至Sandbox環境的驗證服務 */ ~~~ ## 遇到的坑[#](https://www.cnblogs.com/HappyTeemo/p/17148081.html#2188813096) ### 回包結構的修改[#](https://www.cnblogs.com/HappyTeemo/p/17148081.html#1732782073) [https://www.cnblogs.com/HappyTeemo/p/17221209.html](https://www.cnblogs.com/HappyTeemo/p/17221209.html) 新結構: ~~~ Copy Highlighter-hljs { "receipt": { "receipt_type": "ProductionSandbox", "adam_id": 0, "app_item_id": 0, "bundle_id": "申請蘋果支付時的串號 固定的值", "application_version": "24", "download_id": 0, "version_external_identifier": 0, "receipt_creation_date": "2022-************Etc/GMT", "receipt_creation_date_ms": "1643************000", "receipt_creation_date_pst": "2022-0a************/Los_Angeles", "request_date": "2022-02-2************Etc/GMT", "request_date_ms": "164************7", "request_date_pst": "2022-************ngeles", "original_purchase_date": "201************tc/GMT", "original_purchase_date_ms": "13************00", "original_purchase_date_pst": "2013************geles", "original_application_version": "1.0", "in_app": [ //變成了數組 { "quantity": "1", "product_id": "10000",#產品ID "transaction_id": "", ##交易單號 "original_transaction_id": "", "purchase_date": "2022************Etc/GMT", "purchase_date_ms": "164************0", "purchase_date_pst": "2022-************les", "original_purchase_date": "2022************GMT", "original_purchase_date_ms": "164************0", "original_purchase_date_pst": "202************les", "is_trial_period": "false", "in_app_ownership_type": "PURCHASED"#交易狀態 }, { "quantity": "1", "product_id": "10000",#產品ID "transaction_id": "", ##交易單號 "original_transaction_id": "", "purchase_date": "2022************Etc/GMT", "purchase_date_ms": "164************0", "purchase_date_pst": "2022-************les", "original_purchase_date": "2022************GMT", "original_purchase_date_ms": "164************0", "original_purchase_date_pst": "202************les", "is_trial_period": "false", "in_app_ownership_type": "PURCHASED"#交易狀態 }, ] }, "environment": "Sandbox", //環境 "status": 0 } ~~~ 老版本是一個一維數組,沒有in\_app ### post請求的坑,報21003[#](https://www.cnblogs.com/HappyTeemo/p/17148081.html#4042212618) * 第一種,有空格,使用字符串替換 ~~~ Copy Highlighter-hljs$receipt = str_replace(' ',"+", $receipt); ~~~ * 第二種,json不對,直接拼字符串,不要json\_encode ~~~ Copy Highlighter-hljs$postData = '{"receipt-data":"'. $receipt .'"}'; ~~~ * 第三種,蘋果那邊的問題,什么都沒改,第一天好的,第二天報錯(沙盒報錯,線上好的),第三天好了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看