"string", 'partner_id' => "string", 'partner_secret' => "string", 'channel' => "string", 'org_chnl_crtf_codg' => "string", 'org_codg' => "string", 'org_app_id' => "string", 'auth_return_url' => "string", ])]*/ private array $config; /** * 城市编码 441721 香洲区 * @var string */ private string $city_code = '441721'; /** * 授权查询host地址 * @var string */ private string $host = 'https://test-receiver.wecity.qq.com'; // private string $host = 'https://mip-receiver.tengmed.com'; /** * 免密授权host地址 * @var string */ private string $auth_host = 'https://mitest.wecity.qq.com'; // private string $auth_host = 'https://card.wecity.qq.com'; /** * Authorization Class Construct. */ public function __construct() { $this->config = config('wechat.medical.auth'); } /** * 获取签名 * @param string $timestamp * @return string */ private function getSign(string $timestamp): string { return hash_hmac("sha256", $this->config['partner_id'] . $timestamp, $this->config['partner_secret']); } /** * 获取RequestId * @return string */ private function getRequestId(): string { $char_id = strtoupper(md5(uniqid((string)mt_rand(), true))); return substr($char_id, 0, 8) . substr($char_id, 8, 4) . substr($char_id, 12, 4) . substr($char_id, 16, 4) . substr($char_id, 20, 12); } /** * 获取毫秒 * @return int */ private function getMillisecond(): int { [$t1, $t2] = explode(' ', microtime()); return (int)sprintf('%.0f', ((float)$t1 + (float)$t2) * 1000); } /** * @param string $endpoint * @param array $params * @param string $method * @param array $options * @return ResponseInterface|string[] */ protected function requestHanle(string $endpoint, array $params = [], string $method = 'post', array $options = []) { $timestamp = $this->getMillisecond(); $params = array_merge([ 'base_uri' => $this->host, 'headers' => [ 'god-portal-timestamp' => $timestamp, 'god-portal-request-id' => $this->getRequestId(), 'god-portal-signature' => $this->getSign((string)$timestamp), ], 'json' => $params ], $options); try { $response = $this->request($endpoint, $method, $params); $this->writerLog($endpoint, $params, $response); return $response; } catch (Exception $e) { return [ 'code' => -1, //'message' => "{$e->getMessage()} ON {$e->getFile()}:{$e->getLine()}" 'message' => $e->getMessage() ]; } } /** * 记录日志 * @param string $request_url * @param mixed $request_data * @param mixed $response * @return void */ private function writerLog(string $request_url, mixed $request_data, mixed $response): void { //写入日志 $log_content = [ '[REQUEST TIME] ' . date('Y-m-d H:i:s'), '[REQUEST URL] ' . $request_url, '[REQUEST PARAM] ' . json_encode($request_data, JSON_UNESCAPED_UNICODE), '[RESPONSE PARAM] ' . json_encode($response, JSON_UNESCAPED_UNICODE), "\r\n", ]; recordLog('authorization', implode("\r\n", $log_content)); } /** * 获取授权跳转地址 * @param string $return_url 回调地址 * @return string */ public function getAuthRedirectUrl(string $return_url): string { $url = '/oauth/code'; $data = [ 'authType' => 2, 'isDepart' => 2, 'bizType' => '04107', 'appid' => $this->config['app_id'], 'cityCode' => $this->config['city_code'], 'channel' => $this->config['channel'], 'orgChnlCrtfCodg' => $this->config['org_chnl_crtf_codg'], 'orgCodg' => $this->config['org_codg'], 'orgAppId' => $this->config['org_app_id'], 'redirectUrl' => $return_url ]; $redirect_url = $this->auth_host . $url . '?' . http_build_query($data); $this->writerLog($url, $data, ''); return $redirect_url; } /** * 查询用户授权 * @param string $auth_code * @param string $open_id * @return ResponseInterface|string[] * @throws GuzzleException */ public function userQuery(string $auth_code, string $open_id): array|ResponseInterface { $uri = '/api/mipuserquery/userQuery/' . $this->config['partner_id']; $param = [ 'qrcode' => $auth_code, 'openid' => $open_id, ]; return $this->requestHanle($uri, $param); } }