#include "faceverification.h" #include #include #include #include #include "../components/loadingwidget.h" #include "../registryManager/registrymanager.h" #include "../utils/global.h" #include "../utils/logger.h" FaceVerification::FaceVerification(QWidget *parent) : QObject(parent), m_parent(parent), m_view(nullptr), m_layout(nullptr) {} FaceVerification::~FaceVerification() { cleanup(); } void FaceVerification::initFaceVerification() { Logger::getInstance().info("start init face verification"); LoadingWidget::showLoading(m_parent, "请求创建人脸识别..."); m_layout = new QVBoxLayout(m_parent); // TODO: release the qwebengineview when not successfully verified m_view = new QWebEngineView(m_parent); m_view->setAttribute(Qt::WA_OpaquePaintEvent); QWebEnginePage *page = m_view->page(); QJsonObject metaInfo = getMetaInfo(); if (metaInfo["certName"] == "" || metaInfo["certNo"] == "") { QMessageBox::information(nullptr, "获取用户信息错误", "未获得用户的身份证信息,请联系管理员"); emit verificationFailed("未获得用户的身份证信息"); return; } QObject::connect(page, &QWebEnginePage::featurePermissionRequested, [this, page](const QUrl &securityOrigin, QWebEnginePage::Feature feature) { handleFeaturePermission(page, securityOrigin, feature); }); Logger::getInstance().info("FaceVerification: connect"); QUrl postUrl(apiBackendUrl.resolved(QUrl("h-face-verify/pc"))); QJsonObject response = sendPostRequest(postUrl, metaInfo); QString certifyUrl; if (response["code"] != 200) { Logger::getInstance().error( QString("创建人脸识别请求服务器返回错误: userName: %1. response: %2") .arg(metaInfo["certName"].toString(), QString::fromUtf8(QJsonDocument(response).toJson()))); QMessageBox::critical(nullptr, "错误", "无法创建人脸识别,请确认后台录入的身份信息正确"); emit verificationFailed("创建人脸识别请求失败"); return; } if (response.contains("data") && response["data"].isObject()) { LoadingWidget::showLoading(m_parent, "人脸识别请求已创建..."); QJsonObject dataObject = response["data"].toObject(); if (dataObject.contains("ResultObject") && dataObject["ResultObject"].isObject()) { QJsonObject resultObject = dataObject["ResultObject"].toObject(); if (resultObject.contains("CertifyId") && resultObject["CertifyId"].isString()) { m_certifyId = resultObject["CertifyId"].toString(); } if (resultObject.contains("CertifyUrl") && resultObject["CertifyUrl"].isString()) { certifyUrl = resultObject["CertifyUrl"].toString(); } } } if (!certifyUrl.isEmpty()) { m_view->load(QUrl(certifyUrl)); m_layout->addWidget(m_view); m_layout->setStretchFactor(m_view, 1); QObject::connect(m_view->page(), &QWebEnginePage::urlChanged, this, &FaceVerification::onUrlChanged); } else { QMessageBox::information(nullptr, "提示", "人脸识别请求失败"); Logger::getInstance().error("FaceVerificationInit: Failed to get certifyUrl"); LoadingWidget::hideLoading(); emit verificationFailed("人脸识别请求失败"); } } void FaceVerification::cleanup() { closeWebViewAndRestoreUI(); } void FaceVerification::closeWebViewAndRestoreUI() { if (m_view) { if (m_layout) { m_layout->removeWidget(m_view); } delete m_view; m_view = nullptr; } if (m_layout) { delete m_layout; m_layout = nullptr; } } void FaceVerification::onUrlChanged(const QUrl &newUrl) { LoadingWidget::showLoading(m_parent, "查询验证结果..."); if (newUrl.host() == "www.integrateblaster.com") { closeWebViewAndRestoreUI(); QNetworkAccessManager manager; QUrl requestUrl(apiBackendUrl.resolved(QUrl(QString("h-face-verify/certifyId/%1").arg(m_certifyId)))); QNetworkRequest request(requestUrl); QNetworkReply *reply = manager.get(request); QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData); if (!jsonDoc.isNull() && jsonDoc.isObject()) { QJsonObject rootObj = jsonDoc.object(); QJsonObject dataObj = rootObj["data"].toObject(); QString message = dataObj["Message"].toString(); QJsonObject resultObj = dataObj["ResultObject"].toObject(); if (resultObj.isEmpty()) { Logger::getInstance().error(QString("获取认证初始化数据失败. message: %1.").arg(message)); int ret = QMessageBox::information(nullptr, "认证失败", message + " ,请重新认证!"); if (ret == QMessageBox::Ok) { initFaceVerification(); } } else { QString passed = resultObj["Passed"].toString(); if (passed == "T") { Logger::getInstance().info(QString("进入认证界面")); LoadingWidget::hideLoading(); emit verificationSuccessful(); } else if (passed == "F") { int ret = QMessageBox::critical(nullptr, "提示", "操作失败,请重新认证!"); if (ret == QMessageBox::Ok) { initFaceVerification(); } } } } } else { qDebug() << "Request failed:" << reply->errorString(); Logger::getInstance().error( QString("InitFaseVerification request failed. error message: %1").arg(reply->errorString())); } reply->deleteLater(); LoadingWidget::hideLoading(); } LoadingWidget::hideLoading(); } QJsonObject FaceVerification::sendPostRequest(const QUrl &url, const QJsonObject &data) { QNetworkAccessManager manager; QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); QJsonDocument doc(data); QByteArray postData = doc.toJson(); QNetworkReply *reply = manager.post(request, postData); QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); QJsonObject responseJson; if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); QJsonDocument responseDoc = QJsonDocument::fromJson(responseData); if (!responseDoc.isNull() && responseDoc.isObject()) { responseJson = responseDoc.object(); } } else { qDebug() << "Error fetching content: " << reply->errorString(); } reply->deleteLater(); return responseJson; } void FaceVerification::handleFeaturePermission(QWebEnginePage *page, const QUrl &securityOrigin, QWebEnginePage::Feature feature) { if (feature == QWebEnginePage::MediaAudioCapture || feature == QWebEnginePage::MediaAudioVideoCapture || feature == QWebEnginePage::MediaVideoCapture) { page->setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionGrantedByUser); } else { page->setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionDeniedByUser); } } QJsonObject FaceVerification::getMetaInfo() { QJsonObject metaInfo; QString certName; QString certNo; QMap userInfo = RegistryManager::instance()->getCurentLoginUser(); certName = userInfo.value("certName", ""); certNo = userInfo.value("identity", ""); metaInfo["certName"] = certName; metaInfo["certNo"] = certNo; return metaInfo; }