You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

111 lines
3.1 KiB

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<T, T1>
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<T1>(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;
}
}
}
}