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));
}
}
}