refactor: remove PYMS microservice, use ZarinPal directly in CMS
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 8m26s
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 8m26s
- Remove PYMSPaymentService.cs and PYMS proto files - Remove 'pyms' case from DI ConfigureServices - Remove PYMS config from appsettings - Switch PaymentProvider to 'zarinpal' (direct integration) - ZarinPalPaymentService handles sandbox/production, verify, errors - PYMS deployment/service/ingress removed from K8s
This commit is contained in:
@@ -75,7 +75,7 @@ public static class ConfigureServices
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Payment Gateway Service - Multi-Provider Architecture
|
// Payment Gateway Service - Multi-Provider Architecture
|
||||||
// پشتیبانی از درگاههای مختلف: ZarinPal, Daya, PYMS, Mock
|
// پشتیبانی از درگاههای مختلف: ZarinPal, Daya, Mock
|
||||||
var paymentProvider = configuration.GetValue<string>("PaymentProvider", "Mock")?.ToLowerInvariant();
|
var paymentProvider = configuration.GetValue<string>("PaymentProvider", "Mock")?.ToLowerInvariant();
|
||||||
|
|
||||||
switch (paymentProvider)
|
switch (paymentProvider)
|
||||||
@@ -90,11 +90,6 @@ public static class ConfigureServices
|
|||||||
.SetHandlerLifetime(TimeSpan.FromMinutes(5));
|
.SetHandlerLifetime(TimeSpan.FromMinutes(5));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "pyms":
|
|
||||||
// PYMS (Payment Microservice) — ارتباط gRPC با سرویس پرداخت مستقل
|
|
||||||
services.AddSingleton<IPaymentGatewayService, PYMSPaymentService>();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "mock":
|
case "mock":
|
||||||
default:
|
default:
|
||||||
services.AddScoped<IPaymentGatewayService, MockPaymentGatewayService>();
|
services.AddScoped<IPaymentGatewayService, MockPaymentGatewayService>();
|
||||||
|
|||||||
@@ -1,284 +0,0 @@
|
|||||||
using CMSMicroservice.Application.Common.Interfaces;
|
|
||||||
using CMSMicroservice.Protobuf.Protos.PYMS;
|
|
||||||
using CMSMicroservice.Protobuf.Protos.PYMS.Transaction;
|
|
||||||
using Grpc.Net.Client;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using System.Net.Http;
|
|
||||||
|
|
||||||
namespace CMSMicroservice.Infrastructure.Services.Payment;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// پیادهسازی درگاه پرداخت از طریق PYMS (Payment Microservice)
|
|
||||||
/// CMS به جای اتصال مستقیم به ZarinPal، از PYMS استفاده میکند.
|
|
||||||
/// PYMS تراکنشها را ذخیره و با ZarinPal ارتباط برقرار میکند.
|
|
||||||
/// </summary>
|
|
||||||
public class PYMSPaymentService : IPaymentGatewayService, IDisposable
|
|
||||||
{
|
|
||||||
private readonly ILogger<PYMSPaymentService> _logger;
|
|
||||||
private readonly GrpcChannel _channel;
|
|
||||||
private readonly TransactionContract.TransactionContractClient _client;
|
|
||||||
private readonly string _merchantId;
|
|
||||||
private readonly bool _useSandbox;
|
|
||||||
|
|
||||||
public PYMSPaymentService(
|
|
||||||
IConfiguration configuration,
|
|
||||||
ILogger<PYMSPaymentService> logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
|
|
||||||
var pymsAddress = configuration["PYMS:Address"]
|
|
||||||
?? throw new InvalidOperationException("PYMS:Address is not configured.");
|
|
||||||
|
|
||||||
_merchantId = configuration["ZarinPal:MerchantId"]
|
|
||||||
?? throw new InvalidOperationException("ZarinPal:MerchantId is not configured.");
|
|
||||||
|
|
||||||
_useSandbox = configuration.GetValue<bool>("ZarinPal:UseSandbox", true);
|
|
||||||
|
|
||||||
// ایجاد کانال gRPC به PYMS
|
|
||||||
_channel = GrpcChannel.ForAddress(pymsAddress, new GrpcChannelOptions
|
|
||||||
{
|
|
||||||
HttpHandler = new SocketsHttpHandler
|
|
||||||
{
|
|
||||||
EnableMultipleHttp2Connections = true,
|
|
||||||
PooledConnectionIdleTimeout = TimeSpan.FromMinutes(5),
|
|
||||||
KeepAlivePingDelay = TimeSpan.FromSeconds(60),
|
|
||||||
KeepAlivePingTimeout = TimeSpan.FromSeconds(30),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
_client = new TransactionContract.TransactionContractClient(_channel);
|
|
||||||
|
|
||||||
_logger.LogInformation(
|
|
||||||
"PYMS Payment Service initialized. Address={Address}, Mode={Mode}",
|
|
||||||
pymsAddress, _useSandbox ? "🧪 Sandbox" : "🏦 Production");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// مرحله ۱: ارسال درخواست پرداخت به PYMS
|
|
||||||
/// PYMS تراکنش را ایجاد و URL درگاه را برمیگرداند
|
|
||||||
/// </summary>
|
|
||||||
public async Task<PaymentInitiateResult> InitiatePaymentAsync(
|
|
||||||
PaymentRequest request,
|
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// CMS مبالغ را به تومان نگهداری میکند
|
|
||||||
// PYMS مبلغ را به ریال میخواهد — تبدیل تومان به ریال
|
|
||||||
var amountInRials = (long)(request.Amount * 10);
|
|
||||||
|
|
||||||
var grpcRequest = new PaymentRequestRequest
|
|
||||||
{
|
|
||||||
MerchantId = _merchantId,
|
|
||||||
Amount = amountInRials,
|
|
||||||
CallbackUrl = request.CallbackUrl ?? string.Empty,
|
|
||||||
Description = request.Description ?? string.Empty,
|
|
||||||
OrderId = request.UserId.ToString(),
|
|
||||||
// نوع تراکنش: Sandbox برای تست، Real برای Production
|
|
||||||
Type = _useSandbox ? TransactionTypeEnum.Sandbox : TransactionTypeEnum.Real,
|
|
||||||
Currency = CurrencyEnum.Irt, // تومان
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(request.Mobile))
|
|
||||||
grpcRequest.Mobile = request.Mobile;
|
|
||||||
|
|
||||||
_logger.LogInformation(
|
|
||||||
"PYMS payment request: Amount={AmountToman} Toman ({AmountRial} Rial), User={UserId}, Sandbox={Sandbox}",
|
|
||||||
request.Amount, amountInRials, request.UserId, _useSandbox);
|
|
||||||
|
|
||||||
var response = await _client.PaymentRequestAsync(grpcRequest, cancellationToken: cancellationToken);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(response.PaymentGWUrl))
|
|
||||||
{
|
|
||||||
_logger.LogInformation(
|
|
||||||
"PYMS payment initiated successfully: GatewayUrl={Url}",
|
|
||||||
response.PaymentGWUrl);
|
|
||||||
|
|
||||||
// از URL درگاه، Authority را استخراج میکنیم (آخرین بخش URL)
|
|
||||||
var authority = ExtractAuthorityFromUrl(response.PaymentGWUrl);
|
|
||||||
|
|
||||||
return new PaymentInitiateResult
|
|
||||||
{
|
|
||||||
IsSuccess = true,
|
|
||||||
RefId = authority,
|
|
||||||
GatewayUrl = response.PaymentGWUrl
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
_logger.LogError("PYMS payment request failed: Empty gateway URL returned");
|
|
||||||
|
|
||||||
return new PaymentInitiateResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
ErrorMessage = "خطا در دریافت آدرس درگاه از PYMS"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (Grpc.Core.RpcException ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "PYMS gRPC error in InitiatePayment: Status={Status}, Detail={Detail}",
|
|
||||||
ex.StatusCode, ex.Status.Detail);
|
|
||||||
|
|
||||||
return new PaymentInitiateResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
ErrorMessage = $"خطا در ارتباط با سرویس پرداخت: {ex.Status.Detail}"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "PYMS InitiatePayment exception");
|
|
||||||
return new PaymentInitiateResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
ErrorMessage = $"خطا در ارتباط با سرویس پرداخت: {ex.Message}"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// تأیید پرداخت بدون مبلغ — PYMS خودش مبلغ را از تراکنش ذخیرهشده میخواند
|
|
||||||
/// </summary>
|
|
||||||
public async Task<PaymentVerificationResult> VerifyPaymentAsync(
|
|
||||||
string refId,
|
|
||||||
string verificationToken,
|
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
return await VerifyPaymentInternalAsync(refId, verificationToken, cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// تأیید پرداخت با مبلغ — PYMS خودش verify را انجام میدهد
|
|
||||||
/// refId = Authority, verificationToken = Status (OK/NOK)
|
|
||||||
/// </summary>
|
|
||||||
public async Task<PaymentVerificationResult> VerifyPaymentAsync(
|
|
||||||
string refId,
|
|
||||||
string verificationToken,
|
|
||||||
decimal amountInToman,
|
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
return await VerifyPaymentInternalAsync(refId, verificationToken, cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<PaymentVerificationResult> VerifyPaymentInternalAsync(
|
|
||||||
string refId,
|
|
||||||
string verificationToken,
|
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// اگر کاربر لغو کرده
|
|
||||||
if (!string.Equals(verificationToken, "OK", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Payment cancelled by user: Authority={Authority}", refId);
|
|
||||||
return new PaymentVerificationResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
RefId = refId,
|
|
||||||
Message = "پرداخت توسط کاربر لغو شد"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var grpcRequest = new PaymentVerificationRequest
|
|
||||||
{
|
|
||||||
Authority = refId,
|
|
||||||
Status = verificationToken
|
|
||||||
};
|
|
||||||
|
|
||||||
_logger.LogInformation("PYMS verify request: Authority={Authority}, Status={Status}",
|
|
||||||
refId, verificationToken);
|
|
||||||
|
|
||||||
var response = await _client.PaymentVerificationAsync(grpcRequest, cancellationToken: cancellationToken);
|
|
||||||
|
|
||||||
if (response.PaymentStatus)
|
|
||||||
{
|
|
||||||
_logger.LogInformation(
|
|
||||||
"PYMS payment verified: Id={Id}, RefId={RefId}, OrderId={OrderId}, StatusCode={StatusCode}",
|
|
||||||
response.Id, response.RefId, response.OrderId, response.VerificationStatusCode);
|
|
||||||
|
|
||||||
return new PaymentVerificationResult
|
|
||||||
{
|
|
||||||
IsSuccess = true,
|
|
||||||
RefId = refId,
|
|
||||||
TrackingCode = response.RefId,
|
|
||||||
Amount = 0, // مبلغ از DB خوانده میشود
|
|
||||||
Message = response.Message ?? "تراکنش موفق"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
_logger.LogError(
|
|
||||||
"PYMS verify failed: Authority={Authority}, StatusCode={StatusCode}, Message={Message}",
|
|
||||||
refId, response.VerificationStatusCode, response.Message);
|
|
||||||
|
|
||||||
return new PaymentVerificationResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
RefId = refId,
|
|
||||||
Message = response.Message ?? "تأیید پرداخت ناموفق"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (Grpc.Core.RpcException ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "PYMS gRPC error in VerifyPayment: Status={Status}, Detail={Detail}",
|
|
||||||
ex.StatusCode, ex.Status.Detail);
|
|
||||||
|
|
||||||
return new PaymentVerificationResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
RefId = refId,
|
|
||||||
Message = $"خطا در تأیید تراکنش: {ex.Status.Detail}"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "PYMS VerifyPayment exception: Authority={Authority}", refId);
|
|
||||||
return new PaymentVerificationResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
RefId = refId,
|
|
||||||
Message = $"خطا در تأیید تراکنش: {ex.Message}"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// PYMS فعلاً قابلیت Payout ندارد
|
|
||||||
/// </summary>
|
|
||||||
public Task<PayoutResult> ProcessPayoutAsync(
|
|
||||||
PayoutRequest request,
|
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("PYMS does not support direct payout yet.");
|
|
||||||
return Task.FromResult(new PayoutResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
Message = "سرویس پرداخت (PYMS) فعلاً از قابلیت واریز مستقیم پشتیبانی نمیکند",
|
|
||||||
ProcessedAt = DateTime.UtcNow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// استخراج Authority از URL درگاه
|
|
||||||
/// مثال: https://sandbox.zarinpal.com/pg/StartPay/A00000000000000000000000000123456789 → A00000000000000000000000000123456789
|
|
||||||
/// </summary>
|
|
||||||
private static string ExtractAuthorityFromUrl(string gatewayUrl)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(gatewayUrl))
|
|
||||||
return string.Empty;
|
|
||||||
|
|
||||||
// Authority معمولاً آخرین بخش URL است
|
|
||||||
var uri = new Uri(gatewayUrl);
|
|
||||||
var segments = uri.Segments;
|
|
||||||
if (segments.Length > 0)
|
|
||||||
{
|
|
||||||
return segments[^1].TrimEnd('/');
|
|
||||||
}
|
|
||||||
|
|
||||||
return gatewayUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
_channel?.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -73,9 +73,6 @@
|
|||||||
<Protobuf Include="Protos\sitepage.proto" ProtoRoot="Protos\" GrpcServices="Both" />
|
<Protobuf Include="Protos\sitepage.proto" ProtoRoot="Protos\" GrpcServices="Both" />
|
||||||
<!-- Image Resolver Service -->
|
<!-- Image Resolver Service -->
|
||||||
<Protobuf Include="Protos\imageresolver.proto" ProtoRoot="Protos\" GrpcServices="Both" />
|
<Protobuf Include="Protos\imageresolver.proto" ProtoRoot="Protos\" GrpcServices="Both" />
|
||||||
<!-- PYMS (Payment Microservice) - gRPC Client only -->
|
|
||||||
<Protobuf Include="Protos\pyms\pyms_public_messages.proto" ProtoRoot="Protos\" GrpcServices="Client" />
|
|
||||||
<Protobuf Include="Protos\pyms\pyms_transaction.proto" ProtoRoot="Protos\" GrpcServices="Client" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PushToFoursatNuget" AfterTargets="Pack" Condition="'$(CI)' != 'true'">
|
<Target Name="PushToFoursatNuget" AfterTargets="Pack" Condition="'$(CI)' != 'true'">
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package pyms_messages;
|
|
||||||
|
|
||||||
option csharp_namespace = "CMSMicroservice.Protobuf.Protos.PYMS";
|
|
||||||
|
|
||||||
service PYMSPublicMessageContract{}
|
|
||||||
|
|
||||||
message PaginationState
|
|
||||||
{
|
|
||||||
int32 page_number = 1;
|
|
||||||
int32 page_size = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message MetaData
|
|
||||||
{
|
|
||||||
int64 current_page = 1;
|
|
||||||
int64 total_page = 2;
|
|
||||||
int64 page_size = 3;
|
|
||||||
int64 total_count = 4;
|
|
||||||
bool has_previous = 5;
|
|
||||||
bool has_next = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
message DecimalValue
|
|
||||||
{
|
|
||||||
int64 units = 1;
|
|
||||||
sfixed32 nanos = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum TransactionTypeEnum
|
|
||||||
{
|
|
||||||
Real = 0;
|
|
||||||
Sandbox = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum CurrencyEnum
|
|
||||||
{
|
|
||||||
IRR = 0;
|
|
||||||
IRT = 1;
|
|
||||||
}
|
|
||||||
@@ -1,279 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package pyms_transaction;
|
|
||||||
|
|
||||||
import "pyms/pyms_public_messages.proto";
|
|
||||||
import "google/protobuf/empty.proto";
|
|
||||||
import "google/protobuf/wrappers.proto";
|
|
||||||
import "google/protobuf/duration.proto";
|
|
||||||
import "google/protobuf/timestamp.proto";
|
|
||||||
import "google/api/annotations.proto";
|
|
||||||
|
|
||||||
option csharp_namespace = "CMSMicroservice.Protobuf.Protos.PYMS.Transaction";
|
|
||||||
|
|
||||||
service TransactionContract
|
|
||||||
{
|
|
||||||
rpc CreateNewTransaction(CreateNewTransactionRequest) returns (CreateNewTransactionResponse){
|
|
||||||
option (google.api.http) = {
|
|
||||||
post: "/CreateNewTransaction"
|
|
||||||
body: "*"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
rpc UpdateTransaction(UpdateTransactionRequest) returns (google.protobuf.Empty){
|
|
||||||
option (google.api.http) = {
|
|
||||||
put: "/UpdateTransaction"
|
|
||||||
body: "*"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
rpc DeleteTransaction(DeleteTransactionRequest) returns (google.protobuf.Empty){
|
|
||||||
option (google.api.http) = {
|
|
||||||
delete: "/DeleteTransaction"
|
|
||||||
body: "*"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
rpc GetTransaction(GetTransactionRequest) returns (GetTransactionResponse){
|
|
||||||
option (google.api.http) = {
|
|
||||||
get: "/GetTransaction"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
rpc GetAllTransactionByFilter(GetAllTransactionByFilterRequest) returns (GetAllTransactionByFilterResponse){
|
|
||||||
option (google.api.http) = {
|
|
||||||
get: "/GetAllTransactionByFilter"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
rpc PaymentRequest(PaymentRequestRequest) returns (PaymentRequestResponse){
|
|
||||||
option (google.api.http) = {
|
|
||||||
post: "/PaymentRequest"
|
|
||||||
body: "*"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
rpc PaymentVerification(PaymentVerificationRequest) returns (PaymentVerificationResponse){
|
|
||||||
option (google.api.http) = {
|
|
||||||
post: "/PaymentVerification"
|
|
||||||
body: "*"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
message CreateNewTransactionRequest
|
|
||||||
{
|
|
||||||
string merchant_id = 1;
|
|
||||||
int64 amount = 2;
|
|
||||||
string callback_url = 3;
|
|
||||||
string description = 4;
|
|
||||||
google.protobuf.StringValue mobile = 5;
|
|
||||||
google.protobuf.StringValue email = 6;
|
|
||||||
google.protobuf.Int32Value request_status_code = 7;
|
|
||||||
google.protobuf.StringValue request_status_message = 8;
|
|
||||||
google.protobuf.StringValue authority = 9;
|
|
||||||
google.protobuf.StringValue fee_type = 10;
|
|
||||||
google.protobuf.Int64Value fee = 11;
|
|
||||||
oneof Currency_item
|
|
||||||
{
|
|
||||||
pyms_messages.CurrencyEnum currency = 12;
|
|
||||||
}
|
|
||||||
bool payment_status = 13;
|
|
||||||
google.protobuf.Int32Value verification_status_code = 14;
|
|
||||||
google.protobuf.StringValue verification_status_message = 15;
|
|
||||||
google.protobuf.StringValue card_hash = 16;
|
|
||||||
google.protobuf.StringValue card_pan = 17;
|
|
||||||
google.protobuf.StringValue ref_id = 18;
|
|
||||||
google.protobuf.StringValue order_id = 19;
|
|
||||||
oneof Type_item
|
|
||||||
{
|
|
||||||
pyms_messages.TransactionTypeEnum type = 20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message CreateNewTransactionResponse
|
|
||||||
{
|
|
||||||
int64 id = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message UpdateTransactionRequest
|
|
||||||
{
|
|
||||||
int64 id = 1;
|
|
||||||
string merchant_id = 2;
|
|
||||||
int64 amount = 3;
|
|
||||||
string callback_url = 4;
|
|
||||||
string description = 5;
|
|
||||||
google.protobuf.StringValue mobile = 6;
|
|
||||||
google.protobuf.StringValue email = 7;
|
|
||||||
google.protobuf.Int32Value request_status_code = 8;
|
|
||||||
google.protobuf.StringValue request_status_message = 9;
|
|
||||||
google.protobuf.StringValue authority = 10;
|
|
||||||
google.protobuf.StringValue fee_type = 11;
|
|
||||||
google.protobuf.Int64Value fee = 12;
|
|
||||||
oneof Currency_item
|
|
||||||
{
|
|
||||||
pyms_messages.CurrencyEnum currency = 13;
|
|
||||||
}
|
|
||||||
bool payment_status = 14;
|
|
||||||
google.protobuf.Int32Value verification_status_code = 15;
|
|
||||||
google.protobuf.StringValue verification_status_message = 16;
|
|
||||||
google.protobuf.StringValue card_hash = 17;
|
|
||||||
google.protobuf.StringValue card_pan = 18;
|
|
||||||
google.protobuf.StringValue ref_id = 19;
|
|
||||||
google.protobuf.StringValue order_id = 20;
|
|
||||||
oneof Type_item
|
|
||||||
{
|
|
||||||
pyms_messages.TransactionTypeEnum type = 21;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message DeleteTransactionRequest
|
|
||||||
{
|
|
||||||
int64 id = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message GetTransactionRequest
|
|
||||||
{
|
|
||||||
google.protobuf.Int64Value id = 1;
|
|
||||||
google.protobuf.StringValue authority = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message GetTransactionResponse
|
|
||||||
{
|
|
||||||
int64 id = 1;
|
|
||||||
string merchant_id = 2;
|
|
||||||
int64 amount = 3;
|
|
||||||
string callback_url = 4;
|
|
||||||
string description = 5;
|
|
||||||
google.protobuf.StringValue mobile = 6;
|
|
||||||
google.protobuf.StringValue email = 7;
|
|
||||||
google.protobuf.Int32Value request_status_code = 8;
|
|
||||||
google.protobuf.StringValue request_status_message = 9;
|
|
||||||
google.protobuf.StringValue authority = 10;
|
|
||||||
google.protobuf.StringValue fee_type = 11;
|
|
||||||
google.protobuf.Int64Value fee = 12;
|
|
||||||
oneof Currency_item
|
|
||||||
{
|
|
||||||
pyms_messages.CurrencyEnum currency = 13;
|
|
||||||
}
|
|
||||||
bool payment_status = 14;
|
|
||||||
google.protobuf.Int32Value verification_status_code = 15;
|
|
||||||
google.protobuf.StringValue verification_status_message = 16;
|
|
||||||
google.protobuf.StringValue card_hash = 17;
|
|
||||||
google.protobuf.StringValue card_pan = 18;
|
|
||||||
google.protobuf.StringValue ref_id = 19;
|
|
||||||
google.protobuf.StringValue order_id = 20;
|
|
||||||
oneof Type_item
|
|
||||||
{
|
|
||||||
pyms_messages.TransactionTypeEnum type = 21;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message GetAllTransactionByFilterRequest
|
|
||||||
{
|
|
||||||
pyms_messages.PaginationState pagination_state = 1;
|
|
||||||
google.protobuf.StringValue sort_by = 2;
|
|
||||||
GetAllTransactionByFilterFilter filter = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
message GetAllTransactionByFilterFilter
|
|
||||||
{
|
|
||||||
google.protobuf.Int64Value id = 1;
|
|
||||||
google.protobuf.StringValue merchant_id = 2;
|
|
||||||
google.protobuf.Int64Value amount = 3;
|
|
||||||
google.protobuf.StringValue callback_url = 4;
|
|
||||||
google.protobuf.StringValue description = 5;
|
|
||||||
google.protobuf.StringValue mobile = 6;
|
|
||||||
google.protobuf.StringValue email = 7;
|
|
||||||
google.protobuf.Int32Value request_status_code = 8;
|
|
||||||
google.protobuf.StringValue request_status_message = 9;
|
|
||||||
google.protobuf.StringValue authority = 10;
|
|
||||||
google.protobuf.StringValue fee_type = 11;
|
|
||||||
google.protobuf.Int64Value fee = 12;
|
|
||||||
oneof Currency_item
|
|
||||||
{
|
|
||||||
pyms_messages.CurrencyEnum currency = 13;
|
|
||||||
}
|
|
||||||
google.protobuf.BoolValue payment_status = 14;
|
|
||||||
google.protobuf.Int32Value verification_status_code = 15;
|
|
||||||
google.protobuf.StringValue verification_status_message = 16;
|
|
||||||
google.protobuf.StringValue card_hash = 17;
|
|
||||||
google.protobuf.StringValue card_pan = 18;
|
|
||||||
google.protobuf.StringValue ref_id = 19;
|
|
||||||
google.protobuf.StringValue order_id = 20;
|
|
||||||
oneof Type_item
|
|
||||||
{
|
|
||||||
pyms_messages.TransactionTypeEnum type = 21;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message GetAllTransactionByFilterResponse
|
|
||||||
{
|
|
||||||
pyms_messages.MetaData meta_data = 1;
|
|
||||||
repeated GetAllTransactionByFilterResponseModel models = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message GetAllTransactionByFilterResponseModel
|
|
||||||
{
|
|
||||||
int64 id = 1;
|
|
||||||
string merchant_id = 2;
|
|
||||||
int64 amount = 3;
|
|
||||||
string callback_url = 4;
|
|
||||||
string description = 5;
|
|
||||||
google.protobuf.StringValue mobile = 6;
|
|
||||||
google.protobuf.StringValue email = 7;
|
|
||||||
google.protobuf.Int32Value request_status_code = 8;
|
|
||||||
google.protobuf.StringValue request_status_message = 9;
|
|
||||||
google.protobuf.StringValue authority = 10;
|
|
||||||
google.protobuf.StringValue fee_type = 11;
|
|
||||||
google.protobuf.Int64Value fee = 12;
|
|
||||||
oneof Currency_item
|
|
||||||
{
|
|
||||||
pyms_messages.CurrencyEnum currency = 13;
|
|
||||||
}
|
|
||||||
bool payment_status = 14;
|
|
||||||
google.protobuf.Int32Value verification_status_code = 15;
|
|
||||||
google.protobuf.StringValue verification_status_message = 16;
|
|
||||||
google.protobuf.StringValue card_hash = 17;
|
|
||||||
google.protobuf.StringValue card_pan = 18;
|
|
||||||
google.protobuf.StringValue ref_id = 19;
|
|
||||||
google.protobuf.StringValue order_id = 20;
|
|
||||||
oneof Type_item
|
|
||||||
{
|
|
||||||
pyms_messages.TransactionTypeEnum type = 21;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message PaymentRequestRequest
|
|
||||||
{
|
|
||||||
google.protobuf.StringValue merchant_id = 1;
|
|
||||||
int64 amount = 2;
|
|
||||||
string callback_url = 3;
|
|
||||||
google.protobuf.StringValue description = 4;
|
|
||||||
google.protobuf.StringValue mobile = 5;
|
|
||||||
google.protobuf.StringValue email = 6;
|
|
||||||
oneof Currency_item
|
|
||||||
{
|
|
||||||
pyms_messages.CurrencyEnum currency = 7;
|
|
||||||
}
|
|
||||||
oneof Type_item
|
|
||||||
{
|
|
||||||
pyms_messages.TransactionTypeEnum type = 8;
|
|
||||||
}
|
|
||||||
google.protobuf.StringValue order_id = 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PaymentRequestResponse
|
|
||||||
{
|
|
||||||
string payment_g_w_url = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PaymentVerificationRequest
|
|
||||||
{
|
|
||||||
string authority = 1;
|
|
||||||
string status = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PaymentVerificationResponse
|
|
||||||
{
|
|
||||||
int64 id = 1;
|
|
||||||
bool payment_status = 2;
|
|
||||||
string message = 3;
|
|
||||||
google.protobuf.StringValue ref_id = 4;
|
|
||||||
google.protobuf.StringValue order_id = 5;
|
|
||||||
google.protobuf.Int32Value verification_status_code = 6;
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
{
|
{
|
||||||
"PaymentProvider": "pyms",
|
"PaymentProvider": "zarinpal",
|
||||||
"PYMS": {
|
|
||||||
"Address": "https://pyms.se.kbs1.ir"
|
|
||||||
},
|
|
||||||
"ZarinPal": {
|
"ZarinPal": {
|
||||||
"MerchantId": "00000000-0000-0000-0000-000000000000",
|
"MerchantId": "00000000-0000-0000-0000-000000000000",
|
||||||
"UseSandbox": true
|
"UseSandbox": true
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
{
|
{
|
||||||
"PaymentProvider": "pyms",
|
"PaymentProvider": "zarinpal",
|
||||||
"PYMS": {
|
|
||||||
"Address": "http://pyms-svc.default.svc.cluster.local:80"
|
|
||||||
},
|
|
||||||
"ZarinPal": {
|
"ZarinPal": {
|
||||||
"MerchantId": "6b098fc8-f490-47a1-aac3-1de1a1b84404",
|
"MerchantId": "6b098fc8-f490-47a1-aac3-1de1a1b84404",
|
||||||
"UseSandbox": true
|
"UseSandbox": true
|
||||||
|
|||||||
Reference in New Issue
Block a user