新四季網

用於通過計算機網絡進行購買的方法和系統的製作方法

2023-09-20 02:24:40

專利名稱:用於通過計算機網絡進行購買的方法和系統的製作方法
技術領域:
本發明總的來說涉及一種用於通過計算網絡進行購買的方法和系統,更準確地說,涉及一種用於通過Internet或其他非保密的計算機網絡使用自動提款機(ATM)卡、記帳卡(debit card)或其他任何可能要求用於交易認可的有效的個人身份號碼(PIN)的卡購買商品或服務的方法和系統。
背景技術:
由消費者使用個人計算機經由全球資訊網(World Wide Web)或e-mail通過Internet購買商品或服務在近幾年已經很普遍,且組成經濟持續增長的一部分。在通過Internet進行購買時,普通的消費者使用信用卡或ATM卡。在做出購買選擇後,消費者通過Internet發送他的卡信息給在線商。然後該在線商聯繫發證銀行(issuing bank)以驗證卡信息並獲得認可來完成該交易。根據來自銀行的響應,在線商接受或拒絕該購買。
因為Internet是不保密(即公開的)的網絡,所以消費者的信用卡或ATM卡信息有被第三人截取的危險。如果該第三人是不誠實的,則他能使非法的費用記入到該信用卡中,或,在ATM卡情形下直接從消費者的銀行帳戶提取現金。近幾年來,已經使用許多方法來減少這種安全風險。最普遍的方法已經改進加密技術,該加密技術使信用卡或ATM卡數據實質上不可能被第三方讀取,如128位加密套接字協議層(SSL)加密。
然而,當通過Internet使用ATM卡進行購買時,安全考慮變得額外重要,因為不像與ATM機交易,目前在通過Internet的ATM交易中不使用PIN。因此,一旦ATM卡號落入不道德的第三方之手,則通過期詐的Internet交易能劃出卡擁有者的整個銀行帳戶。
克服這個問題的一個方法是要求在通過Internet的ATM交易中使用PIN。然而目前這還不可能,因為在線商沒有能力驗證PIN。另外,不可能為在線商提供ATM卡號和相應的PIN,因為在線商的不道德的職員能使用該PIN非法地訪問卡擁有者的銀行帳戶並從那兒提取現金。

發明內容
因此,本發明的一個目的是提供用於通過Internet使用ATM卡進行購買的新的方法和系統,其中要求有效的PIN以便獲取對一指定交易的認可。本發明的另一目的是提供通過Internet使用ATM卡進行購買的新的方法和系統,其中要求有效的PIN以便獲取對一指定交易的認可,並且PIN不提供給在線商。
根據本發明的第一方面,提供一種在不保密的計算機網絡上使用ATM卡進行購買的方法。根據所述方法,消費者在網絡上發送其ATM卡號給在線商。然後該在線商把該ATM卡號發送給合同第三方(thirdparty contractor),如銀行,該第三方將監督並認可該交易。與此同時或在此後,消費者在網絡上發送其PIN給合同第三方,繞過在線商。合同第三方擁有ATM卡號以及PIN,其驗證ATM卡號和PIN是否正確,核對資金是否充足以及認可或拒絕該交易。該認可或拒絕通過網絡被傳達給在線商,該在線商完成或拒絕該購買並通知消費者。
根據本發明的第二方面,提供一種在不保密的計算機網絡上使用ATM卡進行購買的系統。該系統包括與計算機網絡連接的第一、第二和第三計算機。通過該網絡第一計算機把消費者的ATM卡號傳送給第二計算機,該第二計算機由或為在線商操作。通過該網絡第二計算機把ATM卡號發送給第三計算機,該第三計算機由或為合同第三方操作。與此同時或在此後,通過網絡第一計算機把消費者的PIN傳送給第三計算機,繞過第二計算機。然後第三計算機驗證ATM卡號和PIN是否正確以及在銀行帳戶中的資金是否足以支付交易額。然後第三計算機將驗證過程的結果傳送給第二計算機。依照該驗證結果,購買或者完成或者被拒絕。


