Explorar o código

新增 查询订单

Roc %!s(int64=5) %!d(string=hai) anos
pai
achega
c691195e56

+ 56 - 0
samples/WebApplicationSample/Controllers/WeChatPayV3Controller.cs

@@ -222,5 +222,61 @@ namespace WebApplicationSample.Controllers
             ViewData["response"] = response.Body;
             return View();
         }
+
+        /// <summary>
+        /// 微信支付订单号查询
+        /// </summary>
+        [HttpGet]
+        public IActionResult QueryByTransactionId()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 微信支付订单号查询
+        /// </summary>
+        /// <param name="viewModel"></param>
+        [HttpPost]
+        public async Task<IActionResult> QueryByTransactionId(WeChatPayQueryByTransactionIdViewModel viewModel)
+        {
+            var request = new WeChatPayTransactionsIdRequest
+            { 
+                TransactionId = viewModel.TransactionId,
+                MchId = _optionsAccessor.Value.MchId,
+            };
+
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 商户订单号查询
+        /// </summary>
+        [HttpGet]
+        public IActionResult QueryByOutTradeNo()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 商户订单号查询
+        /// </summary>
+        /// <param name="viewModel"></param>
+        [HttpPost]
+        public async Task<IActionResult> QueryByOutTradeNo(WeChatPayQueryByOutTradeNoViewModel viewModel)
+        {
+            var request = new WeChatPayTransactionsOutTradeNoRequest
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+                MchId = _optionsAccessor.Value.MchId,
+            };
+
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+
+            ViewData["response"] = response.Body;
+            return View();
+        }
     }
 }

+ 14 - 0
samples/WebApplicationSample/Models/WeChatPayV3ViewModel.cs

@@ -81,4 +81,18 @@ namespace WebApplicationSample.Models
         [Display(Name = "notify_url")]
         public string NotifyUrl { get; set; }
     }
+
+    public class WeChatPayQueryByTransactionIdViewModel
+    {
+        [Required]
+        [Display(Name = "transaction_id")]
+        public string TransactionId { get; set; }
+    }
+
+    public class WeChatPayQueryByOutTradeNoViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
 }

+ 12 - 0
samples/WebApplicationSample/Views/WeChatPayV3/Index.cshtml

@@ -48,5 +48,17 @@
             <td><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_4.shtml" target="_blank">https://api.mch.weixin.qq.com/v3/pay/transactions/h5</a></td>
             <td><a asp-controller="WeChatPayV3" asp-action="H5Pay">立即测试</a></td>
         </tr>
+        <tr>
+            <th scope="row">6</th>
+            <td>查询订单-微信支付订单号查询</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_5.shtml" target="_blank">https://api.mch.weixin.qq.com/v3/pay/transactions/id/{transaction_id}</a></td>
+            <td><a asp-controller="WeChatPayV3" asp-action="QueryByTransactionId">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">7</th>
+            <td>查询订单-商户订单号查询</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_5.shtml" target="_blank">https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}</a></td>
+            <td><a asp-controller="WeChatPayV3" asp-action="QueryByOutTradeNo">立即测试</a></td>
+        </tr>
     </tbody>
 </table>

+ 33 - 0
samples/WebApplicationSample/Views/WeChatPayV3/QueryByOutTradeNo.cshtml

@@ -0,0 +1,33 @@
+@model WeChatPayQueryByOutTradeNoViewModel
+@{
+    ViewData["Title"] = "查询订单-商户订单号查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayV3" 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="WeChatPayV3" asp-action="QueryByOutTradeNo">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </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/WeChatPayV3/QueryByTransactionId.cshtml

@@ -0,0 +1,33 @@
+@model WeChatPayQueryByTransactionIdViewModel
+@{
+    ViewData["Title"] = "查询订单-微信支付订单号查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPayV3" 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="WeChatPayV3" asp-action="QueryByTransactionId">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TransactionId"></label>
+                <input type="text" class="form-control" asp-for="TransactionId" />
+            </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"); }
+}

+ 16 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/Amount.cs

@@ -15,6 +15,14 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
         [JsonPropertyName("total")]
         public int Total { get; set; }
 
+        /// <summary>
+        /// 用户支付金额
+        /// 用户支付金额,单位为分。
+        /// 示例值:100
+        /// </summary>
+        [JsonPropertyName("payer_total")]
+        public int PayerTotal { get; set; }
+
         /// <summary>
         /// 货币类型	
         /// CNY:人民币,境内商户号仅支持人民币。
@@ -22,5 +30,13 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
         /// </summary>
         [JsonPropertyName("currency")]
         public string Currency { get; set; }
+
+        /// <summary>
+        /// 用户支付币种	
+        /// 用户支付币种
+        /// 示例值:CNY
+        /// </summary>
+        [JsonPropertyName("payer_currency")]
+        public string PayerCurrency { get; set; }
     }
 }

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

