Selaa lähdekoodia

实现 微信支付APIv3-微信支付分 (#110)

* 微信支付分对接代码

* 简单UI测试后的调整

* 按业务流程测试后调整,整个流程都通了
Tolo 4 vuotta sitten
vanhempi
sitoutus
79c282c565
80 muutettua tiedostoa jossa 4617 lisäystä ja 0 poistoa
  1. 1 0
      README.md
  2. 433 0
      samples/WebApplicationSample/Controllers/WeChatPayScoreController.cs
  3. 125 0
      samples/WebApplicationSample/Controllers/WeChatPayScoreNotifyController.cs
  4. 224 0
      samples/WebApplicationSample/Models/WeChatPayScoreViewModel.cs
  5. 3 0
      samples/WebApplicationSample/Views/Shared/_Layout.cshtml
  6. 175 0
      samples/WebApplicationSample/Views/WeChatPayScore/Index.cshtml
  7. 37 0
      samples/WebApplicationSample/Views/WeChatPayScore/Permissions.cshtml
  8. 33 0
      samples/WebApplicationSample/Views/WeChatPayScore/PermissionsQueryForAuthCode.cshtml
  9. 33 0
      samples/WebApplicationSample/Views/WeChatPayScore/PermissionsQueryForOpenId.cshtml
  10. 37 0
      samples/WebApplicationSample/Views/WeChatPayScore/PermissionsTerminateForAuthCode.cshtml
  11. 37 0
      samples/WebApplicationSample/Views/WeChatPayScore/PermissionsTerminateForOpenId.cshtml
  12. 62 0
      samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrder.cshtml
  13. 37 0
      samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderCancel.cshtml
  14. 49 0
      samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderComplete.cshtml
  15. 73 0
      samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderDirectComplete.cshtml
  16. 53 0
      samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderModify.cshtml
  17. 33 0
      samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderPay.cshtml
  18. 39 0
      samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderQuery.cshtml
  19. 41 0
      samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderSync.cshtml
  20. 4 0
      samples/WebApplicationSample/appsettings.Development.json
  21. 4 0
      samples/WebApplicationSample/appsettings.json
  22. 59 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/Collection.cs
  23. 72 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/CollectionDetail.cs
  24. 42 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/GoodsDetail.cs
  25. 35 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/Location.cs
  26. 17 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/ModifyPostDiscount.cs
  27. 42 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/PostDiscount.cs
  28. 52 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/PostPayment.cs
  29. 101 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/PromotionDetail.cs
  30. 49 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/RiskFund.cs
  31. 31 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/SyncDetail.cs
  32. 71 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/TimeRange.cs
  33. 27 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreModelBase.cs
  34. 50 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsModel.cs
  35. 21 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsQueryForAuthCodeModel.cs
  36. 27 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsQueryForOpenIdModel.cs
  37. 31 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsTerminateForAuthCodeModel.cs
  38. 40 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsTerminateForOpenIdModel.cs
  39. 21 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderCancelModel.cs
  40. 77 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderCompleteModel.cs
  41. 125 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderDirectCompleteModel.cs
  42. 116 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderModel.cs
  43. 52 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderModifyModel.cs
  44. 10 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderPayModel.cs
  45. 32 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderQueryModel.cs
  46. 30 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderSyncModel.cs
  47. 157 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Notify/WeChatPayScoreNotifyBase.cs
  48. 77 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Notify/WeChatPayScorePermissionsOpenOrCancelNotify.cs
  49. 11 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Notify/WeChatPayScoreServiceOrderConfirmNotify.cs
  50. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Notify/WeChatPayScoreServiceOrderPaidNotify.cs
  51. 37 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsQueryForAuthCodeRequest.cs
  52. 35 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsQueryForOpenIdRequest.cs
  53. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsRequest.cs
  54. 34 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsTerminateForAuthCodeRequest.cs
  55. 34 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsTerminateForOpenIdRequest.cs
  56. 31 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderCancelRequest.cs
  57. 31 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderCompleteRequest.cs
  58. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderDirectCompleteRequest.cs
  59. 31 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderModifyRequest.cs
  60. 31 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderPayRequest.cs
  61. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderQueryRequest.cs
  62. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderRequest.cs
  63. 34 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderSyncRequest.cs
  64. 90 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsQueryForAuthCodeResponse.cs
  65. 84 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsQueryForOpenIdResponse.cs
  66. 22 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsResponse.cs
  67. 13 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsTerminateForAuthCodeResponse.cs
  68. 13 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsTerminateForOpenIdResponse.cs
  69. 32 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreResponseBase.cs
  70. 21 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderCancelResponse.cs
  71. 125 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderCompleteResponse.cs
  72. 111 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderDirectCompleteResponse.cs
  73. 150 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderModifyResponse.cs
  74. 21 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderPayResponse.cs
  75. 157 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderQueryResponse.cs
  76. 130 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderResponse.cs
  77. 156 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderSyncResponse.cs
  78. 18 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/ServiceOrderState.cs
  79. 18 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/WeChatPayScoreUserServiceStatus.cs
  80. 5 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/WeChatPayOptions.cs

+ 1 - 0
README.md

@@ -48,6 +48,7 @@ Essensoft.AspNetCore.Payment.Security | [![NuGet](https://img.shields.io/nuget/v
     - 基础支付
     - 基础支付(服务商)
     - 商户进件(服务商)
+    - 微信支付分
 
 ## 开发环境
 * Windows 10

+ 433 - 0
samples/WebApplicationSample/Controllers/WeChatPayScoreController.cs

@@ -0,0 +1,433 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.WeChatPay;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using WebApplicationSample.Models;
+
+namespace WebApplicationSample.Controllers
+{
+    public class WeChatPayScoreController : Controller
+    {
+        private readonly IWeChatPayClient _client;
+        private readonly IOptions<WeChatPayOptions> _optionsAccessor;
+
+        public WeChatPayScoreController(IWeChatPayClient client, IOptions<WeChatPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 创建支付分订单
+        /// </summary>
+        public IActionResult ServiceOrder()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 创建支付分订单
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrder(WeChatPayScoreServiceOrderViewModel viewModel)
+        {
+            var model = new WeChatPayScoreServiceOrderModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                OutOrderNo = viewModel.OutOrderNo,
+                ServiceIntroduction = viewModel.ServiceIntroduction,
+                TimeRange = new TimeRange {
+                    StartTime = viewModel.StartTime,
+                    EndTime = viewModel.EndTime
+                },
+                RiskFund = new RiskFund {
+                    Name = viewModel.RiskFundName,
+                    Amount = viewModel.RiskFundAmount
+                },
+                NotifyUrl = viewModel.NotifyUrl,
+                OpenId = viewModel.OpenId
+            };
+            var request = new WeChatPayScoreServiceOrderRequest();
+            request.SetBodyModel(model);
+            var response =await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 查询支付分订单
+        /// </summary>
+        public IActionResult ServiceOrderQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 查询支付分订单
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderQuery(WeChatPayScoreServiceOrderQueryViewModel viewModel)
+        {
+            var model = new WeChatPayScoreServiceOrderQueryModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                OutOrderNo = viewModel.OutOrderNo,
+                QueryId = viewModel.QueryId
+            };
+            var request = new WeChatPayScoreServiceOrderQueryRequest();
+            request.SetQueryModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 取消支付分订单
+        /// </summary>
+        public IActionResult ServiceOrderCancel()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 取消支付分订单
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderCancel(WeChatPayScoreServiceOrderCancelViewModel viewModel)
+        {
+            var model = new WeChatPayScoreServiceOrderCancelModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                Reason = viewModel.Reason
+            };
+            var request = new WeChatPayScoreServiceOrderCancelRequest();
+            request.OutOrderNo = viewModel.OutOrderNo;
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request,_optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 修改支付分订单金额
+        /// </summary>
+        public IActionResult ServiceOrderModify()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 修改支付分订单金额
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderModify(WeChatPayScoreServiceOrderModifyViewModel viewModel)
+        {
+            var model = new WeChatPayScoreServiceOrderModifyModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,                
+                PostPayments = new List<PostPayment> {
+                   new PostPayment{
+                       Name = viewModel.Name,
+                       Amount = viewModel.Amount,
+                       Count = viewModel.Count
+                   }
+                },
+                TotalAmount = viewModel.TotalAmount,
+                Reason = viewModel.Reason
+            };
+            var request = new WeChatPayScoreServiceOrderModifyRequest();
+            request.OutOrderNo = viewModel.OutOrderNo;
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 完结支付分订单
+        /// </summary>
+        public IActionResult ServiceOrderComplete()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 完结支付分订单
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderComplete(WeChatPayScoreServiceOrderCompleteViewModel viewModel)
+        {
+            var model = new WeChatPayScoreServiceOrderCompleteModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                PostPayments = new List<PostPayment> {
+                   new PostPayment{
+                       Name = viewModel.Name,
+                       Amount = viewModel.Amount,
+                       Count = viewModel.Count
+                   }
+                },
+                TotalAmount = viewModel.TotalAmount
+            };
+            var request = new WeChatPayScoreServiceOrderCompleteRequest();
+            request.OutOrderNo = viewModel.OutOrderNo;
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 商户发起催收扣款
+        /// </summary>
+        public IActionResult ServiceOrderPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 商户发起催收扣款
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderPay(WeChatPayScoreServiceOrderPayViewModel viewModel)
+        {
+            var model = new WeChatPayScoreServiceOrderPayModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId
+            };
+            var request = new WeChatPayScoreServiceOrderPayRequest();
+            request.OutOrderNo = viewModel.OutOrderNo;
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 同步服务订单信息
+        /// </summary>
+        public IActionResult ServiceOrderSync()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 同步服务订单信息
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderSync(WeChatPayScoreServiceOrderSyncViewModel viewModel)
+        {
+            var model = new WeChatPayScoreServiceOrderSyncModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                Type = viewModel.Type,
+                Detail = new SyncDetail {
+                    PaidTime = viewModel.PaidTime
+                }
+            };
+            var request = new WeChatPayScoreServiceOrderSyncRequest();
+            request.OutOrderNo = viewModel.OutOrderNo;
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 创单结单合并
+        /// </summary>
+        public IActionResult ServiceOrderDirectComplete()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 创单结单合并
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderDirectComplete(WeChatPayScoreServiceOrderDirectCompleteViewModel viewModel)
+        {
+            var model = new WeChatPayScoreServiceOrderDirectCompleteModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                OutOrderNo = viewModel.OutOrderNo,
+                ServiceIntroduction = viewModel.ServiceIntroduction,
+                PostPayments = new List<PostPayment> {
+                   new PostPayment{
+                       Name = viewModel.PostPaymentName,
+                       Amount = viewModel.PostPaymentAmount,
+                       Description = viewModel.PostPaymentDescription,
+                       Count = viewModel.PostPaymentCount
+                   }
+                },
+                TimeRange = new TimeRange
+                {
+                    StartTime = viewModel.StartTime,
+                    EndTime = viewModel.EndTime
+                },
+                TotalAmount = viewModel.TotalAmount,
+                NotifyUrl = viewModel.NotifyUrl,
+                OpenId = viewModel.OpenId
+            };
+            var request = new WeChatPayScoreServiceOrderDirectCompleteRequest();
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 商户预授权
+        /// </summary>
+        public IActionResult Permissions()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 商户预授权
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> Permissions(PermissionsViewModel viewModel)
+        {
+            var model = new WeChatPayScorePermissionsModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                AuthorizationCode = viewModel.AuthorizationCode,
+                NotifyUrl = viewModel.NotifyUrl
+            };
+            var request = new WeChatPayScorePermissionsRequest();
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 支付分-查询用户授权记录(授权协议号)
+        /// </summary>
+        public IActionResult PermissionsQueryForAuthCode()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 支付分-查询用户授权记录(授权协议号)
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> PermissionsQueryForAuthCode(PermissionsQueryForAuthCodeViewModel viewModel)
+        {
+            var model = new WeChatPayScorePermissionsQueryForAuthCodeModel
+            {
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId
+            };
+            
+            var request = new WeChatPayScorePermissionsQueryForAuthCodeRequest();
+            request.AuthorizationCode = viewModel.AuthorizationCode;
+            request.SetQueryModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 解除用户授权关系(授权协议号)
+        /// </summary>
+        public IActionResult PermissionsTerminateForAuthCode()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 解除用户授权关系(授权协议号)
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> PermissionsTerminateForAuthCode(PermissionsTerminateForAuthCodeViewModel viewModel)
+        {
+            var model = new WeChatPayScorePermissionsTerminateForAuthCodeModel
+            {                
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                Reason  = viewModel.Reason
+            };
+            var request = new WeChatPayScorePermissionsTerminateForAuthCodeRequest();
+            request.AuthorizationCode = viewModel.AuthorizationCode;
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 支付分-查询用户授权记录(openid)
+        /// </summary>
+        public IActionResult PermissionsQueryForOpenId()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 支付分-查询用户授权记录(openid)
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> PermissionsQueryForOpenId(PermissionsQueryForOpenIdViewModel viewModel)
+        {
+            var model = new WeChatPayScorePermissionsQueryForOpenIdModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId
+            };
+            var request = new WeChatPayScorePermissionsQueryForOpenIdRequest();
+            request.OpenId = viewModel.OpenId;
+            request.SetQueryModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 解除用户授权关系(OpenId)
+        /// </summary>
+        public IActionResult PermissionsTerminateForOpenId()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 解除用户授权关系(OpenId)
+        /// </summary>
+        [HttpPost]
+        public async Task<IActionResult> PermissionsTerminateForOpenId(PermissionsTerminateForOpenIdViewModel viewModel)
+        {
+            var model = new WeChatPayScorePermissionsTerminateForOpenIdModel
+            {
+                AppId = _optionsAccessor.Value.AppId,
+                ServiceId = _optionsAccessor.Value.PayScoreServiceId,
+                Reason = viewModel.Reason
+            };
+            var request = new WeChatPayScorePermissionsTerminateForOpenIdRequest();
+            request.OpenId = viewModel.OpenID;
+            request.SetBodyModel(model);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+    }
+}

+ 125 - 0
samples/WebApplicationSample/Controllers/WeChatPayScoreNotifyController.cs

@@ -0,0 +1,125 @@
+using System;
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.WeChatPay;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Notify;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+
+namespace WebApplicationSample.Controllers
+{
+    [Route("wechatpay/score/notify")]
+    public class WeChatPayScoreNotifyController : Controller
+    {
+        private readonly IWeChatPayNotifyClient _client;
+        private readonly IOptions<WeChatPayOptions> _optionsAccessor;
+
+        public WeChatPayScoreNotifyController(IWeChatPayNotifyClient client, IOptions<WeChatPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 开启/解除授权服务回调通知
+        /// </summary>
+        [Route("Permissions")]
+        [HttpPost]
+        public async Task<IActionResult> Permissions()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<WeChatPayScorePermissionsOpenOrCancelNotify>(Request, _optionsAccessor.Value);
+                if (notify.UserServiceStatus == WeChatPayScoreUserServiceStatus.Opened ||
+                    notify.UserServiceStatus == WeChatPayScoreUserServiceStatus.Closed)
+                {
+                    Console.WriteLine("Permissions body: " + notify.Body);
+                    return WeChatPayNotifyResult.Success;
+                }
+
+                return WeChatPayNotifyResult.Failure;
+            }
+            catch (WeChatPayException ex)
+            {
+                Console.WriteLine("出现异常: " + ex.Message);
+                return WeChatPayNotifyResult.Failure;
+            }
+        }
+
+        /// <summary>
+        /// 确认订单回调通知
+        /// </summary>
+        [Route("orderconfirm")]
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderConfirm()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<WeChatPayScoreServiceOrderConfirmNotify>(Request, _optionsAccessor.Value);
+                if (notify.State == ServiceOrderState.Doing)
+                {
+                    Console.WriteLine("ServiceOrderConfirm body: " + notify.Body);
+                    return WeChatPayNotifyResult.Success;
+                }
+
+                return WeChatPayNotifyResult.Failure;
+            }
+            catch (WeChatPayException ex)
+            {
+                Console.WriteLine("出现异常: " + ex.Message);
+                return WeChatPayNotifyResult.Failure;
+            }
+        }
+
+        /// <summary>
+        /// 订单支付成功回调通知
+        /// </summary>
+        [Route("orderpaid")]
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderPaid()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<WeChatPayScoreServiceOrderPaidNotify>(Request, _optionsAccessor.Value);
+                if (notify.State == ServiceOrderState.Done)
+                {
+                    Console.WriteLine("ServiceOrderPaid body: " + notify.Body);
+                    return WeChatPayNotifyResult.Success;
+                }
+
+                return WeChatPayNotifyResult.Failure;
+            }
+            catch (WeChatPayException ex)
+            {
+                Console.WriteLine("出现异常: " + ex.Message);
+                return WeChatPayNotifyResult.Failure;
+            }
+        }
+
+        /// <summary>
+        /// 订单 确认 或 支付成功 回调通知
+        /// </summary>
+        [Route("confirmorpaid")]
+        [HttpPost]
+        public async Task<IActionResult> ServiceOrderConfirmOrPaid()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<WeChatPayScoreServiceOrderPaidNotify>(Request, _optionsAccessor.Value);
+                if (notify.State == ServiceOrderState.Doing || notify.State == ServiceOrderState.Done)
+                {
+                    Console.WriteLine("ServiceOrderConfirmOrPaid body: " + notify.Body);
+                    return WeChatPayNotifyResult.Success;
+                }
+
+                return WeChatPayNotifyResult.Failure;
+            }
+            catch (WeChatPayException ex)
+            {
+                Console.WriteLine("出现异常: " + ex.Message);
+                return WeChatPayNotifyResult.Failure;
+            }
+        }
+    }
+}