下面參照附圖詳細地描述本發明。
在附圖中圖1是根據本發明的一個實施例的系統的框圖;圖2是說明圖1的系統操作的流程圖;圖3示出了一個可能的圖形用戶界面,該界面能用於使消費者輸入或將其PIN發送給合同第三方;圖4是概述通過圖1的系統的數據流的示意圖。
具體實施例方式圖1示意性地示出了根據本發明一個實施例的系統10。系統10包括在消費者位置14的第一計算機12、位於在線商位置18的第二計算機16,以及在合同第三方位置22的第三計算機20。這三個計算機12、16、20通過計算機網絡24,連接在一起,為便於論述,該網絡為Internet,儘管本發明可能在任何公眾的或私人的計算機網絡或它們的結合中實施。正如本領域的普通技術人員所了解的,Internet 24是一複雜且不定形的計算機網絡,該計算機網絡包括數千個節點以及元件,並且在該網絡上,信號由,特別是,電話線、衛星和光纖發送。
通常位於消費者家中或公司(消費者位置14)的第一計算機12典型地是一常規的個人計算機(PC),其包括容納有一中央處理單元(CPU)和支持電路以及一軟盤驅動器、一硬碟驅動器以及一內置數據機的機殼。通過該機殼連接到CPU的是一鍵盤、一滑鼠以及一顯示器。用戶使用該鍵盤和滑鼠來控制第一計算機12的操作以及將信息輸入到該第一計算機12。該第一計算機12通常經由連接到數據機的電話線連接到Internet,儘管該計算機通過一高速數據傳輸線能連接到Internet。消費者通常利用Internet服務供應商如ErolsTM或America OnlineTM連接到Internet,但也可能直接連接到Internet。
儘管消費者通常使用常規的PC,但消費者也可能使用可連接到Internet的任何類型的計算機,包括在區域網上的一個工作站,以及任何作業系統。第一計算機12的詳細細節基本上與本發明無關。第一計算機12僅用作消費者通過Internet對商品或服務下定單的一個常規界面。
圖1接著示出了位於在線商位置18的第二計算機16。該第二計算機16最好是比個人計算機功能更強大的計算機,如工作站,儘管在線商也可能使用一個人計算機。第二計算機16的詳細細節基本上也與本發明無關。
通常,第二計算機16是由在線商或由與在線商籤訂合同的Internet服務供應商擁有和操作的一個環球網伺服器(Web server)(提供通過Internet直接訪問World Wide Web的計算機,該計算機包括必需的硬體、作業系統、環球網伺服器軟體、TCP/IP協議以及環球網站點內容)。為便於論述,在線商位置18指的是第二計算機16的位置,且不必需是在線商的實際物理位置。
第二計算機16最好將運行Windows NTTM4.0,使用InternetInformation ServerTM4.0以及Commerce ServerTM3.0。第二計算機16的CPU必須具有可接受的功率以及應具有至少64兆字節的RAM。
第二計算機16通常在存儲器中具有一在線目錄,該目錄能被Internet 24上的消費者通過由在線商提供的適當的圖形用戶界面訪問和瀏覽。
圖1中所示的第三計算機20位於合同第三方位置22。合同第三方是一個獨立的、已保險的機構,如銀行,它與在線商聯繫以提供ATM服務。儘管該第三計算機20可以是個人計算機,但與第二計算機16一樣,它最好是具有更強大功能的計算機,如工作站。同樣該第三計算機20最好是由合同第三方或由與該合同第三方籤訂合同的Internet服務供應商擁有和操作的環球網伺服器。合同第三方位置22指第三計算機20的位置且不必需是該合同第三方的實際物理位置。與第一和第二計算機12、16一樣,第三計算機20的詳細細節基本上與本發明無關,只要該第三計算機20能執行在此描述的功能即可。該第三計算機最好是運行Compaq ProLiantTM的伺服器,其具有128MB RAM,運行在500MHZ並使用Windows NTTM4.0。
圖2中提供的流程圖26說明系統10的操作。如方框28中所示,消費者最初經由Internet通過使用市面上可買到的瀏覽器如InternetExplorerTM或Netscape NavigatorTM來訪問在線商的環球網站點以建立第一計算機12與第二計算機16之間的連接。然後,如方框30和32所示,使用由在線商提供的GUI(圖形用戶界面),消費者瀏覽在線目錄、選擇他希望購買的商品和/或服務。一旦消費者作出選擇且準備下定單,該消費者就通過Internet把購買定單消息發送給在線商(方框34)。
然後消費者被提示有關支付信息,如方框36所示,為便於當前的論述,該支付信息是ATM卡號及其截止日期,儘管支付信息能包括附加的數據,諸如消費者的姓名和住址。然後該消費者通過Internet把他的支付信息發送給在線商,如方框38所示。如在此所使用的,術語「ATM卡」包括銀行卡、記帳卡和發證銀行或機構可能要求用於使用的有效PIN的任何其他卡。通過Internet,使用加密連接,如128位加密SSL來發送支付信息。
當在線商收到ATM卡號時或更早,第二計算機16通過將消費者的IP位址和一個日期/時間戳結合起來創建一個唯一會話標識符,該IP位址唯一地識別該消費者。然後通過Internet由第二計算機16將ATM卡號連同該唯一會話標識符、唯一地識別該在線商的一個商人ID、識別由在線商使用的終端的終端ID、ATM卡的截止日期以及購買價格發送或傳回給位於合同第三方位置22的第三計算機20(方框40)。該數據包以隊列(queue)的形式存儲在第三計算機的存儲器中。最好也使用128位加密SSL。
由第二計算機16發送給第三計算機20的數據包最好以工業標準格式如ISO 8583或VISA-K格式發送。然而,本發明並不局限於任何特定格式,也可能使用在線商可能要求的任何格式。創建唯一會話標識符並格式化數據包的用Java編寫的一個樣本電腦程式在附錄A中提供。該程序被設計成在Windows NT 4.0下的Internet Server4.0上運行的一個Active Server Page,儘管該程序能在其他平臺和編程環境下使用,並能由本領域普通技術人員容易地實現。在此沒有明確或暗示的授權許可複製、準備派生作品、發布拷貝、顯示或其他對附加在此的程序附錄A的使用,除非該程序可能被複製作為由此發布的專利的附錄。
與此同時或稍後,第二計算機執行到第三計算機的超級連結並且消費者由第三計算機提示輸入其PIN(方框42)。消費者把他的PIN輸入到第一計算機12中並通過Internet將它發送到第三計算機20(方框44)。第一計算機12和第三計算機20之間的連接被加密並與第一計算機12和第二計算機16的連接無關,因此在線商決不能擁有該PIN。與第二計算機16一樣,第一計算機12將唯一會話標識符、商人ID、終端ID、ATM卡的截止日期以及購買價格連同在一數據包中的PIN發送給第三計算機20。
圖3示出了一個典型的GUI 46,它可能由合同第三方提供並在消費者的屏幕上彈出以允許消費者輸入他的PIN並將它發送給該合同第三方。從圖3中可清楚地看到,GUI 46模仿一個實際的ATM機並包括一個模擬鍵盤48和一個屏幕50。該屏幕50顯示在線商的名稱和郵件地址52以及購買價格54。消費者使用他的滑鼠輸入他的PIN,如連續點56所示。通過按下SUBMIT(提交)按鈕58,PIN號被發送給合同第三方。如果消費者出錯則他按CLEAR(清除)按鈕60並重新鍵入他的PIN。如果該消費者需要合同第三方的幫助,則他簡單地按下HELP(幫助)按鈕62,就將在屏幕上彈出由該合同第三方提供的一個幫助菜單,消費者可操作該菜單。
接著第三計算機20驗證ATM卡號及PIN是否有效(方框64)。因為合同第三方可能在任何指定時間內監視許多交易,所以該第三計算機20必須使從第一和第二計算機12,16收到的數據包同步。為執行該操作,第三計算機20匹配包含在從第一和第二計算機12,16收到的數據包內的所述唯一對話標識符、商人ID、終端ID、ATM卡的截止日期以及購買價格欄位。用於使從第一和第二計算機12,16收到的數據包同步的一個樣本電腦程式提供在附錄B中。該程序用C++編寫並能很容易地由本領域的普通技術人員執行。在此沒有明確或暗示的授權許可複製、準備派生的作品、發布拷貝、顯示或其他對附加在此的程序附錄B的使用,除非該程序可能被複製作為由此發布的專利的附錄。
為了發生交易,所有上述數據欄位必須匹配。為了安全原因,最好執行用於匹配的一個「兩分鐘窗口(two minute window)」。如果在該兩分鐘窗口內沒有匹配,則交易被中止。
一旦來自第一和第二計算機12,16的數據包由第三計算機20同步,則該第三計算機檢查ATM卡號和PIN。如果ATM卡號以及PIN是無效的,則第三計算機20通知第二計算機16,且在線商拒絕該購買定單並通知消費者(方框66)。如果ATM卡號和PIN是有效的,則第三計算機20檢查是否有充足的資金來支付該購買價格56(方框68)。如果帳戶中有充足的資金,則第三計算機把一個認可消息發送給第二計算機,把帳記入消費者的帳戶中,完成購買並通知消費者(方框70)。如果沒有充足的資金,則發送一個拒絕消息,在線商拒絕該購買並通知消費者(方框72)。
如果ATM卡是由合同第三方發行的,則驗證步驟(方框64和68)可能通過簡單地訪問在第三計算機20內或連接於其上的一個內部資料庫來完成。然而,如果ATM卡是由其它銀行發行的,那麼合同第三方必須通過和發證銀行直接或通過一保密線路聯繫,經由一專用的ATM網絡,諸如CIRRUS或經由任何其他可行途徑來驗證該卡信息。
圖4中概述了通過該系統的數據流。第一,消費者(第一計算機)通過網絡將他的PIN卡號發送給在線商(第二計算機)(方框74)。第二,在線商通過網絡將ATM卡號發送給合同第三方(第三計算機)(方框76)。第三,該消費者通過網絡將他的PIN發送給合同第三方(方框78)。如圖4所示,在線商被完全地繞過且永遠不會接收到PIN。第四,合同第三方驗證ATM卡號和PIN並檢查資金是否充足(方框80)。第五,合同第三方通過網絡將驗證過程的結果發送給在線商(方框82)。以及第六,在線商通過網絡將該結果發送給消費者,依據驗證的結果完成或拒絕該購買(方框84)。
因此,根據上述內容實現了本發明的目的。本發明的各種修改對本領域的普通技術人員來說將是顯而易見的,但不會導致本發明被修改得脫離所附權利要求限定的範圍。
  附錄Aimport java.io.*;import java.net.*;import java.util.*;import java.util.Date;import com.ms.com.*;import com.ms.asp.*;public class JRoute{   public Socket socSocket;  int m_iTimeout=10000;  J8583 msg=new J8583;  public int init(String input)  {   //VAR DECLARATIONS   int port=0,ok=0;//CONNECTION PORT,CHECKSUM  String hostname=″localhost″;//DEFAULT  DataOutputStream theOutputStream;  int parnum=8;  String strlnput=″″;dp/   String cardNumber=″″,amount=″″,expirydate=″″,trannum=″″,tid=″″,mid=″″,unique=″″,goAway=″″;   try{  ///////////////////////////////////READ INI PARS  StringTokenizer tkToken=new StringTokenizer(input);  hostname=tkToken.nextToken;  port=Integer.parseInt(tkToken.nextToken);  m_iTimeout=Integer.parseInt(tkToken.nextToken);  ///////////////////////////////////  //CARD NEEDS TO BE SENT TO OKTOPUS  //BUILD MSG  msg.addField(2,cardNumber);  msg.addField(4,amount);  msg.addField(14,expirydate);  msg.addField(37,″1″);  msg.addField(41,tid);  msg.addField(42,mid);  msg.addField(61,unique);  //CREATE SOCKET  try  {  socSocket=new Socket(hostname,port);  socSocket.setSoTimeout(m_iTimeout);  socSocket.setTcpNoDelay(true);  }  catch(UnknownHostException e)  {   return(-4);//HOST NOT FOUND  }  catch(lOException sockErr)  {   return(-3);  }  catch(Exception all)  {   return(-2);  }  msg.sendData(socSocket);   }   catch(Exception er)   {   return(-1);//SEND ERROR   }   return(-1);}public int listenfordata{   //8583 CLASS   msg.receive(socSocket);   try   {   if(msg.decide(socSocket)==0)//APPROVAL   {  try{   return(0);//ITS GOOD  }  catch(Exception any)  {   return(-2);//ERRORdp/   }   }   else   {   return(1);//DENIED   }  }  catch(Exception e)  {   return(-3);//ERRROR  }  }}import java.io.*;import java.net.*;public class J8583{   private byte m_baOut[]=new byte ;//OUTGOING BUFFER   private int m_baOutIndex=0;//0 BASED INDEX OF FILLED BYTES   private DataOutputStream m_dosData;   private BufferedInputStream m_bisInput;   private int m_field[]=new int[30];   private String m_value[]=new String[30];   public J8583   {   //CONSTRUCTOR   }   public void readFields   {   int x=0;   for(x=0;x<30;x++)   System.out.print(m_field[x]+″=″+m_value[x]+″\n″);   }   public void addField(int field,String value)   {   int xj;   j=value.length;   m_baOut[m_baOutIndex]=(byte)field;   m_baOutIndex++;   for(x=0;x<j;x++)//THE INDEX IS ONE HIGH TO LEAVE A NULL BETWEEN FIELDS   m_baOut[x+m_baOutIndex]=(byte)value.charAt(x);   m_baOutIndex +=j+1;//RESET THE INDEX   }   public void sendData(Socket socLocal)   {   try   {  //SEND  m_dosData=new DataOutputStream(socLocal.getOutputStream);  m_dosData.write(m_baOut,0,m_baOutIndex);   }   catch(UnknownHostException e)   {  System.out.print(e);  System.exit(0);   }   catch(IOException sockErr)   {   System.out.print(″Socket Connection″+sockErr);   System.exit(0);   }   catch(Exception all)   {  System.out.print(″Socket Error″+all);  System.exit(0);   }  }dp/public String resolveFieldValue(int fieldNumber){   int x=0;   for(x=0;x<30;x++)   if(m_field[x]=fieldNumber)   return(m_value[x]);   return(″″);}public void receive(Socket socLocal){try   {   m_bisInput=new BufferedInputStream(socLocal.getInputStream);   int k=1,index=0;   byte buf[]=new byte ;   m_bisInput.read(buf,0,1024);   for(k=0;k<30;k++)//INITIALIZE THE NULL STRINGS   m_value[k]=″″;   k=1;   m_field[index]=buf[index];//FIRST FIELD MARKED BY FIRST BYTE   while(k<1024)   {   if(buf[k]!=0)   {   m_value[index]+=(char)buf[k++];   }   else   {   if(buf[k+1]=0)//END OF STREAM   break;   else   {   index++;   m_field[index]=buf[k+1];   // System.out.print(″|″+buf[k+1]+″|″);   k+=2;   }   }   }   catch(IOException err)   {  //TIMEOUT  //System.out.print((nTimeout)/1000+″Second Timeout″);  try  {socLocal.close;}  catch(IOException Error){System.out.print(″p″+Error);}   }   catch(Exception all)   {   //MOST LIKELY A CLOSE ON IQ   System.out.print(″Network Connection Closed″+all);   //redirect(urlTimeout);   }}public int decide(Socket socLocal){  int k=0,index=0;  byte pResult=0;  for(k=0;k<30;k++)  if(m_field[k]=39)//GRAB PIN FIELDdp/   pResult=(byte)m_value[k].charAt(0);  try{socLocal.close;}  catch(IOException e){}  if(pResult=48)//0 IS APPROVED  {   //System.out.print(″Thank You For Shopping At Electronic Paycheck″);   return(0);  }  else  {   //System.out.print(″Denied″);   return(1);  }   }}   附錄B//webhostDlg.cppimplementation file//#include″stdafx.h″#include″webhost.h″#include″webhostDlg.h″#include<afxtempl.h>//list#ifndef TimeOut#define TimeOut 200#endif#define TimerID 0x4000#ifdef_DEBUG#define new DEBUG_NEW#undef THIS FILEstatic char THIS_FILE[]=_FILE_;#endif//////////////////////////////////////////////////////////////////////////////CAboutDlg dialog used for App Aboutclass CAboutDlgpublic CDialog{public   CAboutDlg;//Dialog Data   //{{AFX_DATA(CAboutDlg)   enum{IDD=IDD_ABOUTBOX};   //}}AFX_DATA   //Class Wizard generated virtual function overrides   //{{AFX_VIRTUAL(CAboutDlg)   protected   virtual void DoDataExchange(CDataExchange* pDX);//DDX/DDV support   //}}AFX_VIRTUAL//Implementationprotected   //{{AFX_MSG(CAboutDlg)   //}}AFX_MSG   DECLARE_MESSAGE_MAP};CAboutDlg∷CAboutDlgCDialog(CAboutDlg∷IDD){   //{{AFX_DATA_INIT(CAboutDlg)   //}}AFX_DATA_INIT}dp/void CAboutDlg∷DoDataExchange(CDataExchange* pDX){   CDialog∷DoDataExchange(pDX);   //{{AFX_DATA_MAP(CAboutDlg)   //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)   //{{AFX_MSG_MAP(CAboutDlg)   //No message handlers   //}}AFX_MSG_MAPEND_MESSAGE_MAP//////////////////////////////////////////////////////////////////////////////CWebhostDlg dialogCWebhostDlg∷CWebhostDlg(CWnd* pParent/*=NULL*/)  :CDialog(CWebhostDlg∷IDD,pParent){  //{{AFX_DATA_INIT(CWebhostDlg)  m_in=0;  m_out=0;  m_q=_T(″″);  //}}AFX_DATA_INIT  //Note that Loadlcon does not require a subsequent DestroyIcon in Win32  m_hlcon=AfxGetApp->LoadIcon(IDR_MAINFRAME);}void CWebhostDlg∷DoDataExchange(CDataExchange* pDX){  CDialog∷DoDataExchange(pDX);  //{{AFX_DATA_MAP(CWebhostDlg)  DDX_Control(pDX,IDC_LST,m_lst);  DDX_Text(pDX,IDC_IN,m_in);  DDX_Text(pDX,IDC_OUT,m_out);  DDX_Text(pDX,IDC_Q,m_q);  //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CWebhostDlg,CDialog)  //{{AFX_MSG_MAP(CWebhostDlg)  ON_WM_SYSCOMMAND  ON_WM_PAINT  ON_WM_QUERYDRAGICON  ON_WM_TIMER  //}}AFX_MSG_MAPEND_MESSAGE_MAPextem CWebhostApp theApp;CWebhostDlg* pDlg;char dbParam[256];#include<ep_init.h>#include<format.h>#define_STDC_#include<d3des.h>EPsql sql;Listener listener;CList<Auth*,Auth*>Qa;CList<EndPoint*,EndPoint*>Qe;int matchF[]={2,14,41,42,61,0};//f61=uniqueID,f44=″5A315405018B44C4″unsigned char key[]={0x29,0xda,0x91,0x0b,0x80,0x9b,0xfe,0xd3};CString sDebug;void Listener∷OnAccept(int nErrorCode){ EndPoint* tmp=new EndPoint; if(Accept(*tmp))tmp->init;else delete tmp;}int EndPoint∷respond{ const char *p;dp/ char pkt ,*s=pkt; int i,d[]={35,43,47,48,52,62,102,103,0}; if(getType=0)return 0; i=0;while(d[i]){set(d[i],NULL);i++;} for(i=2;i<128;i++) {if(p=get(i)){*s=i;strcpy(s+1,p);s+=strlen(p)+2;}} return Send(pkt,s-pkt);}int EndPoint∷aging(int t){ if(t){if(t=-1)sec-;else sec=t;} return sec;}int EndPoint∷match(M8583* m){ int f,i=0; while(f=matchF[i++])if(strcmp(m->get(f),get(f)))return 0; return 1;}void EndPoint∷init{ char buf[32]; CString ip0; UINT port; BOOL nodelay=TRUE; SetSockOpt{TCP_NODELAY,amp;nodelay,sizeof(BOOL),IPPROTO_TCP); sec=TimeOut;Qe.AddTail(this);pDlg->m_in++; GetPeerName(ip0,port);ip=inet_addr(ip0); sprintf(buf,″Connect %08x″,ip);pDlg->note(buf);}void EndPoint∷reject(int code){ char buf[32]; sprintf(buf,″Reject %08x,code=%d″,ip,code);pDlg->note(buf);sec=0; set(39,″100″);set(44,buf+16);respond;}void EndPoint∷OnReceive(int nErrorCode){ Auth* a; EndPoint* e=NULL; POSITION pos1,pos2; BOOL fullTrans=TRUE; short len,l,i,f; const char* pp; char *p,pin[24],pan[20],buf[ 1024],scode[]=″1200″,offset[]=″0000″; if(nErrorCode){sec=0;return;} len=Receive(buf,1020);buf[len]=0;p=buf;setType(1200);*pin=1; while(*p){ l=strlen(p);if((*p==61)amp;amp;(1==2)amp;amp;(p[1]==′A′))fullTrans=FALSE; if(set(*p,p+1,8)<1){reject(*p);return;} if((*p==52)amp;amp;(1<14))//clear PIN {*pin=0;pin[1]=1-1;strcpy(pin+2,p+1);memset(pin+1+1,15,10);} p+=(1+1);//build PIN block } if((pp=get(52))amp;amp;(strncmp(pp,″F01″,3)==0)){reject(52);return;} i=0;while(f=matchF[i++])if(get(f)==NULL){reject(f);return;} if(*pin=0){//got clear PIN,build PAN block,update PIN block strcpy(pan,offset);strncpy(pan+4,get(2)+strlen(get(2))-13,12); p=pin;for(i=0;i<16;i++){*p=(*^pan[i])amp;15;p++;} for(i=0;i<8;i++)pin[i]=(pin[i*2]<<4)+pin[i*2+1]; deskey(key,0);des((unsigned char*)pin,(unsigned char*)pan); for(i=0;i<8;i++)bin2hex(pin+i*2,pan[i]);pin[16]=0;set(52,pin); strcpy(buf,get(2));strcat(buf,″=″);strcat(buf,get(14)); strcat(buf,scode);strcat(buf,offset);set(35,buf);}//service code and offset hardcodedif(fullTrans){ pos2=Qe.GetHeadPosition; while(pos2){ pos1=pos2;e=Qe.GetNext(pos2); if(!match(e)‖(e==this))e=NULL;else{Qe.RemoveAt(pos1);break;} }}if(!fullTrans‖fullTransamp;amp;e){a=new Auth(this,e);Qa.AddTail(a);Qe.RemoveAt(Qe.Find(this));}sprintf(buf,″Recv %08x %d,card=%s″,ip,len,get(2)); pDlg->note(buf);dp/}Auth∷Auth(EndPoint* e1,EndPoint″e2){ int i; const char* p; char f[16],dest[4]=″N?″; e
=e1;e[1]=e2;cp(*e1); if(e2){ if(e2->getType==1200)setType(1200);set(3,″000000″); for(i=2;i<128;i++)if(p=e2->get(i))set(i,p); }else{set(3,″300000″);set(4,″000000000000″);} if(fillMsg(*this,sql,dbParam,3))//1BIN,2mid/tid {e1->reject(1);if(e2)e2->reject(1);setType(0);return;} id=++pDlg->m_out;pDlg->UpdateData(FALSE); set(37,itoa(id,f,10),8);pDlg->m_ep.cp(*this); dest[1]=*(get(47)+1);pDlg->m_ep.send(dest);}BOOL Auth∷isActive{ if((e[1]==NULL)‖(e
->aging(0)>0)amp;amp;(e[1]->aging(0)>0))return TRUE; setType(0);return FALSE;}Auth∷~Auth{ for(int i=0;i<2;i++)if(e[i]) {e[i]->cp(*this);e[i]->respond;delete e[i];} setType(0);}//////////////////////////////////////////////////////////////////////////////CWebhostDlg message handlersBOOL CWebhostDlg∷ONInitDialog{   CDialog∷OnInitDialog;   //Add ″About..″menu item to system menu.   //IDM_ABOUTBOX must be in the system command range.   ASSERT((IDM_ABOUTBOX amp; 0xFFF0)==IDM_ABOUTBOX);   ASSERT(IDM_ABOUTBOX<0xF000);   CMenu* pSysMenu=GetSystemMenu(FALSE);   if(pSysMenu !=NULL)   {  CString strAboutMenu;  strAboutMenu.LoadString(IDS_ABOUTBOX);  if(!strAboutMenu.IsEmpty)  {   pSysMenu->AppendMenu(MF_SEPARATOR);   pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);  }   }   //Set the icon for this dialog.The framework does this automatically   // when the application′s main window is not a dialog   SetIcon(m_hlcon,TRUE);//Set big icon   SetIcon(m_hlcon,FALSE);//Set small icon   //TODOAdd extra initialization herechar IP[256],name[4],title[16];short TCPort,port;const char fmt[]=″%s %hd %2s %s %hd %s″;const char usage[]=″Usagewebhost IP port name DBpararn listenPort″;if(sscanf(theApp.m_lpCmdLine,fmt,IP,amp;TCPort,name,dbParam,amp;port)<5){∷MessageBox(NULL,usage,″Error″,MB_OK);EndDialog(0);return FALSE;}sprintf(title,″WebHost %s %d″,name,port);SetWindowText(title);if(!listener.Create(port)){ ∷MessageBox(NULL,″Unable to create TCP/IP sockets.″,″Error″,MB_OK); EndDialog(0);return FALSE;}if(!listener. Listen){ ∷MessageBox(NULL,″Network error.″,″Error″,MB_OK); EndDialog(0);return FALSE;}dp/ if(m_ep.connect(IP,TCPort,name)){ ∷MessageBox(NULL,″Error connecting to EProute.″,″Error″,MB_OK); EndDialog(0);return FALSE; } pDlg=this;SetTimer(TimerID,1000,NULL);  return TRUE;//return TRUE unless you set the focus to a control } void CWebhostDlg∷OnSysCommand(UINT nID,LPARAM IParam) {   if((nID amp; 0xFFF0)==IDM_ABOUTBOX)   {  CAboutDlg dlgAbout;  dlgAbout.DoModal;   }   else   {  CDialog∷OnSysCommand(nID,IParam);   }}//If you add a minimize button to your dialog,you will need the code below//to draw the icon.For MFC applications using the document/view model,//this is automatically done for you by the framework.void CWebhostDlg∷OnPaint{   if(lslconic)   {  CPaintDC dc(this);//device context for painting  SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc,0);  //Center icon in client rectangle  int cxIcon=GetSystemMetrics(SM_CXICON);  int cyIcon=GetSystemMetrics(SM_CYICON);  CRect rect;  GetClientRect(amp;rect);  int x=(rect.Width-cxIcon+1)/2;  int y=(rect.Height-cyIcon+1)/2;  //Draw the icon    dc.Drawlcon(x,y,m_hlcon);   }   else   {  CDialog∷OnPaint;   }}//The system calls this to obtain the cursor to display while the user drags//the minimized window.HCURSOR CWebhostDlg∷OnQueryDragIcon{   return(HCURSOR)m_hIcon;}void CWebhostDlg∷OnTimer(UINT nIDEvent){   //TODOAdd your message handler code here and/or call default Auth* a; EndPoint* e; POSITION pos1,pos2; BOOL del=FALSE; if(nIDEvent==TimerID){ pos2=Qe.GetHeadPosition; while(pos2){ pos1=pos2;e=Qe.GetNext(pos2); if(e->aging<1){Qe. RemoveAt(pos1);del=TRUE;delete e;} } pos2=Qa.GetHeadPosition; while(pos2){ pos1=pos2;a=Qa.GetNext(pos2); if(!a->isActive){Qa.RemoveAt(pos1);del=TRUE;delete a;} }dp/  if(del)note(NULL); }  CDialog∷OnTimer(nIDEvent);}void CWebhostDlg∷note(const char*s){ if(s) {m_lst.AddString(s);if(m_lst.GetCount>14)m_lst.DeleteString(0);} m_q.Format(″%d %d″,Qe.GetCount,Qa.GetCount);UpdateData(FALSE);}void On8583(short mType,EPacket* ep){ int n,i; char s[64]; const char* p; POSITION pos1,pos2; Auth* a; if((mType=1)‖ep->mustExit){pDlg->EndDialog(0);return;} if(mType)return;//ignore other administrative messages ep->receive;if(ep->getType=1430)return; if(p=ep->get(37))n=atoi(p);else return; pos2=Qa.GetHeadPosition; while(pos2){ pos1=pos2;a=Qa.GetNext(pos2); if(a->match(n)){ ep->set(37,NULL);for(i=2;i<128;i++)if(p=ep->get(i))a->set(i,p); Qa.RemoveAt(pos1);delete a;pDlg->note(NULL);return; } } pDlg->note(″reversal″);ep->getType(s);memset(s+4,′0′,18);s[22]=0; if(p=ep->get(11))strncpy(s+4,p,6); if(p=ep->get(12))strncpy(s+10,p,12); if(p=ep->get(32))strcpy(s+22,p); ep->set(56,s);ep->setType(1420);ep->send(ep->getSender);}/*sDebug.Format(″″);∷MessageBox(NULL,sDebug,″Debug″,MB_OK);*/
權利要求
1.一種通過計算機網絡使用第一號碼和第二號碼進行購買的方法,該第一號碼識別消費者帳戶,從該帳戶中將提取資金來支付購買價格,該第二號碼與所述第一號碼有關,當該第二號碼與所述第一號碼一起使用時,能從所述帳戶中提取資金,所述方法包括步驟通過所述網絡從消費者位置電子地把所述第一號碼發送到在線商位置;通過所述網絡從所述在線商位置電子地把所述第一號碼發送到合同第三方位置;通過所述網絡從所述消費者位置電子地把所述第二號碼發送到所述合同第三方位置;以及在合同第三方位置處確定所述第一和第二號碼的有效性。
2.如權利要求1所述的方法,其中,當所述第二號碼從所述消費者位置傳送給合同第三方位置時繞過所述在線商位置。
3.如權利要求1所述的方法,其中,所述第一和第二號碼通過所述網絡經由加密連接被發送。
4.如權利要求1所述的方法,其中所述網絡是Internet。
5.如權利要求1所述的方法,包括在合同第三方位置確定所述帳戶是否有足夠的資金來支付所述購買價格的附加步驟。
6.如權利要求1所述的方法,包括從所述合同第三方位置通過所述網絡電子地把一個信號發送給所述在線商位置以指示所述第一和第二號碼是否有效的附加步驟。
7.如權利要求5所述的方法,包括從所述合同第三方位置通過所述網絡電子地把一個信號發送給所述在線商位置以指示所述帳戶中是否有足夠的資金來支付所述購買價格的附加步驟。
8.如權利要求1所述的方法,包括從所述在線商位置通過所述網絡電子地把一個信號發送給所述消費者位置以指示所述購買是否已經認可的附加步驟。
9.一種通過計算機網絡使用第一號碼和第二號碼進行購買的系統,該第一號碼識別消費者帳戶,從該帳戶中將提取資金來支付購買價格,該第二號碼與所述第一號碼有關,當該第二號碼與所述第一號碼一起使用時,能從所述帳戶中提取資金,所述系統包括在消費者位置的第一計算機,所述第一計算機連接到所述網絡;位於在線商位置的第二計算機,所述第二計算機連接到所述網絡;以及在合同第三方位置的第三計算機,所述第三計算機連接到所述網絡;其中通過所述網絡從所述第一計算機把所述第一號碼發送給所述第二計算機;通過所述網絡從所述第二計算機把所述第一號碼發送給所述第三計算機;通過所述網絡從所述第一計算機把所述第二號碼發送給所述第三計算機;以及所述第三計算機確定所述第一和第二號碼是否有效。
10.如權利要求9所述的系統,其中當把所述第二號碼發送給所述第三計算機時所述第一計算機繞過所述第二計算機。
11.如權利要求9所述的系統,其中所述第一和第二號碼通過所述網絡經由加密連接發送。
12.如權利要求9所述的系統,其中所述網絡是Internet。
13.如權利要求9所述的系統,其中所述第三計算機檢查所述帳戶中是否有足夠的資金來支付所述購買價格。
14.如權利要求9所述的系統,其中所述第三計算機通知所述第二計算機所述第一和第二號碼是否有效。
15.如權利要求13所述的系統,其中所述第三計算機通知所述第二計算機所述帳戶中是否有足夠的資金來支付所述購買價格。
16.如權利要求9所述的系統,其中所述第二計算機通知所述第一計算機所述購買是否被認可。
17.一種認可將通過計算機網絡使用第一號碼和第二號碼進行的購買的方法,該第一號碼識別消費者帳戶,從該帳戶中將提取資金來支付購買價格,該第二號碼與所述第一號碼有關,當該第二號碼與所述第一號碼一起使用時,能從所述帳戶中提取資金,所述方法包括步驟在合同第三方位置接收通過所述網絡從在線商位置電子地發送的所述第一號碼;在所述合同第三方位置接收通過所述網絡從消費者位置電子地發送的所述第二號碼;以及在所述合同第三方位置處確定所述第一和第二號碼的有效性。
18.如權利要求17所述的方法,其中所述網絡是Internet。
19.如權利要求17所述的方法,包括在所述合同第三方位置確定所述帳戶中是否有足夠的資金來支付所述購買價格的附加步驟。
20.如權利要求17所述的方法,包括從所述合同第三方位置通過所述網絡電子地把一個信號發送給所述在線商位置以指示所述第一和第二號碼是否有效的附加步驟。
21.如權利要求19所述的方法,包括從所述合同第三方位置通過所述網絡電子地把一個信號發送給所述在線商位置以指示在所述帳戶中是否有足夠的資金來支付所述購買價格的附加步驟。
22.一種認可將通過計算機網絡使用第一號碼和第二號碼進行的購買的系統,該第一號碼識別消費者的帳戶,從該帳戶中將提取資金來支付購買價格,該第二號碼與所述第一號碼有關,當該第二號碼與所述第一號碼一起使用時,能從所述帳戶中提取資金,所述系統包括連接到所述網絡的計算機;所述計算機被配置成接收通過所述網絡從在線商的計算機發送的所述第一號碼,接收通過所述網絡從消費者計算機發送的所述第二號碼,並驗證所述第一和第二號碼的有效性。
23.如權利要求22所述的系統,其中所述網絡為Internet。
24.如權利要求22所述的系統,其中所述計算機被配置成確定所述帳戶中是否有足夠的資金來支付所述購買價格。
25.如權利要求22所述的系統,其中所述計算機被配置成通知所述在線商的計算機所述第一和第二號碼是否有效。
26.如權利要求24所述的系統,其中所述計算機被配置成通知所述在線商的計算機所述帳戶中是否有足夠的資金來支付所述購買價格。
全文摘要
提供一種用於通過計算機網絡使用一ATM卡或類似物進行購買的方法和系統(10)。根據本發明,消費者(12)通過網絡(24)將他的ATM卡號發送給一在線商(16)。然後該在線商(16)將該ATM卡號發送給一合同第三方(20),如銀行,該合同第三方將檢查和認可該交易。與此同時或稍後,消費者(12)通過網絡將他的PIN發送給合同第三方(20),該合同第三方驗證該ATM卡和PIN是否有效。
文檔編號G06Q10/00GK1378675SQ00813905
公開日2002年11月6日 申請日期2000年9月7日 優先權日1999年9月7日
發明者道格拉斯·W·金 申請人:埃帕西菲克公司

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