faceverification.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include "faceverification.h"
  2. #include <QEventLoop>
  3. #include <QJsonDocument>
  4. #include <QProcessEnvironment>
  5. #include <QWebEngineSettings>
  6. #include "../components/loadingwidget.h"
  7. #include "../registryManager/registrymanager.h"
  8. #include "../utils/global.h"
  9. #include "../utils/logger.h"
  10. FaceVerification::FaceVerification(QWidget *parent)
  11. : QObject(parent), m_parent(parent), m_view(nullptr), m_layout(nullptr) {}
  12. FaceVerification::~FaceVerification() { cleanup(); }
  13. void FaceVerification::initFaceVerification() {
  14. Logger::getInstance().info("start init face verification");
  15. LoadingWidget::showLoading(m_parent, "请求创建人脸识别...");
  16. m_layout = new QVBoxLayout(m_parent);
  17. // TODO: release the qwebengineview when not successfully verified
  18. m_view = new QWebEngineView(m_parent);
  19. m_view->setAttribute(Qt::WA_OpaquePaintEvent);
  20. QWebEnginePage *page = m_view->page();
  21. QJsonObject metaInfo = getMetaInfo();
  22. if (metaInfo["certName"] == "" || metaInfo["certNo"] == "") {
  23. QMessageBox::information(nullptr, "获取用户信息错误", "未获得用户的身份证信息,请联系管理员");
  24. emit verificationFailed("未获得用户的身份证信息");
  25. return;
  26. }
  27. QObject::connect(page, &QWebEnginePage::featurePermissionRequested,
  28. [this, page](const QUrl &securityOrigin, QWebEnginePage::Feature feature) {
  29. handleFeaturePermission(page, securityOrigin, feature);
  30. });
  31. Logger::getInstance().info("FaceVerification: connect");
  32. QUrl postUrl(apiBackendUrl.resolved(QUrl("h-face-verify/pc")));
  33. QJsonObject response = sendPostRequest(postUrl, metaInfo);
  34. QString certifyUrl;
  35. if (response["code"] != 200) {
  36. Logger::getInstance().error(
  37. QString("创建人脸识别请求服务器返回错误: userName: %1. response: %2")
  38. .arg(metaInfo["certName"].toString(), QString::fromUtf8(QJsonDocument(response).toJson())));
  39. QMessageBox::critical(nullptr, "错误", "无法创建人脸识别,请确认后台录入的身份信息正确");
  40. emit verificationFailed("创建人脸识别请求失败");
  41. return;
  42. }
  43. if (response.contains("data") && response["data"].isObject()) {
  44. LoadingWidget::showLoading(m_parent, "人脸识别请求已创建...");
  45. QJsonObject dataObject = response["data"].toObject();
  46. if (dataObject.contains("ResultObject") && dataObject["ResultObject"].isObject()) {
  47. QJsonObject resultObject = dataObject["ResultObject"].toObject();
  48. if (resultObject.contains("CertifyId") && resultObject["CertifyId"].isString()) {
  49. m_certifyId = resultObject["CertifyId"].toString();
  50. }
  51. if (resultObject.contains("CertifyUrl") && resultObject["CertifyUrl"].isString()) {
  52. certifyUrl = resultObject["CertifyUrl"].toString();
  53. }
  54. }
  55. }
  56. if (!certifyUrl.isEmpty()) {
  57. m_view->load(QUrl(certifyUrl));
  58. m_layout->addWidget(m_view);
  59. m_layout->setStretchFactor(m_view, 1);
  60. QObject::connect(m_view->page(), &QWebEnginePage::urlChanged, this, &FaceVerification::onUrlChanged);
  61. } else {
  62. QMessageBox::information(nullptr, "提示", "人脸识别请求失败");
  63. Logger::getInstance().error("FaceVerificationInit: Failed to get certifyUrl");
  64. LoadingWidget::hideLoading();
  65. emit verificationFailed("人脸识别请求失败");
  66. }
  67. }
  68. void FaceVerification::cleanup() { closeWebViewAndRestoreUI(); }
  69. void FaceVerification::closeWebViewAndRestoreUI() {
  70. if (m_view) {
  71. if (m_layout) {
  72. m_layout->removeWidget(m_view);
  73. }
  74. delete m_view;
  75. m_view = nullptr;
  76. }
  77. if (m_layout) {
  78. delete m_layout;
  79. m_layout = nullptr;
  80. }
  81. }
  82. void FaceVerification::onUrlChanged(const QUrl &newUrl) {
  83. LoadingWidget::showLoading(m_parent, "查询验证结果...");
  84. if (newUrl.host() == "www.integrateblaster.com") {
  85. closeWebViewAndRestoreUI();
  86. QNetworkAccessManager manager;
  87. QUrl requestUrl(apiBackendUrl.resolved(QUrl(QString("h-face-verify/certifyId/%1").arg(m_certifyId))));
  88. QNetworkRequest request(requestUrl);
  89. QNetworkReply *reply = manager.get(request);
  90. QEventLoop loop;
  91. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  92. loop.exec();
  93. if (reply->error() == QNetworkReply::NoError) {
  94. QByteArray responseData = reply->readAll();
  95. QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData);
  96. if (!jsonDoc.isNull() && jsonDoc.isObject()) {
  97. QJsonObject rootObj = jsonDoc.object();
  98. QJsonObject dataObj = rootObj["data"].toObject();
  99. QString message = dataObj["Message"].toString();
  100. QJsonObject resultObj = dataObj["ResultObject"].toObject();
  101. if (resultObj.isEmpty()) {
  102. Logger::getInstance().error(QString("获取认证初始化数据失败. message: %1.").arg(message));
  103. int ret = QMessageBox::information(nullptr, "认证失败", message + " ,请重新认证!");
  104. if (ret == QMessageBox::Ok) {
  105. initFaceVerification();
  106. }
  107. } else {
  108. QString passed = resultObj["Passed"].toString();
  109. if (passed == "T") {
  110. Logger::getInstance().info(QString("进入认证界面"));
  111. LoadingWidget::hideLoading();
  112. emit verificationSuccessful();
  113. } else if (passed == "F") {
  114. int ret = QMessageBox::critical(nullptr, "提示", "操作失败,请重新认证!");
  115. if (ret == QMessageBox::Ok) {
  116. initFaceVerification();
  117. }
  118. }
  119. }
  120. }
  121. } else {
  122. qDebug() << "Request failed:" << reply->errorString();
  123. Logger::getInstance().error(
  124. QString("InitFaseVerification request failed. error message: %1").arg(reply->errorString()));
  125. }
  126. reply->deleteLater();
  127. LoadingWidget::hideLoading();
  128. }
  129. LoadingWidget::hideLoading();
  130. }
  131. QJsonObject FaceVerification::sendPostRequest(const QUrl &url, const QJsonObject &data) {
  132. QNetworkAccessManager manager;
  133. QNetworkRequest request(url);
  134. request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
  135. QJsonDocument doc(data);
  136. QByteArray postData = doc.toJson();
  137. QNetworkReply *reply = manager.post(request, postData);
  138. QEventLoop loop;
  139. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  140. loop.exec();
  141. QJsonObject responseJson;
  142. if (reply->error() == QNetworkReply::NoError) {
  143. QByteArray responseData = reply->readAll();
  144. QJsonDocument responseDoc = QJsonDocument::fromJson(responseData);
  145. if (!responseDoc.isNull() && responseDoc.isObject()) {
  146. responseJson = responseDoc.object();
  147. }
  148. } else {
  149. qDebug() << "Error fetching content: " << reply->errorString();
  150. }
  151. reply->deleteLater();
  152. return responseJson;
  153. }
  154. void FaceVerification::handleFeaturePermission(QWebEnginePage *page, const QUrl &securityOrigin,
  155. QWebEnginePage::Feature feature) {
  156. if (feature == QWebEnginePage::MediaAudioCapture || feature == QWebEnginePage::MediaAudioVideoCapture ||
  157. feature == QWebEnginePage::MediaVideoCapture) {
  158. page->setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionGrantedByUser);
  159. } else {
  160. page->setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionDeniedByUser);
  161. }
  162. }
  163. QJsonObject FaceVerification::getMetaInfo() {
  164. QJsonObject metaInfo;
  165. QString certName;
  166. QString certNo;
  167. QMap<QString, QString> userInfo = RegistryManager::instance()->getCurentLoginUser();
  168. certName = userInfo.value("certName", "");
  169. certNo = userInfo.value("identity", "");
  170. metaInfo["certName"] = certName;
  171. metaInfo["certNo"] = certNo;
  172. return metaInfo;
  173. }