Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产午夜小视频,国产综合久久久久影院,我想看一级毛片免费的

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          PHP如何支持CURL字符串證書傳輸 -

          PHP如何支持CURL字符串證書傳輸 ?

          最近在對(duì)接微信支付的時(shí)候,需要在退款處用到證書,由于我們是SAAS平臺(tái),要支持多方多渠道支付,如果把所有證書文件保存在應(yīng)用服務(wù)器會(huì)受到SLB的影響,會(huì)導(dǎo)致某臺(tái)機(jī)器文件不同步而阻礙退款流程,但把文件存在OSS的話,后端又要從OSS下載到應(yīng)用服務(wù)器來保證一致性。思來想去,最終決定將證書內(nèi)容保存在數(shù)據(jù)庫,不同客戶各對(duì)應(yīng)一份證書文件,無論幾臺(tái)機(jī)器做集群都能保證文件的一致性,同時(shí)也避免了多余的下載步驟。

          問題

          但是剛做就遇到了問題,PHP的CURL證書并不支持字符串的傳輸,只能填寫證書路徑(以下是官方的說法)

          1

          Client certificates must be specified by a path expression to a certificate store.

          解決過程

          我第一個(gè)想到的就是創(chuàng)建空白文件,將證書內(nèi)容寫進(jìn)去,等證書使用完畢后再將文件刪除,但是創(chuàng)建實(shí)體文件再刪除的操作消耗性能不說,還非常麻煩,有沒有創(chuàng)建臨時(shí)文件的方法呢?有,tmpfile()函數(shù)就可以幫我們創(chuàng)建臨時(shí)文件并拿到文件路徑,于是我寫了一個(gè)獲取臨時(shí)文件路徑的方法

          1

          2

          3

          4

          5

          6

          7

          8

          9

          <?php

          public function getTmpPathByContent($content)

          {

          $tmpFile=tmpfile();

          fwrite($tmpFile, $content);

          $tempPemPath=stream_get_meta_data($tmpFile);

          return $tempPemPath['uri']; ///tmp/phpXZCtAO

          }

          ?>

          比較悲哀的是,通過這個(gè)方法返回的路徑根本讀不到內(nèi)容,甚至一度以為是不是被騙了

          1

          file_get_contents(/tmp/phpyyiOZv): failed to open stream: No such file or directory

          看了官方文檔才找到原因,如果tmpfile()返回的句柄引用計(jì)數(shù)為0的話就會(huì)將臨時(shí)文件回收,臨時(shí)路徑自然也就失效了,顯然方法getTmpPathByContent()執(zhí)行完后,局部變量$tmpFile的生命周期就結(jié)束了(官方文檔如下)

          1

          The file is automatically removed when closed (for example, by calling fclose(), or when there are no remaining references to the file handle returned by tmpfile()), or when the script ends.

          確認(rèn)了根源,那我們現(xiàn)在亟需找到一個(gè)生命周期隨進(jìn)程結(jié)束而終止的變量類型來保存句柄,什么類型能滿足條件呢?靜態(tài)變量。靜態(tài)變量與局部變量不同的是,在PHP生命周期開始時(shí)便會(huì)為其分配內(nèi)存空間,并會(huì)把它存儲(chǔ)在全局變量區(qū)域,而全局變量是在模塊關(guān)閉階段銷毀的,這樣的話,聲明靜態(tài)變量就可以使$tmpFile引用計(jì)數(shù)持續(xù)保持大于0的狀態(tài),那我們的代碼就可以做出如下處理

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          <?php

          public function getTmpPathByContent($content)

          {

          static $tmpFile=null;

          $tmpFile=tmpfile();

          fwrite($tmpFile, $content);

          $tempPemPath=stream_get_meta_data($tmpFile);

          return $tempPemPath['uri'];

          }

          ?>

          再執(zhí)行一次就成功讀取了臨時(shí)文件的內(nèi)容

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          13

          14

          15

          16

          17

          18

          19

          20

          21

          22

          23

          24

          25

          26

          -----BEGIN CERTIFICATE-----

          MIIEbDCCA9WgAwIBAgIEAWJKHDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC

          Q04xEjAQBgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNV

          BAoTB1RlbmNlbnQxDDAKBgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEf

          MB0GCSqGSIb3DQEJARYQbW1wYXltY2hAdGVuY2VudDAeFw0xNzA4MDcwOTIxNDda

          Fw0yNzA4MDUwOTIxNDdaMIGbMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR3Vhbmdk

          b25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UEChMHVGVuY2VudDEOMAwGA1UE

          CxMFTU1QYXkxMDAuBgNVBAMUJ+a3seWcs+W4guaYjua6kOi9r+S7tuiCoeS7veac

          iemZkOWFrOWPuDERMA8GA1UEBBMIMTAyNTkyODEwggEiMA0GCSqGSIb3DQEBAQUA

          A4IBDwAwggEKAoIBAQDg2D3++uOxY/yMGQPBnROvyYimnCsfGE0dnqdGUTCykqBh

          yfv82zE1/St/4DQX2QDiIvLif+sMGcYwF4bkzdY+HgitYLI0k5o/5LCNZOMctuio

          kdYC2bNdWHq2y9S5UWLQR1Zvq+6QyPBVBVY9yq9xtQhIlUTsZnICAp3iQLfQUR3l

          aEdH9IERoRUIkbyb8oX5ONQz4P9jOeE9C5iwx0QrH4s01NFhkhr8JHlugRLpo9vA

          xGgi/48fOlONj6wWal5Gt0OvvEbIwgQwya15KBX2YeGnZvYBQa+lQMeXEqZSFie3

          G+wGvbtlONczQEtp+JDxLZLUS/FT7U0TQN/t8JDvAgMBAAGjggFGMIIBQjAJBgNV

          HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh0iQ0VTLUNBIEdlbmVyYXRlIENlcnRpZmlj

          YXRlIjAdBgNVHQ4EFgQUjDJ75bu3Roog7XOH6uFAdZ6kpcIwgb8GA1UdIwSBtzCB

          tIAUPgUm9iJitBVbiM1kfrDUYqflhnShgZCkgY0wgYoxCzAJBgNVBAYTAkNOMRIw

          EAYDVQQIEwlHdWFuZ2RvbmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdU

          ZW5jZW50MQwwCgYDVQQLEwNXWEcxEzARBgNVBAMTCk1tcGF5bWNoQ0ExHzAdBgkq

          hkiG9w0BCQEWEG1tcGF5bWNoQHRlbmNlbnSCCQC7VJcrvADoVzAOBgNVHQ8BAf8E

          BAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADgYEA

          ucJLJkkHxlqQCEapZOWmySutqNVZxFbqyG//UXxxpA/1yG4e+KmufKZWv+c+MtYI

          8i0KDDCv/UE+kkFIrHYDDKsdLRpxrYOUHGoqq0c7yBJ6Dimgy6m8U8FsEv3HtUR2

          8g5xrg2Tc5MPWEp9ncEw575hGk0CXLDGOkI1nU+pGqk=

          -----END CERTIFICATE-----

          下面就可以把生成的臨時(shí)文件地址設(shè)置到CURLOPT_SSLCERT了

          1

          2

          3

          4

          5

          <?php

          $sslCertPath=getTmpPathByContent($content);

          curl_setopt($ch,CURLOPT_SSLCERT, $sslCertPath);

          //......

          ?>

          以上就是PHP如何支持CURL字符串證書傳輸 ?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注其它相關(guān)文章!

          更多技巧請(qǐng)《轉(zhuǎn)發(fā) + 關(guān)注》哦!

          篇文章給大家?guī)淼膬?nèi)容是關(guān)于PHP支持CURL字符串證書傳輸?shù)姆椒ń榻B(代碼),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

          最近在對(duì)接微信支付的時(shí)候,需要在退款處用到證書,由于我們是SAAS平臺(tái),要支持多方多渠道支付,如果把所有證書文件保存在應(yīng)用服務(wù)器會(huì)受到SLB的影響,會(huì)導(dǎo)致某臺(tái)機(jī)器文件不同步而阻礙退款流程,但把文件存在OSS的話,后端又要從OSS下載到應(yīng)用服務(wù)器來保證一致性。思來想去,最終決定將證書內(nèi)容保存在數(shù)據(jù)庫,不同客戶各對(duì)應(yīng)一份證書文件,無論幾臺(tái)機(jī)器做集群都能保證文件的一致性,同時(shí)也避免了多余的下載步驟。

          問題

          但是剛做就遇到了問題,PHP的CURL證書并不支持字符串的傳輸,只能填寫證書路徑(以下是官方的說法)

          Client certificates must be specified by a path expression to a certificate store.

          解決過程

          我第一個(gè)想到的就是創(chuàng)建空白文件,將證書內(nèi)容寫進(jìn)去,等證書使用完畢后再將文件刪除,但是創(chuàng)建實(shí)體文件再刪除的操作消耗性能不說,還非常麻煩,有沒有創(chuàng)建臨時(shí)文件的方法呢?有,tmpfile()函數(shù)就可以幫我們創(chuàng)建臨時(shí)文件并拿到文件路徑,于是我寫了一個(gè)獲取臨時(shí)文件路徑的方法

          <?php

          public function getTmpPathByContent($content)

          {

          $tmpFile=tmpfile();

          fwrite($tmpFile, $content);

          $tempPemPath=stream_get_meta_data($tmpFile);

          return $tempPemPath['uri']; ///tmp/phpXZCtAO

          }

          ?>

          比較悲哀的是,通過這個(gè)方法返回的路徑根本讀不到內(nèi)容,甚至一度以為是不是被騙了

          file_get_contents(/tmp/phpyyiOZv): failed to open stream: No such file or directory

          看了官方文檔才找到原因,如果tmpfile()返回的句柄引用計(jì)數(shù)為0的話就會(huì)將臨時(shí)文件回收,臨時(shí)路徑自然也就失效了,顯然方法getTmpPathByContent()執(zhí)行完后,局部變量$tmpFile的生命周期就結(jié)束了(官方文檔如下)

          The file is automatically removed when closed (for example, by calling fclose(), or when there are no remaining references to the file handle returned by tmpfile()), or when the script ends.

          確認(rèn)了根源,那我們現(xiàn)在亟需找到一個(gè)生命周期隨進(jìn)程結(jié)束而終止的變量類型來保存句柄,什么類型能滿足條件呢?靜態(tài)變量。靜態(tài)變量與局部變量不同的是,在PHP生命周期開始時(shí)便會(huì)為其分配內(nèi)存空間,并會(huì)把它存儲(chǔ)在全局變量區(qū)域,而全局變量是在模塊關(guān)閉階段銷毀的,這樣的話,聲明靜態(tài)變量就可以使$tmpFile引用計(jì)數(shù)持續(xù)保持大于0的狀態(tài),那我們的代碼就可以做出如下處理

          <?php

          public function getTmpPathByContent($content)

          {

          static $tmpFile=null;

          $tmpFile=tmpfile();

          fwrite($tmpFile, $content);

          $tempPemPath=stream_get_meta_data($tmpFile);

          return $tempPemPath['uri'];

          }

          ?>

          再執(zhí)行一次就成功讀取了臨時(shí)文件的內(nèi)容

          -----BEGIN CERTIFICATE-----

          MIIEbDCCA9WgAwIBAgIEAWJKHDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC

          Q04xEjAQBgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNV

          BAoTB1RlbmNlbnQxDDAKBgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEf

          MB0GCSqGSIb3DQEJARYQbW1wYXltY2hAdGVuY2VudDAeFw0xNzA4MDcwOTIxNDda

          Fw0yNzA4MDUwOTIxNDdaMIGbMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR3Vhbmdk

          b25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UEChMHVGVuY2VudDEOMAwGA1UE

          CxMFTU1QYXkxMDAuBgNVBAMUJ+a3seWcs+W4guaYjua6kOi9r+S7tuiCoeS7veac

          iemZkOWFrOWPuDERMA8GA1UEBBMIMTAyNTkyODEwggEiMA0GCSqGSIb3DQEBAQUA

          A4IBDwAwggEKAoIBAQDg2D3++uOxY/yMGQPBnROvyYimnCsfGE0dnqdGUTCykqBh

          yfv82zE1/St/4DQX2QDiIvLif+sMGcYwF4bkzdY+HgitYLI0k5o/5LCNZOMctuio

          kdYC2bNdWHq2y9S5UWLQR1Zvq+6QyPBVBVY9yq9xtQhIlUTsZnICAp3iQLfQUR3l

          aEdH9IERoRUIkbyb8oX5ONQz4P9jOeE9C5iwx0QrH4s01NFhkhr8JHlugRLpo9vA

          xGgi/48fOlONj6wWal5Gt0OvvEbIwgQwya15KBX2YeGnZvYBQa+lQMeXEqZSFie3

          G+wGvbtlONczQEtp+JDxLZLUS/FT7U0TQN/t8JDvAgMBAAGjggFGMIIBQjAJBgNV

          HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh0iQ0VTLUNBIEdlbmVyYXRlIENlcnRpZmlj

          YXRlIjAdBgNVHQ4EFgQUjDJ75bu3Roog7XOH6uFAdZ6kpcIwgb8GA1UdIwSBtzCB

          tIAUPgUm9iJitBVbiM1kfrDUYqflhnShgZCkgY0wgYoxCzAJBgNVBAYTAkNOMRIw

          EAYDVQQIEwlHdWFuZ2RvbmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdU

          ZW5jZW50MQwwCgYDVQQLEwNXWEcxEzARBgNVBAMTCk1tcGF5bWNoQ0ExHzAdBgkq

          hkiG9w0BCQEWEG1tcGF5bWNoQHRlbmNlbnSCCQC7VJcrvADoVzAOBgNVHQ8BAf8E

          BAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADgYEA

          ucJLJkkHxlqQCEapZOWmySutqNVZxFbqyG//UXxxpA/1yG4e+KmufKZWv+c+MtYI

          8i0KDDCv/UE+kkFIrHYDDKsdLRpxrYOUHGoqq0c7yBJ6Dimgy6m8U8FsEv3HtUR2

          8g5xrg2Tc5MPWEp9ncEw575hGk0CXLDGOkI1nU+pGqk=

          -----END CERTIFICATE-----

          下面就可以把生成的臨時(shí)文件地址設(shè)置到CURLOPT_SSLCERT了

          <?php

          $sslCertPath=getTmpPathByContent($content);

          curl_setopt($ch,CURLOPT_SSLCERT, $sslCertPath);

          //......

          ?>

          本篇文章到這里就已經(jīng)全部結(jié)束了,更多其他精彩內(nèi)容可以關(guān)注的php視頻教程欄目!

          以上就是PHP支持CURL字符串證書傳輸?shù)姆椒ń榻B(代碼)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注其它相關(guān)文章!

          更多技巧請(qǐng)《轉(zhuǎn)發(fā) + 關(guān)注》哦!

          通知短信:當(dāng)您需要快速通知用戶時(shí),通知短信是最快捷有效的方式。短信通知支持三大運(yùn)營商以及虛擬運(yùn)營商,我們提供電信級(jí)運(yùn)維保障、獨(dú)享專用通道。

          地址:https://www.apispace.com/eolink/api/sms-notify/introduction?utm_source=tth&utm_content=tuijian&utm_term=tongzhiduanxin

          Java 接入示例:

          OkHttpClient client=new OkHttpClient().newBuilder().build();
          MediaType mediaType=MediaType.parse("application/json");
          RequestBody body=RequestBody.create(mediaType, "{\"msg\":\"\",\"params\":\"\",\"sendtime\":\"\",\"extend\":\"\",\"uid\":\"\"}");
          Request request=new Request.Builder()
            .url("https://eolink.o.apispace.com/sms-notify/notify")
            .method("POST",body)
            .addHeader("X-APISpace-Token","")
            .addHeader("Authorization-Type","apikey")
            .addHeader("Content-Type","")
            .build();
          
          Response response=client.newCall(request).execute();
          System.out.println(response.body().string());
          

          2、空氣質(zhì)量查詢:支持國內(nèi)3400+個(gè)城市的整點(diǎn)觀測,并附帶空氣質(zhì)量監(jiān)測點(diǎn)(全國共2335個(gè))的整點(diǎn)觀測數(shù)據(jù)。

          地址:https://www.apispace.com/eolink/api/34324/introduction?utm_source=tth&utm_content=tuijian&utm_term=kqzl

          Python 接入示例:

          import requests
          
          url="https://eolink.o.apispace.com/34324/air/v001/aqi"
          
          payload={"areacode" : "101010100","lonlat" : "116.407526,39.904030"}
          
          headers={
              "X-APISpace-Token":"",
              "Authorization-Type":"apikey"
          }
          
          response=requests.request("GET", url, params=payload, headers=headers)
          
          print(response.text)
          

          3、二維碼識(shí)別OCR:對(duì)圖片中的二維碼、條形碼進(jìn)行檢測和識(shí)別,返回存儲(chǔ)的文字內(nèi)容。

          PHP 接入示例:

          <?php
          
          $curl=curl_init();
          
          curl_setopt_array($curl, array(
            CURLOPT_URL=> "https://eolink.o.apispace.com/ocrbarcode/ocr/v1/barcode",
            CURLOPT_RETURNTRANSFER=> true,
            CURLOPT_ENCODING=> "",
            CURLOPT_MAXREDIRS=> 10,
            CURLOPT_TIMEOUT=> 30,
            CURLOPT_HTTP_VERSION=> CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST=> "POST",
            CURLOPT_POSTFIELDS=> "{\"image\":null,\"url\":null,\"pdf\":null,\"pdf_page\":null}",
            CURLOPT_HTTPHEADER=> array(
              "X-APISpace-Token:",
              "Authorization-Type:apikey",
              "Content-Type:application/json"
            ),
          ));
          
          $response=curl_exec($curl);
          
          $err=curl_error($curl);
          
          curl_close($curl);
          
          if ($err) {
            echo "cURL Error #:" . $err;
          } else {
            echo $response;
          }

          4、發(fā)票核驗(yàn):發(fā)票真?zhèn)悟?yàn)證服務(wù),根據(jù)發(fā)票類型代碼和發(fā)票四要素獲取發(fā)票全票面信息,支持全國增值稅專用發(fā)票、增值稅普通發(fā)票(含電子普通發(fā)票、卷式發(fā)票、通行費(fèi)發(fā)票)、機(jī)動(dòng)車銷售統(tǒng)一發(fā)票、貨物運(yùn)輸業(yè)增值稅專用發(fā)票、二手車銷售統(tǒng)一發(fā)票等不同發(fā)票的驗(yàn)真。

          JavaScript 接入示例:

          var data="{\"date\":\"20180101\",\"number\":\"12341234\",\"code\":\"1234123412\",\"verifyCode\":\"123132\",\"priceWithoutTax\":\"123.12\",\"type\":\"01\"}"
          
          var xhr=new XMLHttpRequest();
          xhr.withCredentials=false;
          
          xhr.addEventListener("readystatechange", function () {
              if (this.readyState===4) {
                  console.log(this.responseText);
              }
          });
          
          xhr.open("POST", "https://eolink.o.apispace.com/fphy2/fapiao2");
          xhr.setRequestHeader("X-APISpace-Token","");
          xhr.setRequestHeader("Authorization-Type","apikey");
          xhr.setRequestHeader("Content-Type","application/json");
          
          xhr.send(data);

          5、全國快遞物流地圖軌跡查詢:通過物流單號(hào)和收寄件地址,自動(dòng)評(píng)估物流時(shí)效,并在地圖中展示包裹運(yùn)輸軌跡。包括順豐、圓通、申通等主流快遞公司。自動(dòng)識(shí)別快遞公司及單號(hào),實(shí)時(shí)查詢,穩(wěn)定高效,服務(wù)器毫秒響應(yīng),數(shù)據(jù)及時(shí)準(zhǔn)確。

          微信小程序接入示例:

          var data="{\"cpCode\":null,\"mailNo\":null,\"phone\":null,\"origin\":null,\"destination\":null,\"receiveAddress\":null,\"responseModel\":null}"
          
          wx.request({
              "url":"https://eolink.o.apispace.com/wldtgj1/paidtobuy_api/trace_map",
              "method": "POST",
              "header": {
                  "X-APISpace-Token":"",
                  "Authorization-Type":"apikey",
                  "Content-Type":""
              },
              "data": data,
              "success": (response)=> {
                  console.log(response.data)
              }
          })

          6、空號(hào)檢測:通過手機(jī)號(hào)碼查詢其在網(wǎng)活躍度,返回包括空號(hào)、實(shí)號(hào)、停機(jī)、庫無、沉默號(hào)、風(fēng)險(xiǎn)號(hào)等狀態(tài)。

          NodeJS 接入示例:


          主站蜘蛛池模板: 国产第一区二区三区在线观看| 狠狠色婷婷久久一区二区 | 亚洲日本精品一区二区| 国产一区二区在线观看| 中文字幕日韩一区二区三区不卡| 国产成人av一区二区三区在线 | 伦理一区二区三区| 美日韩一区二区三区| 亚洲综合一区国产精品| 无码少妇精品一区二区免费动态| 久久免费视频一区| 亚洲中文字幕丝袜制服一区 | 在线观看午夜亚洲一区| 日本一区二区三区四区视频| 亚洲另类无码一区二区三区| 精品永久久福利一区二区| 国模大尺度视频一区二区| 香蕉久久AⅤ一区二区三区| 国产成人av一区二区三区不卡| 亚洲变态另类一区二区三区| 无码一区二区波多野结衣播放搜索| 一区二区免费视频| 乱码精品一区二区三区| 99精品一区二区三区| 国精无码欧精品亚洲一区| 精品一区二区三区在线视频| 精品福利一区二区三| 无码一区二区三区视频| 色欲精品国产一区二区三区AV| 亚洲av无码不卡一区二区三区| 日产亚洲一区二区三区| 成人中文字幕一区二区三区| 91精品福利一区二区| 精品久久久中文字幕一区| 国产一区二区三区美女| 波多野结衣高清一区二区三区| 少妇无码AV无码一区| 日韩一区二区在线观看视频| 日本无码一区二区三区白峰美| 国内精品视频一区二区八戒| 精品女同一区二区|