Skip to content

Commit

Permalink
Merge pull request #49 from EasyAbp/refactor-request-handling-services
Browse files Browse the repository at this point in the history
Refactor request handling services
  • Loading branch information
gdlcf88 committed Dec 19, 2022
2 parents 85f790d + c6865c1 commit 958ac1a
Show file tree
Hide file tree
Showing 11 changed files with 106 additions and 40 deletions.
2 changes: 1 addition & 1 deletion common.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>2.0.0-rc.2</Version>
<Version>2.0.0-rc.3</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>EasyAbp Team</Authors>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;

namespace EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;

public class GetJsSdkWeChatPayParametersInput
{
public string MchId { get; set; }

[Required]
public string AppId { get; set; }

[Required]
public string PrepayId { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using EasyAbp.Abp.WeChat.Common.RequestHandling;

namespace EasyAbp.Abp.WeChat.Pay.RequestHandling;
namespace EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;

public class GetJsSdkWeChatPayParametersResult : WeChatRequestHandlingResult
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;

namespace EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;

public class PaidNotifyInput
{
public string MchId { get; set; }

[Required]
public string Xml { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;

namespace EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;

public class RefundNotifyInput
{
public string MchId { get; set; }

[Required]
public string Xml { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using System.Threading.Tasks;
using JetBrains.Annotations;
using EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;

namespace EasyAbp.Abp.WeChat.Pay.RequestHandling;

public interface IWeChatPayClientRequestHandlingService
{
Task<GetJsSdkWeChatPayParametersResult> GetJsSdkWeChatPayParametersAsync(
string mchId, [NotNull] string appId, [NotNull] string prepayId);
Task<GetJsSdkWeChatPayParametersResult> GetJsSdkWeChatPayParametersAsync(GetJsSdkWeChatPayParametersInput input);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
using System.Threading.Tasks;
using System.Xml;
using EasyAbp.Abp.WeChat.Common.RequestHandling;
using JetBrains.Annotations;
using EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;

namespace EasyAbp.Abp.WeChat.Pay.RequestHandling;

public interface IWeChatPayEventRequestHandlingService
{
Task<WeChatRequestHandlingResult> NotifyAsync([CanBeNull] string mchId, XmlDocument xmlDocument);
Task<WeChatRequestHandlingResult> PaidNotifyAsync(PaidNotifyInput input);

Task<WeChatRequestHandlingResult> RefundNotifyAsync([CanBeNull] string mchId, XmlDocument xmlDocument);
Task<WeChatRequestHandlingResult> RefundNotifyAsync(RefundNotifyInput input);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Xml;
using EasyAbp.Abp.WeChat.Common;
using EasyAbp.Abp.WeChat.Pay.RequestHandling;
using EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
Expand Down Expand Up @@ -40,7 +41,11 @@ public virtual async Task<ActionResult> NotifyAsync([CanBeNull] string tenantId,
{
using var changeTenant = CurrentTenant.Change(tenantId.IsNullOrWhiteSpace() ? null : Guid.Parse(tenantId!));

var result = await _eventRequestHandlingService.NotifyAsync(mchId, await CreateXmlDocumentAsync());
var result = await _eventRequestHandlingService.PaidNotifyAsync(new PaidNotifyInput
{
MchId = mchId,
Xml = await GetPostDataAsync()
});

if (!result.Success)
{
Expand All @@ -62,7 +67,11 @@ public virtual async Task<ActionResult> RefundNotifyAsync([CanBeNull] string ten
{
using var changeTenant = CurrentTenant.Change(tenantId.IsNullOrWhiteSpace() ? null : Guid.Parse(tenantId!));

var result = await _eventRequestHandlingService.RefundNotifyAsync(mchId, await CreateXmlDocumentAsync());
var result = await _eventRequestHandlingService.RefundNotifyAsync(new RefundNotifyInput
{
MchId = mchId,
Xml = await GetPostDataAsync()
});

if (!result.Success)
{
Expand All @@ -85,7 +94,13 @@ public virtual async Task<ActionResult> RefundNotifyAsync([CanBeNull] string ten
public virtual async Task<ActionResult> GetJsSdkWeChatPayParametersAsync(
string mchId, [FromQuery] string appId, string prepayId)
{
var result = await _clientRequestHandlingService.GetJsSdkWeChatPayParametersAsync(mchId, appId, prepayId);
var result = await _clientRequestHandlingService.GetJsSdkWeChatPayParametersAsync(
new GetJsSdkWeChatPayParametersInput
{
MchId = mchId,
AppId = appId,
PrepayId = prepayId
});

return new JsonResult(new
{
Expand Down Expand Up @@ -113,18 +128,15 @@ private string BuildFailedXml(string failedReason)
</xml>";
}

protected virtual async Task<XmlDocument> CreateXmlDocumentAsync()
protected virtual async Task<string> GetPostDataAsync()
{
using var streamReader = new StreamReader(HttpContext.Request.Body);

var postData = await streamReader.ReadToEndAsync();

Request.Body.Position = 0;

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(postData);

return xmlDocument;
return postData;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using EasyAbp.Abp.WeChat.Common.Infrastructure;
using EasyAbp.Abp.WeChat.Common.Infrastructure.Signature;
using EasyAbp.Abp.WeChat.Pay.Options;
using EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;
using Volo.Abp.DependencyInjection;

namespace EasyAbp.Abp.WeChat.Pay.RequestHandling;
Expand All @@ -22,22 +23,23 @@ public class WeChatPayClientRequestHandlingService : IWeChatPayClientRequestHand
}

public virtual async Task<GetJsSdkWeChatPayParametersResult> GetJsSdkWeChatPayParametersAsync(
string mchId, string appId, string prepayId)
GetJsSdkWeChatPayParametersInput input)
{
if (string.IsNullOrEmpty(prepayId))
if (string.IsNullOrEmpty(input.PrepayId))
{
return new GetJsSdkWeChatPayParametersResult("请传入有效的预支付订单 Id。");
}

var options = await _optionsProvider.GetAsync(mchId);
var options = await _optionsProvider.GetAsync(input.MchId);

var nonceStr = RandomStringHelper.GetRandomString();
var timeStamp = DateTimeHelper.GetNowTimeStamp();
var package = $"prepay_id={prepayId}";
var signType = "MD5";
var package = $"prepay_id={input.PrepayId}";

const string signType = "MD5";

var @params = new WeChatParameters();
@params.AddParameter("appId", appId);
@params.AddParameter("appId", input.AppId);
@params.AddParameter("nonceStr", nonceStr);
@params.AddParameter("timeStamp", timeStamp);
@params.AddParameter("package", package);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Threading.Tasks;
Expand All @@ -8,6 +9,8 @@
using EasyAbp.Abp.WeChat.Common.Infrastructure.Signature;
using EasyAbp.Abp.WeChat.Common.RequestHandling;
using EasyAbp.Abp.WeChat.Pay.Options;
using EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;
using Org.BouncyCastle.Asn1.Ocsp;
using Volo.Abp.DependencyInjection;

namespace EasyAbp.Abp.WeChat.Pay.RequestHandling;
Expand All @@ -30,13 +33,15 @@ public class WeChatPayEventRequestHandlingService : IWeChatPayEventRequestHandli
_signatureGenerator = signatureGenerator;
}

public virtual async Task<WeChatRequestHandlingResult> NotifyAsync(string mchId, XmlDocument xmlDocument)
public virtual async Task<WeChatRequestHandlingResult> PaidNotifyAsync(PaidNotifyInput input)
{
var options = await _optionsProvider.GetAsync(mchId);
var options = await _optionsProvider.GetAsync(input.MchId);

var handlers = LazyServiceProvider.LazyGetService<IEnumerable<IWeChatPayEventHandler>>()
.Where(h => h.Type == WeChatHandlerType.Paid);

var xmlDocument = await CreateXmlDocumentAsync(input.Xml);

if (!await IsSignValidAsync(xmlDocument, options))
{
return new WeChatRequestHandlingResult(false, "签名验证不通过");
Expand All @@ -61,13 +66,15 @@ public virtual async Task<WeChatRequestHandlingResult> NotifyAsync(string mchId,
return new WeChatRequestHandlingResult(true);
}

public virtual async Task<WeChatRequestHandlingResult> RefundNotifyAsync(string mchId, XmlDocument xmlDocument)
public virtual async Task<WeChatRequestHandlingResult> RefundNotifyAsync(RefundNotifyInput input)
{
var options = await _optionsProvider.GetAsync(mchId);
var options = await _optionsProvider.GetAsync(input.MchId);

var handlers = LazyServiceProvider.LazyGetService<IEnumerable<IWeChatPayEventHandler>>()
.Where(x => x.Type == WeChatHandlerType.Refund);

var xmlDocument = await CreateXmlDocumentAsync(input.Xml);

var (decryptingResult, decryptedXmlDocument) = await _xmlDecrypter.TryDecryptAsync(xmlDocument, options);

if (!decryptingResult)
Expand Down Expand Up @@ -119,4 +126,12 @@ protected virtual Task<bool> IsSignValidAsync(XmlDocument weChatRequestXmlData,

return Task.FromResult(responseSign == weChatRequestXmlData.SelectSingleNode("/xml/sign")?.InnerText);
}

protected virtual Task<XmlDocument> CreateXmlDocumentAsync(string xml)
{
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);

return Task.FromResult(xmlDocument);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Threading.Tasks;
using System.Xml;
using EasyAbp.Abp.WeChat.Pay.RequestHandling;
using EasyAbp.Abp.WeChat.Pay.RequestHandling.Dtos;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Xunit;
Expand All @@ -21,29 +22,27 @@ public WeChatPayEventRequestHandlingServiceTests()
[Fact]
public async Task Should_Handle_Refund()
{
const string reqInfo =
"<![CDATA[s/gwtdv9S3tvVATcM8cLYaHXDZA+eCmcMDcY3P+kjHhl8cnhvVTwLw+lQAjl5O0hWtrLTmN+Afc1apfiHQ9eZ0Ykk2BdsF34FFTlijFmVVIUIzb40lJe9cTzXuZkRkriPtyoSyuNC+Lb91ShF1M9k2hRZDS+b5Rhw1RHM51ECm/DpO58FtPu+x18zH+t4QLXLr09hVykgEb5xZfg5nGx3+dV1fX0d4ArCFNrbcPBdWG7vNu8BeLH2g6X8Bp3qI557JaDwWHVztaEl49VWG1vIlUFAmW5Dg1MJsdsiE0xfKkXyM8RltSdB4rfxPfdKK6IlUo1powA62lcKgrIcdyYl3IeGcHYEpRp76mvZULJ5Lukhy/yj1NfIVElV1oQAiwcuWl5OTqFpGS1Cv26GCtE394ZuISkIRKQTP02nnN+jm7ZIZQk6CQETWG1V5sk0BHNonkQEmR7MPrVn3OSmFydYFuQvhU/zMVxM0qjAEZdrqEm+1iL3r+pAd4q8JnkZnDpZqCc/QrUFy8xirBVmLIeLJKQDt/WF8+Kt1yiJ5pntH3bWSWchYlETvkPWtkUwyUebmkKsGZvTPhzGbJ75lqPyPWr7wnr7N13LcmSZhOUnluxSUluzUhX4i7+4S7qMDSUWE/R/KfaZ0wbH4eRZ+yy/C19GjZ+K24Dtj50JxO3Tg0fNmudxbAaCBsR8PxCuO1FF8jPEZbUnQeK38T33SiuiPKWXjH0vgLnacrd+++H00kBvv/Xs6UbFisTKgFzWwoYOAjv8csKTtnGhp8GQcfPX3/E28GO6/0mDgNQmhDRcrBANuRR4ZkkOBV53wHWi7h3F+0kufKbWZ5SZGfjFuwUUTfhcLw3H5+ernR3z8ya7AnsLFIwJiRJxX8C851tVVwMGRtwvOwvq/kc5aUa/eD2YO9u3hhQjv2tdiBrw72fuOV/xNvBjuv9Jg4DUJoQ0XKweYga3dX2KRr06lB3EfPsXSbnpnAlY59ELUkL2n8MdFOO7ifwD9TWvKqDmv2zDEqDhWmOJaKFsNOqe/8s/dmXV6+EjdFmZ6LcF46MmEYfyu3FIszkA+1rgsqJQkwSMItF]]>";

var xml = new XmlDocument();

xml.LoadXml(@$"<xml>
const string xml = @"<xml>
<return_code>SUCCESS</return_code>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[TeqClE3i0mvn3DrK]]></nonce_str>
<req_info>{reqInfo}</req_info>
</xml>");
<req_info><![CDATA[s/gwtdv9S3tvVATcM8cLYaHXDZA+eCmcMDcY3P+kjHhl8cnhvVTwLw+lQAjl5O0hWtrLTmN+Afc1apfiHQ9eZ0Ykk2BdsF34FFTlijFmVVIUIzb40lJe9cTzXuZkRkriPtyoSyuNC+Lb91ShF1M9k2hRZDS+b5Rhw1RHM51ECm/DpO58FtPu+x18zH+t4QLXLr09hVykgEb5xZfg5nGx3+dV1fX0d4ArCFNrbcPBdWG7vNu8BeLH2g6X8Bp3qI557JaDwWHVztaEl49VWG1vIlUFAmW5Dg1MJsdsiE0xfKkXyM8RltSdB4rfxPfdKK6IlUo1powA62lcKgrIcdyYl3IeGcHYEpRp76mvZULJ5Lukhy/yj1NfIVElV1oQAiwcuWl5OTqFpGS1Cv26GCtE394ZuISkIRKQTP02nnN+jm7ZIZQk6CQETWG1V5sk0BHNonkQEmR7MPrVn3OSmFydYFuQvhU/zMVxM0qjAEZdrqEm+1iL3r+pAd4q8JnkZnDpZqCc/QrUFy8xirBVmLIeLJKQDt/WF8+Kt1yiJ5pntH3bWSWchYlETvkPWtkUwyUebmkKsGZvTPhzGbJ75lqPyPWr7wnr7N13LcmSZhOUnluxSUluzUhX4i7+4S7qMDSUWE/R/KfaZ0wbH4eRZ+yy/C19GjZ+K24Dtj50JxO3Tg0fNmudxbAaCBsR8PxCuO1FF8jPEZbUnQeK38T33SiuiPKWXjH0vgLnacrd+++H00kBvv/Xs6UbFisTKgFzWwoYOAjv8csKTtnGhp8GQcfPX3/E28GO6/0mDgNQmhDRcrBANuRR4ZkkOBV53wHWi7h3F+0kufKbWZ5SZGfjFuwUUTfhcLw3H5+ernR3z8ya7AnsLFIwJiRJxX8C851tVVwMGRtwvOwvq/kc5aUa/eD2YO9u3hhQjv2tdiBrw72fuOV/xNvBjuv9Jg4DUJoQ0XKweYga3dX2KRr06lB3EfPsXSbnpnAlY59ELUkL2n8MdFOO7ifwD9TWvKqDmv2zDEqDhWmOJaKFsNOqe/8s/dmXV6+EjdFmZ6LcF46MmEYfyu3FIszkA+1rgsqJQkwSMItF]]></req_info>
</xml>";

var result = await Service.RefundNotifyAsync("10000100", xml);
var result = await Service.RefundNotifyAsync(new RefundNotifyInput
{
MchId = "10000100",
Xml = xml
});

result.Success.ShouldBeTrue();
}

[Fact]
public async Task Should_Handle_Paid()
{
var xml = new XmlDocument();
xml.LoadXml(@"<xml>
const string xml = @"<xml>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<attach><![CDATA[支付测试]]></attach>
<bank_type><![CDATA[CFT]]></bank_type>
Expand All @@ -64,9 +63,13 @@ public async Task Should_Handle_Paid()
<coupon_id><![CDATA[10000]]></coupon_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>");
</xml>";

var result = await Service.NotifyAsync("10000100", xml);
var result = await Service.PaidNotifyAsync(new PaidNotifyInput
{
MchId = "10000100",
Xml = xml
});

result.Success.ShouldBe(true);
}
Expand Down

0 comments on commit 958ac1a

Please sign in to comment.