Tại host Customer, ta tạo một Agent customerMaster để nhận dữ liệu do người dùng đưa vào
Input: hàng mua (MaSp, TenSP, soluong, dongia) privateKey
customer digital signature
Thông tin hóa đơn mua hàng được “ký” bằng khóa bí mật của người mua, tạo ra chữ ký số của người mua (customer digital signature), đồng thời nó dùng khóa công khai của TTP để mã hóa thông tin thanh toán (số tiền, số thẻ tín dụng)
customerMaster tạo ra agent customerSlave mang theo thông tin thanh toán đã được mã hóa, hóa đơn mua hàng và chữ ký số của người mua di chuyển tới
hostMerchant. Tại hostMerchant, agent customerSlave trao những thông tin đó cho merchantMaster. MerchantMaster dùng khóa bí mật của người bán để ký lên hóa đơn tạo ra chữ ký số của người bán và gửi tất cả chúng đến TTP
Aglet TTP chứng thực thông tin hóa đơn bằng khóa công khai của người mua và người bán, nó giải mã thông tin thanh toán của người mua bằng khóa bí mật của TPP. Nếu tất cả các thông tin được chứng thực, TTP xuất biên lai cho merchantSlave
MerchantSlave mang biên lai đã được TTP chứng thực trở về hostMerchant và trao cho customerSlave
customerSlave mang biên lai trở về hostCustomer
3.3.2.3. Mô hình xử lý dòng dữ liệu
a. Yêu cầu thanh toán:
1. Tạo aglet customerSlave
2. Di chuyển aglet customerSlave đến host Merchant để gửi yêu cầu thanh toán
protectedvoid MoveToMerchant(Message msg) {
try{
AgletProxy p = aglet.getProxy();
p.sendOnewayMessage(new Message("GoToMerchant", "atp://Merchant:500"));
Object[] arg=new Object[]{order_infor, signed_customer, payment_data, aglet.getAgletID()};
aglet=getAgletContext.createAglet(codebase, "Yeu cau thanh toan", arg);
try {
aglet.dispatch(new URL("atp://Merchant:500"));
}
catch(Exeption e){
System.out.println("Khong the chuyen Aglet qua host Merchant");
} }
catch(Exeption e){
System.out.println("Khong the tao Aglet"); }
}
3. Nếu nhận được thông báo (message) “BIEN_LAI” Nhận biên lai
Lưu thông tin biên lai vào CSDL và thông báo tới người dùng public bool handleMessage(Message msg){
if (msg.sameKind("BIEN_LAI")){
MySQLConnect connect = new MySQLConnect("Customer", "root", "123456", "agletpayment");
String noi_dung=(String)msg.getArg("noi_dung");
connect.excuteQuery("INSERT INTO RECEIPT (NOI_DUNG, NGAY_TAO) VALUES('"+ noi_dung +"',
CURRENT_TIMESTAMP)"); }
}
b. Chủ hàng nhận yêu cầu thanh toán
1. Tạo aglet merchantSlave
2. Nhận thông tin từ customerSlave
protectedvoid GetAgletConsumer(Message msg){
int i=1; while (e.hasMoreElements()){ AgletProxy proxy=(AgletProxy)e.nextElements(); if (proxy.getAgletClassName()== "Consumer"){ customer_id=proxy.getAgletID(); return; } } }
3. Di chuyển aglet merchantSlave đến host TTP để gửi yêu cầu xác thực
protectedvoid MoveToTTP(Message msg) {
try
{
Object[] arg=new Object[]{order_infor, signed_customer, signed_merchant, payment_data, id_this_merchan};
aglet=getAgletContext.createAglet(codebase, "Yeu cau xac thuc",arg);
try{
aglet.dispatch(new URL("atp://TTP:500"));
}
catch(Exeption e){
System.out.println("Khong the chuyen Aglet qua host TTP");
} }
catch(Exeption e){
System.out.println("Khong the tao Aglet"); }
}
4. Nếu nhận được thông báo (message) “BIEN_LAI” Nhận biên lai
Chuyển lại biên lai cho customerSlave (vẫn đang chờ tại host Merchant)
public bool TranferToConsumer(Message msg){ AgletProxy proxy_customer =
/*Lay proxy cuc bo cua agent customerSlave */ String noi_dung=(String)msg.getArg(“noi_dung"); Message msg1=new Message("BIEN_LAI"); msg1.setArg(noi_dung);
proxy_customer.sendMessage(msg1); dispose(); //Tu huy
}
c. TTP xác thực hóa đơn và xuất biên lai
1. Chứng thực chữ kỹ số của chủ hàng 2. Chứng thực chữ ký số của người mua
3. Giải mã thông tin thanh toán của người mua 4. Tạo biên lai và gửi cho merchantSlave
public bool handleMessage(Message msg) { if (msg.sameKind("GoToTTP")) GetAgletMerchant(msg); else return false; return true; }
protected void GetAgletMerchant(Message msg){ Enumration e = getAgletContext().getAgletProxies(); int i=1; while (e.hasMoreElements()){ AgletProxy proxy=(AgletProxy)e.nextElements(); if (proxy.getAgletClassName()== "Merchant"){ merchant_id=proxy.getAgletID(); return; } } }
Public void run(){
AgletProxy proxy_merchant =
getAgletContext.getAgletProxy (merchant_id); /*
Lay proxy cuc bo cua agent merchantSlave */
proxy_merchant.sendMessage(new Message("BIEN_LAI")); }
3.3.2.4. Giao diện chương trình
a. Màn hình đăng nhập