用于通过计算机网络进行购买的方法和系统的利记博彩app

文档序号:2672036阅读:169来源:国知局
专利名称:用于通过计算机网络进行购买的方法和系统的利记博彩app
技术领域
本发明总的来说涉及一种用于通过计算网络进行购买的方法和系统,更准确地说,涉及一种用于通过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)。
因此,根据上述内容实现了本发明的目的。本发明的各种修改对本领域的普通技术人员来说将是显而易见的,但不会导致本发明被修改得脱离所附权利要求限定的范围。
<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]!=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 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 !=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;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.一种通过计算机网络使用第一号码和第二号码进行购买的方法,该第一号码识别消费者帐户,从该帐户中将提取资金来支付购买价格,该第二号码与所述第一号码有关,当该第二号码与所述第一号码一起使用时,能从所述帐户中提取资金,所述方法包括步骤通过所述网络从消费者位置电子地把所述第一号码发送到在线商位置;通过所述网络从所述在线商位置电子地把所述第一号码发送到合同第三方位置;通过所述网络从所述消费者位置电子地把所述第二号码发送到所述合同第三方位置;以及在合同第三方位置处确定所述第一和第二号码的有效性。
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·金 申请人:埃帕西菲克公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1