javascript - Redsys 问题(MVC .net 项目) - 不显示付款消息
问题描述
我在项目中的支付网关有问题。我的意图是从网络集成支付网关。用户按下支付按钮,我的应用程序收集所有数据并显示支付窗口。当用户按下按钮时,应用程序会使用AngularJS执行一个函数:
function CreaPago() {
$http({
method: 'POST',
url: './PagoTarjeta/CrearPago',
data: {
valores: $scope.listadoLineasDeclaracion
}
}).then(function (response) {
$scope.parametros = response.data;
}, function (response) {
$scope.parametros = response.data || 'Request failed';
}).finally(function () {
window.open($scope.parametros);
});
}
在服务器 (PagoTarjetaController.cs) 上,我收集支付所需的数据并以 html ( C# ) 格式转发到网络。
**[HttpPost]
public string CrearPago(List<DeclaracionLinea> valores)
{
if (valores == null || valores.Count == 0) return string.Empty;
string cadenaConexion = System.Configuration.ConfigurationManager.AppSettings["CadenaDeConexion"];
ControladoraGuardado ctrGuarda = new ControladoraGuardado();
HistoricoPagos hist = new HistoricoPagos();
hist.Correcto = false;
hist.FechaEnvio = DateTime.Now;
hist.Id_Usuario = SoporteConversion.AEntero(System.Web.HttpContext.Current.Session["userid"].ToString());
hist.Id_Declaracion = valores[0].Id_Declaracion;
hist.FechaRespuesta = new DateTime(1900, 1, 1);
hist.Respuesta = string.Empty;
foreach (DeclaracionLinea lin in valores)
{
if (!lin.Pagada)
hist.Importe += lin.Importe;
}
ctrGuarda.GuardaHistoricoPagos(cadenaConexion, hist);
return System.Configuration.ConfigurationManager.AppSettings["urlFinal"] + "/PagoTarjeta/PagoTarjeta?importe=" + hist.Importe + "&pedido=" + hist.Id + "&iddeclaracion=" + hist.Id_Declaracion;
}**
此时我们进入HTML页面:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="~/Scripts/Controllers/pagoTarjetaController.js"></script>
<div id="login col-12">
<div class="container col-xs-12" ng-controller='pagoTarjetaController'>
<div class="row text-center">
<img src="~/Content/images/genericas/cargando.gif" />
</div>
<div id="login-row" class="row justify-content-center align-items-center">
<div id="login-column" class="col-sm-6 col-md-offset-3 col-sm-offset-3">
<div class="login-box col-sm-12">
<form action="https://sis-t.redsys.es:25443/sis/realizarPago" method="post">
<!--<form action="https://sis.redsys.es/sis/realizarPago" method="post">-->
<input runat="server" type="hidden" id="Ds_SignatureVersion" name="Ds_SignatureVersion" value="@TempData["Ds_SignatureVersion"]" />
<input runat="server" size="100" type="hidden" id="Ds_MerchantParameters" name="Ds_MerchantParameters" value="@TempData["Ds_MerchantParameters"]" />
<input runat="server" type="hidden" size="50" id="Ds_Signature" name="Ds_Signature" value="@TempData["Ds_Signature"]" />
</form>
</div>
</div>
</div>
</div>
</div>
执行加载的 HTML 页面时,支付控制器 de JavaScript PagoTarjetaController.js 并执行 Cargar() 函数:
function Cargar() {
$http({
method: 'POST',
url: './PagoTarjeta/Cargar',
data: { importe: valores.importe, pedido: valores.pedido, iddeclaracion : valores.iddeclaracion }
}).then(function (response) {
$scope.status = response.status;
$scope.listado = response.data;
}, function (response) {
$scope.listado = response.data || 'Request failed';
$scope.status = response.status;
}).finally(function () {
setTimeout(document.forms[0].submit(), 2000);
});
}
有了这个,我们返回调用控制器“PagoTarjetaController.cs”(C#)的动作“Cargar”。
public void Cargar(string importe, string pedido, string iddeclaracion)
{
string version = "HMAC_SHA256_V1";
// New instance of RedysAPI
RedsysAPI r = new RedsysAPI();
//Parameters. This is an example. Use your own parameters
var fuc = System.Configuration.ConfigurationManager.AppSettings["TPVfuc"];
var terminal = System.Configuration.ConfigurationManager.AppSettings["TPVterminal"];
var currency = "978";
var trans = "0";
//This is the url of SOAP merchant service. This is an example use your own url
// In url is the path of InotificacionSIS.asmx
var url = "";
// OK url
var urlOK = System.Configuration.ConfigurationManager.AppSettings["urlFinal"] + "/PagoTarjeta/PagosOK?pedido=" + pedido.ToString() + "&iddeclaracion=" + iddeclaracion;
// KO url
var urlKO = System.Configuration.ConfigurationManager.AppSettings["urlFinal"] + "/PagoTarjeta/PagosKO?pedido=" + pedido.ToString() + "&iddeclaracion=" + iddeclaracion;
// Generate randomly with Customer's platform
var id = pedido;
// Amount
string amount = RevisarImporte(importe); // ;
// Main Key
var kc = System.Configuration.ConfigurationManager.AppSettings["TPVkc"];
// Fill Ds_MerchantParameters parameters
r.SetParameter("DS_MERCHANT_AMOUNT", amount);
r.SetParameter("DS_MERCHANT_ORDER", id);
r.SetParameter("DS_MERCHANT_MERCHANTCODE", fuc);
r.SetParameter("DS_MERCHANT_CURRENCY", currency);
r.SetParameter("DS_MERCHANT_TRANSACTIONTYPE", trans);
r.SetParameter("DS_MERCHANT_TERMINAL", terminal);
r.SetParameter("DS_MERCHANT_MERCHANTURL", url);
r.SetParameter("DS_MERCHANT_URLOK", urlOK);
r.SetParameter("DS_MERCHANT_URLKO", urlKO);
r.SetParameter("DS_MERCHANT_SUMTOTAL", amount);
// Calculate Ds_SignatureVersion
TempData["Ds_SignatureVersion"] = version;
// Calculate Ds_MerchantParameters
string parms = r.createMerchantParameters();
TempData["Ds_MerchantParameters"] = parms;
// Calculate Ds_Signature
string sig = r.createMerchantSignature(kc);
TempData["Ds_Signature"] = sig;
}
问题是最后显示的窗口如下:
我发现,如果我在 PagoTarjetaController.cs 中的“Cargar()”函数中等待一段时间,该应用程序在大约 90% 的情况下运行良好。
The example with time to wait is(c#):
public void Cargar(string importe, string pedido, string iddeclaracion)
{
System.Threading.Thread.Sleep(12000);
string version = "HMAC_SHA256_V1";
// New instance of RedysAPI
RedsysAPI r = new RedsysAPI();
//Parameters. This is an example. Use your own parameters
// PONER EN EL WEB.CONFIG
var fuc = System.Configuration.ConfigurationManager.AppSettings["TPVfuc"];
var terminal = System.Configuration.ConfigurationManager.AppSettings["TPVterminal"];
var currency = "978";
var trans = "0";
//This is the url of SOAP merchant service. This is an example use your own url
// In url is the path of InotificacionSIS.asmx
var url = "";
// OK url
var urlOK = System.Configuration.ConfigurationManager.AppSettings["urlFinal"] + "/PagoTarjeta/PagosOK?pedido=" + pedido.ToString() + "&iddeclaracion=" + iddeclaracion;
// KO url
var urlKO = System.Configuration.ConfigurationManager.AppSettings["urlFinal"] + "/PagoTarjeta/PagosKO?pedido=" + pedido.ToString() + "&iddeclaracion=" + iddeclaracion;
// Generate randomly with Customer's platform
var id = pedido;
// Amount
System.Threading.Thread.Sleep(2000);
string amount = RevisarImporte(importe); // importe + "00";
// Main Key
var kc = System.Configuration.ConfigurationManager.AppSettings["TPVkc"];
// Fill Ds_MerchantParameters parameters
r.SetParameter("DS_MERCHANT_AMOUNT", amount);
r.SetParameter("DS_MERCHANT_ORDER", id);
r.SetParameter("DS_MERCHANT_MERCHANTCODE", fuc);
r.SetParameter("DS_MERCHANT_CURRENCY", currency);
r.SetParameter("DS_MERCHANT_TRANSACTIONTYPE", trans);
r.SetParameter("DS_MERCHANT_TERMINAL", terminal);
r.SetParameter("DS_MERCHANT_MERCHANTURL", url);
r.SetParameter("DS_MERCHANT_URLOK", urlOK);
r.SetParameter("DS_MERCHANT_URLKO", urlKO);
r.SetParameter("DS_MERCHANT_SUMTOTAL", amount);
// Calculate Ds_SignatureVersion
TempData["Ds_SignatureVersion"] = version;
// Calculate Ds_MerchantParameters
string parms = r.createMerchantParameters();
TempData["Ds_MerchantParameters"] = parms;
// Calculate Ds_Signature
string sig = r.createMerchantSignature(kc);
TempData["Ds_Signature"] = sig;
}
我的问题是如何让应用程序在没有等待时间的情况下运行,以及为什么它不能 100% 运行..
解决方案
推荐阅读
- java - 如何在 java 中读取 json 文件,更新值并将其存储回同一个文件?
- angular - 如何解决 Angular 8 中的以下错误?
- awk - 按块名合并两个ini文件
- split - 尝试用 bigquery 中非空白行的值填充空白行
- swift - 如何使用 ARkit 在 GPS 坐标处放置 3D 对象
- .net-core - Automapper,如果提到 ConstructUsing,在现有对象上映射时不会触发 AfterMap
- java - 无需递归即可找到总和等于或小于给定数字的最大子集
- gcc - Apples gcc 可以与 GNUs gcc C/C++ 代码兼容吗?
- angular - 是否可以在 Angular 的新选项卡中打开 mat-dialog?
- vue.js - 如何在 NativeScript/Vue 中自定义 Pull-To-Refresh 指示器样式?