using System; using System.Text; using BWP.ABCClient.Businesses.Type; using BWP.ABCClient.Common; using BWP.ABCClient.Exceptions; namespace BWP.ABCClient.Businesses { public class BusinessBase where T : MessageBase where T1 : MessageBase { private readonly IBusinessType _businessType; public string MerchantID { get; set; } public string RequestUrl { get; set; } public bool IsTestState { get; set; } public T RequestObj { get; set; } public T1 ResponseObj { get; set; } public DateTime? Date { get; set; } public string SequenceNo { get; set; } public decimal Amount { get; set; } public string Remarks { get; set; } public string ResultNotifyURL { get; set; } protected AbcLog Log; public BusinessBase(IBusinessType businessInfo) { _businessType = businessInfo; Log = new AbcLog(businessInfo.Name); } public virtual void Request() { if (RequestObj == null) { throw new Exception("RequestObj不能为空"); } if (string.IsNullOrEmpty(RequestUrl)) { throw new Exception("RequestUrl不能为空"); } if (string.IsNullOrEmpty(MerchantID)) { throw new Exception("MerchantID不能为空"); } BeforeRequest(); RSAService.Sign(RequestObj, MerchantID, _businessType.SignEncoding, _businessType.IsMarket); var request = new Request { RequestEncoding = _businessType.RequestEncoding, ResponseEncoding = _businessType.ResponseEncoding, Url = RequestUrl, Message = SendXml }; Log.AddNewLine(string.Format("{0}交易开始:==========================", string.IsNullOrEmpty(SequenceNo) ? string.Empty : "流水号[" + SequenceNo + "]")); if (_businessType.CompressEnabled) { Log.AddNewLine("压缩前的报文"); Log.AddNewLine(MsgUtil.MsgToBareXml(RequestObj)); } Log.AddNewLine("提交的报文:"); Log.AddNewLine(request.Message); Log.AddNewLine(string.Format("连线网上支付平台:[{0}]", RequestUrl)); string result = request.Run(); string receivedXml = GetReceivedXml(result); Log.AddNewLine("返回报文:"); Log.AddNewLine(receivedXml); Verify(receivedXml); ResponseObj = MsgUtil.ParseXmlToMsg(receivedXml); AfterRequest(); } protected void Verify(string receivedXml) { if (!RSAService.Verify(receivedXml, _businessType.VerifyEncoding, _businessType.IsMarket, IsTestState)) { Log.AddNewLine("网上支付平台的响应报文签名验证失败"); Log.Commit(); throw new RSAException("网上支付平台的响应报文签名验证失败"); } } protected virtual void BeforeRequest() { } protected virtual void AfterRequest() { } private string GetReceivedXml(string result) { if (_businessType.CompressEnabled) { result = MsgUtil.DeCompress(result); } return result; } public string SendXml { get { var result = MsgUtil.MsgToBareXml(RequestObj); if (_businessType.CompressEnabled) { result = MsgUtil.Compress(result); } return result; } } } }