119 lines
4.8 KiB
C#
119 lines
4.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Net.Http;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using _0_Framework.Application;
|
|
using _0_Framework.Application.PaymentGateway;
|
|
using CompanyManagment.App.Contracts.PaymentTransaction;
|
|
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace CompanyManagment.Application;
|
|
|
|
/// <summary>
|
|
/// سرویس مشترک برای ایجاد درگاه پرداخت سپهر
|
|
/// </summary>
|
|
public class SepehrPaymentGatewayService : ISepehrPaymentGatewayService
|
|
{
|
|
private readonly IPaymentGateway _paymentGateway;
|
|
private readonly IPaymentTransactionApplication _paymentTransactionApplication;
|
|
|
|
public SepehrPaymentGatewayService(
|
|
IPaymentTransactionApplication paymentTransactionApplication,
|
|
IHttpClientFactory httpClientFactory,
|
|
ILogger<SepehrPaymentGateway> sepehrGatewayLogger)
|
|
{
|
|
_paymentGateway = new SepehrPaymentGateway(httpClientFactory, sepehrGatewayLogger);
|
|
_paymentTransactionApplication = paymentTransactionApplication;
|
|
}
|
|
|
|
/// <summary>
|
|
/// ایجاد درگاه پرداخت سپهر برای یک تراکنش
|
|
/// </summary>
|
|
/// <param name="amount">مبلغ</param>
|
|
/// <param name="contractingPartyId">شناسه طرف قرارداد</param>
|
|
/// <param name="frontCallbackUrl">آدرس بازگشتی به فرانت برای نمایش نتیجه</param>
|
|
/// <param name="gatewayCallbackUrl">آدرس بازگشتی درگاه پرداخت</param>
|
|
/// <param name="financialInvoiceId">شناسه فاکتور مالی (اختیاری)</param>
|
|
/// <param name="extraData">دادههای اضافی (اختیاری)</param>
|
|
/// <param name="cancellationToken">توکن لغو</param>
|
|
/// <returns>شامل Token درگاه یا OperationResult با خطا</returns>
|
|
public async Task<OperationResult<CreateSepehrPaymentGatewayResponse>> CreateSepehrPaymentGateway(
|
|
double amount,
|
|
long contractingPartyId,
|
|
long financialInvoiceId,
|
|
string gatewayCallbackUrl,
|
|
string frontCallbackUrl="https://client.gozareshgir.ir",
|
|
Dictionary<string, object> extraData = null,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
var op = new OperationResult<CreateSepehrPaymentGatewayResponse>();
|
|
|
|
try
|
|
{
|
|
// گام 1: ایجاد تراکنش پرداخت
|
|
var transactionCommand = new CreatePaymentTransaction()
|
|
{
|
|
Amount = amount,
|
|
ContractingPartyId = contractingPartyId,
|
|
CallBackUrl = frontCallbackUrl,
|
|
Gateway = PaymentTransactionGateWay.SepehrPay
|
|
};
|
|
|
|
var transactionResult = await _paymentTransactionApplication.Create(transactionCommand);
|
|
|
|
if (!transactionResult.IsSuccedded)
|
|
{
|
|
return op.Failed(transactionResult.Message);
|
|
}
|
|
|
|
// گام 2: ایجاد درخواست درگاه پرداخت
|
|
extraData ??= new Dictionary<string, object>();
|
|
|
|
var createPaymentCommand = new CreatePaymentGatewayRequest()
|
|
{
|
|
Amount = amount,
|
|
TransactionId = transactionResult.SendId.ToString(),
|
|
CallBackUrl = gatewayCallbackUrl,
|
|
FinancialInvoiceId = financialInvoiceId,
|
|
ExtraData = extraData
|
|
};
|
|
|
|
// گام 3: ارسال درخواست به درگاه سپهر
|
|
var gatewayResponse = await _paymentGateway.Create(createPaymentCommand, cancellationToken);
|
|
|
|
#if DEBUG
|
|
gatewayResponse.IsSuccess = true;
|
|
#endif
|
|
if (!gatewayResponse.IsSuccess)
|
|
{
|
|
return op.Failed($"خطا در ایجاد درگاه پرداخت: {gatewayResponse.Message ?? gatewayResponse.ErrorCode?.ToString()}");
|
|
}
|
|
|
|
// گام 4: ذخیره Token در تراکنش
|
|
var setTokenResult = await _paymentTransactionApplication.SetTransactionId(
|
|
transactionResult.SendId,
|
|
gatewayResponse.Token);
|
|
|
|
if (!setTokenResult.IsSuccedded)
|
|
{
|
|
return op.Failed("خطا در ذخیره Token درگاه");
|
|
}
|
|
|
|
// گام 5: بازگشت اطلاعات درگاه پرداخت
|
|
var response = new CreateSepehrPaymentGatewayResponse
|
|
{
|
|
Token = gatewayResponse.Token,
|
|
TransactionId = transactionResult.SendId,
|
|
PaymentUrl = _paymentGateway.GetStartPayUrl(gatewayResponse.Token)
|
|
};
|
|
|
|
return op.Succcedded(response);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return op.Failed($"خطا در ایجاد درگاه پرداخت: {ex.Message}");
|
|
}
|
|
}
|
|
} |