faceverification.cpp 8.2 KB

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