Мы прекращаем поддержку данного сервиса. Читать подробнее в Confluence

Commit 4059da66 authored by Andrey Veremenko's avatar Andrey Veremenko
Browse files

Переработан код. используется либа гугла для проверки телефона, собирается...

Переработан код. используется либа гугла для проверки телефона, собирается вебпаком. Добавленна возможность верификации телефона с привязкой к акк ИСУ и созданием акк ДБ. Добавлена дока
parent 8ef68f95
No related merge requests found
Showing with 2779 additions and 144 deletions
+2779 -144
phone_test.js
node_modules
build
\ No newline at end of file
# VereficationPhone
Верефикация моб. телефонов используя API Предоставленное ДИиБР
\ No newline at end of file
Сервис предоставляет возможно верефицировать моб. телефоны.
Доступно два основных метода работы:
- верефицирование телефона
- верефицирование телефона с созданием аккаунты в системе ДИиБР и привязка номера телефона к аккаунту пользователя ИСУ
## Информация об API
Верефикация моб. телефонов используя API Предоставленное ДИиБР.
Документация доступна по [ссылке](https://hq.itmo.ru/docs/asmr.html)
login: `isu`
password: `Pass28gNoW1`
## Руководство по эксплуатации
### Сборка проекта при необходимости доработки.
Необходимо чтобы был установлен nodejs. Далее в папке проекта в консоли
1. `npm i`
1. `npm run build`
Результат сборки попадает в папку `build`
### Подключение сервиса в свое приложение.
Необходимо подключить к странице js файлы. Путь: `#IMAGE_PREFIX#/cis-js/settings_profile/vereficationPhone.min.js`
Для запуска выполняем код с соответствующими параметрами:
```js
/*Обычная верефикация телефона*/
verificationPhone.vereficationNumber(<номер_телефона>, <калбек_функция>);
/*Верефицирование телефона с привязкой*/
var callback = function (password) {
try{
verificationPhone.verificationNumberAndLinkToPerson(<номер_телефона>,password, <калбек_функция>);
}catch(err){
G2.notify(err, '', true);
}
}
N2.settings.processWithPassword(callback);
```
## Дальнейшее развитие
Реализовать возможность смены привязанного к аккаунту номера телефона.
module.exports = {
"presets": [
"@babel/preset-env"
],
"plugins": [
[
"@babel/plugin-transform-runtime"
]
]
};
\ No newline at end of file
This diff is collapsed.
{
"name": "verification-phone",
"version": "1.1.0",
"description": "Модуль верификации телефона и Привязки телефона к аккаунту ИСУ",
"main": "index.js",
"scripts": {
"build": "webpack --config webpack.config.js"
},
"repository": {
"type": "git",
"url": "https://gitisu.itmo.ru/gitlab/veremenko/vereficationphone.git"
},
"author": "Veremenko A.P.",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.12.13",
"@babel/plugin-transform-runtime": "^7.12.13",
"@babel/preset-env": "^7.12.13",
"babel-loader": "^8.2.2",
"webpack": "^5.20.1",
"webpack-cli": "^4.5.0"
},
"dependencies": {
"libphonenumber-js": "^1.9.9"
}
}
/*
В коде используется общий объект для передачи данных между функциями(obj,outObject) Максимальный формат и тип данных:
obj = { "sip_numberObj": libphonenumber-js.ParsedNumberSearch,
"phoneNumObj": libphonenumber-js.ParsedNumberSearch,
"token": string,
"type": string,
}
*/
import parsePhoneNumber from 'libphonenumber-js';
(() => {
//Инициализация
window.verificationPhone = () => {
};
//Симуляция клика на элемент
function simulateClick(el) {
let evt = new MouseEvent('click', {
bubbles: true,
cancelable: true,
view: window
});
let canceled = !el.dispatchEvent(evt);
}
//Функция проверки дозвона
async function checkCall(obj, callback) {
let vereficPhoneNum = obj.phoneNumObj.number,
confirmPhoneNum = obj.sip_numberObj.number,
token = obj.token,
type = obj.type;
if (typeof callback != 'function') {
console.error('в колбек передана не функция');
throw 'в колбек передана не функция';
}
let requestConfirmPhone;
try {
G2.superManLoader();
requestConfirmPhone = await G2.ajax({
/*Сделано так для возможности верифицировать телефон для не зарегестрированных пользователей*/
app: 2109,
page: 0,
type: 'json',
process: 'CONFIRM_PHONE',
g_params: [vereficPhoneNum, confirmPhoneNum, token, type],
});
G2.superManDeloader();
requestConfirmPhone = JSON.parse(requestConfirmPhone);
if(requestConfirmPhone.error){
throw requestConfirmPhone.error;
}
} catch (err) {
G2.superManDeloader();
callback(err);
return;
}
if (requestConfirmPhone.answer) {
callback();
} else {
callback('Звонок не был осуществлён');
}
}
//Функция проверки входных параметров
function checkParamsAndGetPhomrObj(phoneNumber, callback) {
let phoneNumObj;
if (typeof callback != 'function' || typeof callback === undefined) {
throw 'в колбек передана не функция';
}
phoneNumObj = parsePhoneNumber(phoneNumber);
if (!phoneNumObj.isValid()) {
throw 'Номер телефона не валиден';
}
return phoneNumObj;
}
//Функция вызова модалки
function showModal(obj, callback){
bootbox.dialog({
title: 'Верификация номера телефона',
onEscape: true,
message: `<div class="row">
<div class="col-md-12 text-center">
<div class="form-group">
Позвоните на номер:<p/>
<span class="tel"> <a href="${obj.sip_numberObj.getURI()}" style="font-weight: bold;font-size: 2.5rem;">${obj.sip_numberObj.formatInternational()}</a></span>
<div style="opacity: 0.5;"><p></p> с указанного вами телефона <div style="margin-top: -1rem;"><p></p> ${obj.phoneNumObj.formatInternational()} </div> </div>
</div>
</div>
</div>`,
buttons: {
confirm: {
label: 'Я позвонил',
className: 'btn-primary',
callback: (e) => {
checkCall(obj, (err) => {
if (err) {
G2.notify(err, '', true);
return;
}
G2.notify('Номер успешно верифицирован');
if (typeof callback != undefined) {
callback();
}
/*Костыль вызванный тем что callback bootbox-са должен возвращать true или false*/
simulateClick(document.querySelector('.modal-btn-cancel'));
});
return false;
}
},
cancel: {
label: 'Отмена',
className: 'btn-warning modal-btn-cancel',
callback: () => {
return true;
}
}
}
});
}
//Функция верефикации телефона
window.verificationPhone.vereficationNumber = async (phoneNumber, callback) => {
let phoneNumObj, requestGetPhone, sip_numberObj;
let outObject = {};
try{
phoneNumObj = checkParamsAndGetPhomrObj(phoneNumber, callback);
}catch(err){
G2.notify(err, '', true);
return;
}
try {
G2.superManLoader();
requestGetPhone = await G2.ajax({
/*Сделано так для возможности верифицировать телефон для не зарегестрированных пользователей*/
app: 2109,
page: 0,
type: 'json',
process: 'GET_PHONE_NUMBER',
g_params: [phoneNumObj.number],
});
requestGetPhone = JSON.parse(requestGetPhone);
if(requestGetPhone.error){
throw requestGetPhone.error;
}
outObject.sip_numberObj = parsePhoneNumber(`+${requestGetPhone.sip_phone}`);
outObject.phoneNumObj = phoneNumObj;
outObject.type = 'verification';
console.log(parsePhoneNumber(`+${requestGetPhone.sip_phone}`));
G2.superManDeloader();
} catch (err) {
G2.superManDeloader();
console.error(err);
return;
}
showModal(outObject,callback);
};
window.verificationPhone.verificationNumberAndLinkToPerson = async (phoneNumber, password, callback) => {
let phoneNumObj, sip_numberObj, tmp_token, reAuthorization;
let outObject = {};
try{
phoneNumObj = checkParamsAndGetPhomrObj(phoneNumber, callback);
}catch(err){
G2.notify(err, '', true);
return;
}
try {
G2.superManLoader("Проверяем и получаем телефон для верификации...");
let requestGetPhone = await G2.ajax({
app: 2109,
page: 0,
type: 'json',
process: 'GET_PHONE_NUMBER',
/*Второй и третий параметр Y указывает на верефикацию с соданием аккаунт в ДИИБР и привязкой к аккаунту ИСУ*/
g_params: [phoneNumObj.number, 'Y', password]
});
requestGetPhone = JSON.parse(requestGetPhone);
if(requestGetPhone.error){
throw requestGetPhone.error;
}
outObject.sip_numberObj = parsePhoneNumber(`+${requestGetPhone.sip_phone}`);
outObject.phoneNumObj = phoneNumObj;
outObject.token = requestGetPhone.token;
outObject.type = requestGetPhone.isu_re_registration ? 're-registration' : 'registration';
G2.superManDeloader();
} catch (err) {
G2.superManDeloader();
G2.notify(err, '', true);
return;
}
showModal(outObject, callback);
};
})();
\ No newline at end of file
const checkNumberPhone = (phone_number) => {
if (typeof phone_number != 'string') {
throw 'номер телефона должен быть строкой';
}
let phoneNumber = phone_number.replace(/[^\d]/g, '');
if (phoneNumber.length != 11) {
throw 'Телефон не валидный';
}
return phoneNumber;
}
const formatingNumberPhone = (num) => {
num = num.split('');
num.splice(0, '', '+');
num.splice(2, '', '(');
num.splice(6, '', ')');
num.splice(10, '', '-');
num.splice(13, '', '-');
return num.join('');
}
const simulateClick = function (el) {
let evt = new MouseEvent('click', {
bubbles: true,
cancelable: true,
view: window
});
let canceled = !el.dispatchEvent(evt);
};
const checkCall = async (vereficPhoneNum, confirmPhoneNum, callback) => {
if (typeof callback != 'function') {
console.error('в колбек передана не функция');
throw 'в колбек передана не функция';
}
let requestConfirmPhone;
try {
requestConfirmPhone = await G2.ajax({
/*Сделано так для возможности верифицировать телефон для не зарегестрированных пользователей*/
app: 2109,
page: 0,
type: 'json',
process: 'CONFIRM_PHONE',
g_params: [vereficPhoneNum, confirmPhoneNum],
});
requestConfirmPhone = JSON.parse(requestConfirmPhone);
} catch (err) {
callback(err);
}
if (requestConfirmPhone.answer) {
callback();
} else {
callback('Звонок не был осуществлён');
}
}
const vereficationNumber = async (phoneNumber, callback) => {
let phoneNum, req;
if (typeof callback != 'function' || typeof callback === undefined) {
console.error('в колбек передана не функция');
return false;
}
try {
phoneNum = checkNumberPhone(phoneNumber);
} catch (err) {
console.error(err);
return;
}
try {
requestGetPhone = await G2.ajax({
/*Сделано так для возможности верифицировать телефон для не зарегестрированных пользователей*/
app: 2109,
page: 0,
type: 'json',
process: 'GET_PHONE_NUMBER',
g_params: [phoneNum],
});
requestGetPhone = JSON.parse(requestGetPhone);
} catch (err) {
console.error(err);
return;
}
try {
bootbox.dialog({
title: 'Верификация номера телефона',
onEscape: true,
message: `<div class="row">
<div class="col-md-12 text-center">
<div class="form-group">
Позвоните на номер:<p/>
<span class="tel"> <a href="tel: +${requestGetPhone.sip_number}" style="font-weight: bold;font-size: 2.5rem;">${formatingNumberPhone(requestGetPhone.sip_number)}</a></span>
<div style="opacity: 0.5;"><p></p> с указанного вами телефона <div style="margin-top: -1rem;"><p></p> ${formatingNumberPhone(phoneNum)} </div> </div>
</div>
</div>
</div>`,
buttons: {
confirm: {
label: 'Я позвонил',
className: 'btn-primary',
callback: (e) => {
checkCall(phoneNum, requestGetPhone.sip_number, (err)=>{
if(err){
G2.notify(err,'',true);
return;
}
G2.notify('Номер успешно верефецирован');
if(typeof callback != undefined){
callback();
}
/*Костыль вызванный тем что callback bootbox-са должен возвращать true или false*/
simulateClick(document.querySelector('.modal-btn-cancel'));
});
return false;
}
},
cancel: {
label: 'Отмена',
className: 'btn-warning modal-btn-cancel',
callback: ()=>{
return true;
}
}
}
});
} catch (err) {
console.error(err);
return;
}
}
//export {vereficationNumber}
vereficationNumber('+7(921)350-29-25',()=>{
console.log('Ура');
});
\ No newline at end of file
const path = require('path');
module.exports = {
mode: 'production',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'build'),
filename: 'vereficationPhone.min.js'
},
module: {
rules: [{
test: /\.js$/,
exclude: /node_modules/,
use: ["babel-loader"]
}]
}
};
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment