Commit 442e33db by NitefullWind

1. 修改激活的步骤。 2. 登录接口新增认证类型。 3. 去掉激活和锁定接口。

parent 81d610f9
#include "reader.h"
#include "reader.h"
Reader* Reader::instance()
{
......@@ -10,7 +10,7 @@ Reader::Reader(QObject *parent) : QObject(parent)
{
s_end = true;
s_initsuc = false;
isDefaultPassword = false;
_isDefaultPassword = false;
s_reader = NULL;
this->moveToThread(&m_thread);
m_thread.start();
......@@ -38,27 +38,44 @@ bool Reader::readVipNO()
{
QString vipNo;
QString error;
QString uuid;
while(s_end && !ReadCard(s_reader, s_readerCfg.Section, vipNo, error))
while(s_end && (!ReadCard(s_reader, s_readerCfg.Section, vipNo, uuid , error) || _isDefaultPassword))
{
// 如果是用默认密码读卡,则进行激活操作
if(_isDefaultPassword) {
emit needActivate();
qDebug() << tr("修改卡[%1]密码").arg(uuid);
while(s_end && !ActivateCard(s_reader, s_readerCfg.Section, s_readerCfg.Password, error)) {
}
emit activateFinished();
_isDefaultPassword = false;
connectReader();
break;
}
if(error == ReaderError.ConnectedError || error == ReaderError.PasswordError) {
qDebug() << "Readcard failed: " << error;
if(error == ReaderError.PasswordError) {
isDefaultPassword = !isDefaultPassword;
_isDefaultPassword = true;
}
connectReader();
}
Sleep(500);
}
if(!s_end)
{
condition.wakeAll();
return false;
}
emit getVipNO(vipNo);
qDebug() << __FUNCTION__ << vipNo << uuid;
emit getVipNO(vipNo, uuid);
return true;
}
void Reader::connectReader()
......@@ -71,35 +88,36 @@ void Reader::connectReader()
if(s_initsuc) {
DisConnectDevice(s_reader);
}
// do
// {
int tryTimes = 3;
do
{
if(sign)
{
if(isDefaultPassword) {
if(_isDefaultPassword) {
sign = ConnectDevice(s_readerCfg.Port,
s_readerCfg.Baud,
s_readerCfg.Section,
s_readerCfg.Password,
s_readerCfg.PasswordDefault,
s_reader,
error);
} else {
sign = ConnectDevice(s_readerCfg.Port,
s_readerCfg.Baud,
s_readerCfg.Section,
s_readerCfg.PasswordDefault,
s_readerCfg.Password,
s_reader,
error);
}
}
if(!sign) {
s_reader = NULL;
qDebug() << "Connect device failed: " << error;
qDebug() << "Connect reader device failed: " << error;
}
else
s_initsuc = sign;
// Sleep(500);
// }while(s_end && !sign);
Sleep(500);
}while(s_end && !sign && --tryTimes);
}
}
......@@ -125,15 +143,15 @@ void Reader::disconnectReader()
mutex.unlock();
}
bool Reader::activateCard()
{
bool sign = false;
QString error;
if(s_initsuc) {
sign = ActivateCard(s_reader, s_readerCfg.Section, s_readerCfg.Password, error);
}
if(!sign) {
qDebug() << "Activate card failed: " << error;
}
return sign;
}
//bool Reader::activateCard()
//{
// bool sign = false;
// QString error;
// if(s_initsuc) {
// sign = ActivateCard(s_reader, s_readerCfg.Section, s_readerCfg.Password, error);
// }
// if(!sign) {
// qDebug() << "Activate card failed: " << error;
// }
// return sign;
//}
#ifndef READER_H
#ifndef READER_H
#define READER_H
#include "global.h"
......@@ -40,7 +40,7 @@ private:
private:
bool s_end;
bool s_initsuc;
bool isDefaultPassword;
bool _isDefaultPassword;
QMutex mutex;
QWaitCondition condition;
HANDLE s_reader;
......@@ -48,12 +48,14 @@ private:
ReaderCfg s_readerCfg;
signals:
void getVipNO(QString VipNO);
void getVipNO(QString VipNO, QString uuid);
void needActivate();
void activateFinished();
public slots:
void disconnectReader();
bool readVipNO();
bool activateCard();
// bool activateCard();
};
#endif // READER_H
#ifndef GLOBAL_H
#ifndef GLOBAL_H
#define GLOBAL_H
#include <QObject>
#include <QApplication>
......@@ -46,6 +46,14 @@ enum FM_TYPE {
FM_Order_Revoke
};
enum Member_Type {
Unknow = 0,
PayCode,
Phone,
Account,
EntityCard
};
// 根据POS属性名,从配置文件中读取服务属性名
class FMPropsMap
{
......@@ -80,7 +88,9 @@ struct{
const QString FM_Type = "FM_Type";
const QString TransId = "trans_id";
const QString Member_sign = "member_sign";
const QString Member_type = "member_type";
const QString IsActive = "is_active";
const QString Inner_code = "inner_code";
const QString Name = "name";
const QString Birthday = "birthday";
......@@ -141,6 +151,7 @@ struct{
const QString Discount = "discount";
// 卡激活锁定
const QString CardUUID = "CardUUID";
const QString CardNo = "card_no";
const QString CardStatus = "card_status";
const QString CardStatusDesc = "card_status_desc";
......
#ifndef SESSION_H
#ifndef SESSION_H
#define SESSION_H
#include <QVariant>
......@@ -32,6 +32,7 @@ public:
void addData(const QString key, const QVariant value);
void addData(const QString key, const QMap<QString, Coupon> couponMap);
bool contains(const QString key) {return _sessionDataMap.contains(key);}
QMap<QString, Coupon> getCouponMap(const QString key);
QMap<QString, QVariant> sessionDataMap() const { return this->_sessionDataMap;}
......
#include "tasklogin.h"
#include "tasklogin.h"
#include "fmviplogin.h"
TaskLogin::TaskLogin(QJsonObject &jsonObj, Session *session, QObject *parent)
......@@ -10,7 +10,6 @@ void TaskLogin::setWindow()
{
_window = new FMVipLogin;
//connect(this, SIGNAL(TaskLogin::starReader), _window, SLOT(FMVipLogin::onstartreader));
connect(this, &TaskLogin::starReader, qobject_cast<FMVipLogin*>(_window), &FMVipLogin::onstartreader);
connect(qobject_cast<FMVipLogin*>(_window), FMVipLogin::login, this, TaskLogin::onLogin);
}
......@@ -18,6 +17,8 @@ void TaskLogin::setWindow()
void TaskLogin::packageServerReq()
{
serverReqJsonObj[ServerProps(PosProps.Member_sign)] = _session->data(PosProps.Member_sign).toString();
serverReqJsonObj[ServerProps(PosProps.Member_type)] = _session->data(PosProps.Member_type).toInt();
serverReqJsonObj[ServerProps(PosProps.Inner_code)] = _session->data(PosProps.Inner_code).toString();
}
void TaskLogin::packagePOSRsp()
......@@ -61,7 +62,13 @@ void TaskLogin::onLogin()
session()->addData(PosProps.Mobile, getServerJsonValue(PosProps.Mobile).toString());
session()->addData(PosProps.Fm_open_id, account);
session()->addData(PosProps.Score, getServerJsonValue(PosProps.Score).toInt());
session()->addData(PosProps.IsActive, getServerJsonValue(PosProps.IsActive).toInt());
int isActive = getServerJsonValue(PosProps.IsActive).toInt();
if(session()->contains(PosProps.IsActive) && isActive==1) { // 刷卡、服务端已激活则看卡密码是否已修改
qDebug() << tr("Server isActive: %1. Card is default password: %2.").arg(isActive).arg(session()->data(PosProps.IsActive).toInt());
isActive = session()->data(PosProps.IsActive).toInt();
}
session()->addData(PosProps.IsActive, isActive);
// QMap<QString, QVariant> couponMap;
// for (auto value : getServerJsonValue(PosProps.CouponList).toArray())
......
#include "taskmanage.h"
#include "taskmanage.h"
#include "fmvippanel.h"
#include "tasklogin.h"
#include "taskfund.h"
......@@ -59,19 +59,19 @@ void TaskManage::onFund()
void TaskManage::onLock()
{
childTask = new TaskCardLock(posReqJsonObj, this->session());
doChildTask();
// childTask = new TaskCardLock(posReqJsonObj, this->session());
// doChildTask();
}
void TaskManage::onActivate()
{
bool isOk = Reader::instance()->activateCard();
if(!isOk) {
FMMsgWnd::FailureWnd("fmv: 激活卡时写卡失败!");
return;
}
childTask = new TaskCardActive(posReqJsonObj, this->session());
doChildTask();
// bool isOk = Reader::instance()->activateCard();
// if(!isOk) {
// FMMsgWnd::FailureWnd("fmv: 激活卡时写卡失败!");
// return;
// }
// childTask = new TaskCardActive(posReqJsonObj, this->session());
// doChildTask();
}
void TaskManage::doChildTask()
......
#include "fmviplogin.h"
#include "fmviplogin.h"
#include "ui_fmviplogin.h"
#include "fmvippanel.h"
#include <QFile>
......@@ -15,6 +15,8 @@ FMVipLogin::FMVipLogin(QDialog *parent) :
ui->setupUi(this);
connect(this, &FMVipLogin::startreader, Reader::instance(), &Reader::readVipNO);
connect(Reader::instance(), &Reader::getVipNO, this, &FMVipLogin::readVipNO);
connect(Reader::instance(), &Reader::needActivate, this, &FMVipLogin::onNeedActivate);
connect(Reader::instance(), &Reader::activateFinished, this, &FMVipLogin::onActivateFinished);
emit startreader();
ui->login_edit->setFocus();
qDebug() << "main:" <<QThread::currentThreadId();
......@@ -36,13 +38,15 @@ void FMVipLogin::onstartreader()
emit startreader();
}
void FMVipLogin::readVipNO(QString VipNo)
void FMVipLogin::readVipNO(QString VipNo, QString uuid)
{
ui->login_edit->setText(VipNo);
QString id = VipNo;
_session->addData(PosProps.Member_sign, id);
_session->addData(PosProps.Inner_code, uuid);
_session->addData(PosProps.Member_type, Member_Type::EntityCard);
this->setEnabled(false);
......@@ -51,6 +55,18 @@ void FMVipLogin::readVipNO(QString VipNo)
emit login();
}
void FMVipLogin::onNeedActivate()
{
activateInfoWnd = new FMMsgWnd(this);
activateInfoWnd->show(FMMsgWnd::T_Warning, tr("fmv:此卡需要激活,请重新刷卡!"));
}
void FMVipLogin::onActivateFinished()
{
activateInfoWnd->close();
delete activateInfoWnd;
}
void FMVipLogin::initWnd(Session *session)
{
this->_session = session;
......@@ -86,6 +102,21 @@ void FMVipLogin::on_login_btn_clicked()
{
QString id = ui->login_edit->text();
switch (id.length()) {
case 20:
session()->addData(PosProps.Member_type, Member_Type::PayCode);
break;
case 11:
session()->addData(PosProps.Member_type, Member_Type::Phone);
break;
case 10:
session()->addData(PosProps.Member_type, Member_Type::Account);
break;
default:
session()->addData(PosProps.Member_type, Member_Type::Unknow);
break;
}
_session->addData(PosProps.Member_sign, id);
this->setEnabled(false);
......
#ifndef FMVIPLOGIN_H
#ifndef FMVIPLOGIN_H
#define FMVIPLOGIN_H
#include "fmvipwnd.h"
#include "fmmsgwnd.h"
class QNetworkReply;
......@@ -30,8 +31,11 @@ signals:
public slots:
void on_login_btn_clicked();
void on_edit_change(QString numkey);
void readVipNO(QString VipNO);
void readVipNO(QString VipNO, QString uuid);
void onstartreader();
void onNeedActivate();
void onActivateFinished();
void on_delete_clicked();
void on_clear_clicked();
void on_confirm_clicked();
......@@ -41,6 +45,7 @@ private slots:
private:
Ui::FMVipLogin *ui;
FMNumPad *numpad;
FMMsgWnd *activateInfoWnd;
};
#endif // FMVIPLOGIN_H
#include "fm_mwrf32.h"
#include "mwdll/mwrf32.h"
#include <QCryptographicHash>
#include <QDebug>
bool ConnectDevice(int port, int baud, int sector, const QString password, HANDLE &handle, QString &error)
{
......@@ -15,16 +16,17 @@ bool ConnectDevice(int port, int baud, int sector, const QString password, HANDL
if(st!=0)
{
rf_exit(handle);
error = "load key error";
error = QString("load key error sector %1").arg(sector);
return false;
}
rf_beep(handle,30);
return true;
}
bool ReadCard(const HANDLE handle, int sector, QString &vipNo, QString &error)
bool ReadCard(const HANDLE handle, int sector, QString &vipNo, QString& uuid, QString &error)
{
int st;
unsigned char rdata[17];
// 寻卡
unsigned long snr; //卡片序列号
st = rf_card(handle, 0, &snr);
......@@ -33,6 +35,7 @@ bool ReadCard(const HANDLE handle, int sector, QString &vipNo, QString &error)
error = "could not find the card";
return false;
}
uuid = QString::number(snr);
// 鉴权
st = rf_authentication(handle, 0, sector);
if(st!=0)
......@@ -41,18 +44,17 @@ bool ReadCard(const HANDLE handle, int sector, QString &vipNo, QString &error)
return false;
}
// 读卡号
unsigned char rdata[32];
ZeroMemory(rdata,32);
ZeroMemory(rdata,17);
st = rf_read(handle, sector*4, rdata);
if(st!=0)
{
error = "read data error";
return false;
}
vipNo = QString::fromLatin1((char*)rdata);
vipNo = QString(QByteArray((char*)rdata, 16).toHex()).mid(17);
// 读效验数据
QString keyData;
ZeroMemory(rdata,32);
ZeroMemory(rdata,17);
st = rf_read(handle, sector*4+1, rdata);
if(st!=0)
{
......@@ -66,7 +68,6 @@ bool ReadCard(const HANDLE handle, int sector, QString &vipNo, QString &error)
error = "check key_data error";
return false;
}
rf_beep(handle,30);
return true;
}
......@@ -96,15 +97,15 @@ bool ActivateCard(const HANDLE handle, int sector, const QString newPassword, QS
return false;
}
// 读卡号
unsigned char rdata[32];
ZeroMemory(rdata,32);
unsigned char rdata[17];
ZeroMemory(rdata,17);
st = rf_read(handle, sector*4, rdata);
if(st!=0)
{
error = "read data error";
return false;
}
vipNo = QString::fromLatin1((char*)rdata);
vipNo = QString::fromLatin1(QByteArray((char*)rdata, 16).toHex()).mid(17);
// 写入效验数据
QByteArray keyData = QCryptographicHash::hash(QString("%1%2").arg(vipNo,MD5_KEY).toLatin1(), QCryptographicHash::Md5);
st = rf_write(handle, sector*4+1, (unsigned char*)keyData.toHex().mid(8, 16).data());
......
......@@ -26,9 +26,9 @@ FM_MWRF32SHARED_EXPORT void DisConnectDevice(const HANDLE handle);
FM_MWRF32SHARED_EXPORT bool ActivateCard(const HANDLE handle, int sector, const QString newPassword, QString& error);
/* 功能:读取会员号
* 参数:[1]设备句柄[2]要读取的扇区号[3_out]会员号[4_out]错误原因
* 参数:[1]设备句柄[2]要读取的扇区号[3_out]会员号[4_out]UUID[5_out]错误原因
* 返回:成功true
* */
FM_MWRF32SHARED_EXPORT bool ReadCard(const HANDLE handle, int sector, QString& vipNo, QString& error);
FM_MWRF32SHARED_EXPORT bool ReadCard(const HANDLE handle, int sector, QString& vipNo, QString& uuid, QString& error);
#endif // FM_MWRF32_H
......@@ -24,9 +24,9 @@ void ActivateWorker::run()
{
QString error;
bool result;
result = ActivateCard(m_handle, 1, "111111111111", error);
result = ActivateCard(m_handle, 15, "ffffffffffff", error);
qDebug() << QDateTime::currentDateTime() << result << error;
emit activeted(result, error);
Sleep(300);
Sleep(1000);
}
}
......@@ -25,7 +25,7 @@ MainWindow::~MainWindow()
void MainWindow::on_pbt0_clicked()
{
QString error;
if(ConnectDevice(4, 9600, 1, "111111111111", handle, error))
if(ConnectDevice(0, 9600, 15, "ffffffffffff", handle, error))
{
ui->label->setText("连接设备成功!");
ui->pbt1->setEnabled(true);
......@@ -33,6 +33,8 @@ void MainWindow::on_pbt0_clicked()
}else
{
ui->label->setText("连接设备失败!");
qDebug() << error;
}
}
......@@ -49,9 +51,10 @@ void MainWindow::on_pbt2_clicked()
{
QString error;
QString vipNo;
if(ReadCard(handle, 1, vipNo, error))
QString uuid;
if(ReadCard(handle, 15, vipNo, uuid, error))
{
ui->label_3->setText(vipNo);
ui->label_3->setText(uuid + "###" + vipNo);
}else
{
ui->label_3->setText(error);
......
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