'https://clue.changan.com.cn:5786', 'app_key' => '2e0a1703b9784ca89e9368e21a119b4c', 'app_secret' => 'a6049e8b647ae0339111b39ffaf1cab0', 'pubKey' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArJiVab+4lEatCcpLQHef8+MyjcSKmOLqcGPb+ObtwvLxbyRQ/eM2AO3mDAPFZddYhl/hSeLBsWIt1vY4WKUtkmm5mRRLkFQuLj0FRhRKxHBstKNXd0MX+ekz4Jx2FaulleRfJ7PbGpCZJNDzMmZHuRng0g+1g2Avk1B5NQ9dSn3SzRbHXAiY8aCkyUs3i8Hb/nMq2ivj9AJjgsc3LcltKLG/Lnlvr2b17WLKNjPxdyj112+xR0CA99/hBZo2cxDfjUIhDjBo9pcCRzA3AnFOnRQ44fjjcDwwoMhvpgnbt7D+5ek4wDzgnL4hai3naCIfzlnYQSVlCII/NUURs9WjZwIDAQAB', ]; private Token $tokenHelper; private array $requestData = []; /** * RSA public key * @var string */ private string $pubKey = ''; private \Magento\Framework\HTTP\Client\Curl $curl; private string $response; private AvatrInterface $clue; private Transformers $transformers; private string $distributorCode; private string $carSeries; /** * @var string */ private string $line; public function __construct( Context $context, Token $tokenHelper, \Magento\Framework\HTTP\Client\Curl $curl, Transformers $transformers ) { parent::__construct($context); $this->tokenHelper = $tokenHelper; $this->curl = $curl; $this->transformers = $transformers; $this->tokenHelper->setCaller($this); } /** * @throws LocalizedException */ public function getHost(): string { return $this->_getData('host'); } public function setConfig(array $config = []): static { $this->config = array_merge($this->config, $config); return $this; } /** * @throws LocalizedException */ function _getData(string $key): string { if (isset($this->config[$key]) && !empty($this->config[$key])) { return $this->config[$key]; } throw new LocalizedException(__($key.' is not set')); } /** * @throws LocalizedException */ function getAppSecret(): string { return $this->_getData('app_secret'); } /** * @throws LocalizedException */ function getAppKey(): string { return $this->_getData('app_key'); } /** * get RSA public key * @return string * @throws LocalizedException */ protected function getPubKey(): string { return "-----BEGIN PUBLIC KEY-----\n" . wordwrap( $this->_getData('pubKey'), 64, "\n", true ) . "\n-----END PUBLIC KEY-----"; } /** * data must contains follow data: * customerPhoneNo: 客户电话 * outwardOriginId: 线索生成系统的原始id * city: 客户城市编码(国标) https://github.com/modood/Administrative-divisions-of-China/tree/master/dist * * @param array $data * @return $this */ public function setRequestData(array $data): static { $info = [ 'brand' => '80081004', 'leaveInfoTime' => date('Y-m-d H:i:s'), 'sourceCd' => '0201700260000' ]; if ($this->line=='启源') { $info['brand'] = '80081005'; $info['sourceCd'] = '0200300140010'; } $this->requestData = array_merge($info, $data); return $this; } /** * @return array */ public function getRequestData(): array { if (!empty($this->requestData)) { return $this->requestData; } $leadsCreateTime = $this->clue->getCreatedAt(); if (!$leadsCreateTime) { $leadsCreateTime = date('Y-m-d H:i:s'); } $this->requestData = [ 'brand' => '80081004', 'leaveInfoTime' => $leadsCreateTime, 'sourceCd' => '0201700260000', 'customerName' => $this->clue->getName(), 'customerPhoneNo' => $this->clue->getTelephone(), 'outwardOriginId' => 'bbycm-'.str_pad($this->clue->getId(), 12, '0', STR_PAD_LEFT), 'city' => $this->clue->getCityId(), 'province' => $this->clue->getProvinceId(), 'intentionCarSeries' => $this->carSeries, ]; if (is_numeric($this->distributorCode)) { $this->requestData['distributorId'] = $this->distributorCode; } else { $this->requestData['distributorCode'] = $this->distributorCode; } if ($this->line=='启源') { $this->requestData['brand'] = '80081005'; $this->requestData['sourceCd'] = '0200300140010'; $this->requestData['marketingActivityName'] = '重庆福戈文化传播有限公司'; $this->requestData['marketingActivityNo'] = '2024mtjjrcqfg'; } return $this->requestData; } /** * @throws LocalizedException */ protected function sign(): string { return base64_encode($this->publicEncrypt(json_encode($this->requestData))); } protected function publicEncrypt(string $data) { if (!is_string($data)) { return null; } $dataLength = mb_strlen($data); $offet = 0; $length = 128; $i = 0; $string = ''; while ($dataLength - $offet > 0) { if ($dataLength - $offet > $length) { $str = mb_substr($data, $offet, $length); } else { $str = mb_substr($data, $offet, $dataLength - $offet); } $encrypted = ''; openssl_public_encrypt($str,$encrypted, $this->getPubKey()); $string .= $encrypted; $i ++; $offet = $i * $length; } return base64_encode($string); } /** * @throws LocalizedException */ protected function getRequestUrl(): string { return rtrim($this->getHost(), "/") . '/api/interface/commonClue/createClue'; } /** * @return Token */ public function getTokenHelper(): Token { return $this->tokenHelper; } /** * @throws LocalizedException */ public function post(): self { $body = json_encode([array_merge($this->getRequestData(), ['data'=>$this->sign()])]); $token = $this->tokenHelper->getToken(); $this->curl->addHeader("Content-Type", "application/json"); $this->curl->addHeader('token', $token); $this->curl->addHeader('isEncipher', false); $this->curl->post( $this->getRequestUrl(), $body); $this->response = $this->curl->getBody(); return $this; } /** * @throws LocalizedException */ public function transform(array $from): array { $this->distributorCode = $from[5]; $this->line = $from[2]; if(!$carSeries = $this->transformers->getCarSeriesCode(trim($from[6]))){ $carSeries = $this->transformers->getCarSeriesCode(trim($from[2]).trim($from[6])); if(!$carSeries) { throw new \Exception('车系:'.$from[6].'不存在'); } } $this->carSeries = $carSeries; return $this->transformers->transform($from); } public function setClue(AvatrInterface $clue): CarSeriesClueInterface { $this->clue = $clue; return $this; } public function isSuccess(): bool { $response = $this->getResponse(); return isset($response['code']) && $response['code']==200 && $response['total'] > 0; } public function getResponse(): array { $response = json_decode($this->response, true); return is_array($response)? $response:[]; } public function reset(): CarSeriesClueInterface { $this->requestData = []; return $this; } }