国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

PHP 調(diào)用 e 簽寶接口簽名指南

這篇具有很好參考價值的文章主要介紹了PHP 調(diào)用 e 簽寶接口簽名指南。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

在 401 問題上卡了 一段時間,參考官網(wǎng)文檔和鑒權(quán)簽名計算測試也試了很久,簽名確定是沒錯的,但是一直提示 INVALID_SIGNATURE

其實問題在于我忽略了 公共請求頭格式 中 Content-MD5 部分的一句話:

GET 和 DELETE 請求且 Body 體無數(shù)據(jù)時,此參數(shù)可為 “”(空字符串)或不傳此參數(shù)。

因為參數(shù)必選部分他寫了 ,我就只關(guān)注這個了…害

鑒權(quán)簽名計算:https://open.esign.cn/tools/signature

下面就快速列出代碼了

代碼部分

獲取 Content-MD5

/**
 * @param string $body
 *
 * @return string 請求體字符串,如果是文件則需要 md5_file 方法并傳入文件名(帶路徑)
 */
public function getContentMd5(string $body): string {
    return base64_encode(md5($body, true));
}

獲取簽名

這里我將 App Secret 直接作為形參傳入了。因為請求頭和 Date 可忽略,這里也直接不作處理。

/**
 * @param string $method
 * @param string $content_md5
 * @param string $content_type
 * @param string $uri
 * @param string $app_secret
 *
 * @return string
 */
public function getSignature(string $method,
                             string $content_md5, string $content_type, string $uri, string $app_secret): string {
    $string = "$method\n*/*\n$content_md5\n$content_type\n\n$uri";

    return base64_encode(hash_hmac('sha256', $string, $app_secret, true));
}

構(gòu)建請求頭

需注意 X-Tsign-Open-Ca-Timestamp 請求頭 必需 傳入毫秒級時間戳,也就是 13 位長,用 time() 方法獲取的是秒級,同樣會得到 401 INVALID_TIMESTAMP 的響應(yīng)

/**
 * @param string $app_id
 * @param string $app_secret
 * @param string $method
 * @param string $body          這里以 JSON 作為請求體示例,如果涉及到其它類型請求,自行修改一下
 * @param string $content_type
 * @param string $uri
 *
 * @return array
 */
public function buildSignedHeaders(string $app_id,
                                   string $app_secret,
                                   string $method, string $body, string $content_type, string $uri): array {
    $contentMd5 = '';

    if (in_array($method, ['GET', 'DELETE'])) {
        $content_type = '';
    } else {
        $contentMd5 = $this->getContentMd5($body);
    }

    return [
        'Accept' => '*/*',
        'Content-MD5' => $contentMd5,
        'Content-Type' => $content_type,
        'X-Tsign-Open-App-Id' => $app_id,
        'X-Tsign-Open-Auth-Mode' => 'Signature',
        'X-Tsign-Open-Ca-Signature' => $this->getSignature($method, $contentMd5, $content_type, $uri, $app_secret),
        'X-Tsign-Open-Ca-Timestamp' => Carbon::now()->getTimestampMs()
    ];
}

如果沒有 Carbon 庫,可以用官方 Demo 的寫法:

/**
 * @return float 返回值是個 double
 */
public function getMillisecond(): float {
    [$t1, $t2] = explode(' ', microtime());

    return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);
}

發(fā)送請求

/**
 * @param string      $method
 * @param string      $uri
 * @param array       $data
 * @param string|null $content_type
 * @param bool        $sandbox
 *
 * @return array|null
 */
