using System.Threading; using System.Threading.Tasks; using PaySharp.Core; using PaySharp.Core.Request; using PaySharp.Wechatpay.Domain; using PaySharp.Wechatpay.Request; namespace PaySharp.Wechatpay.Response { public class BarcodePayResponse : BaseResponse { /// /// 用户标识 /// 用户在商户appid 下的唯一标识 /// [ReName(Name = "openid")] public string OpenId { get; set; } /// /// 是否关注公众账号 /// 仅在公众账号类型支付有效,取值范围:Y或N;Y-关注;N-未关注 /// public string IsSubscribe { get; set; } /// /// 交易类型 /// public string TradeType { get; set; } /// /// 银行类型,采用字符串类型的银行标识,详见银行类型 /// public string BankType { get; set; } /// /// 货币类型 /// 符合ISO 4217标准的三位字母代码,默认人民币:CNY,详见货币类型 /// [ReName(Name = "fee_type")] public string AmountType { get; set; } /// /// 订单金额 /// 订单总金额,单位为分 /// [ReName(Name = "total_fee")] public int TotalAmount { get; set; } /// /// 应结订单金额 /// 当订单使用了免充值型优惠券后返回该参数,应结订单金额=订单金额-免充值优惠券金额。 /// [ReName(Name = "settlement_total_fee")] public int SettlementTotalAmount { get; set; } /// /// 现金支付货币类型 /// 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型 /// [ReName(Name = "cash_fee_type")] public string CashAmountType { get; set; } /// /// 现金支付金额 /// 订单现金支付金额,详见支付金额 /// [ReName(Name = "cash_fee")] public int CashAmount { get; set; } /// /// 代金券金额 /// “代金券”金额小于等于订单金额,订单金额-“代金券”金额=现金支付金额,详见支付金额 /// [ReName(Name = "coupon_fee")] public int CouponAmount { get; set; } /// /// 微信支付订单号 /// [ReName(Name = "transaction_id")] public string TradeNo { get; set; } /// /// 商户订单号 /// public string OutTradeNo { get; set; } /// /// 商家数据包 /// public string Attach { get; set; } /// /// 支付完成时间 /// public string TimeEnd { get; set; } /// /// 营销详情 /// public string PromotionDetail { get; set; } private Merchant _merchant; internal override void Execute(Merchant merchant, Request request) { _merchant = merchant; var barcodePayRequest = request as BarcodePayRequest; if (ResultCode == "SUCCESS") { barcodePayRequest.OnPaySucceed(this, null); return; } if (ErrCode == "USERPAYING") { var queryResponse = new QueryResponse(); Task.Run(async () => { queryResponse = await PollQueryTradeStateAsync( barcodePayRequest.Model.OutTradeNo, barcodePayRequest.PollTime, barcodePayRequest.PollCount); }) .GetAwaiter() .GetResult(); if (queryResponse != null) { barcodePayRequest.OnPaySucceed(queryResponse, null); return; } else { barcodePayRequest.OnPayFailed(this, "支付超时"); return; } } barcodePayRequest.OnPayFailed(this, ErrCodeDes); } /// /// 轮询查询用户是否支付 /// /// 订单号 /// 轮询间隔 /// 轮询次数 /// private QueryResponse PollQueryTradeState(string outTradeNo, int pollTime, int pollCount) { for (var i = 0; i < pollCount; i++) { var queryRequest = new QueryRequest(); queryRequest.AddGatewayData(new QueryModel { OutTradeNo = outTradeNo }); var queryResponse = SubmitProcess.Execute(_merchant, queryRequest); if (queryResponse.TradeState == "SUCCESS") { return queryResponse; } Thread.Sleep(pollTime); } //支付超时,取消订单 var cancelRequest = new CancelRequest(); cancelRequest.AddGatewayData(new CancelModel { OutTradeNo = outTradeNo }); SubmitProcess.Execute(_merchant, cancelRequest); return null; } /// /// 轮询查询用户是否支付 /// /// 订单号 /// 轮询间隔 /// 轮询次数 /// private async Task PollQueryTradeStateAsync(string outTradeNo, int pollTime, int pollCount) { return await Task.Run(() => PollQueryTradeState(outTradeNo, pollTime, pollCount)); } } }