+ 224 - 0
samples/WebApplicationSample/Models/WeChatPayScoreViewModel.cs

@@ -0,0 +1,224 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace WebApplicationSample.Models
+{
+    public class WeChatPayScoreServiceOrderViewModel
+    {
+        [Required]
+        [Display(Name = "out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        [Required]
+        [Display(Name = "service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        [Required]
+        [Display(Name = "start_time")]
+        public string StartTime { get; set; }
+
+        [Required]
+        [Display(Name = "end_time")]
+        public string EndTime { get; set; }
+
+        [Required]
+        [Display(Name = "risk_fund_name")]
+        public string RiskFundName { get; set; }
+
+        [Required]
+        [Display(Name = "risk_fund_amount")]
+        public long RiskFundAmount { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "openid")]
+        public string OpenId { get; set; }
+    }
+
+    public class WeChatPayScoreServiceOrderQueryViewModel
+    {
+        [Display(Name = "out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        [Display(Name = "query_id")]
+        public string QueryId { get; set; }
+
+    }
+
+    public class WeChatPayScoreServiceOrderCancelViewModel
+    {
+        [Required]
+        [Display(Name = "out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        [Required]
+        [Display(Name = "reason")]
+        public string Reason { get; set; }
+    }
+
+    public class WeChatPayScoreServiceOrderModifyViewModel
+    {
+        [Required]
+        [Display(Name = "out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_name")]
+        public string Name { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_amount")]
+        public long Amount { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_count")]
+        public uint Count { get; set; }
+
+        [Required]
+        [Display(Name = "total_amount")]
+        public long TotalAmount { get; set; }
+
+        [Required]
+        [Display(Name = "reason")]
+        public string Reason { get; set; }
+    }
+
+    public class WeChatPayScoreServiceOrderCompleteViewModel
+    {
+        [Required]
+        [Display(Name = "out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_name")]
+        public string Name { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_amount")]
+        public long Amount { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_count")]
+        public uint Count { get; set; }
+
+        [Required]
+        [Display(Name = "total_amount")]
+        public long TotalAmount { get; set; }
+    }
+
+    public class WeChatPayScoreServiceOrderPayViewModel
+    {
+        [Required]
+        [Display(Name = "out_order_no")]
+        public string OutOrderNo { get; set; }
+    }
+
+    public class WeChatPayScoreServiceOrderSyncViewModel
+    {
+        [Required]
+        [Display(Name = "out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        [Required]
+        [Display(Name = "type")]
+        public string Type { get; set; }
+
+        [Required]
+        [Display(Name = "paid_time")]
+        public string PaidTime { get; set; }
+    }
+
+
+    public class WeChatPayScoreServiceOrderDirectCompleteViewModel
+    {
+        [Required]
+        [Display(Name = "out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        [Required]
+        [Display(Name = "service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_name")]
+        public string PostPaymentName { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_amount")]
+        public long PostPaymentAmount { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_count")]
+        public uint PostPaymentCount { get; set; }
+
+        [Required]
+        [Display(Name = "post_payment_description")]
+        public string PostPaymentDescription { get; set; }
+
+
+        [Required]
+        [Display(Name = "start_time")]
+        public string StartTime { get; set; }
+
+        [Required]
+        [Display(Name = "end_time")]
+        public string EndTime { get; set; }
+
+        [Required]
+        [Display(Name = "total_amount")]
+        public long TotalAmount { get; set; }
+                
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "openid")]
+        public string OpenId { get; set; }
+    }
+
+    public class PermissionsViewModel
+    {
+        [Required]
+        [Display(Name = "authorization_code")]
+        public string AuthorizationCode { get; set; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+
+    public class PermissionsQueryForAuthCodeViewModel
+    {
+        [Required]
+        [Display(Name = "authorization_code")]
+        public string AuthorizationCode { get; set; }
+    }
+
+    public class PermissionsTerminateForAuthCodeViewModel
+    {
+        [Required]
+        [Display(Name = "authorization_code")]
+        public string AuthorizationCode { get; set; }
+
+        [Required]
+        [Display(Name = "reason")]
+        public string Reason { get; set; }
+    }
+
+    public class PermissionsQueryForOpenIdViewModel
+    {
+        [Required]
+        [Display(Name = "openid")]
+        public string OpenId { get; set; }
+    }
+
+    public class PermissionsTerminateForOpenIdViewModel
+    {
+        [Required]
+        [Display(Name = "openid")]
+        public string OpenID { get; set; }
+
+        [Required]
+        [Display(Name = "reason")]
+        public string Reason { get; set; }
+    }
+}

+ 3 - 0
samples/WebApplicationSample/Views/Shared/_Layout.cshtml

@@ -37,6 +37,9 @@
                     <li class="nav-item @Html.IsActive("WeChatPayV3")">
                         <a class="nav-link" asp-controller="WeChatPayV3" asp-action="Index">微信支付V3</a>
                     </li>
+                    <li class="nav-item @Html.IsActive("WeChatPayScore")">
+                        <a class="nav-link" asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a>
+                    </li>
                 </ul>
             </div>
         </div>

+ 175 - 0
samples/WebApplicationSample/Views/WeChatPayScore/Index.cshtml

@@ -0,0 +1,175 @@
+@{
+    ViewData["Title"] = "微信支付分(V3)";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Home" asp-action="Index">首页</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<div class="text-center">
+    <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_1_4.shtml" target="_blank">微信支付分的API列表</a>
+</div>
+<br />
+<table class="table table-bordered table-hover">
+    <thead>
+        <tr>
+            <th scope="col">#</th>
+            <th scope="col">产品</th>
+            <th scope="col">接口</th>
+            <th scope="col">#</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <th scope="row">1</th>
+            <td>创建支付分订单</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_14.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_14.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="ServiceOrder">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">2</th>
+            <td>查询支付分订单</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_15.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_15.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="ServiceOrderQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">3</th>
+            <td>取消支付分订单</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_16.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_16.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="ServiceOrderCancel">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">4</th>
+            <td>修改订单金额</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_17.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_17.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="ServiceOrderModify">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">5</th>
+            <td>完结支付分订单</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_18.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_18.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="ServiceOrderComplete">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">6</th>
+            <td>商户发起催收扣款</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_19.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_19.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="ServiceOrderPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">7</th>
+            <td>同步服务订单信息</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_20.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_20.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="ServiceOrderSync">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">8</th>
+            <td>申请退款</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_26.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_26.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayV3" asp-action="Refund">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">9</th>
+            <td>查询单笔退款</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_27.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_27.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayV3" asp-action="RefundQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">10</th>
+            <td>创单结单合并</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_1.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_1.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="ServiceOrderDirectComplete">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">11</th>
+            <td>商户预授权</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_2.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_2.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="Permissions">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">12</th>
+            <td>查询用户授权记录(授权协议号)</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_3.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_3.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="PermissionsQueryForAuthCode">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">13</th>
+            <td>解除用户授权关系(授权协议号)</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_4.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_4.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="PermissionsTerminateForAuthCode">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">14</th>
+            <td>查询用户授权记录(openid)</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_5.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_5.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="PermissionsQueryForOpenId">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">15</th>
+            <td>解除用户授权关系(openid)</td>
+            <td>
+                <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_6.shtml" target="_blank">
+                    https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_6.shtml
+                </a>
+            </td>
+            <td><a asp-controller="WeChatPayScore" asp-action="PermissionsTerminateForOpenId">立即测试</a></td>
+        </tr>
+    </tbody>
+</table>

+ 37 - 0
samples/WebApplicationSample/Views/WeChatPayScore/Permissions.cshtml

@@ -0,0 +1,37 @@
+@model PermissionsViewModel
+@{
+    ViewData["Title"] = "支付分-商户预授权API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="Permissions">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="AuthorizationCode"></label>
+                <input type="text" class="form-control" asp-for="AuthorizationCode" value="@(Guid.NewGuid().ToString("N"))" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="https://domain.com/wechatpay/score/notify/permissions" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 33 - 0
samples/WebApplicationSample/Views/WeChatPayScore/PermissionsQueryForAuthCode.cshtml

@@ -0,0 +1,33 @@
+@model PermissionsQueryForAuthCodeViewModel
+@{
+    ViewData["Title"] = "支付分-查询用户授权记录(授权协议号)API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="PermissionsQueryForAuthCode">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="AuthorizationCode"></label>
+                <input type="text" class="form-control" asp-for="AuthorizationCode" value="" />
+            </div>            
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 33 - 0
samples/WebApplicationSample/Views/WeChatPayScore/PermissionsQueryForOpenId.cshtml

@@ -0,0 +1,33 @@
+@model PermissionsQueryForOpenIdViewModel
+@{
+    ViewData["Title"] = "支付分-查询用户授权记录(openid)API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="PermissionsQueryForOpenId">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OpenId"></label>
+                <input type="text" class="form-control" asp-for="OpenId" value="" />
+            </div>            
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 37 - 0
samples/WebApplicationSample/Views/WeChatPayScore/PermissionsTerminateForAuthCode.cshtml

@@ -0,0 +1,37 @@
+@model PermissionsTerminateForAuthCodeViewModel
+@{
+    ViewData["Title"] = "支付分-解除用户授权关系(授权协议号)API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="PermissionsTerminateForAuthCode">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="AuthorizationCode"></label>
+                <input type="text" class="form-control" asp-for="AuthorizationCode" value="" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Reason"></label>
+                <input type="text" class="form-control" asp-for="Reason" value="撤销原因" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 37 - 0
samples/WebApplicationSample/Views/WeChatPayScore/PermissionsTerminateForOpenId.cshtml

@@ -0,0 +1,37 @@
+@model PermissionsTerminateForOpenIdViewModel
+@{
+    ViewData["Title"] = "支付分-解除用户授权关系(openid)API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="PermissionsTerminateForOpenId">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OpenID"></label>
+                <input type="text" class="form-control" asp-for="OpenID" value="" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Reason"></label>
+                <input type="text" class="form-control" asp-for="Reason" value="撤销原因" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 62 - 0
samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrder.cshtml

@@ -0,0 +1,62 @@
+@model WeChatPayScoreServiceOrderViewModel
+@{
+    ViewData["Title"] = "支付分-创建支付分订单API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="ServiceOrder">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutOrderNo"></label>
+                <input type="text" class="form-control" asp-for="OutOrderNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ServiceIntroduction"></label>
+                <input type="text" class="form-control" asp-for="ServiceIntroduction" value="测试支付分订单" />
+            </div>
+            <div class="form-group">
+                <label asp-for="StartTime"></label>
+                <input type="text" class="form-control" asp-for="StartTime" value="OnAccept" />
+            </div>
+            <div class="form-group">
+                <label asp-for="EndTime"></label>
+                <input type="text" class="form-control" asp-for="EndTime" value="@(DateTime.Now.AddMinutes(5).ToString("yyyyMMddHHmmss"))" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RiskFundName"></label>
+                <input type="text" class="form-control" asp-for="RiskFundName" value="ESTIMATE_ORDER_COST" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RiskFundAmount"></label>
+                <input type="text" class="form-control" asp-for="RiskFundAmount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl"
+                       value="https://domain.com/wechatpay/score/notify/confirmorpaid" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpenId"></label>
+                <input type="text" class="form-control" asp-for="OpenId" value="" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 37 - 0
samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderCancel.cshtml

@@ -0,0 +1,37 @@
+@model WeChatPayScoreServiceOrderCancelViewModel
+@{
+    ViewData["Title"] = "支付分-取消支付分订单API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="ServiceOrderCancel">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutOrderNo"></label>
+                <input type="text" class="form-control" asp-for="OutOrderNo" value="" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Reason"></label>
+                <input type="text" class="form-control" asp-for="Reason" value="取消原因"/>
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 49 - 0
samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderComplete.cshtml

@@ -0,0 +1,49 @@
+@model WeChatPayScoreServiceOrderCompleteViewModel
+@{
+    ViewData["Title"] = "支付分-完结支付分订单API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="ServiceOrderComplete">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutOrderNo"></label>
+                <input type="text" class="form-control" asp-for="OutOrderNo" value="" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Name"></label>
+                <input type="text" class="form-control" asp-for="Name" value="就餐费用, 服务费" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Count"></label>
+                <input type="text" class="form-control" asp-for="Count" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalAmount"></label>
+                <input type="text" class="form-control" asp-for="TotalAmount" value="1" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 73 - 0
samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderDirectComplete.cshtml

@@ -0,0 +1,73 @@
+@model WeChatPayScoreServiceOrderDirectCompleteViewModel
+@{
+    ViewData["Title"] = "支付分-创单结单合并API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="ServiceOrderDirectComplete">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutOrderNo"></label>
+                <input type="text" class="form-control" asp-for="OutOrderNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ServiceIntroduction"></label>
+                <input type="text" class="form-control" asp-for="ServiceIntroduction" value="测试支付分订单" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PostPaymentName"></label>
+                <input type="text" class="form-control" asp-for="PostPaymentName" value="就餐费用, 服务费" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PostPaymentAmount"></label>
+                <input type="text" class="form-control" asp-for="PostPaymentAmount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PostPaymentCount"></label>
+                <input type="text" class="form-control" asp-for="PostPaymentCount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PostPaymentDescription"></label>
+                <input type="text" class="form-control" asp-for="PostPaymentDescription" value="就餐人均100元,服务费:100/小时" />
+            </div>
+            <div class="form-group">
+                <label asp-for="StartTime"></label>
+                <input type="text" class="form-control" asp-for="StartTime" value="@DateTime.Now.AddMinutes(1).ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="EndTime"></label>
+                <input type="text" class="form-control" asp-for="EndTime" value="@DateTime.Now.AddMinutes(2).ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalAmount"></label>
+                <input type="text" class="form-control" asp-for="TotalAmount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="https://domain.com/wechatpay/score/notify/orderpaid" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpenId"></label>
+                <input type="text" class="form-control" asp-for="OpenId" value="" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 53 - 0
samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderModify.cshtml

@@ -0,0 +1,53 @@
+@model WeChatPayScoreServiceOrderModifyViewModel
+@{
+    ViewData["Title"] = "支付分-修改支付分订单API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="ServiceOrderModify">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutOrderNo"></label>
+                <input type="text" class="form-control" asp-for="OutOrderNo" value="" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Name"></label>
+                <input type="text" class="form-control" asp-for="Name" value="就餐费用, 服务费" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Count"></label>
+                <input type="text" class="form-control" asp-for="Count" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalAmount"></label>
+                <input type="text" class="form-control" asp-for="TotalAmount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Reason"></label>
+                <input type="text" class="form-control" asp-for="Reason" value="用户投诉" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 33 - 0
samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderPay.cshtml

@@ -0,0 +1,33 @@
+@model WeChatPayScoreServiceOrderPayViewModel
+@{
+    ViewData["Title"] = "支付分-商户发起催收扣款API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="ServiceOrderPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutOrderNo"></label>
+                <input type="text" class="form-control" asp-for="OutOrderNo" value="" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 39 - 0
samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderQuery.cshtml

@@ -0,0 +1,39 @@
+@model WeChatPayScoreServiceOrderQueryViewModel
+@{
+    ViewData["Title"] = "支付分-查询支付分订单API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="ServiceOrderQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutOrderNo"></label>
+                <input type="text" class="form-control" asp-for="OutOrderNo" value="" 
+                       placeholder="out_order_no与query_id必填其中一个.不允许都填写或都不填写" />
+            </div>
+            <div class="form-group">
+                <label asp-for="QueryId"></label>
+                <input type="text" class="form-control" asp-for="QueryId" value="" 
+                       placeholder="out_order_no与query_id必填其中一个.不允许都填写或都不填写"/>
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 41 - 0
samples/WebApplicationSample/Views/WeChatPayScore/ServiceOrderSync.cshtml

@@ -0,0 +1,41 @@
+@model WeChatPayScoreServiceOrderSyncViewModel
+@{
+    ViewData["Title"] = "支付分-同步服务订单信息API";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayScore" asp-action="Index">微信支付分(V3)</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPayScore" asp-action="ServiceOrderSync">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutOrderNo"></label>
+                <input type="text" class="form-control" asp-for="OutOrderNo" value="" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Type"></label>
+                <input type="text" class="form-control" asp-for="Type" value="Order_Paid" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PaidTime"></label>
+                <input type="text" class="form-control" asp-for="PaidTime" value="@(DateTime.Now.ToString("yyyyMMddHHmmss"))" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 4 - 0
samples/WebApplicationSample/appsettings.Development.json

@@ -29,6 +29,10 @@
     // 为微信支付商户平台的APIv3密钥,请注意不是API密钥,v3接口必填
     "V3Key": "",
 
+    // 支付分服务ID
+    // 要调用微信支付分接口必须配置
+    "PayScoreServiceId": "",
+
     // API证书(.p12)
     // 为微信支付商户平台的API证书(.p12),v3接口必填
     // 可为证书文件(.p12)路径 / 证书文件(.p12)的base64字符串

+ 4 - 0
samples/WebApplicationSample/appsettings.json

@@ -30,6 +30,10 @@
     // 为微信支付商户平台的APIv3密钥,请注意不是API密钥,v3接口必填
     "V3Key": "",
 
+    // 支付分服务ID
+    // 要调用微信支付分接口必须配置
+    "PayScoreServiceId": "",
+
     // API证书(.p12)
     // 为微信支付商户平台的API证书(.p12),v3接口必填
     // 可为证书文件(.p12)路径 / 证书文件(.p12)的base64字符串

+ 59 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/Collection.cs

@@ -0,0 +1,59 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 收款信息,非0元完结后返回
+    /// </summary>
+    public class Collection : WeChatPayObject
+    {
+        /// <summary>
+        /// 收款状态
+        /// </summary>
+        /// <remarks>
+        /// USER_PAYING:待支付
+        /// USER_PAID:已支付
+        /// 示例值:USER_PAID
+        /// </remarks>
+        [JsonPropertyName("state")]
+        public string State { get; set; }
+
+        /// <summary>
+        /// 总收款金额
+        /// </summary>
+        /// <remarks>
+        /// 总金额,大于等于0的数字,单位为分,只能为整数,详见支付金额。
+        /// 此参数需满足:总金额=付费项目金额之和-商户优惠项目金额之和,且小于等于订单风险金额 。未使用服务、取消订单时,该字段必须为0。
+        /// 示例值:50000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 待收金额
+        /// </summary>
+        /// <remarks>
+        /// 等待用户付款金额,只能为整数,详见支付金额。
+        /// 示例值:40000
+        /// </remarks>
+        [JsonPropertyName("paying_amount")]
+        public long PayingAmount { get; set; }
+
+        /// <summary>
+        /// 已收金额
+        /// </summary>
+        /// <remarks>
+        /// 用户已付款的金额,只能为整数,详见支付金额。
+        /// 示例值:10000
+        /// </remarks>
+        [JsonPropertyName("paid_amount")]
+        public long PaidAmount { get; set; }
+
+        /// <summary>
+        /// 收款明细
+        /// </summary>
+        [JsonPropertyName("details")]
+        public List<CollectionDetail> Details { get; set; }
+    }
+}

+ 72 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/CollectionDetail.cs

@@ -0,0 +1,72 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 收款明细
+    /// </summary>
+    public class CollectionDetail : WeChatPayObject
+    {
+        /// <summary>
+        /// 收款序号
+        /// </summary>
+        /// <remarks>
+        /// 从1开始递增
+        /// 示例值:1
+        /// </remarks>
+        [JsonPropertyName("seq")]
+        public int Sequence { get; set; }
+
+        /// <summary>
+        /// 单笔收款金额
+        /// </summary>
+        /// <remarks>
+        /// 单笔收款动作的金额,只能为整数,详见支付金额。
+        /// 示例值:10000
+        /// </remarks>
+        [JsonPropertyName("amount")]
+        public long Amount { get; set; }
+
+        /// <summary>
+        /// 收款成功渠道
+        /// </summary>
+        /// <remarks>
+        /// NEWTON:微信支付分
+        /// MCH:商户渠道
+        /// 示例值:NEWTON
+        /// </remarks>
+        [JsonPropertyName("paid_type")]
+        public string PaidType { get; set; }
+
+        /// <summary>
+        /// 收款成功时间
+        /// </summary>
+        /// <remarks>
+        /// 支付成功时间,支持两种格式:yyyyMMddHHmmss和yyyyMMdd
+        /// 1、传入20091225091010表示2009年12月25日9点10分10秒
+        /// 2、传入20091225默认认为时间为2009年12月25日0点0分0秒
+        /// 示例值:20091225091210
+        /// </remarks>
+        [JsonPropertyName("paid_time")]
+        public string PaidTime { get; set; }
+
+        /// <summary>
+        /// 微信支付交易单号
+        /// </summary>
+        /// <remarks>
+        /// 结单交易单号,等于普通支付接口中的transaction_id,可以使用该订单号在APP支付->API列表->查询订单、申请退款。只有单据状态为USER_PAID,且收款成功渠道为支付分渠道,收款金额大于0,才会返回结单交易单号。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("transaction_id")]
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 优惠功能
+        /// </summary>
+        /// <remarks>
+        /// 注:针对2020年5月27日10:00:00以后完结的订单生效
+        /// </remarks>
+        [JsonPropertyName("promotion_detail")]
+        public PromotionDetail PromotionDetail { get; set; }
+    }
+}

+ 42 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/GoodsDetail.cs

@@ -0,0 +1,42 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 单品信息
+    /// </summary>
+    public class GoodsDetail : WeChatPayObject
+    {
+        /// <summary>
+        /// 商品编码
+        /// 示例值:M1006
+        /// </summary>
+        [JsonPropertyName("goods_id")]
+        public string GoodsId { get; set; }
+
+        /// <summary>
+        /// 商品数量
+        /// 示例值:1
+        /// </summary>
+        [JsonPropertyName("quantity")]
+        public uint Quantity { get; set; }
+
+        /// <summary>
+        /// 商品价格
+        /// </summary>
+        [JsonPropertyName("unit_price")]
+        public long UnitPrice { get; set; }
+
+        /// <summary>
+        /// 商品优惠金额
+        /// </summary>
+        [JsonPropertyName("discount_amount")]
+        public long DiscountAmount { get; set; }
+
+        /// <summary>
+        /// 商品备注
+        /// </summary>
+        [JsonPropertyName("goods_remark")]
+        public string GoodsRemark { get; set; }
+    }
+}

+ 35 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/Location.cs

@@ -0,0 +1,35 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 服务位置
+    /// </summary>
+    public class Location : WeChatPayObject
+    {
+        /// <summary>
+        /// 服务开始地点
+        /// </summary>
+        /// <remarks>
+        /// 开始使用服务的地点,不超过50个字符,超出报错处理。
+        ///【建议】
+        ///   1、用户下单时【未确定】服务结束地点,不填写。
+        ///   2、服务在同一地点开始和结束,不填写。
+        ///   3、用户下单时【已确定】服务结束地点,填写。
+        ///示例值:嗨客时尚主题展餐厅
+        /// </remarks>
+        [JsonPropertyName("start_location")]
+        public string StartLocation { get; set; }
+
+        /// <summary>
+        /// 预计服务结束位置
+        /// </summary>
+        /// <remarks>
+        /// 1、结束使用服务的地点,不超过50个字符,超出报错处理 。
+        /// 2、填写了服务开始地点,才能填写服务结束地点。
+        /// 示例值:嗨客时尚主题展餐厅
+        /// </remarks>
+        [JsonPropertyName("end_location")]
+        public string EndLocation { get; set; }
+    }
+}

+ 17 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/ModifyPostDiscount.cs

@@ -0,0 +1,17 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    public class ModifyPostDiscount : PostDiscount
+    {
+        /// <summary>
+        /// 优惠金额       
+        /// </summary>
+        /// <remarks>
+        /// 优惠金额;单位为分,只能为整数,详见支付金额。
+        /// 示例值:100
+        /// </remarks>
+        [JsonPropertyName("name")]
+        public long Amount { get; set; }
+    }
+}

+ 42 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/PostDiscount.cs

@@ -0,0 +1,42 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 后付费商户优惠
+    /// </summary>
+    public class PostDiscount : WeChatPayObject
+    {
+        /// <summary>
+        /// 优惠名称       
+        /// </summary>
+        /// <remarks>
+        /// 优惠名称说明;name和description若填写,则必须同时填写,优惠名称不可重复描述。
+        /// 示例值:满20减1元 
+        /// </remarks>
+        [JsonPropertyName("name")]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 优惠使用条件说明
+        /// </summary>
+        /// <remarks>
+        /// name和description若填写,则必须同时填写。
+        /// 示例值:不与其他优惠叠加  
+        /// </remarks>
+        [JsonPropertyName("description")]
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 付费数量      
+        /// </summary>
+        /// <remarks>
+        /// 付费项目的数量。
+        /// 特殊规则:数量限制100,不填时默认1。
+        /// 示例值:4 
+        /// </remarks>
+        [JsonPropertyName("count")]
+        public uint Count { get; set; }
+
+    }
+}

+ 52 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/PostPayment.cs

@@ -0,0 +1,52 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 后付款项目
+    /// </summary>
+    public class PostPayment : WeChatPayObject
+    {
+        /// <summary>
+        /// 付费项目名称       
+        /// </summary>
+        /// <remarks>
+        /// 相同订单号下不能出现相同的付费项目名称,当参数长度超过20个字符时,报错处理。
+        /// 示例值:就餐费用, 服务费
+        /// </remarks>
+        [JsonPropertyName("name")]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 金额 
+        /// </summary>
+        /// <remarks>
+        /// 此付费项目总金额,大于等于0,单位为分,等于0时代表不需要扣费,只能为整数,详见支付金额。
+        /// 如果填写了“付费项目名称”,则amount或description必须填写其一,或都填。
+        /// 示例值:40000       
+        /// </remarks>
+        [JsonPropertyName("amount")]
+        public long Amount { get; set; }
+
+        /// <summary>
+        /// 计费说明      
+        /// </summary>
+        /// <remarks>
+        /// 描述计费规则,不超过30个字符,超出报错处理。如果填写了“付费项目名称”,则amount或description必须填写其一,或都填。
+        /// 示例值:就餐人均100元,服务费:100/小时 
+        /// </remarks>
+        [JsonPropertyName("description")]
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 付费数量   
+        /// </summary>
+        /// <remarks>
+        /// 付费项目的数量。
+        /// 特殊规则:数量限制100,不填时默认1。
+        /// 示例值:4    
+        /// </remarks>
+        [JsonPropertyName("count")]
+        public uint Count { get; set; }
+    }
+}

+ 101 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/PromotionDetail.cs

@@ -0,0 +1,101 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 优惠功能
+    /// </summary>
+    public class PromotionDetail : WeChatPayObject
+    {
+        /// <summary>
+        /// 券ID
+        /// 示例值:123456
+        /// </summary>
+        [JsonPropertyName("coupon_id")]
+        public string CouponId { get; set; }
+
+        /// <summary>
+        /// 优惠名称
+        /// 示例值:单品优惠-6
+        /// </summary>
+        [JsonPropertyName("name")]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 优惠范围
+        /// </summary>
+        /// <remarks>
+        /// GLOBAL:全场代金券;
+        /// SINGLE:单品优惠
+        /// 示例值:GLOBAL
+        /// </remarks>
+        [JsonPropertyName("scope")]
+        public string Scope { get; set; }
+
+        /// <summary>
+        /// 优惠类型
+        /// </summary>
+        /// <remarks>
+        /// 枚举值:CASH:充值;
+        /// NOCASH:免充值。
+        /// 示例值:CASH
+        /// </remarks>
+        [JsonPropertyName("type")]
+        public string Type { get; set; }
+
+        /// <summary>
+        /// 优惠券面额
+        /// 示例值:100
+        /// </summary>
+        [JsonPropertyName("amount")]
+        public int Amount { get; set; }
+
+        /// <summary>
+        /// 活动ID
+        /// </summary>
+        /// <remarks>
+        /// 活动ID,批次ID
+        /// 示例值:activity_id
+        /// </remarks>
+        [JsonPropertyName("stock_id")]
+        public string StockId { get; set; }
+
+        /// <summary>
+        /// 微信出资
+        /// 示例值:100
+        /// </summary>
+        [JsonPropertyName("wechatpay_contribute")]
+        public long WechatpayContribute { get; set; }
+
+        /// <summary>
+        /// 商户出资
+        /// 示例值:100
+        /// </summary>
+        [JsonPropertyName("merchant_contribute")]
+        public long MerchantContribute { get; set; }
+
+        /// <summary>
+        /// 其他出资
+        /// 示例值:100
+        /// </summary>
+        [JsonPropertyName("other_contribute")]
+        public long OtherContribute { get; set; }
+
+        /// <summary>
+        /// 优惠币种
+        /// </summary>
+        /// <remarks>
+        /// CNY:人民币,境内商户号仅支持人民币
+        /// 示例值:CNY
+        /// </remarks>
+        [JsonPropertyName("currency")]
+        public string Currency { get; set; }
+
+        /// <summary>
+        /// 单品列表
+        /// </summary>
+        [JsonPropertyName("goods_detail")]
+        public List<GoodsDetail> GoodsDetails { get; set; }
+    }
+}

+ 49 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/RiskFund.cs

@@ -0,0 +1,49 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 订单风险金
+    /// </summary>
+    public class RiskFund : WeChatPayObject
+    {
+        /// <summary>
+        /// 风险金名称       
+        /// </summary>
+        /// <remarks>
+        /// 枚举值:
+        ///【先免模式】(评估不通过可交押金)可填名称为
+        /// DEPOSIT:押金
+        /// ADVANCE:预付款
+        /// CASH_DEPOSIT:保证金
+        ///【先享模式】(评估不通过不可使用服务)可填名称为
+        /// ESTIMATE_ORDER_COST:预估订单费用
+        /// 示例值:DEPOSIT
+        /// </remarks>
+        [JsonPropertyName("name")]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 风险金额 
+        /// </summary>
+        /// <remarks>
+        /// 1、数字,必须>0(单位分)。
+        /// 2、风险金额≤每个服务ID的风险金额上限。
+        /// 3、当商户优惠字段为空时,付费项目总金额≤服务ID的风险金额上限 (未填写金额的付费项目,视为该付费项目金额为0)。
+        /// 4、完结金额可大于、小于或等于风险金额。
+        /// 示例值:10000     
+        /// </remarks>
+        [JsonPropertyName("amount")]
+        public long Amount { get; set; }
+
+        /// <summary>
+        /// 风险说明      
+        /// </summary>
+        /// <remarks>
+        /// 文字,不超过30个字。
+        /// 示例值:就餐的预估费用
+        /// </remarks>
+        [JsonPropertyName("description")]
+        public string Description { get; set; }
+    }
+}

+ 31 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/SyncDetail.cs

@@ -0,0 +1,31 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 同步订单-详情
+    /// </summary>
+    public class SyncDetail : WeChatPayObject
+    {
+        /// <summary>
+        /// 收款成功时间
+        /// </summary>
+        /// <remarks>
+        /// 支付成功时间,支持两种格式:yyyyMMddHHmmss和yyyyMMdd
+        /// ● 传入20091225091010表示2009年12月25日9点10分10秒。
+        /// ● 传入20091225默认认为时间为2009年12月25日0点0分0秒。
+        /// 用户通过其他方式付款成功的实际时间需满足条件:服务开始时间<调用商户完结订单接口的时间<用户通过其他方式付款成功的实际时间≤商户调用支付分订单同步接口的时间。
+        ///【服务开始时间】
+        /// 1、当完结订单有填写【实际服务开始时间】时,【服务开始时间】=完结订单【实际服务开始时间】。
+        /// 2、当完结订单未填写【实际服务开始时间】时,【服务开始时间】=创建订单【服务开始时间】
+        /// 场景类型为Order_Paid时,必填。
+        /// 支持两种格式:yyyyMMddHHmmss和yyyyMMdd
+        /// ● 传入20091225091010表示2009年12月25日9点10分10秒。
+        /// ● 传入20091225表示时间为2009年12月25日23点59分59秒。
+        /// 注意:微信支付分会根据此时间更新用户侧的守约记录、负面记录信息;因此请务必如实填写用户实际付款成功时间,以免造成不必要的客诉。
+        /// 示例值:20091225091210
+        /// </remarks>
+        [JsonPropertyName("paid_time")]
+        public string PaidTime { get; set; }
+    }
+}

+ 71 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/TimeRange.cs

@@ -0,0 +1,71 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    /// 服务时间段
+    /// </summary>
+    public class TimeRange : WeChatPayObject
+    {
+        /// <summary>
+        /// 服务开始时间
+        /// </summary>
+        /// <remarks>
+        /// 用户端展示用途。
+        /// 用户下单时确认的服务开始时间(比如用户今天下单,明天开始接受服务,这里指的是明天的服务开始时间)。
+        /// 支持三种格式:yyyyMMddHHmmss、yyyyMMdd和 OnAccept
+        /// ● 传入20091225091010表示2009年12月25日9点10分10秒。
+        /// ● 传入20091225默认认为时间为2009年12月25日
+        /// ● 传入OnAccept表示用户确认订单成功时间为【服务开始时间】。
+        /// 根据传入时间精准度进行校验
+        /// 1)若传入时间精准到秒,则校验精准到秒:【服务开始时间】>【商户调用创建订单接口时间
+        /// 2)若传入时间精准到日,则校验精准到日:【服务开始时间】>=【商户调用创建订单接口时间】
+        /// 示例值:20091225091010
+        /// </remarks>
+        [JsonPropertyName("start_time")]
+        public string StartTime { get; set; }
+
+
+        /// <summary>
+        /// 服务开始时间备注
+        /// </summary>
+        /// <remarks>
+        /// 服务开始时间备注说明,服务开始时间有填时,可填写服务开始时间备注,不超过20个字符,超出报错处理。
+        /// 示例值:开始租借日期
+        /// </remarks>
+        [JsonPropertyName("start_time_remark")]
+        public string StartTimeRemark { get; set; }
+
+        /// <summary>
+        /// 预计服务结束时间
+        /// </summary>
+        /// <remarks>
+        /// 用户端展示用途,支持两种格式:yyyyMMddHHmmss和yyyyMMdd
+        /// ● 传入20091225091010表示2009年12月25日9点10分10秒。
+        /// ● 传入20091225默认认为时间为2009年12月25日
+        /// 根据传入时间精准度进行校验
+        /// 1、若传入时间精准到秒,则校验精准到秒:
+        /// 1)【预计服务结束时间】>【服务开始时间】
+        /// 2)【预计服务结束时间】>【商户调用接口时间+1分钟】
+        /// 2、若传入时间精准到日,则校验精准到日:
+        /// 1)【预计服务结束时间】>=【服务开始时间】
+        /// 2)【预计服务结束时间】>=【商户调用接口时间】
+        /// 【建议】
+        ///    1、用户下单时【未确定】服务结束时间,不填写。
+        ///    2、用户下单时【已确定】服务结束时间,填写。
+        /// 示例值:20091225121010
+        /// </remarks>
+        [JsonPropertyName("end_time")]
+        public string EndTime { get; set; }
+
+        /// <summary>
+        /// 预计服务结束时间备注
+        /// </summary>
+        /// <remarks>
+        /// 预计服务结束时间备注说明,预计服务结束时间有填时,可填写预计服务结束时间备注,不超过20个字符,超出报错处理。
+        /// 示例值:结束租借时间
+        /// </remarks>
+        [JsonPropertyName("end_time_remark")]
+        public string EndTimeRemark { get; set; }
+    }
+}

+ 27 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreModelBase.cs

@@ -0,0 +1,27 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    public abstract class WeChatPayScoreModelBase : WeChatPayObject
+    {
+        /// <summary>
+        /// AppId
+        /// </summary>
+        /// <remarks>
+        /// 微信公众平台分配的与传入的商户号建立了支付绑定关系的appid,可在公众平台查看绑定关系,此参数需在本系统先进行配置。
+        /// 示例值:wxd678efh567hg6787
+        /// </remarks>
+        [JsonPropertyName("appid")]
+        public virtual string AppId { get; set; }
+
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        /// <remarks>
+        /// 服务ID有本接口对应产品的权限。
+        /// 示例值:500001
+        /// </remarks>
+        [JsonPropertyName("service_id")]
+        public virtual string ServiceId { get; set; }
+    }
+}

+ 50 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsModel.cs

@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 商户预授权
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_2.shtml">商户预授权API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsModel : WeChatPayObject
+    {
+        /// <summary>
+        /// AppId
+        /// </summary>
+        /// <remarks>
+        /// 服务商申请的公众号或移动应用APPID
+        /// 示例值:wxd678efh567hg6787
+        /// </remarks>
+        [JsonPropertyName("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        /// <remarks>
+        /// 服务ID有本接口对应产品的权限。
+        /// 示例值:500001
+        /// </remarks>
+        [JsonPropertyName("service_id")]
+        public string ServiceId { get; set; }
+
+        /// <summary>
+        /// 授权协议号
+        /// </summary>
+        /// <remarks>
+        /// 预授权成功时的授权协议号,要求此参数只能由数字、大小写字母_-*组成,且在同一个商户号下唯一。详见[商户订单号]。 
+        /// 示例值:1234323JKHDFE1243252
+        /// </remarks>
+        [JsonPropertyName("authorization_code")]
+        public string AuthorizationCode { get; set; }
+
+        /// <summary>
+        /// 商户接收授权回调通知的地址 
+        /// </summary>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+}

+ 21 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsQueryForAuthCodeModel.cs

@@ -0,0 +1,21 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 查询用户授权记录(授权协议号)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_3.shtml">查询用户授权记录(授权协议号)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsQueryForAuthCodeModel : WeChatPayObject
+    {
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        /// <remarks>
+        /// 服务ID有本接口对应产品的权限。
+        /// 示例值:500001
+        /// </remarks>
+        [JsonPropertyName("service_id")]
+        public string ServiceId { get; set; }
+    }
+}

+ 27 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsQueryForOpenIdModel.cs

@@ -0,0 +1,27 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 查询用户授权记录(openid)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_5.shtml">查询用户授权记录(openid)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsQueryForOpenIdModel : WeChatPayObject
+    {
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        /// <remarks>
+        /// 服务ID有本接口对应产品的权限。
+        /// 示例值:500001
+        /// </remarks>
+        [JsonPropertyName("service_id")]
+        public string ServiceId { get; set; }
+
+        /// <summary>
+        /// appid
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public string AppId { get; set; }
+    }
+}

+ 31 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsTerminateForAuthCodeModel.cs

@@ -0,0 +1,31 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 解除用户授权关系(授权协议号)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_4.shtml">解除用户授权关系(授权协议号)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsTerminateForAuthCodeModel : WeChatPayObject
+    {
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        /// <remarks>
+        /// 服务ID有本接口对应产品的权限。
+        /// 示例值:500001
+        /// </remarks>
+        [JsonPropertyName("service_id")]
+        public string ServiceId { get; set; }
+
+        /// <summary>
+        /// 撤销原因
+        /// </summary>
+        /// <remarks>
+        /// 解除授权原因 
+        /// 示例值:撤销原因
+        /// </remarks>
+        [JsonPropertyName("reason")]
+        public string Reason { get; set; }
+    }
+}

+ 40 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScorePermissionsTerminateForOpenIdModel.cs

@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 解除用户授权关系(openid)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_6.shtml">解除用户授权关系(openid)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsTerminateForOpenIdModel : WeChatPayObject
+    {
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        /// <remarks>
+        /// 服务ID有本接口对应产品的权限。
+        /// 示例值:500001
+        /// </remarks>
+        [JsonPropertyName("service_id")]
+        public string ServiceId { get; set; }
+
+        /// <summary>
+        /// appid
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 撤销原因
+        /// </summary>
+        /// <remarks>
+        /// 解除授权原因 
+        /// 示例值:撤销原因
+        /// </remarks>
+        [JsonPropertyName("reason")]
+        public string Reason { get; set; }
+    }
+}

+ 21 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderCancelModel.cs

@@ -0,0 +1,21 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 取消支付分订单API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_16.shtml">取消支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderCancelModel : WeChatPayScoreModelBase
+    {
+        /// <summary>
+        /// 取消原因
+        /// </summary>
+        /// <remarks>
+        /// 最多30个字符,每个汉字/数字/英语都按1个字符计算超过长度报错处理。
+        /// 示例值:用户投诉
+        /// </remarks>
+        [JsonPropertyName("reason")]
+        public string Reason { get; set; }
+    }
+}

+ 77 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderCompleteModel.cs

@@ -0,0 +1,77 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 完结支付分订单
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_18.shtml">完结支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderCompleteModel : WeChatPayScoreModelBase
+    {
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<ModifyPostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 总金额       
+        /// </summary>
+        /// <remarks>
+        /// 总金额,单位为分,不能超过完结订单时候的总金额,只能为整数,详见支付金额。此参数需满足:总金额 =(修改后付费项目1…+修改后完结付费项目n)-(修改 后付费商户优惠项目1…+修改后付费商户优惠项目n)
+        /// 示例值:50000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 微信支付服务分账标记
+        /// </summary>
+        /// <remarks>
+        /// 完结订单分账接口标记。分账开通流程,详见
+        /// false:不分账,默认:false
+        /// true:分账。
+        /// 示例值:false
+        /// </remarks>
+        [JsonPropertyName("profit_sharing")]
+        public bool ProfitSharing { get; set; }
+
+        /// <summary>
+        /// 订单优惠标记
+        /// </summary>
+        /// <remarks>
+        /// 订单优惠标记,代金券或立减金优惠的参数,说明详见代金券或立减金优惠
+        /// 示例值:goods_tag
+        /// </remarks>
+        [JsonPropertyName("goods_tag")]
+        public string GoodsTag { get; set; }
+    }
+}

+ 125 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderDirectCompleteModel.cs

@@ -0,0 +1,125 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 创单结单合并
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_1.shtml">创单结单合并API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderDirectCompleteModel : WeChatPayScoreModelBase
+    {
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        /// <remarks>
+        /// 商户系统内部服务订单号(不是交易单号),要求此参数只能由数字、大小写字母_-|*组成,且在同一个商户号下唯一。
+        /// 详见[商户订单号]。示例值:1234323JKHDFE1243252
+        /// </remarks>
+        [JsonPropertyName("out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        /// <summary>
+        /// 用户标识
+        /// </summary>
+        [JsonPropertyName("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<ModifyPostDiscount> PostDiscounts { get; set; }
+                
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 总金额       
+        /// </summary>
+        /// <remarks>
+        /// 1、金额:数字,必须≥0(单位:分)
+        /// 2、总金额 =(完结付费项目1…+完结付费项目n)-(完结商户优惠项目1…+完结商户优惠项目n)
+        /// 3、总金额上限:总金额≤“服务风险金额”
+        /// 示例值:50000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 微信支付服务分账标记
+        /// </summary>
+        /// <remarks>
+        /// 完结订单分账接口标记。分账开通流程,详见
+        /// false:不分账,默认:false
+        /// true:分账。
+        /// 示例值:false
+        /// </remarks>
+        [JsonPropertyName("profit_sharing")]
+        public bool ProfitSharing { get; set; }
+
+        /// <summary>
+        /// 订单优惠标记
+        /// </summary>
+        /// <remarks>
+        /// 订单优惠标记,代金券或立减金优惠的参数,说明详见代金券或立减金优惠
+        /// 示例值:goods_tag
+        /// </remarks>
+        [JsonPropertyName("goods_tag")]
+        public string GoodsTag { get; set; }
+
+        /// <summary>
+        /// 商户数据包
+        /// </summary>
+        /// <remarks>
+        /// 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。
+        /// 示例值:Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald
+        /// </remarks>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户回调地址
+        /// </summary>
+        /// <remarks>
+        /// 商户接收用户确认订单和付款成功回调通知的地址。
+        /// 示例值:https://api.test.com
+        /// </remarks>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+}

+ 116 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderModel.cs

@@ -0,0 +1,116 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 创建支付分订单 - 请求JSON参数
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_14.shtml">创建支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderModel : WeChatPayScoreModelBase
+    {
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        /// <remarks>
+        /// 商户系统内部服务订单号(不是交易单号),要求此参数只能由数字、大小写字母_-|*组成,且在同一个商户号下唯一。
+        /// 详见[商户订单号]。示例值:1234323JKHDFE1243252
+        /// </remarks>
+        [JsonPropertyName("out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<PostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 订单风险金信息
+        /// </summary>
+        [JsonPropertyName("risk_fund")]
+        public RiskFund RiskFund { get; set; }
+
+        /// <summary>
+        /// 商户数据包
+        /// </summary>
+        /// <remarks>
+        /// 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。
+        /// 示例值:Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald
+        /// </remarks>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户回调地址
+        /// </summary>
+        /// <remarks>
+        /// 商户接收用户确认订单和付款成功回调通知的地址。
+        /// 示例值:https://api.test.com
+        /// </remarks>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 用户标识
+        /// </summary>
+        /// <remarks>
+        /// 微信用户在商户对应appid下的唯一标识。
+        /// 免确认订单:必填
+        /// 需确认订单:不填
+        /// 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
+        /// </remarks>
+        [JsonPropertyName("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 是否需要用户确认
+        /// </summary>
+        /// <remarks>
+        /// 枚举值:
+        /// false:免确认订单
+        /// true:需确认订单
+        /// 默认值true
+        /// 示例值:true
+        /// </remarks>
+        [JsonPropertyName("need_user_confirm")]
+        public bool NeedUserConfirm { get; set; }
+    }
+}

+ 52 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderModifyModel.cs

@@ -0,0 +1,52 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 修改订单金额API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_17.shtml">修改订单金额API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderModifyModel : WeChatPayScoreModelBase
+    {
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<ModifyPostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 总金额       
+        /// </summary>
+        /// <remarks>
+        /// 总金额,单位为分,不能超过完结订单时候的总金额,只能为整数,详见支付金额。此参数需满足:总金额 =(修改后付费项目1…+修改后完结付费项目n)-(修改 后付费商户优惠项目1…+修改后付费商户优惠项目n)
+        /// 示例值:50000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 修改原因
+        /// </summary>
+        /// <remarks>
+        /// 按照字符计算,超过长度报错处理。
+        /// 示例值:用户投诉
+        /// </remarks>
+        [JsonPropertyName("reason")]
+        public string Reason { get; set; }
+    }
+}

+ 10 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderPayModel.cs

@@ -0,0 +1,10 @@
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 商户发起催收扣款
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_19.shtml">商户发起催收扣款API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderPayModel : WeChatPayScoreModelBase
+    {
+    }
+}

+ 32 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderQueryModel.cs

@@ -0,0 +1,32 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 查询支付分订单API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_15.shtml">查询支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderQueryModel : WeChatPayScoreModelBase
+    {
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        /// <remarks>
+        /// 商户系统内部服务订单号(不是交易单号),要求此参数只能由数字、大小写字母_-|*组成,且在同一个商户号下唯一。
+        /// 详见[商户订单号]。示例值:1234323JKHDFE1243252
+        /// </remarks>
+        [JsonPropertyName("out_order_no")]
+        public string OutOrderNo { get; set; }
+
+        /// <summary>
+        /// 回跳查询ID
+        /// </summary>
+        /// <remarks>
+        /// 微信侧回跳到商户前端时用于查单的单据查询id。详见章节“小程序跳转接口,回跳商户接口”。
+        /// 商户单号与回跳查询id必填其中一个.不允许都填写或都不填写。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("query_id")]
+        public string QueryId { get; set; }
+    }
+}

+ 30 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Domain/WeChatPayScoreServiceOrderSyncModel.cs

@@ -0,0 +1,30 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain
+{
+    /// <summary>
+    ///  微信支付分 - 同步服务订单信息
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_20.shtml">同步服务订单信息API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderSyncModel : WeChatPayScoreModelBase
+    {
+        /// <summary>
+        /// 场景类型
+        /// </summary>
+        /// <remarks>
+        /// 场景类型为“Order_Paid”,字符串表示“订单收款成功” 。
+        /// 示例值:Order_Paid
+        /// </remarks>
+        [JsonPropertyName("type")]
+        public string Type { get; set; }
+
+        /// <summary>
+        /// 内容信息详情
+        /// </summary>
+        /// <remarks>
+        /// 场景类型为Order_Paid时,为必填项。
+        /// </remarks>
+        [JsonPropertyName("detail")]
+        public SyncDetail Detail { get; set; }
+    }
+}

+ 157 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Notify/WeChatPayScoreNotifyBase.cs

@@ -0,0 +1,157 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Notify
+{
+    public abstract class WeChatPayScoreNotifyBase : WeChatPayNotify
+    {
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        [JsonPropertyName("out_order_no")]
+        public virtual string OutOrderNo { get; set; }
+
+        /// <summary>
+        /// AppId
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public virtual string AppId { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public virtual string MchId { get; set; }
+
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        [JsonPropertyName("service_id")]
+        public virtual string ServiceId { get; set; }
+
+        /// <summary>
+        /// 微信用户在商户对应appid下的唯一标识
+        /// </summary>
+        [JsonPropertyName("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 服务订单状态
+        /// </summary>
+        /// <remarks>
+        /// 表示当前单据状态。
+        ///  枚举值:
+        ///  DOING:服务订单进行中
+        ///  DONE:服务订单完成
+        ///  示例值:DONE
+        /// </remarks>
+        [JsonPropertyName("state")]
+        public virtual string State { get; set; }
+
+        /// <summary>
+        /// 订单状态说明
+        /// </summary>
+        /// <remarks>
+        /// 对服务订单"进行中"状态的附加说明。
+        /// 1、USER_CONFIRM:用户确认
+        /// 2、MCH_COMPLETE:商户完结
+        /// 示例值:MCH_COMPLETE
+        /// </remarks>
+        [JsonPropertyName("state_description")]
+        public virtual string StateDescription { get; set; }
+
+        /// <summary>
+        /// 商户收款总金额
+        /// </summary>
+        /// <remarks>
+        /// 总金额,大于等于0的数字,单位为分,只能为整数,详见支付金额。
+        /// 此参数需满足:总金额=后付费项目金额之和-后付费商户优惠项目金额之和,且小于等于订单风险金额。取消订单时,该字段必须为0。
+        /// 示例值:40000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public virtual long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public virtual string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public virtual List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public virtual List<ModifyPostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public virtual TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public virtual Location Location { get; set; }
+
+        /// <summary>
+        /// 订单风险金信息
+        /// </summary>
+        [JsonPropertyName("risk_fund")]
+        public virtual RiskFund RiskFund { get; set; }
+
+        /// <summary>
+        /// 商户数据包
+        /// </summary>
+        /// <remarks>
+        /// 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。
+        /// 示例值:Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald
+        /// </remarks>
+        [JsonPropertyName("attach")]
+        public virtual string Attach { get; set; }
+
+        /// <summary>
+        /// 微信支付服务订单号
+        /// </summary>
+        /// <remarks>
+        /// 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("order_id")]
+        public virtual string OrderId { get; set; }
+
+        /// <summary>
+        /// 是否需要收款
+        /// </summary>
+        /// <remarks>
+        /// 是否需要收款,非0元完结后返回
+        /// true:微信支付分代收款
+        /// false:无需微信支付分代收款
+        /// 示例值:true
+        /// </remarks>
+        [JsonPropertyName("need_collection")]
+        public virtual bool NeedCollection { get; set; }
+    }
+}

+ 77 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Notify/WeChatPayScorePermissionsOpenOrCancelNotify.cs

@@ -0,0 +1,77 @@
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Notify
+{
+    /// <summary>
+    /// 开启/解除授权服务回调通知
+    /// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_10.shtml">开启/解除授权服务回调通知API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsOpenOrCancelNotify : WeChatPayNotify
+    {
+        /// <summary>
+        /// AppId
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 商户签约单号
+        /// </summary>
+        /// <remarks>
+        /// 调用授权服务接口提交的商户请求唯一标识(新签约的用户,且在授权签约中上传了该字段,则在解约授权回调通知中有返回)。
+        /// 示例值:1234323JKHDFE1243252
+        /// </remarks>
+        [JsonPropertyName("out_request_no")]
+        public string OutRequestNo { get; set; }
+
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        [JsonPropertyName("service_id")]
+        public string ServiceId { get; set; }
+
+        /// <summary>
+        /// 微信用户在商户对应appid下的唯一标识
+        /// </summary>
+        [JsonPropertyName("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 回调状态
+        /// </summary>
+        /// <remarks>
+        /// 1、USER_OPEN_SERVICE:授权成功 
+        /// 2、USER_CLOSE_SERVICE:解除授权成功
+        /// 示例值:USER_OPEN_SERVICE
+        /// </remarks>
+        [JsonPropertyName("user_service_status")]
+        public string UserServiceStatus { get; set; }
+
+        /// <summary>
+        /// 服务开启/解除授权时间
+        /// </summary>
+        /// <remarks>
+        /// 服务开启/解除授权成功时间。
+        /// 示例值:20180225112233
+        /// </remarks>
+        [JsonPropertyName("openorclose_time")]
+        public string OpenOrCloseTime { get; set; }
+
+        /// <summary>
+        /// 授权协议号
+        /// </summary>
+        /// <remarks>
+        /// 授权协议号,预授权时返回,非预授权不返回
+        /// 示例值:1275342195190894594
+        /// </remarks>
+        [JsonPropertyName("authorization_code")]
+        public string AuthorizationCode { get; set; }
+    }
+}

+ 11 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Notify/WeChatPayScoreServiceOrderConfirmNotify.cs

@@ -0,0 +1,11 @@
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Notify
+{
+    /// <summary>
+    /// 确认订单回调通知
+    /// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_21.shtml">确认订单回调通知API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderConfirmNotify : WeChatPayScoreNotifyBase
+    {
+
+    }
+}

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Notify/WeChatPayScoreServiceOrderPaidNotify.cs

@@ -0,0 +1,29 @@
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Notify
+{
+    /// <summary>
+    /// 支付成功回调通知
+    /// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_22.shtml">支付成功回调通知API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderPaidNotify : WeChatPayScoreNotifyBase
+    {
+        /// <summary>
+        /// 商户回调地址
+        /// </summary>
+        /// <remarks>
+        /// 商户接收用户确认订单和付款成功回调通知的地址。
+        /// 示例值:https://api.test.com
+        /// </remarks>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+
+
+        /// <summary>
+        /// 收款信息,非0元完结后返回
+        /// </summary>
+        [JsonPropertyName("collection")]
+        public Collection Collection { get; set; }
+    }
+}

+ 37 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsQueryForAuthCodeRequest.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 查询用户授权记录(授权协议号)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_3.shtml">查询用户授权记录(授权协议号)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsQueryForAuthCodeRequest : IWeChatPayGetRequest<WeChatPayScorePermissionsQueryForAuthCodeResponse>
+    {
+        private WeChatPayObject _queryModel;
+
+        /// <summary>
+        /// 预授权成功时的授权协议号。
+        /// </summary>
+        public string AuthorizationCode { get; set; }
+
+        public WeChatPayObject GetQueryModel()
+        {
+            return _queryModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/permissions/authorization-code/{AuthorizationCode}";
+        }
+
+        public void SetQueryModel(WeChatPayObject queryModel)
+        {
+            _queryModel = queryModel;
+        }
+    }
+}

+ 35 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsQueryForOpenIdRequest.cs

@@ -0,0 +1,35 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 查询用户授权记录(openid)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_5.shtml">查询用户授权记录(openid)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsQueryForOpenIdRequest : IWeChatPayGetRequest<WeChatPayScorePermissionsQueryForOpenIdResponse>
+    {
+        private WeChatPayObject _queryModel;
+
+        /// <summary>
+        /// 用户标识。
+        /// </summary>
+        public string OpenId { get; set; }
+
+        public WeChatPayObject GetQueryModel()
+        {
+            return _queryModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/permissions/openid/{OpenId}";
+        }
+
+        public void SetQueryModel(WeChatPayObject queryModel)
+        {
+            _queryModel = queryModel;
+        }
+
+    }
+}

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsRequest.cs

@@ -0,0 +1,29 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 商户预授权
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_2.shtml">商户预授权API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsRequest : IWeChatPayPostRequest<WeChatPayScorePermissionsResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/v3/payscore/permissions";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 34 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsTerminateForAuthCodeRequest.cs

@@ -0,0 +1,34 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 解除用户授权关系(授权协议号)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_4.shtml">解除用户授权关系(授权协议号)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsTerminateForAuthCodeRequest : IWeChatPayPostRequest<WeChatPayScorePermissionsTerminateForAuthCodeResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        /// <summary>
+        /// 预授权成功时的授权协议号。
+        /// </summary>
+        public string AuthorizationCode { get; set; }
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/permissions/authorization-code/{AuthorizationCode}/terminate";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 34 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScorePermissionsTerminateForOpenIdRequest.cs

@@ -0,0 +1,34 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 解除用户授权关系(openid)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_6.shtml">解除用户授权关系(openid)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsTerminateForOpenIdRequest : IWeChatPayPostRequest<WeChatPayScorePermissionsTerminateForOpenIdResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        /// <summary>
+        /// 用户标识。
+        /// </summary>
+        public string OpenId { get; set; }
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/permissions/openid/{OpenId}/terminate";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 31 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderCancelRequest.cs

@@ -0,0 +1,31 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 取消支付分订单API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_16.shtml">取消支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderCancelRequest : IWeChatPayPostRequest<WeChatPayScoreServiceOrderCancelResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        public string OutOrderNo { get; set; }
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{OutOrderNo}/cancel";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 31 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderCompleteRequest.cs

@@ -0,0 +1,31 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 完结支付分订单
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_18.shtml">完结支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderCompleteRequest : IWeChatPayPostRequest<WeChatPayScoreServiceOrderCompleteResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        public string OutOrderNo { get; set; }
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{OutOrderNo}/complete";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderDirectCompleteRequest.cs

@@ -0,0 +1,29 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 创单结单合并
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_1.shtml">创单结单合并API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderDirectCompleteRequest : IWeChatPayPostRequest<WeChatPayScoreServiceOrderDirectCompleteResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/v3/payscore/serviceorder/direct-complete";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 31 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderModifyRequest.cs

@@ -0,0 +1,31 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 修改订单金额API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_17.shtml">修改订单金额API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderModifyRequest : IWeChatPayPostRequest<WeChatPayScoreServiceOrderModifyResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        public string OutOrderNo { get; set; }
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{OutOrderNo}/modify";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 31 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderPayRequest.cs

@@ -0,0 +1,31 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 商户发起催收扣款
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_19.shtml">商户发起催收扣款API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderPayRequest : IWeChatPayPostRequest<WeChatPayScoreServiceOrderPayResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        public string OutOrderNo { get; set; }
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{OutOrderNo}/pay";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderQueryRequest.cs

@@ -0,0 +1,29 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 查询支付分订单API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_15.shtml">查询支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderQueryRequest : IWeChatPayGetRequest<WeChatPayScoreServiceOrderQueryResponse>
+    {
+        private WeChatPayObject _queryModel;
+
+        public WeChatPayObject GetQueryModel()
+        {
+            return _queryModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/v3/payscore/serviceorder";
+        }
+
+        public void SetQueryModel(WeChatPayObject queryModel)
+        {
+            _queryModel = queryModel;
+        }
+    }
+}

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderRequest.cs

@@ -0,0 +1,29 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 创建支付分订单
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_14.shtml">创建支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderRequest : IWeChatPayPostRequest<WeChatPayScoreServiceOrderResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/v3/payscore/serviceorder";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 34 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Request/WeChatPayScoreServiceOrderSyncRequest.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Request
+{
+    /// <summary>
+    ///  微信支付分 - 同步服务订单信息
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_20.shtml">同步服务订单信息API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderSyncRequest : IWeChatPayPostRequest<WeChatPayScoreServiceOrderSyncResponse>
+    {
+        private WeChatPayObject _bodyModel;
+
+        public string OutOrderNo { get; set; }
+
+        public WeChatPayObject GetBodyModel()
+        {
+            return _bodyModel;
+        }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{OutOrderNo}/sync";
+        }
+
+        public void SetBodyModel(WeChatPayObject bodyModel)
+        {
+            _bodyModel = bodyModel;
+        }
+    }
+}

+ 90 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsQueryForAuthCodeResponse.cs

@@ -0,0 +1,90 @@
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 查询用户授权记录(授权协议号)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_3.shtml">查询用户授权记录(授权协议号)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsQueryForAuthCodeResponse : WeChatPayResponse
+    {
+        /// <summary>
+        /// 服务id
+        /// </summary>
+        /// <remarks>
+        /// 该服务ID有本接口对应产品的权限。 
+        /// 示例值:2002000000000558128851361561536
+        /// </remarks>
+        [JsonPropertyName("service_id")]
+        public string ServiceId { get; set; }
+
+        /// <summary>
+        /// AppId
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 用户标识
+        /// </summary>
+        [JsonPropertyName("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 授权协议号
+        /// </summary>
+        /// <remarks>
+        /// 预授权成功时的授权协议号。
+        /// 示例值:1275342195190894594
+        /// </remarks>
+        [JsonPropertyName("authorization_code")]
+        public string AuthorizationCode { get; set; }
+
+        /// <summary>
+        /// 授权状态
+        /// </summary>
+        /// <remarks>
+        /// 标识用户授权服务情况。
+        /// UNAVAILABLE:用户未授权服务
+        /// AVAILABLE:用户已授权服务
+        /// UNBINDUSER:未绑定用户(已经预授权但未完成正式授权)
+        /// 示例值:UNAVAILABLE
+        /// </remarks>
+        [JsonPropertyName("authorization_state")]
+        public string AuthorizationState { get; set; }
+
+        /// <summary>
+        /// 授权通知地址
+        /// 示例值:https://www.weixin.com
+        /// </summary>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 最近一次解除授权时间
+        /// </summary>
+        /// <remarks>
+        /// 最近一次解除授权时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示北京时间2015年05月20日13点29分35秒
+        /// 示例值:2015-05-20T13:29:35.120+08:00
+        /// </remarks>
+        [JsonPropertyName("cancel_authorization_time")]
+        public string CancelAuthorizationTime { get; set; }
+
+        /// <summary>
+        /// 最近一次授权成功时间
+        /// </summary>
+        /// <remarks>
+        /// 最近一次授权成功时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示北京时间2015年05月20日13点29分35秒
+        /// 示例值:2015-05-20T13:29:35.120+08:00
+        /// </remarks>
+        [JsonPropertyName("authorization_success_time")]
+        public string AuthorizationSuccessTime { get; set; }
+    }
+}

+ 84 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsQueryForOpenIdResponse.cs

@@ -0,0 +1,84 @@
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 查询用户授权记录(openid)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_5.shtml">查询用户授权记录(openid)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsQueryForOpenIdResponse : WeChatPayResponse
+    {
+        /// <summary>
+        /// 服务id
+        /// </summary>
+        /// <remarks>
+        /// 该服务ID有本接口对应产品的权限。 
+        /// 示例值:2002000000000558128851361561536
+        /// </remarks>
+        [JsonPropertyName("service_id")]
+        public string ServiceId { get; set; }
+
+        /// <summary>
+        /// AppId
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 用户标识
+        /// </summary>
+        [JsonPropertyName("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 授权协议号
+        /// </summary>
+        /// <remarks>
+        /// 预授权成功时的授权协议号。
+        /// 示例值:1275342195190894594
+        /// </remarks>
+        [JsonPropertyName("authorization_code")]
+        public string AuthorizationCode { get; set; }
+
+        /// <summary>
+        /// 授权状态
+        /// </summary>
+        /// <remarks>
+        /// 标识用户授权服务情况。
+        /// UNAVAILABLE:用户未授权服务
+        /// AVAILABLE:用户已授权服务
+        /// UNBINDUSER:未绑定用户(已经预授权但未完成正式授权)
+        /// 示例值:UNAVAILABLE
+        /// </remarks>
+        [JsonPropertyName("authorization_state")]
+        public string AuthorizationState { get; set; }
+
+        /// <summary>
+        /// 最近一次解除授权时间
+        /// </summary>
+        /// <remarks>
+        /// 最近一次解除授权时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示北京时间2015年05月20日13点29分35秒
+        /// 示例值:2015-05-20T13:29:35.120+08:00
+        /// </remarks>
+        [JsonPropertyName("cancel_authorization_time")]
+        public string CancelAuthorizationTime { get; set; }
+
+        /// <summary>
+        /// 最近一次授权成功时间
+        /// </summary>
+        /// <remarks>
+        /// 最近一次授权成功时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示北京时间2015年05月20日13点29分35秒
+        /// 示例值:2015-05-20T13:29:35.120+08:00
+        /// </remarks>
+        [JsonPropertyName("authorization_success_time")]
+        public string AuthorizationSuccessTime { get; set; }
+
+    }
+}

+ 22 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsResponse.cs

@@ -0,0 +1,22 @@
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 商户预授权
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_2.shtml">商户预授权API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsResponse : WeChatPayResponse
+    {
+        /// <summary>
+        /// 预授权token
+        /// </summary>
+        /// <remarks>
+        /// 用于跳转到微信侧小程序授权数据,跳转到微信侧小程序传入,时效性为1小时
+        /// 示例值:apply_permissions_token
+        /// </remarks>
+        [JsonPropertyName("apply_permissions_token")]
+        public string ApplyPermissionsToken { get; set; }
+    }
+}

+ 13 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsTerminateForAuthCodeResponse.cs

@@ -0,0 +1,13 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 解除用户授权关系(授权协议号)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_4.shtml">解除用户授权关系(授权协议号)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsTerminateForAuthCodeResponse : WeChatPayResponse
+    {
+
+    }
+}

+ 13 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScorePermissionsTerminateForOpenIdResponse.cs

@@ -0,0 +1,13 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 解除用户授权关系(openid)
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_6.shtml">解除用户授权关系(openid)API</a></para>
+    /// </summary>
+    public class WeChatPayScorePermissionsTerminateForOpenIdResponse : WeChatPayResponse
+    {
+
+    }
+}

+ 32 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreResponseBase.cs

@@ -0,0 +1,32 @@
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.V3;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    public abstract class WeChatPayScoreResponseBase : WeChatPayResponse
+    {
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        [JsonPropertyName("out_order_no")]
+        public virtual string OutOrderNo { get; set; }
+
+        /// <summary>
+        /// AppId
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public virtual string AppId { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public virtual string MchId { get; set; }
+
+        /// <summary>
+        /// 支付分服务ID
+        /// </summary>
+        [JsonPropertyName("service_id")]
+        public virtual string ServiceId { get; set; }
+    }
+}

+ 21 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderCancelResponse.cs

@@ -0,0 +1,21 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 取消支付分订单API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_16.shtml">取消支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderCancelResponse : WeChatPayScoreResponseBase
+    {
+        /// <summary>
+        /// 微信支付服务订单号
+        /// </summary>
+        /// <remarks>
+        /// 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("order_id")]
+        public string OrderId { get; set; }
+    }
+}

+ 125 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderCompleteResponse.cs

@@ -0,0 +1,125 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 完结支付分订单
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_18.shtml">完结支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderCompleteResponse : WeChatPayScoreResponseBase
+    {
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 服务订单状态
+        /// </summary>
+        /// <remarks>
+        /// 表示当前单据状态。
+        ///  枚举值:
+        ///  1、CREATED:商户已创建服务订单
+        ///  2、DOING:服务订单进行中
+        ///  3、DONE:服务订单完成
+        ///  4、REVOKED:商户取消服务订单
+        ///  5、EXPIRED:服务订单已失效
+        ///  示例值:CREATED
+        /// </remarks>
+        [JsonPropertyName("state")]
+        public string State { get; set; }
+
+        /// <summary>
+        /// 订单状态说明
+        /// </summary>
+        /// <remarks>
+        /// 对服务订单"进行中"状态的附加说明。
+        /// 1、USER_CONFIRM:用户确认
+        /// 2、MCH_COMPLETE:商户完结
+        /// 示例值:MCH_COMPLETE
+        /// </remarks>
+        [JsonPropertyName("state_description")]
+        public string StateDescription { get; set; }
+
+        /// <summary>
+        /// 商户收款总金额
+        /// </summary>
+        /// <remarks>
+        /// 总金额,大于等于0的数字,单位为分,只能为整数,详见支付金额。
+        /// 此参数需满足:总金额=后付费项目金额之和-后付费商户优惠项目金额之和,且小于等于订单风险金额。取消订单时,该字段必须为0。
+        /// 示例值:40000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<ModifyPostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 订单风险金信息
+        /// </summary>
+        [JsonPropertyName("risk_fund")]
+        public RiskFund RiskFund { get; set; }
+
+        /// <summary>
+        /// 微信支付服务订单号
+        /// </summary>
+        /// <remarks>
+        /// 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("order_id")]
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 是否需要收款
+        /// </summary>
+        /// <remarks>
+        /// 是否需要收款,非0元完结后返回
+        /// true:微信支付分代收款
+        /// false:无需微信支付分代收款
+        /// 示例值:true
+        /// </remarks>
+        [JsonPropertyName("need_collection")]
+        public bool NeedCollection { get; set; }
+    }
+}

+ 111 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderDirectCompleteResponse.cs

@@ -0,0 +1,111 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 创单结单合并
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_1.shtml">创单结单合并API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderDirectCompleteResponse : WeChatPayScoreResponseBase
+    {
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 服务订单状态
+        /// </summary>
+        /// <remarks>
+        /// 表示当前单据状态。
+        ///  枚举值:
+        ///  1、DOING:服务订单进行中
+        ///  2、DONE:服务订单完成
+        ///  示例值:DOING
+        /// </remarks>
+        [JsonPropertyName("state")]
+        public string State { get; set; }
+
+        /// <summary>
+        /// 订单状态说明
+        /// </summary>
+        /// <remarks>
+        /// 对服务订单"进行中"状态的附加说明。
+        /// 1、MCH_COMPLETE:商户完结
+        /// 示例值:MCH_COMPLETE
+        /// </remarks>
+        [JsonPropertyName("state_description")]
+        public string StateDescription { get; set; }
+        
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<ModifyPostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 商户数据包
+        /// </summary>
+        /// <remarks>
+        /// 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。
+        /// 示例值:Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald
+        /// </remarks>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户回调地址
+        /// </summary>
+        /// <remarks>
+        /// 商户接收用户确认订单和付款成功回调通知的地址。
+        /// 示例值:https://api.test.com
+        /// </remarks>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 商户收款总金额
+        /// </summary>
+        /// <remarks>
+        /// 总金额,大于等于0的数字,单位为分,只能为整数,详见支付金额。
+        /// 此参数需满足:总金额=后付费项目金额之和-后付费商户优惠项目金额之和,且小于等于订单风险金额。取消订单时,该字段必须为0。
+        /// 示例值:40000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+    }
+}

+ 150 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderModifyResponse.cs

@@ -0,0 +1,150 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 修改订单金额API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_17.shtml">修改订单金额API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderModifyResponse : WeChatPayScoreResponseBase
+    {
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 服务订单状态
+        /// </summary>
+        /// <remarks>
+        /// 表示当前单据状态。
+        ///  枚举值:
+        ///  1、CREATED:商户已创建服务订单
+        ///  2、DOING:服务订单进行中
+        ///  3、DONE:服务订单完成
+        ///  4、REVOKED:商户取消服务订单
+        ///  5、EXPIRED:服务订单已失效
+        ///  示例值:CREATED
+        /// </remarks>
+        [JsonPropertyName("state")]
+        public string State { get; set; }
+
+        /// <summary>
+        /// 订单状态说明
+        /// </summary>
+        /// <remarks>
+        /// 对服务订单"进行中"状态的附加说明。
+        /// 1、USER_CONFIRM:用户确认
+        /// 2、MCH_COMPLETE:商户完结
+        /// 示例值:MCH_COMPLETE
+        /// </remarks>
+        [JsonPropertyName("state_description")]
+        public string StateDescription { get; set; }
+
+        /// <summary>
+        /// 商户收款总金额
+        /// </summary>
+        /// <remarks>
+        /// 总金额,大于等于0的数字,单位为分,只能为整数,详见支付金额。
+        /// 此参数需满足:总金额=后付费项目金额之和-后付费商户优惠项目金额之和,且小于等于订单风险金额。取消订单时,该字段必须为0。
+        /// 示例值:40000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<ModifyPostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 订单风险金信息
+        /// </summary>
+        [JsonPropertyName("risk_fund")]
+        public RiskFund RiskFund { get; set; }
+
+        /// <summary>
+        /// 商户数据包
+        /// </summary>
+        /// <remarks>
+        /// 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。
+        /// 示例值:Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald
+        /// </remarks>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户回调地址
+        /// </summary>
+        /// <remarks>
+        /// 商户接收用户确认订单和付款成功回调通知的地址。
+        /// 示例值:https://api.test.com
+        /// </remarks>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 微信支付服务订单号
+        /// </summary>
+        /// <remarks>
+        /// 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("order_id")]
+        public string OrderId { get; set; }
+
+
+        /// <summary>
+        /// 是否需要收款
+        /// </summary>
+        /// <remarks>
+        /// 是否需要收款,非0元完结后返回
+        /// true:微信支付分代收款
+        /// false:无需微信支付分代收款
+        /// 示例值:true
+        /// </remarks>
+        [JsonPropertyName("need_collection")]
+        public bool NeedCollection { get; set; }
+
+        /// <summary>
+        /// 收款信息
+        /// </summary>
+        [JsonPropertyName("collection")]
+        public Collection Collection { get; set; }
+    }
+}

+ 21 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderPayResponse.cs

@@ -0,0 +1,21 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 商户发起催收扣款
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_19.shtml">商户发起催收扣款API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderPayResponse : WeChatPayScoreResponseBase
+    {
+        /// <summary>
+        /// 微信支付服务订单号
+        /// </summary>
+        /// <remarks>
+        /// 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("order_id")]
+        public string OrderId { get; set; }
+    }
+}

+ 157 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderQueryResponse.cs

@@ -0,0 +1,157 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 查询支付分订单API
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_15.shtml">查询支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderQueryResponse : WeChatPayScoreResponseBase
+    {
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 服务订单状态
+        /// </summary>
+        /// <remarks>
+        /// 表示当前单据状态。
+        ///  枚举值:
+        ///  1、CREATED:商户已创建服务订单
+        ///  2、DOING:服务订单进行中
+        ///  3、DONE:服务订单完成
+        ///  4、REVOKED:商户取消服务订单
+        ///  5、EXPIRED:服务订单已失效
+        ///  示例值:CREATED
+        /// </remarks>
+        [JsonPropertyName("state")]
+        public string State { get; set; }
+
+        /// <summary>
+        /// 订单状态说明
+        /// </summary>
+        /// <remarks>
+        /// 对服务订单"进行中"状态的附加说明。
+        /// 1、USER_CONFIRM:用户确认
+        /// 2、MCH_COMPLETE:商户完结
+        /// 示例值:MCH_COMPLETE
+        /// </remarks>
+        [JsonPropertyName("state_description")]
+        public string StateDescription { get; set; }
+
+        /// <summary>
+        /// 商户收款总金额
+        /// </summary>
+        /// <remarks>
+        /// 总金额,大于等于0的数字,单位为分,只能为整数,详见支付金额。
+        /// 此参数需满足:总金额=后付费项目金额之和-后付费商户优惠项目金额之和,且小于等于订单风险金额。取消订单时,该字段必须为0。
+        /// 示例值:40000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<PostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 订单风险金信息
+        /// </summary>
+        [JsonPropertyName("risk_fund")]
+        public RiskFund RiskFund { get; set; }
+
+        /// <summary>
+        /// 商户数据包
+        /// </summary>
+        /// <remarks>
+        /// 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。
+        /// 示例值:Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald
+        /// </remarks>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户回调地址
+        /// </summary>
+        /// <remarks>
+        /// 商户接收用户确认订单和付款成功回调通知的地址。
+        /// 示例值:https://api.test.com
+        /// </remarks>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 微信支付服务订单号
+        /// </summary>
+        /// <remarks>
+        /// 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("order_id")]
+        public string OrderId { get; set; }
+
+
+        /// <summary>
+        /// 是否需要收款
+        /// </summary>
+        /// <remarks>
+        /// 是否需要收款,非0元完结后返回
+        /// true:微信支付分代收款
+        /// false:无需微信支付分代收款
+        /// 示例值:true
+        /// </remarks>
+        [JsonPropertyName("need_collection")]
+        public bool NeedCollection { get; set; }
+
+        /// <summary>
+        /// 收款信息,非0元完结后返回
+        /// </summary>
+        [JsonPropertyName("collection")]
+        public Collection Collection { get; set; }
+
+        /// <summary>
+        /// 微信用户在商户对应appid下的唯一标识
+        /// </summary>
+        [JsonPropertyName("openid")]
+        public string OpenId { get; set; }
+
+    }
+}

+ 130 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderResponse.cs

@@ -0,0 +1,130 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 创建支付分订单
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_14.shtml">创建支付分订单API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderResponse : WeChatPayScoreResponseBase
+    {
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 服务订单状态
+        /// </summary>
+        /// <remarks>
+        /// 表示当前单据状态。
+        ///  枚举值:
+        ///  1、CREATED:商户已创建服务订单
+        ///  2、DOING:服务订单进行中
+        ///  3、DONE:服务订单完成
+        ///  4、REVOKED:商户取消服务订单
+        ///  5、EXPIRED:服务订单已失效
+        ///  示例值:CREATED
+        /// </remarks>
+        [JsonPropertyName("state")]
+        public string State { get; set; }
+
+        /// <summary>
+        /// 订单状态说明
+        /// </summary>
+        /// <remarks>
+        /// 对服务订单"进行中"状态的附加说明。
+        /// 1、USER_CONFIRM:用户确认
+        /// 2、MCH_COMPLETE:商户完结
+        /// 示例值:MCH_COMPLETE
+        /// </remarks>
+        [JsonPropertyName("state_description")]
+        public string StateDescription { get; set; }
+
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<PostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 订单风险金信息
+        /// </summary>
+        [JsonPropertyName("risk_fund")]
+        public RiskFund RiskFund { get; set; }
+
+        /// <summary>
+        /// 商户数据包
+        /// </summary>
+        /// <remarks>
+        /// 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。
+        /// 示例值:Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald
+        /// </remarks>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户回调地址
+        /// </summary>
+        /// <remarks>
+        /// 商户接收用户确认订单和付款成功回调通知的地址。
+        /// 示例值:https://api.test.com
+        /// </remarks>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 微信支付服务订单号
+        /// </summary>
+        /// <remarks>
+        /// 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("order_id")]
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 跳转微信侧小程序订单数据
+        /// </summary>
+        /// <remarks>
+        /// 用户跳转到微信侧小程序订单数据,需确认模式特有API中调起支付分-确认订单传入。该数据一小时内有效。
+        /// 示例值:DJIOSQPYWDxsjdldeuwhdodwxasd_dDiodnwjh9we
+        /// </remarks>
+        [JsonPropertyName("package")]
+        public string Package { get; set; }
+    }
+}

+ 156 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/Response/WeChatPayScoreServiceOrderSyncResponse.cs

@@ -0,0 +1,156 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore.Response
+{
+    /// <summary>
+    ///  微信支付分 - 同步服务订单信息
+    ///  <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_20.shtml">同步服务订单信息API</a></para>
+    /// </summary>
+    public class WeChatPayScoreServiceOrderSyncResponse : WeChatPayScoreResponseBase
+    {
+        /// <summary>
+        /// 服务信息
+        /// </summary>
+        /// <remarks>
+        /// 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理。
+        /// 示例值:某某酒店
+        /// </remarks>
+        [JsonPropertyName("service_introduction")]
+        public string ServiceIntroduction { get; set; }
+
+        /// <summary>
+        /// 服务订单状态
+        /// </summary>
+        /// <remarks>
+        /// 表示当前单据状态。
+        ///  枚举值:
+        ///  1、CREATED:商户已创建服务订单
+        ///  2、DOING:服务订单进行中
+        ///  3、DONE:服务订单完成
+        ///  4、REVOKED:商户取消服务订单
+        ///  5、EXPIRED:服务订单已失效
+        ///  示例值:CREATED
+        /// </remarks>
+        [JsonPropertyName("state")]
+        public string State { get; set; }
+
+        /// <summary>
+        /// 订单状态说明
+        /// </summary>
+        /// <remarks>
+        /// 对服务订单"进行中"状态的附加说明。
+        /// 1、USER_CONFIRM:用户确认
+        /// 2、MCH_COMPLETE:商户完结
+        /// 示例值:MCH_COMPLETE
+        /// </remarks>
+        [JsonPropertyName("state_description")]
+        public string StateDescription { get; set; }
+
+        /// <summary>
+        /// 商户收款总金额
+        /// </summary>
+        /// <remarks>
+        /// 总金额,大于等于0的数字,单位为分,只能为整数,详见支付金额。
+        /// 此参数需满足:总金额=后付费项目金额之和-后付费商户优惠项目金额之和,且小于等于订单风险金额。取消订单时,该字段必须为0。
+        /// 示例值:40000
+        /// </remarks>
+        [JsonPropertyName("total_amount")]
+        public long TotalAmount { get; set; }
+
+        /// <summary>
+        /// 后付费项目
+        /// </summary>
+        /// <remarks>
+        /// 后付费项目列表,最多包含100条付费项目。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_payments")]
+        public List<PostPayment> PostPayments { get; set; }
+
+        /// <summary>
+        /// 后付费商户优惠
+        /// </summary>
+        /// <remarks>
+        /// 后付费商户优惠列表,最多包含30条商户优惠。
+        /// 如果传入,用户侧则显示此参数。
+        /// </remarks>
+        [JsonPropertyName("post_discounts")]
+        public List<ModifyPostDiscount> PostDiscounts { get; set; }
+
+        /// <summary>
+        /// 服务时间范围
+        /// </summary>
+        [JsonPropertyName("time_range")]
+        public TimeRange TimeRange { get; set; }
+
+        /// <summary>
+        /// 服务位置信息
+        /// 如果传入,用户侧则显示此参数。
+        /// </summary>
+        [JsonPropertyName("location")]
+        public Location Location { get; set; }
+
+        /// <summary>
+        /// 订单风险金信息
+        /// </summary>
+        [JsonPropertyName("risk_fund")]
+        public RiskFund RiskFund { get; set; }
+
+        /// <summary>
+        /// 商户数据包
+        /// </summary>
+        /// <remarks>
+        /// 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。
+        /// 示例值:Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald
+        /// </remarks>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户回调地址
+        /// </summary>
+        /// <remarks>
+        /// 商户接收用户确认订单和付款成功回调通知的地址。
+        /// 示例值:https://api.test.com
+        /// </remarks>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 微信支付服务订单号
+        /// </summary>
+        /// <remarks>
+        /// 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。
+        /// 示例值:15646546545165651651
+        /// </remarks>
+        [JsonPropertyName("order_id")]
+        public string OrderId { get; set; }
+
+
+        /// <summary>
+        /// 是否需要收款
+        /// </summary>
+        /// <remarks>
+        /// 是否需要收款,非0元完结后返回
+        /// true:微信支付分代收款
+        /// false:无需微信支付分代收款
+        /// 示例值:true
+        /// </remarks>
+        [JsonPropertyName("need_collection")]
+        public bool NeedCollection { get; set; }
+
+        /// <summary>
+        /// 收款信息,非0元完结后返回
+        /// </summary>
+        [JsonPropertyName("collection")]
+        public Collection Collection { get; set; }
+
+        /// <summary>
+        /// 微信用户在商户对应appid下的唯一标识
+        /// </summary>
+        [JsonPropertyName("openid")]
+        public string OpenId { get; set; }
+    }
+}

+ 18 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/ServiceOrderState.cs

@@ -0,0 +1,18 @@
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore
+{
+    /// <summary>
+    /// 服务订单状态
+    /// </summary>
+    public static class ServiceOrderState
+    {
+        /// <summary>
+        /// 服务订单进行中
+        /// </summary>
+        public const string Doing = "DOING";
+
+        /// <summary>
+        /// 服务订单完成
+        /// </summary>
+        public const string Done = "DONE";
+    }
+}

+ 18 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Payscore/WeChatPayScoreUserServiceStatus.cs

@@ -0,0 +1,18 @@
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Payscore
+{
+    /// <summary>
+    /// 用户授权状态
+    /// </summary>
+    public static class WeChatPayScoreUserServiceStatus
+    {
+        /// <summary>
+        /// 授权成功
+        /// </summary>
+        public const string Opened = "USER_OPEN_SERVICE";
+
+        /// <summary>
+        /// 解除授权成功
+        /// </summary>
+        public const string Closed = "USER_CLOSE_SERVICE";
+    }
+}

+ 5 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/WeChatPayOptions.cs

@@ -92,6 +92,11 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
         /// </summary>
         public string RsaPublicKey { get; set; }
 
+        /// <summary>
+        /// 微信支付分服务ID(调用微信支付分接口必须配置)
+        /// </summary>
+        public string PayScoreServiceId { get; set; }
+
         internal X509Certificate2 Certificate2;
         internal RSA CertificateRSAPrivateKey;
         internal string CertificateSerialNo;