public function request(string  $method, string $uri, array $data = [],
                        ?string $content_type = 'application/json', bool $sandbox = false): ?array {
    $method = strtoupper($method); // 統(tǒng)一轉(zhuǎn)換為大寫

    $body = '';

    if ($method === 'POST') {
        if (str_starts_with($content_type, 'application/json')) {
            $body = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        } else {
            // TODO: 其它類型的接口自行處理
        }
    }

    // 此處通過 .env 文件取配置
    $host = env('ESIGN_HOST'); // https://openapi.esign.cn
    $appId = env('ESIGN_APPID');
    $appSecret = env('ESIGN_APPSECRET');

    // 可以根據(jù)參數(shù)進(jìn)入沙盒環(huán)境方便調(diào)試
    if ($sandbox) {
        $host = env('ESIGN_SANDBOX_HOST'); // https://smlopenapi.esign.cn
        $appId = env('ESIGN_SANDBOX_APPID');
        $appSecret = env('ESIGN_SANDBOX_APPSECRET');
    }

    $headers = $this->buildSignedHeaders($appId, $appSecret, $method, $body, $content_type, $uri);

    // 這里使用了 Laravel/Lumen 9+ 的內(nèi)置 Http Facade,實際也是調(diào)用 GuzzleHttp 客戶端,如果直接使用 Guzzle 的 Client,send 換成 request 即可
    // 可能有人會問為什么不直接用定義好的 asJson 和 post 方法,因為...他帶上了 UA,得重新處理簽名部分,我懶
    $response = Http::send($method, $host . $uri, [
        'headers' => $headers,
        'body' => $body // 示例僅針對 JSON 請求,其它接口需調(diào)整
    ])->body();

    $response = json_decode($response, true);

    if (json_last_error() === JSON_ERROR_NONE) {
        return $response;
    }

    return null;
}

調(diào)用

假設(shè)類名為 ESignService

// 所以 Carbon 這個庫真的方便 ;)
$from= Carbon::createFromDate(2023, 12, 1)->startOfDay()->getTimestampMs();
$to = Carbon::createFromDate(2023, 12, 31)->endOfDay()->getTimestampMs();

// 此處為查詢集成方企業(yè)流程列表接口
var_dump((new ESignService)->request('POST', '/v3/organizations/sign-flow-list', [
    'pageNum' => 1,
    'pageSize' => 10,
    'signFlowStartTimeFrom' => $from, // 對于這個接口,signFlowStartTimeFrom 和 signFlowStartTimeTo 是必傳的,文檔上必選為否又誤導(dǎo)了
    'signFlowStartTimeTo' => $to
]));

注意: 部分接口形式帶有資源路由參數(shù),如 /v3/sign-flow/{signFlowId}/preview-file-download-url,上方代碼僅供參考,中間的 signFlowId 需根據(jù)實際業(yè)務(wù)調(diào)整文章來源地址http://www.zghlxwxcb.cn/news/detail-807942.html

