亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

用于通過計算機網(wǎng)絡進行購買的方法和系統(tǒng)的制作方法

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

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


下面參照附圖詳細地描述本發(fā)明。
在附圖中圖1是根據(jù)本發(fā)明的一個實施例的系統(tǒng)的框圖;圖2是說明圖1的系統(tǒng)操作的流程圖;圖3示出了一個可能的圖形用戶界面,該界面能用于使消費者輸入或?qū)⑵銹IN發(fā)送給合同第三方;圖4是概述通過圖1的系統(tǒng)的數(shù)據(jù)流的示意圖。
具體實施例方式圖1示意性地示出了根據(jù)本發(fā)明一個實施例的系統(tǒng)10。系統(tǒng)10包括在消費者位置14的第一計算機12、位于在線商位置18的第二計算機16,以及在合同第三方位置22的第三計算機20。這三個計算機12、16、20通過計算機網(wǎng)絡24,連接在一起,為便于論述,該網(wǎng)絡為Internet,盡管本發(fā)明可能在任何公眾的或私人的計算機網(wǎng)絡或它們的結合中實施。正如本領域的普通技術人員所了解的,Internet 24是一復雜且不定形的計算機網(wǎng)絡,該計算機網(wǎng)絡包括數(shù)千個節(jié)點以及元件,并且在該網(wǎng)絡上,信號由,特別是,電話線、衛(wèi)星和光纖發(fā)送。
通常位于消費者家中或公司(消費者位置14)的第一計算機12典型地是一常規(guī)的個人計算機(PC),其包括容納有一中央處理單元(CPU)和支持電路以及一軟盤驅(qū)動器、一硬盤驅(qū)動器以及一內(nèi)置調(diào)制解調(diào)器的機殼。通過該機殼連接到CPU的是一鍵盤、一鼠標以及一顯示器。用戶使用該鍵盤和鼠標來控制第一計算機12的操作以及將信息輸入到該第一計算機12。該第一計算機12通常經(jīng)由連接到調(diào)制解調(diào)器的電話線連接到Internet,盡管該計算機通過一高速數(shù)據(jù)傳輸線能連接到Internet。消費者通常利用Internet服務供應商如ErolsTM或America OnlineTM連接到Internet,但也可能直接連接到Internet。
盡管消費者通常使用常規(guī)的PC,但消費者也可能使用可連接到Internet的任何類型的計算機,包括在局域網(wǎng)上的一個工作站,以及任何操作系統(tǒng)。第一計算機12的詳細細節(jié)基本上與本發(fā)明無關。第一計算機12僅用作消費者通過Internet對商品或服務下定單的一個常規(guī)界面。
圖1接著示出了位于在線商位置18的第二計算機16。該第二計算機16最好是比個人計算機功能更強大的計算機,如工作站,盡管在線商也可能使用一個人計算機。第二計算機16的詳細細節(jié)基本上也與本發(fā)明無關。
通常,第二計算機16是由在線商或由與在線商簽訂合同的Internet服務供應商擁有和操作的一個環(huán)球網(wǎng)服務器(Web server)(提供通過Internet直接訪問World Wide Web的計算機,該計算機包括必需的硬件、操作系統(tǒng)、環(huán)球網(wǎng)服務器軟件、TCP/IP協(xié)議以及環(huán)球網(wǎng)站點內(nèi)容)。為便于論述,在線商位置18指的是第二計算機16的位置,且不必需是在線商的實際物理位置。
第二計算機16最好將運行Windows NTTM4.0,使用InternetInformation ServerTM4.0以及Commerce ServerTM3.0。第二計算機16的CPU必須具有可接受的功率以及應具有至少64兆字節(jié)的RAM。
第二計算機16通常在存儲器中具有一在線目錄,該目錄能被Internet 24上的消費者通過由在線商提供的適當?shù)膱D形用戶界面訪問和瀏覽。
圖1中所示的第三計算機20位于合同第三方位置22。合同第三方是一個獨立的、已保險的機構,如銀行,它與在線商聯(lián)系以提供ATM服務。盡管該第三計算機20可以是個人計算機,但與第二計算機16一樣,它最好是具有更強大功能的計算機,如工作站。同樣該第三計算機20最好是由合同第三方或由與該合同第三方簽訂合同的Internet服務供應商擁有和操作的環(huán)球網(wǎng)服務器。合同第三方位置22指第三計算機20的位置且不必需是該合同第三方的實際物理位置。與第一和第二計算機12、16一樣,第三計算機20的詳細細節(jié)基本上與本發(fā)明無關,只要該第三計算機20能執(zhí)行在此描述的功能即可。該第三計算機最好是運行Compaq ProLiantTM的服務器,其具有128MB RAM,運行在500MHZ并使用Windows NTTM4.0。
圖2中提供的流程圖26說明系統(tǒng)10的操作。如方框28中所示,消費者最初經(jīng)由Internet通過使用市面上可買到的瀏覽器如InternetExplorerTM或Netscape NavigatorTM來訪問在線商的環(huán)球網(wǎng)站點以建立第一計算機12與第二計算機16之間的連接。然后,如方框30和32所示,使用由在線商提供的GUI(圖形用戶界面),消費者瀏覽在線目錄、選擇他希望購買的商品和/或服務。一旦消費者作出選擇且準備下定單,該消費者就通過Internet把購買定單消息發(fā)送給在線商(方框34)。
然后消費者被提示有關支付信息,如方框36所示,為便于當前的論述,該支付信息是ATM卡號及其截止日期,盡管支付信息能包括附加的數(shù)據(jù),諸如消費者的姓名和住址。然后該消費者通過Internet把他的支付信息發(fā)送給在線商,如方框38所示。如在此所使用的,術語“ATM卡”包括銀行卡、記帳卡和發(fā)證銀行或機構可能要求用于使用的有效PIN的任何其他卡。通過Internet,使用加密連接,如128位加密SSL來發(fā)送支付信息。
當在線商收到ATM卡號時或更早,第二計算機16通過將消費者的IP地址和一個日期/時間戳結合起來創(chuàng)建一個唯一會話標識符,該IP地址唯一地識別該消費者。然后通過Internet由第二計算機16將ATM卡號連同該唯一會話標識符、唯一地識別該在線商的一個商人ID、識別由在線商使用的終端的終端ID、ATM卡的截止日期以及購買價格發(fā)送或傳回給位于合同第三方位置22的第三計算機20(方框40)。該數(shù)據(jù)包以隊列(queue)的形式存儲在第三計算機的存儲器中。最好也使用128位加密SSL。
由第二計算機16發(fā)送給第三計算機20的數(shù)據(jù)包最好以工業(yè)標準格式如ISO 8583或VISA-K格式發(fā)送。然而,本發(fā)明并不局限于任何特定格式,也可能使用在線商可能要求的任何格式。創(chuàng)建唯一會話標識符并格式化數(shù)據(jù)包的用Java編寫的一個樣本計算機程序在附錄A中提供。該程序被設計成在Windows NT 4.0下的Internet Server4.0上運行的一個Active Server Page,盡管該程序能在其他平臺和編程環(huán)境下使用,并能由本領域普通技術人員容易地實現(xiàn)。在此沒有明確或暗示的授權許可復制、準備派生作品、發(fā)布拷貝、顯示或其他對附加在此的程序附錄A的使用,除非該程序可能被復制作為由此發(fā)布的專利的附錄。
與此同時或稍后,第二計算機執(zhí)行到第三計算機的超級鏈接并且消費者由第三計算機提示輸入其PIN(方框42)。消費者把他的PIN輸入到第一計算機12中并通過Internet將它發(fā)送到第三計算機20(方框44)。第一計算機12和第三計算機20之間的連接被加密并與第一計算機12和第二計算機16的連接無關,因此在線商決不能擁有該PIN。與第二計算機16一樣,第一計算機12將唯一會話標識符、商人ID、終端ID、ATM卡的截止日期以及購買價格連同在一數(shù)據(jù)包中的PIN發(fā)送給第三計算機20。
圖3示出了一個典型的GUI 46,它可能由合同第三方提供并在消費者的屏幕上彈出以允許消費者輸入他的PIN并將它發(fā)送給該合同第三方。從圖3中可清楚地看到,GUI 46模仿一個實際的ATM機并包括一個模擬鍵盤48和一個屏幕50。該屏幕50顯示在線商的名稱和郵件地址52以及購買價格54。消費者使用他的鼠標輸入他的PIN,如連續(xù)點56所示。通過按下SUBMIT(提交)按鈕58,PIN號被發(fā)送給合同第三方。如果消費者出錯則他按CLEAR(清除)按鈕60并重新鍵入他的PIN。如果該消費者需要合同第三方的幫助,則他簡單地按下HELP(幫助)按鈕62,就將在屏幕上彈出由該合同第三方提供的一個幫助菜單,消費者可操作該菜單。
接著第三計算機20驗證ATM卡號及PIN是否有效(方框64)。因為合同第三方可能在任何指定時間內(nèi)監(jiān)視許多交易,所以該第三計算機20必須使從第一和第二計算機12,16收到的數(shù)據(jù)包同步。為執(zhí)行該操作,第三計算機20匹配包含在從第一和第二計算機12,16收到的數(shù)據(jù)包內(nèi)的所述唯一對話標識符、商人ID、終端ID、ATM卡的截止日期以及購買價格字段。用于使從第一和第二計算機12,16收到的數(shù)據(jù)包同步的一個樣本計算機程序提供在附錄B中。該程序用C++編寫并能很容易地由本領域的普通技術人員執(zhí)行。在此沒有明確或暗示的授權許可復制、準備派生的作品、發(fā)布拷貝、顯示或其他對附加在此的程序附錄B的使用,除非該程序可能被復制作為由此發(fā)布的專利的附錄。
為了發(fā)生交易,所有上述數(shù)據(jù)字段必須匹配。為了安全原因,最好執(zhí)行用于匹配的一個“兩分鐘窗口(two minute window)”。如果在該兩分鐘窗口內(nèi)沒有匹配,則交易被中止。
一旦來自第一和第二計算機12,16的數(shù)據(jù)包由第三計算機20同步,則該第三計算機檢查ATM卡號和PIN。如果ATM卡號以及PIN是無效的,則第三計算機20通知第二計算機16,且在線商拒絕該購買定單并通知消費者(方框66)。如果ATM卡號和PIN是有效的,則第三計算機20檢查是否有充足的資金來支付該購買價格56(方框68)。如果帳戶中有充足的資金,則第三計算機把一個認可消息發(fā)送給第二計算機,把帳記入消費者的賬戶中,完成購買并通知消費者(方框70)。如果沒有充足的資金,則發(fā)送一個拒絕消息,在線商拒絕該購買并通知消費者(方框72)。
如果ATM卡是由合同第三方發(fā)行的,則驗證步驟(方框64和68)可能通過簡單地訪問在第三計算機20內(nèi)或連接于其上的一個內(nèi)部數(shù)據(jù)庫來完成。然而,如果ATM卡是由其它銀行發(fā)行的,那么合同第三方必須通過和發(fā)證銀行直接或通過一保密線路聯(lián)系,經(jīng)由一專用的ATM網(wǎng)絡,諸如CIRRUS或經(jīng)由任何其他可行途徑來驗證該卡信息。
圖4中概述了通過該系統(tǒng)的數(shù)據(jù)流。第一,消費者(第一計算機)通過網(wǎng)絡將他的PIN卡號發(fā)送給在線商(第二計算機)(方框74)。第二,在線商通過網(wǎng)絡將ATM卡號發(fā)送給合同第三方(第三計算機)(方框76)。第三,該消費者通過網(wǎng)絡將他的PIN發(fā)送給合同第三方(方框78)。如圖4所示,在線商被完全地繞過且永遠不會接收到PIN。第四,合同第三方驗證ATM卡號和PIN并檢查資金是否充足(方框80)。第五,合同第三方通過網(wǎng)絡將驗證過程的結果發(fā)送給在線商(方框82)。以及第六,在線商通過網(wǎng)絡將該結果發(fā)送給消費者,依據(jù)驗證的結果完成或拒絕該購買(方框84)。
因此,根據(jù)上述內(nèi)容實現(xiàn)了本發(fā)明的目的。本發(fā)明的各種修改對本領域的普通技術人員來說將是顯而易見的,但不會導致本發(fā)明被修改得脫離所附權利要求限定的范圍。
<pre listing-type="program-listing">  附錄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=″″;&lt;dp n="d8"/&gt;   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);//ERROR&lt;dp n="d9"/&gt;   }   }   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);   }  }&lt;dp n="d10"/&gt;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]?。?)   {   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 FIELD&lt;dp n="d11"/&gt;   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∷CAboutDlg()CDialog(CAboutDlg∷IDD){   //{{AFX_DATA_INIT(CAboutDlg)   //}}AFX_DATA_INIT}&lt;dp n="d12"/&gt;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_MAP()extem 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;&lt;dp n="d13"/&gt; 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;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;&amp;amp;(1==2)&amp;amp;&amp;amp;(p[1]==′A′))fullTrans=FALSE; if(set(*p,p+1,8)<1){reject(*p);return;} if((*p==52)&amp;amp;&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;&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;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‖fullTrans&amp;amp;&amp;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);&lt;dp n="d14"/&gt;}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;&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;amp; 0xFFF0)==IDM_ABOUTBOX);   ASSERT(IDM_ABOUTBOX<0xF000);   CMenu* pSysMenu=GetSystemMenu(FALSE);   if(pSysMenu ?。絅ULL)   {  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,F(xiàn)ALSE);//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;amp;TCPort,name,dbParam,&amp;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;}&lt;dp n="d15"/&gt; 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;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;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;} }&lt;dp n="d16"/&gt;  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);*/</pre>
權利要求
1.一種通過計算機網(wǎng)絡使用第一號碼和第二號碼進行購買的方法,該第一號碼識別消費者帳戶,從該帳戶中將提取資金來支付購買價格,該第二號碼與所述第一號碼有關,當該第二號碼與所述第一號碼一起使用時,能從所述帳戶中提取資金,所述方法包括步驟通過所述網(wǎng)絡從消費者位置電子地把所述第一號碼發(fā)送到在線商位置;通過所述網(wǎng)絡從所述在線商位置電子地把所述第一號碼發(fā)送到合同第三方位置;通過所述網(wǎng)絡從所述消費者位置電子地把所述第二號碼發(fā)送到所述合同第三方位置;以及在合同第三方位置處確定所述第一和第二號碼的有效性。
2.如權利要求1所述的方法,其中,當所述第二號碼從所述消費者位置傳送給合同第三方位置時繞過所述在線商位置。
3.如權利要求1所述的方法,其中,所述第一和第二號碼通過所述網(wǎng)絡經(jīng)由加密連接被發(fā)送。
4.如權利要求1所述的方法,其中所述網(wǎng)絡是Internet。
5.如權利要求1所述的方法,包括在合同第三方位置確定所述賬戶是否有足夠的資金來支付所述購買價格的附加步驟。
6.如權利要求1所述的方法,包括從所述合同第三方位置通過所述網(wǎng)絡電子地把一個信號發(fā)送給所述在線商位置以指示所述第一和第二號碼是否有效的附加步驟。
7.如權利要求5所述的方法,包括從所述合同第三方位置通過所述網(wǎng)絡電子地把一個信號發(fā)送給所述在線商位置以指示所述賬戶中是否有足夠的資金來支付所述購買價格的附加步驟。
8.如權利要求1所述的方法,包括從所述在線商位置通過所述網(wǎng)絡電子地把一個信號發(fā)送給所述消費者位置以指示所述購買是否已經(jīng)認可的附加步驟。
9.一種通過計算機網(wǎng)絡使用第一號碼和第二號碼進行購買的系統(tǒng),該第一號碼識別消費者帳戶,從該帳戶中將提取資金來支付購買價格,該第二號碼與所述第一號碼有關,當該第二號碼與所述第一號碼一起使用時,能從所述帳戶中提取資金,所述系統(tǒng)包括在消費者位置的第一計算機,所述第一計算機連接到所述網(wǎng)絡;位于在線商位置的第二計算機,所述第二計算機連接到所述網(wǎng)絡;以及在合同第三方位置的第三計算機,所述第三計算機連接到所述網(wǎng)絡;其中通過所述網(wǎng)絡從所述第一計算機把所述第一號碼發(fā)送給所述第二計算機;通過所述網(wǎng)絡從所述第二計算機把所述第一號碼發(fā)送給所述第三計算機;通過所述網(wǎng)絡從所述第一計算機把所述第二號碼發(fā)送給所述第三計算機;以及所述第三計算機確定所述第一和第二號碼是否有效。
10.如權利要求9所述的系統(tǒng),其中當把所述第二號碼發(fā)送給所述第三計算機時所述第一計算機繞過所述第二計算機。
11.如權利要求9所述的系統(tǒng),其中所述第一和第二號碼通過所述網(wǎng)絡經(jīng)由加密連接發(fā)送。
12.如權利要求9所述的系統(tǒng),其中所述網(wǎng)絡是Internet。
13.如權利要求9所述的系統(tǒng),其中所述第三計算機檢查所述帳戶中是否有足夠的資金來支付所述購買價格。
14.如權利要求9所述的系統(tǒng),其中所述第三計算機通知所述第二計算機所述第一和第二號碼是否有效。
15.如權利要求13所述的系統(tǒng),其中所述第三計算機通知所述第二計算機所述賬戶中是否有足夠的資金來支付所述購買價格。
16.如權利要求9所述的系統(tǒng),其中所述第二計算機通知所述第一計算機所述購買是否被認可。
17.一種認可將通過計算機網(wǎng)絡使用第一號碼和第二號碼進行的購買的方法,該第一號碼識別消費者帳戶,從該帳戶中將提取資金來支付購買價格,該第二號碼與所述第一號碼有關,當該第二號碼與所述第一號碼一起使用時,能從所述帳戶中提取資金,所述方法包括步驟在合同第三方位置接收通過所述網(wǎng)絡從在線商位置電子地發(fā)送的所述第一號碼;在所述合同第三方位置接收通過所述網(wǎng)絡從消費者位置電子地發(fā)送的所述第二號碼;以及在所述合同第三方位置處確定所述第一和第二號碼的有效性。
18.如權利要求17所述的方法,其中所述網(wǎng)絡是Internet。
19.如權利要求17所述的方法,包括在所述合同第三方位置確定所述賬戶中是否有足夠的資金來支付所述購買價格的附加步驟。
20.如權利要求17所述的方法,包括從所述合同第三方位置通過所述網(wǎng)絡電子地把一個信號發(fā)送給所述在線商位置以指示所述第一和第二號碼是否有效的附加步驟。
21.如權利要求19所述的方法,包括從所述合同第三方位置通過所述網(wǎng)絡電子地把一個信號發(fā)送給所述在線商位置以指示在所述賬戶中是否有足夠的資金來支付所述購買價格的附加步驟。
22.一種認可將通過計算機網(wǎng)絡使用第一號碼和第二號碼進行的購買的系統(tǒng),該第一號碼識別消費者的帳戶,從該帳戶中將提取資金來支付購買價格,該第二號碼與所述第一號碼有關,當該第二號碼與所述第一號碼一起使用時,能從所述帳戶中提取資金,所述系統(tǒng)包括連接到所述網(wǎng)絡的計算機;所述計算機被配置成接收通過所述網(wǎng)絡從在線商的計算機發(fā)送的所述第一號碼,接收通過所述網(wǎng)絡從消費者計算機發(fā)送的所述第二號碼,并驗證所述第一和第二號碼的有效性。
23.如權利要求22所述的系統(tǒng),其中所述網(wǎng)絡為Internet。
24.如權利要求22所述的系統(tǒng),其中所述計算機被配置成確定所述帳戶中是否有足夠的資金來支付所述購買價格。
25.如權利要求22所述的系統(tǒng),其中所述計算機被配置成通知所述在線商的計算機所述第一和第二號碼是否有效。
26.如權利要求24所述的系統(tǒng),其中所述計算機被配置成通知所述在線商的計算機所述帳戶中是否有足夠的資金來支付所述購買價格。
全文摘要
提供一種用于通過計算機網(wǎng)絡使用一ATM卡或類似物進行購買的方法和系統(tǒng)(10)。根據(jù)本發(fā)明,消費者(12)通過網(wǎng)絡(24)將他的ATM卡號發(fā)送給一在線商(16)。然后該在線商(16)將該ATM卡號發(fā)送給一合同第三方(20),如銀行,該合同第三方將檢查和認可該交易。與此同時或稍后,消費者(12)通過網(wǎng)絡將他的PIN發(fā)送給合同第三方(20),該合同第三方驗證該ATM卡和PIN是否有效。
文檔編號G06Q10/00GK1378675SQ00813905
公開日2002年11月6日 申請日期2000年9月7日 優(yōu)先權日1999年9月7日
發(fā)明者道格拉斯·W·金 申請人:埃帕西菲克公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1