using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PaySharp.Alipay.Domain;
using PaySharp.Alipay.Request;
using PaySharp.Core.Request;
namespace PaySharp.Alipay.Response
{
public class BarcodePayResponse : BaseResponse
{
///
/// 支付宝交易号
///
public string TradeNo { get; set; }
///
/// 商户订单号
///
public string OutTradeNo { get; set; }
///
/// 买家支付宝账号
///
public string BuyerLogonId { get; set; }
///
/// 订单金额
///
public double TotalAmount { get; set; }
///
/// 标价币种
///
public string TransCurrency { get; set; }
///
/// 结算币种
///
public string SettleCurrency { get; set; }
///
/// 结算金额
///
public double SettleAmount { get; set; }
///
/// 支付币种
///
public string PayCurrency { get; set; }
///
/// 支付金额
///
public double PayAmount { get; set; }
///
/// 结算币种兑换标价币种汇率
///
public double SettleTransRate { get; set; }
///
/// 标价币种兑换支付币种汇率
///
public double TransPayRate { get; set; }
///
/// 实收金额
///
public double ReceiptAmount { get; set; }
///
/// 付款金额
///
public double BuyerPayAmount { get; set; }
///
/// 集分宝金额
///
public double PointAmount { get; set; }
///
/// 开票金额
///
public double InvoiceAmount { get; set; }
///
/// 交易付款时间
///
public DateTime GmtPayment { get; set; }
///
/// 交易支付使用的资金渠道
///
public List FundBillList { get; set; }
///
/// 支付宝卡余额
///
public double CardBalance { get; set; }
///
/// 发生支付交易的商户门店名称
///
public string StoreName { get; set; }
///
/// 买家支付宝用户号
///
public string BuyerUserId { get; set; }
///
/// 本交易支付时使用的所有优惠券信息
///
public string DiscountGoodsDetail { get; set; }
///
/// 本交易支付时使用的所有优惠券信息
///
public List VoucherDetailList { get; set; }
///
/// 预授权支付模式,该参数仅在信用预授权支付场景下返回。信用预授权支付:CREDIT_PREAUTH_PAY
///
public string AuthTradePayMode { get; set; }
///
/// 商户传入业务信息,具体值要和支付宝约定
/// 将商户传入信息分发给相应系统,应用于安全,营销等参数直传场景
/// 格式为json格式
///
public string BusinessParams { get; set; }
///
/// 买家用户类型
/// CORPORATE:企业用户
/// PRIVATE:个人用户
///
public string BuyerUserType { get; set; }
///
/// 商家优惠金额
///
public double MdiscountAmount { get; set; }
///
/// 平台优惠金额
///
public double DiscountAmount { get; set; }
private Merchant _merchant;
internal override void Execute(Merchant merchant, Request request)
{
_merchant = merchant;
var barcodePayRequest = request as BarcodePayRequest;
if (Code == "10000")
{
barcodePayRequest.OnPaySucceed(this, null);
return;
}
if (!string.IsNullOrEmpty(TradeNo))
{
var queryResponse = new QueryResponse();
Task.Run(async () =>
{
queryResponse = await PollQueryTradeStateAsync(
TradeNo,
barcodePayRequest.PollTime,
barcodePayRequest.PollCount);
})
.GetAwaiter()
.GetResult();
if (queryResponse != null)
{
barcodePayRequest.OnPaySucceed(queryResponse, null);
return;
}
else
{
barcodePayRequest.OnPayFailed(this, "支付超时");
return;
}
}
barcodePayRequest.OnPayFailed(this, SubMessage);
}
///
/// 轮询查询用户是否支付
///
/// 支付宝订单号
/// 轮询间隔
/// 轮询次数
///
private QueryResponse PollQueryTradeState(string tradeNo, int pollTime, int pollCount)
{
for (var i = 0; i < pollCount; i++)
{
var queryRequest = new QueryRequest();
queryRequest.AddGatewayData(new QueryModel
{
TradeNo = tradeNo
});
var queryResponse = SubmitProcess.Execute(_merchant, queryRequest);
if (queryResponse.TradeStatus == "TRADE_SUCCESS")
{
return queryResponse;
}
Thread.Sleep(pollTime);
}
//支付超时,取消订单
var cancelRequest = new CancelRequest();
cancelRequest.AddGatewayData(new CancelModel
{
TradeNo = tradeNo
});
SubmitProcess.Execute(_merchant, cancelRequest);
return null;
}
///
/// 轮询查询用户是否支付
///
/// 支付宝订单号
/// 轮询间隔
/// 轮询次数
///
private async Task PollQueryTradeStateAsync(string tradeNo, int pollTime, int pollCount)
{
return await Task.Run(() => PollQueryTradeState(tradeNo, pollTime, pollCount));
}
}
}