@@ -0,0 +1,31 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 查询订单API - 微信支付订单号查询
+    /// 最新更新时间:2020.05.26
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_5.shtml
+    /// </summary>
+    public class WeChatPayTransactionsIdRequest : IWeChatPayV3GetRequest<WeChatPayTransactionsIdResponse>
+    {
+        /// <summary>
+        /// 直连商户号
+        /// 直连商户的商户号,由微信支付生成并下发。
+        /// 示例值:1230000109
+        /// </summary>
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 微信支付订单号
+        /// 微信支付系统生成的订单号
+        /// 示例值:1217752501201407033233368018
+        /// </summary>
+        public string TransactionId { get; set; }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/pay/transactions/id/{TransactionId}?mchid={MchId}";
+        }
+    }
+}

+ 32 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayTransactionsOutTradeNoRequest.cs

@@ -0,0 +1,32 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 查询订单API - 商户订单号查询
+    /// 最新更新时间:2020.05.26
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_5.shtml
+    /// </summary>
+    public class WeChatPayTransactionsOutTradeNoRequest : IWeChatPayV3GetRequest<WeChatPayTransactionsOutTradeNoResponse>
+    {
+        /// <summary>
+        /// 直连商户号
+        /// 直连商户的商户号,由微信支付生成并下发。
+        /// 示例值:1230000109
+        /// </summary>
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一,详见【商户订单号】。
+        /// 特殊规则:最小字符长度为6
+        /// 示例值:1217752501201407033233368018
+        /// </summary>
+        public string OutTradeNo { get; set; }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{OutTradeNo}?mchid={MchId}";
+        }
+    }
+}

+ 136 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayTransactionsIdResponse.cs

