diff --git a/src/ICanPay.Alipay/AlipayGateway.cs b/src/ICanPay.Alipay/AlipayGateway.cs
index 45405fe..a1fc619 100644
--- a/src/ICanPay.Alipay/AlipayGateway.cs
+++ b/src/ICanPay.Alipay/AlipayGateway.cs
@@ -44,8 +44,6 @@ namespace ICanPay.Alipay
public new Notify Notify => (Notify)base.Notify;
- protected override bool IsWaitPay => Notify.TradeStatus == Constant.WAIT_BUYER_PAY;
-
protected override bool IsSuccessPay => Notify.TradeStatus == Constant.TRADE_SUCCESS;
protected override string[] NotifyVerifyParameter => new string[]
@@ -123,7 +121,6 @@ namespace ICanPay.Alipay
TradeNo = tradeNo
});
var queryResponse = NetExecute(queryRequest);
- //TODO:检测签名
if (queryResponse.TradeStatus == Constant.TRADE_SUCCESS)
{
return true;
@@ -166,11 +163,16 @@ namespace ICanPay.Alipay
return false;
}
- private string BuildSign(GatewayData gatewayData)
+ protected override string BuildSign(GatewayData gatewayData)
{
return EncryptUtil.RSA(gatewayData.ToUrl(false), Merchant.Privatekey, Merchant.SignType);
}
+ protected override bool CheckSign(string data, string sign)
+ {
+ return EncryptUtil.RSAVerifyData(data, sign, Merchant.AlipayPublicKey, Merchant.SignType);
+ }
+
///
/// 是否是已成功支付的支付通知
///
@@ -231,10 +233,18 @@ namespace ICanPay.Alipay
GatewayData.FromJson(body);
string sign = GatewayData.GetStringValue(Constant.SIGN);
GatewayData.Remove(Constant.SIGN);
- GatewayData.FromJson(GatewayData[0].Value.ToString());
+ string data = GatewayData[0].Value.ToString();
+
+ if (!CheckSign(data, sign))
+ {
+ throw new GatewayException("签名验证失败");
+ }
+
+ GatewayData.FromJson(data);
GatewayData.Add(Constant.SIGN, sign);
GatewayData.Add(BODY, body);
+ //TODO:待优化
return GatewayData.ToObject(StringCase.Snake);
}
diff --git a/src/ICanPay.Core/Gateways/BaseGateway.cs b/src/ICanPay.Core/Gateways/BaseGateway.cs
index c19376e..38ccf9c 100644
--- a/src/ICanPay.Core/Gateways/BaseGateway.cs
+++ b/src/ICanPay.Core/Gateways/BaseGateway.cs
@@ -92,11 +92,6 @@ namespace ICanPay.Core
///
protected internal abstract bool IsSuccessPay { get; }
- ///
- /// 是否等待支付
- ///
- protected abstract bool IsWaitPay { get; }
-
///
/// 需要验证的参数名称数组,用于识别不同的网关类型。
/// 商户号(AppId)必须放第一位
@@ -130,8 +125,30 @@ namespace ICanPay.Core
HttpUtil.Write(FAILURE);
}
+ ///
+ /// 执行请求
+ ///
+ /// 数据模型
+ /// 返回模型
+ /// 请求
+ ///
public abstract TResponse Execute(Request request) where TResponse : IResponse;
+ ///
+ /// 生成签名
+ ///
+ /// 网关数据
+ ///
+ protected abstract string BuildSign(GatewayData gatewayData);
+
+ ///
+ /// 检验签名
+ ///
+ /// 待验证数据
+ /// 签名
+ ///
+ protected abstract bool CheckSign(string data, string sign);
+
#endregion
#endregion
diff --git a/src/ICanPay.Core/Gateways/GatewayData.cs b/src/ICanPay.Core/Gateways/GatewayData.cs
index 6020b01..40703e3 100644
--- a/src/ICanPay.Core/Gateways/GatewayData.cs
+++ b/src/ICanPay.Core/Gateways/GatewayData.cs
@@ -484,10 +484,16 @@ namespace ICanPay.Core
if (!string.IsNullOrEmpty(json))
{
var jObject = JObject.Parse(json);
- var list = jObject.Children().OfType();
- foreach (var item in list)
+ foreach (var item in jObject)
{
- Add(item.Name, item.Value.ToString());
+ if (item.Value.Type == JTokenType.Object)
+ {
+ Add(item.Key, item.Value.ToString(Newtonsoft.Json.Formatting.None));
+ }
+ else
+ {
+ Add(item.Key, item.Value.ToString());
+ }
}
}
}
diff --git a/src/ICanPay.Core/Gateways/NullGateway.cs b/src/ICanPay.Core/Gateways/NullGateway.cs
index 0658a39..7720751 100644
--- a/src/ICanPay.Core/Gateways/NullGateway.cs
+++ b/src/ICanPay.Core/Gateways/NullGateway.cs
@@ -9,20 +9,11 @@ namespace ICanPay.Core
///
public class NullGateway : BaseGateway
{
+ public override string GatewayUrl { get; set; }
- #region 属性
+ protected internal override bool IsSuccessPay { get; }
- public override string GatewayUrl { get; set; } = string.Empty;
-
- protected internal override bool IsSuccessPay => false;
-
- protected override bool IsWaitPay => false;
-
- protected internal override string[] NotifyVerifyParameter => new string[0];
-
- #endregion
-
- #region 方法
+ protected internal override string[] NotifyVerifyParameter { get; }
protected internal override async Task ValidateNotifyAsync()
{
@@ -34,7 +25,14 @@ namespace ICanPay.Core
throw new NotImplementedException();
}
- #endregion
+ protected override string BuildSign(GatewayData gatewayData)
+ {
+ throw new NotImplementedException();
+ }
+ protected override bool CheckSign(string data, string sign)
+ {
+ throw new NotImplementedException();
+ }
}
}
diff --git a/src/ICanPay.Unionpay/UnionpayGateway.cs b/src/ICanPay.Unionpay/UnionpayGateway.cs
index a69ebe5..016336f 100644
--- a/src/ICanPay.Unionpay/UnionpayGateway.cs
+++ b/src/ICanPay.Unionpay/UnionpayGateway.cs
@@ -43,6 +43,7 @@ namespace ICanPay.Unionpay
: base(merchant, new GatewayData(StringComparer.Ordinal))
{
_merchant = merchant;
+ //TODO:测试同时读取是否有问题
_merchant.CertId = Util.GetCertId(merchant.CertPath, merchant.CertPwd);
_merchant.CertKey = Util.GetCertKey(merchant.CertPath, merchant.CertPwd);
//_merchant.EncryptCertId = Util.GetEncryptCertId();