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;
|
|
}
|
|
}
|
|
}
|
|
}
|