到了這里,關(guān)于PHP 調(diào)用 e 簽寶接口簽名指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • php 接口請求一次,controller調(diào)用了兩次。

    這幾天開發(fā)一個數(shù)據(jù)導(dǎo)出功能 由于是數(shù)據(jù)導(dǎo)出,所以有點慢。然后發(fā)現(xiàn)一個問題,前端只請求一次,controller卻收到了兩次請求。而且第二次請求i必定失敗 這就悲催了。腦子懵懵的! 由于我這就是個小活兒,于是環(huán)境就是使用的nginx+fastcgi 網(wǎng)上搜索了一圈,大多都是說跨域的

    2024年02月06日
    瀏覽(16)
  • PHP調(diào)用淘寶app商品詳情原數(shù)據(jù) API 接口

    作為互聯(lián)網(wǎng)企業(yè),調(diào)用淘寶APP中的數(shù)據(jù)是非常常見的。那么如何調(diào)用呢? taobao.item_get_app 公共參數(shù) 請求地址:申請調(diào)用地址 名稱 類型 必須 描述 key String 是 調(diào)用key(點*擊*注*冊*免*費*調(diào)*用) secret String 是 調(diào)用密鑰 api_name String 是 API接口名稱(包括在請求地址中)[item_search

    2023年04月24日
    瀏覽(33)
  • Python編程實現(xiàn)百度AI開放平臺的接口對接方法,詳解和實踐指南

    Python編程實現(xiàn)百度AI開放平臺的接口對接方法,詳解和實踐指南 引言 百度AI開放平臺提供了豐富的人工智能接口,包括語音識別、圖像識別、自然語言處理等功能。本文將通過Python編程,詳解如何對接百度AI開放平臺的接口,并提供實際代碼示例。 準(zhǔn)備工作 在開始之前,我們

    2024年02月13日
    瀏覽(31)
  • 使用SSE技術(shù)調(diào)用OPENAI接口并實現(xiàn)流式輸出,用PHP語言實現(xiàn)

    作為AI語言模型服務(wù)提供商,OpenAI 提供了一系列的 API 接口,其中大部分需要通過 HTTP 請求訪問。對于大量數(shù)據(jù)的請求,傳統(tǒng)的同步請求會導(dǎo)致網(wǎng)絡(luò)響應(yīng)變慢,無法滿足實時數(shù)據(jù)處理和分析的需求。因此,為了優(yōu)化這些接口的調(diào)用效率,我們可以利用 SSE(Server Sent Events) 技術(shù)來

    2024年02月11日
    瀏覽(22)
  • PHP/JAVA/C#調(diào)取Taobao平臺API接口實例

    PHP優(yōu)勢: -易于學(xué)習(xí)和使用,適合快速開發(fā) -兼容性很好,可在不同操作系統(tǒng)和服務(wù)器上運行 -開源且擁有龐大的社區(qū)支持,可以獲得大量的教程和幫助文檔 -專門用于Web開發(fā)和動態(tài)網(wǎng)頁生成 Java優(yōu)勢: -適用于構(gòu)建大型、復(fù)雜的應(yīng)用程序 -良好的跨平臺能力 -高度可靠和安全的應(yīng)

    2024年02月02日
    瀏覽(16)
  • PHP 如何設(shè)計一個高安全的電商平臺:淘寶/京東商品類API封裝接口

    PHP 如何設(shè)計一個高安全的電商平臺:淘寶/京東商品類API封裝接口

    如何保證API接口安全 接口的安全性主要圍繞Token、Timestamp和Sign三個機制展開設(shè)計,保證接口的數(shù)據(jù)不會被篡改和重復(fù)調(diào)用,下面具體來看: Token授權(quán)機制 :用戶使用用戶名密碼登錄后服務(wù)器給客戶端返回一個Token(通常是UUID),并將Token-UserId以鍵值對的形式存放在緩存服務(wù)

    2024年02月09日
    瀏覽(26)
  • ssm/php/node/python基于Andriod平臺的手機Web地圖服務(wù)設(shè)計(源碼+mysql+文檔)

    ssm/php/node/python基于Andriod平臺的手機Web地圖服務(wù)設(shè)計(源碼+mysql+文檔)

    本系統(tǒng) (程序+源碼) 帶文檔lw萬字以上 ? ?文末可領(lǐng)取本課題的JAVA源碼參考 選題背景: 隨著移動互聯(lián)網(wǎng)的快速發(fā)展,智能手機已經(jīng)成為人們?nèi)粘I钪胁豢苫蛉钡墓ぞ?。而地圖服務(wù)作為智能手機的重要功能之一,為用戶提供了方便快捷的定位、導(dǎo)航和地理信息查詢等服務(wù)

    2024年01月21日
    瀏覽(40)
  • 如何設(shè)計安全可靠的開放接口---之簽名(sign)

    如何設(shè)計安全可靠的開放接口---之簽名(sign)

    1. 如何設(shè)計安全可靠的開放接口—之Token 2. 如何設(shè)計安全可靠的開放接口—之AppId、AppSecret 3. 如何設(shè)計安全可靠的開放接口—之簽名(sign) 4. 如何設(shè)計安全可靠的開放接口【番外篇】—關(guān)于MD5應(yīng)用的介紹 5. 如何設(shè)計安全可靠的開放接口—還有哪些安全保護(hù)措施 6. 如何設(shè)計安全

    2024年02月10日
    瀏覽(27)
  • 三方開放接口,Springboot通過AOP實現(xiàn)API接口的簽名驗證

    前言 對外開放的接口,需要驗證請求方發(fā)送過來的數(shù)據(jù)確實是由發(fā)送方發(fā)起的,并且中途不能被篡改和偽造,所以才會對接口的訪問進(jìn)行簽名驗證,以保證雙方獲取到的原來的信息是沒有經(jīng)過篡改的。 實現(xiàn)方法 對請求的信息內(nèi)容,通過MD5運算或者其他算法(必須是 不可逆的

    2024年02月07日
    瀏覽(31)
  • PHP SM2簽名如何實現(xiàn)

    SM2是一種基于橢圓曲線密碼算法的公鑰密碼體制,包括數(shù)字簽名、密鑰交換和公鑰加密三部分。本文將介紹如何使用PHP實現(xiàn)SM2簽名。 在開始實現(xiàn)SM2簽名之前,確保已經(jīng)安裝了以下依賴: PHP 7.0 或更高版本 OpenSSL 擴展 使用一個流行的第三方庫 php-gmssl 來實現(xiàn)SM2簽名。首先,通過

    2024年02月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包