"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 array|mixed */ protected function requestHandle(string $endpoint, array $params = [], string $method = 'post', array $options = []): mixed { $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($method, $endpoint, $params); $this->writerLog($endpoint, $params, $response); return $response; } catch (Exception $e) { $err_msg = "{$e->getMessage()} ON {$e->getFile()}:{$e->getLine()}"; $this->info($endpoint, $params, $err_msg); return [ 'code' => -1, //'message' => $err_msg 'message' => $e->getMessage() ]; } } /** * 获取小程序授权跳转地址 * @return string */ public function getMiniProgramAuthRedirectUrl(): string { $url = 'auth/pages/bindcard/auth/index'; $data = [ 'openType' => 'getAuthCode', 'cityCode' => $this->config['city_code'], 'channel' => $this->config['channel'], 'orgChnlCrtfCodg' => $this->config['org_chnl_crtf_codg'], 'orgCodg' => $this->config['org_codg'], 'bizType' => '04107', 'orgAppId' => $this->config['org_app_id'], ]; $redirect_url = $url . '?' . http_build_query($data); $this->writerLog($url, $data, ''); return $redirect_url; } /** * 查询用户授权 * @param string $auth_code * @param string $open_id * @return mixed */ public function userQuery(string $auth_code, string $open_id): mixed { $uri = '/api/mipuserquery/userQuery/' . $this->config['partner_id']; $param = [ 'qrcode' => $auth_code, 'openid' => $open_id, ]; return $this->requestHandle($uri, $param); } }