支付网关设计方案.docx
《支付网关设计方案.docx》由会员分享,可在线阅读,更多相关《支付网关设计方案.docx(50页珍藏版)》请在冰豆网上搜索。
![支付网关设计方案.docx](https://file1.bdocx.com/fileroot1/2023-2/6/5454e9b0-f1cf-406d-ac78-52262a31d34d/5454e9b0-f1cf-406d-ac78-52262a31d34d1.gif)
支付网关设计方案
支付网关设计方案
4.5证书和CRL的管理7
支付网关设计方案
1.功能
网关证书申请,管理。
持卡人身份验证。
处理商户货款支付信息。
保存、管理支付信息。
2.硬件构成
支付网关(PaymentGateway)由一组计算机组成。
按其功能,可划分为消息服务器,数据库服务器和管理员工作站。
消息服务器:
支持电子支付消息处理,提供持卡人身份认证,货款支付。
数据库服务器:
保存支付信息
管理员工作站:
管理网关证书,支付信息
3.软件系统
PCR(网关证书申请PaymentGatewayCertificateRegistration)
运行在网关管理员工作站上,提供申请、管理网关证书服务。
PAC(SET消息处理PaymentGatewayAuthorize&CaptureProcess)
运行在网关消息服务器上,提供持卡人身份认证,货款支付。
PAI(网关证书管理PaymentGatewayAdministratorInterface)
运行在网关管理员工作站上,提供证书和支付信息数据库管理员界面。
PB(银行身份验证PaymentGatewayBankInterface)
运行在网关消息服务器上,提供SET与银行网络的桥接。
4.软件结构
网关消息服务器处理与商户之间的电子支付消息(PAC),共8对:
AuthReq/Res
//授权
CapReq/Res
//获款
AuthRevReq/Res
//授权更改
CapRevReq/Res
//获款更改
CredReq/Res
//退款
CredRevReq/Res
//退款更改
PCertReq/Res
//申请证书
BatchAdminReq/Res
//批处理
网关申请数字证书需处理与PCA的证书消息(PCR),共3对:
Me_AqCInitReq/Res
//证书申请初始化
CertReq/Res
//证书申请
CertInqReq/Res
//证书查询
出于编程的清晰和对实际情况的考虑,每对消息单独处理,为每一对消息设计一个消息处理类,定义消息流处理函数。
对每一对消息,处理完成后保存事务记录。
对于PCR,将实际发生的支付和支付撤销等记入支付记录数据库
网关管理程序(PAI)
管理系统内已有的数字证书,黑名单等信息。
查询PAC和PCR的事务记录和PAC的支付记录。
银行接口程序(PB)
提供与现有银行信用卡支付网络的接口。
4.1消息处理基本流程:
每对消息的处理流程如下:
4.2消息处理类库结构
类SMessageWrapper包含了一个SMessage结构,该结构为SChoice的子类,包含了全部消息项,而每个消息处理的基本数据和处理流程都定义在各消息类的InputProcess和OutputProcess中。
classSMessageWrapper:
publicSSequence{
public:
SMessageHeadw-messageHead;
SMessagew-message;
}
classSmessage:
publicSChoice
{
SPInitReqw_purchaseInitRequest;
SPInitResw_purchaseInitResponse;
SPReqw_purchaseRequest;
SPResw_purchaseResponse;
SInqReqw_inquiryRequest;
SInqResw_inquiryResponse;
SAuthReqw_authorizationRequest;
SAuthResw_authorizationResponse;
SAuthRevReqw_authReversalRequest;
SAuthRevResw_authReversalResponse;
SCapReqw_captureRequestToBeTagged;
SCapResw_captureResponse;
SCapRevReqw_captureReversalRequest;
SCapRevResw_captureReversalResponse;
SCredReqw_creditRequest;
SCredResw_creditResponse;
SCredRevReqw_creditReversalRequest;
SCredRevResw_creditReversalResponse;
SBatchAdminReqw_batchAdministrationRequest;
SBatchAdminResw_batchAdministrationResponse;
SCardCInitReqw_cardholderCInitRequest;
SCardCInitResw_cardholderCInitResponse;
SMe_AqCInitReqw_meAqCInitRequest;
SMe_AqCInitResw_meAqCInitResponse;
SRegFormReqw_registrationFormRequest;
SRegFormResw_registrationFormResponse;
SCertReqw_certificateRequest;
SCertResw_certificateResponse;
SCertInqReqw_certificateInquiryRequest;
SCertInqResw_certificateInquiryResponse;
SErrorw_error;
}
4.3消息处理
电子支付系统的消息传送可以有三种实现:
Socket消息、通过网页交换数据和E_Mail邮件。
对每种消息传送实现,处理都是相同的。
首先去掉可能有的数据封包(如E_Mail)。
如果消息经过编码,解码(如使用E_Mail传送消息,消息要编码成字符串)。
消息解包。
然后判断消息的类型,根据类型生成消息处理类,调用该类的函数完成消息处理。
switch(MessageType)
{
caseAuthReq:
w_authorizationRequest.InputProcess(rootCert,…);
…
break;
caseAuthRes:
…
}
4.4证书和CRL的管理
classCXCertManager//证书管理
{
public:
OpenCert();//获取证书
DeleteCert();//删除证书
SaveCert();//保存证书
}
classCXCrlManager//CRLs管理
{
public:
SaveCRLs();//保存黑名单
OpenCRLs();//获取黑名单
}
证书和CRL保存在一个口令保护的数据库中。
字段:
TypeInteger
DataLongBinary
ThumbsLongBinary
使用MFCODBC类库即可得到满意的存取速度。
4.5消息数据的保存
由于消息是单独处理的。
程序本身不保留消息处理之间的数据。
因而每个消息处理过程中的数据结果要保存在系统事务记录数据库中。
需要保存的的数据包括:
TransIDs,RRPIDs等事务状态信息。
在处理相关的消息时,程序查询系统事务记录数据库,以获得前面相关事务的状态信息,用于确认和比较。
事务记录数据库字段:
xIDText[20]
RRPIDText[20]
LID_CText[20]
LID_MText[20]
…
TransactionTypeInteger//记录对应的事务类型
CurrTimeDateTime
5PCR(PaymentGatewayCertificateRegistration)
处理三对消息Me_AqCInitReq/Res,CertReq/Res和CertInqReq/Res。
5.1证书申请初始化(Me_AqCInitReq/Res)
消息处理类:
CXMe_AqCInitReqRes
{
virtualSendReq();//发送请求
//等待应答
virtualUnPak();//解包
virtualVerify();//校验
vritualResProcess();//处理应答
virtualSaveData();//保存结果
}
5.1.1发送请求
SendReq()
{
1.生成一个新的RRPID(调用内核函数实现)
2.生成一个新的(未用过的)LIDEE
3.生成一个随机的ChallEE(调用内核函数实现)
4.填充BRANDID,此值从SET初始化消息中获取或已存在本地系统中.
5.填写请求类型域.
6.填写语种域.
7.(可选)用所有存在于缓冲区中的黑名单,SET证书,BrandCRLIdentifier及根证书生成指印。
8.填充BIN和ID。
9.调用ComposeMessageWrapper将Me-AqCInitReq发送给PCA
IDData域:
AcquirerID
AcquirerBIN
[AcquirerBusinessID]
}
5.1.2解包
UnPak()
{
提取Me_AqCInitRes消息(内核).
}
5.1.3校验
Verify()
{
从”Me-AqCInitResTBS”域,提取RRPID,LID-EE,Chall-EE,CAEThumb,BrandCRLIdentifier,Thumbs及RequestType。
验证接收到的RRPID与Me_AqCInitReq中的RRPID是否相同,否则返回错误信息,错误码置为“unknowRRPID”。
验证接收到的Chall-EE与Me_AqCInitReq中的Chall-EE是否相同,否则返回错误信息,错误码置为“challengeMismatch”。
验证Thumbs与Me_AqCInitReq中的Thumbs是否相同,否则返回错误信息,错误码置为“thumbsMismatch”。
验证签名(内核),如没通过,返回错误信息,错误码置为“signatureFailure”。
}
5.1.4处理证书申请初始化响应
ResProcess()
{
1.如果Me-AqCInitResTBS包含RegFormData则:
a)显示政策性文本且要求用户同意提交CertReq.
b)显示注册表单中的可见域,提示用户填写.
c)如果Me-AqCInitResTBS包含URL(S),显示Brandand/orCardLogos.
d)如果存在AcctDataField,显示NameandDescription且提示用户填写.
e)填充所有不可见域,如果一个域要求填充,但不可见且不能填充时,置之为空.其余的应填写好。
2.在商户填好注册表单且加入AcctData,如可行生成CertReq.
3.如果在Me-AqCInitResTBS包含ReferralData,则:
a)显示原因.
b)如果包含RefferalLoc,显示包含在其中的URLs或E-MAIL地址.
c)退出消息处理。
}
5.1.5保存数据
SaveData()
{
RRPID,Chall-EE,指印(如果生成了指印)
CAEThumb,BrandCRLIdentifier及RequestType。
LID-CA,Chall-CA
TransactionType=Me_AqCInitReqRes,CurrentTime
}
5.2证书申请(CertReq/Res)
消息处理类:
CXCertReqRespublicCXGatewayCertMsgProcess
{
virtualSendReq();//发送请求
//等待应答
virtualUnPak();//解包
virtualVerify();//校验
vritualResProcess();//处理应答
virtualSaveData();//保存结果
}
5.2.1发送请求
SendReq()
{//p176
系统管理员输入身份证明数据(如果有的话),及其它PCA要求的信息(包含在注册表单中)。
CertReq包含:
1.新的公钥(S);
2.要被更新的证书(如果可行);
3.已填好的注册表单;
4.帐户信息;
5.密钥,CA用之加密CertRes;
6.其它referencenumbersandchallenges;
CertReq重新提交:
如果CA发现提交的注册表单中有误,将在CertRes中标识,可以重新提交一个正确的注册表单.
CertReq根据AcctInfo存在来决定是采用Encx或者Enc处理。
AcctInfo存在则采用EncX,否则用Enc.Me-AqCInitRes指明是否AcctInfo需要包含在AcctInfoField中。
1.如果RequestType为一个新的或更新的签名证书,为此证书生成一个密钥/公钥对。
2.如果RequestType为一个新的或更新的加密证书,为此证书生成一个密钥/公钥对。
3.生成一16bit的随机数,EXNonce。
4.按如下步骤产生CertReqTBS:
a)产生一个新RRPID。
b)如果已接收到Me-AqCInitRes,从中得到RequestType,否则自己生成RequestType。
c)用当前日期填写RequestData。
d)从前一个消息中拷贝LID-EE。
如果不存在,产生一个新的。
e)产生新的Chall-EE3。
f)从前一个消息中拷贝LID-CA及Chall-CA,如果存在。
g)填写IDData;如果Me-AqCInitRes中包括AcctDataField,且此域为必须的,将EE输入的AcctData包含进去。
h)生成EXNoNCE。
i)从Me-AqCInitRes中拷贝RegFormID。
j)如果RegFieldSeq存在于Me-AqCInitRes中,将新的或修正的RegForm包含在内。
6.用新产生的公钥,PublickeySand/orPublicKeyE.
a)如RequestType为更新一个加密证书,用将被更新证书的指印填写EEThumb;如为签名证书,则签名证书的指印不需要。
b)(可选)包含指印(eachCRL,SETcertificate,BrandCRLIdentifierandRootcertficateresidentintheCardholder’strustedcache,ifanyexists).
7.然后构造“ToBeExtraEncrypted”数据:
如果要求,填写AcctData及EXNonce.
8.用EncX封装函数给数据加上“信封”(内核实现)
}
5.2.2解包
UnPak()
{
获取CertRes消息。
}
5.2.3校验
Verify()
{
验证LID-EE,Chall-EE与CertReq;returnanErrorMessagewithErrorCodesettochallengeMismatch.
验证Thumbs;如失败,returnanErrorMessagewithErrorCodesettothumbsMismatch.
}
5.2.4处理证书申请初始化响应
ResProcess()
{
1.验证新证书:
a)如果CertStatusCode表明“Certificaterequestcomplete”,则:
1)从SignedData证书部分取得新证书,并验证签名;
2)验证CertThumbs与CertReq,失败则returnanErrorMessagewithErrorCodesettothumbsMismatch。
3)验证证书中相应与密钥的公钥,失败则returnanErrorMessagewithErrorCodesettoinvalidCertificate。
b)如果CertStatusCode表明“MalformedRegistrationFormItems”,注册表单中有一些域有错。
对每一个,显示Item号及对应的错误信息(在CertRes中返回)。
允许EE重新输入这些域,应重新提交表单。
c)如果CertStatusCode为requestinProgress或requestPended,需在稍晚通过提交CertInqReq来获取证书。
d)如果CertStatusCode为任何其他值,显示EEMessage.
2.验证失败,发送MCA一个出错信息表明失败。
}
5.2.5保存数据
SaveData()
{
RRPID,LID-CA,LID-CA3,TransactionType=CertReqRes,CurrentTime
}
5.3证书申请查询(CertInqReq/Res)
如果证书没有在CertRes中返回,商户可以通过发送CertInqReq给PCA来查询证书的状态。
如果证书已经准备好了则在CertInqRes中返回,否则提供类似什么时候证书生成之类的信息。
如果CertStatusCode表明requestinProgress或requestPended,需通过提交CertInqReq来获取证书。
消息处理类:
CXInqReqRespublicCXGatewayCertMsgProcess
{
virtualSendReq();//发送请求
//等待应答
GetSavedData();//获取保存数据
virtualUnPak();//解包
virtualVerify();//校验
vritualResProcess();//处理应答
virtualSaveData();//保存结果
}
5.3.1发送请求
SendReq()
{//p198
1.GetSaveData();
2.产生新的RRPID;
3.产生新的LID-EE;
4.产生新的Chall-EE3;
对CertInqReqTBS进行签名(内核),将SignedData的contenttype设置为id-set-content-CertInqReqTBS;CertInqReq签名方式与CertReq相同。
调用ComposeMessageWrapper(内核),发送CertInqReq给PCA。
}
GetSavedData()
{
向用户提供已提交的CertReq/Res列表,由用户选择要查询的数字证书。
选择CertRes,获得LID-CA,LID-CA3。
}
5.3.2解包
UnPak()
{
同CertReq/Res。
}
5.3.3校验
Verify()
{
同CertReq/Res。
}
5.3.4处理证书申请初始化响应
ResProcess()
{
同CertReq/Res。
}
5.3.5保存数据
SaveData()
{
RRPID,LID-EE,Chall-EE3TransactionType=CertInqReqRes,CurrentTime
}
6PAC(PaymentGatewayAuthorize&CaptureProcess)
6.1授权验证(AuthReq/Res)
消息处理类:
classCXAuthReqRespublic:
CXMe_GatewayMsgProcess
{
virtualGetSavedData();//获取保存数据
virtualUnPak();//解包
virtualVerify();//校验
vritualReqProcess();//处理请求
virtualCreateRes();//创建应答
virtualSaveData();//保存数据
virtualPak();//打包
}
6.1.1获取保存数据
GetSavedData()
{
}
6.1.2解包
UnPak()
{
获取AuthReq消息。
}
6.1.3校验
Verify()
{
签名验证和内部一致性检查调用内核函数实现。
校验TransIDs
XIDs
LID-Cs
如AuthTags和PIHead中包含LID_Ms,校验LID_Ms
如校验失败,在AuthCode中返回“piAuthMismatch”。
}
6.1.4处理请求
ReqProcess()
{
如果PI是AuthToken,处理AuthToken.
如果PI签名,校验持卡人签名证书品牌和支付网关交换证书品牌。
如不一致,在AuthCode中返回“CardMerchBrandMismatch”。
校验PANData。
校验SO数字签名。
保存PANData数据。
如果PI无签名,检查网关证书,校验网关是否必须要求PI数字签名。
如果必须要求,在AuthCode中返回“signatureRequired”。
校验EXH的哈希值。
保存PANData数据。
verifyPis状态,如果PI正在处理中,在AuthCode中返回“piPreviouslyUsed
处理PIHead
verifyPiHead.MerchantID和merID(证书中merchantData扩展)在AuthoCode中返回“piPreviouslyUsed”
将TransStain转送到发卡行(联机)或利用数据库(脱机)
校验持卡人和商户发送的OIData,如不一致,在AuthoCode中返回“piAuthMismatch”
校验PIHead中的HOD和AuthReaPayload中的HOD2,如不一致,返回错误信息“HODMismatch”。
处理PIExtensions,如发现不支持的扩展,返回错误信息“unrecognizeExtension”。
如AuthReq中包含InstallRecurData,校验AuthReqPayload和PIHead中的InstallRecurData,如不一致,在AuthoCode中返回“InstallRecurMismat