| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- <?php
- namespace Alipay\EasySDK\Kernel\Util;
- use Alipay\EasySDK\Kernel\AlipayConstants;
- class SignContentExtractor
- {
- private $RESPONSE_SUFFIX = "_response";
- private $ERROR_RESPONSE = "error_response";
- /**
- * @param $body string 网关的整体响应字符串
- * @param $method string 本次调用的OpenAPI接口名称
- * @return false|string|null 待验签的原文
- */
- public function getSignSourceData($body, $method)
- {
- $rootNodeName = str_replace(".", "_", $method) . $this->RESPONSE_SUFFIX;
- $rootIndex = strpos($body, $rootNodeName);
- if ($rootIndex !== strrpos($body, $rootNodeName)) {
- throw new \Exception('检测到响应报文中有重复的' . $rootNodeName . ',验签失败。');
- }
- $errorIndex = strpos($body, $this->ERROR_RESPONSE);
- if ($rootIndex > 0) {
- return $this->parserJSONSource($body, $rootNodeName, $rootIndex);
- } else if ($errorIndex > 0) {
- return $this->parserJSONSource($body, $this->ERROR_RESPONSE, $errorIndex);
- } else {
- return null;
- }
- }
- /**
- *
- * @param $responseContent
- * @param $nodeName
- * @param $nodeIndex
- * @return false|string|null
- */
- function parserJSONSource($responseContent, $nodeName, $nodeIndex)
- {
- $signDataStartIndex = $nodeIndex + strlen($nodeName) + 2;
- if (strrpos($responseContent, AlipayConstants::ALIPAY_CERT_SN_FIELD)) {
- $signIndex = strrpos($responseContent, "\"" . AlipayConstants::ALIPAY_CERT_SN_FIELD . "\"");
- } else {
- $signIndex = strrpos($responseContent, "\"" . AlipayConstants::SIGN_FIELD . "\"");
- }
- // 签名前-逗号
- $signDataEndIndex = $signIndex - 1;
- $indexLen = $signDataEndIndex - $signDataStartIndex;
- if ($indexLen < 0) {
- return null;
- }
- return substr($responseContent, $signDataStartIndex, $indexLen);
- }
- }
|