123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- #include "faceverification.h"
- #include <QEventLoop>
- #include <QJsonDocument>
- #include <QProcessEnvironment>
- #include <QWebEngineSettings>
- #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<QString, QString> userInfo = RegistryManager::instance()->getCurentLoginUser();
- certName = userInfo.value("certName", "");
- certNo = userInfo.value("identity", "");
- metaInfo["certName"] = certName;
- metaInfo["certNo"] = certNo;
- return metaInfo;
- }
|