@@ -0,0 +1,136 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    /// <summary>
+    /// 查询订单API-微信支付订单号查询-返回参数
+    /// 最新更新时间:2020.05.26
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_5.shtml
+    /// </summary>
+    public class WeChatPayTransactionsIdResponse : WeChatPayV3Response
+    {
+        /// <summary>
+        /// 公众号ID
+        /// 直连商户申请的公众号或移动应用appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 直连商户号
+        /// 直连商户的商户号,由微信支付生成并下发。
+        /// 示例值:1230000109
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一,详见【商户订单号】。
+        /// 特殊规则:最小字符长度为6
+        /// 示例值:1217752501201407033233368018
+        /// </summary>
+        [JsonPropertyName("out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 微信支付订单号
+        /// 微信支付系统生成的订单号。
+        /// 示例值:1217752501201407033233368018
+        /// </summary>
+        [JsonPropertyName("transaction_id")]
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// 交易类型,枚举值:
+        /// JSAPI:公众号支付
+        /// NATIVE:扫码支付
+        /// APP:APP支付
+        /// MICROPAY:付款码支付
+        /// MWEB:H5支付
+        /// FACEPAY:刷脸支付
+        /// 示例值:MICROPAY
+        /// </summary>
+        [JsonPropertyName("trade_type")]
+        public string TradeType { get; set; }
+
+        /// <summary>
+        /// 交易状态
+        /// 交易状态,枚举值:
+        /// SUCCESS:支付成功
+        /// REFUND:转入退款
+        /// NOTPAY:未支付
+        /// CLOSED:已关闭
+        /// REVOKED:已撤销(付款码支付)
+        /// USERPAYING:用户支付中(付款码支付)
+        /// PAYERROR:支付失败(其他原因,如银行返回失败)
+        /// 示例值:SUCCESS
+        /// </summary>
+        [JsonPropertyName("trade_state")]
+        public string TradeState { get; set; }
+
+        /// <summary>
+        /// 交易状态描述
+        /// 交易状态描述
+        /// 示例值:支付失败,请重新下单支付
+        /// </summary>
+        [JsonPropertyName("trade_state_desc")]
+        public string TradeStateDesc { get; set; }
+
+        /// <summary>
+        /// 付款银行
+        /// 银行类型,采用字符串类型的银行标识。
+        /// 示例值:CMC
+        /// </summary>
+        [JsonPropertyName("bank_type")]
+        public string BankType { get; set; }
+
+        /// <summary>
+        /// 附加数据
+        /// 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
+        /// 示例值:自定义数据
+        /// </summary>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 支付完成时间
+        /// 支付完成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2018-06-08T10:34:56+08:00
+        /// </summary>
+        [JsonPropertyName("success_time")]
+        public string SuccessTime { get; set; }
+
+        /// <summary>
+        /// 支付者
+        /// 示例值:见请求示例
+        /// </summary>
+        [JsonPropertyName("combine_payer_info")]
+        public Payer CombinePayerInfo { get; set; }
+
+        /// <summary>
+        /// 订单金额
+        /// 订单金额信息
+        /// </summary>
+        [JsonPropertyName("amount")]
+        public Amount Amount { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// 支付场景描述
+        /// </summary>
+        [JsonPropertyName("scene_info")]
+        public SceneInfo SceneInfo { get; set; }
+
+        /// <summary>
+        /// 优惠功能
+        /// 优惠功能,享受优惠时返回该字段。
+        /// </summary>
+        [JsonPropertyName("promotion_detail")]
+        public List<PromotionDetail> PromotionDetail { get; set; }
+    }
+}

+ 136 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayTransactionsOutTradeNoResponse.cs

@@ -0,0 +1,136 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    /// <summary>
+    /// 查询订单API-商户订单号查询-返回参数
+    /// 最新更新时间:2020.05.26
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_5.shtml
+    /// </summary>
+    public class WeChatPayTransactionsOutTradeNoResponse : WeChatPayV3Response
+    {
+        /// <summary>
+        /// 公众号ID
+        /// 直连商户申请的公众号或移动应用appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 直连商户号
+        /// 直连商户的商户号,由微信支付生成并下发。
+        /// 示例值:1230000109
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一,详见【商户订单号】。
+        /// 特殊规则:最小字符长度为6
+        /// 示例值:1217752501201407033233368018
+        /// </summary>
+        [JsonPropertyName("out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 微信支付订单号
+        /// 微信支付系统生成的订单号。
+        /// 示例值:1217752501201407033233368018
+        /// </summary>
+        [JsonPropertyName("transaction_id")]
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// 交易类型,枚举值:
+        /// JSAPI:公众号支付
+        /// NATIVE:扫码支付
+        /// APP:APP支付
+        /// MICROPAY:付款码支付
+        /// MWEB:H5支付
+        /// FACEPAY:刷脸支付
+        /// 示例值:MICROPAY
+        /// </summary>
+        [JsonPropertyName("trade_type")]
+        public string TradeType { get; set; }
+
+        /// <summary>
+        /// 交易状态
+        /// 交易状态,枚举值:
+        /// SUCCESS:支付成功
+        /// REFUND:转入退款
+        /// NOTPAY:未支付
+        /// CLOSED:已关闭
+        /// REVOKED:已撤销(付款码支付)
+        /// USERPAYING:用户支付中(付款码支付)
+        /// PAYERROR:支付失败(其他原因,如银行返回失败)
+        /// 示例值:SUCCESS
+        /// </summary>
+        [JsonPropertyName("trade_state")]
+        public string TradeState { get; set; }
+
+        /// <summary>
+        /// 交易状态描述
+        /// 交易状态描述
+        /// 示例值:支付失败,请重新下单支付
+        /// </summary>
+        [JsonPropertyName("trade_state_desc")]
+        public string TradeStateDesc { get; set; }
+
+        /// <summary>
+        /// 付款银行
+        /// 银行类型,采用字符串类型的银行标识。
+        /// 示例值:CMC
+        /// </summary>
+        [JsonPropertyName("bank_type")]
+        public string BankType { get; set; }
+
+        /// <summary>
+        /// 附加数据
+        /// 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
+        /// 示例值:自定义数据
+        /// </summary>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 支付完成时间
+        /// 支付完成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2018-06-08T10:34:56+08:00
+        /// </summary>
+        [JsonPropertyName("success_time")]
+        public string SuccessTime { get; set; }
+
+        /// <summary>
+        /// 支付者
+        /// 示例值:见请求示例
+        /// </summary>
+        [JsonPropertyName("combine_payer_info")]
+        public Payer CombinePayerInfo { get; set; }
+
+        /// <summary>
+        /// 订单金额
+        /// 订单金额信息
+        /// </summary>
+        [JsonPropertyName("amount")]
+        public Amount Amount { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// 支付场景描述
+        /// </summary>
+        [JsonPropertyName("scene_info")]
+        public SceneInfo SceneInfo { get; set; }
+
+        /// <summary>
+        /// 优惠功能
+        /// 优惠功能,享受优惠时返回该字段。
+        /// </summary>
+        [JsonPropertyName("promotion_detail")]
+        public List<PromotionDetail> PromotionDetail { get; set; }
+    }
+}