private async Task <ClientSignedResponse> SignWrapper <T>(ServerSignedRequest <T> request, Func <T, Task <ClientResponse> > func) where T : IClientCallback { ServerResponse <T> sins = new ServerResponse <T>(); try { PaymentGatewayClient cl = PaymentGatewayClientFactory.GetClient(request.Object.Object.Client); if (cl == null) { throw new ResultCodeException(ResultCodes.ClientServerError, ("en", $"Unable to locate PaymentGatewayClient for client '{request.Object.Object.Client}'."), ("es", $"No puedo encontrar una clase que defina a PaymentGatewayClient con el client '{request.Object.Object.Client}'.")); } using (var scope = new FlowingOperationContextScope(cl.InnerChannel)) { sins = await cl.UnwrapRequest(request).ContinueOnScope(scope); } if (sins.ResultCode != ResultCodes.Ok) { return(GenerateError(sins, request.Object.Object.Client)); } if (CallbackImplementation == null) { throw new ResultCodeException(ResultCodes.ClientServerError, ("en", "Callback message lost.There is no ICallback implementation"), ("es", "Mensaje del callback pedido. No hay implementacion de ICallback")); } ClientResponse cr = await func(sins.Response); cr.Client = request.Object.Object.Client; return(CertificateHelperFactory.Instance.SignClient <ClientSignedResponse, ClientResponse>(cr.Client, cr)); } catch (Exception e) { sins.PopulateFromException(e, Logger); return(GenerateError(sins, request.Object.Object.Client)); } }
internal async Task <ServerResponse <T> > UnwrapRequest <T>(ServerSignedRequest <T> resp) { ServerResponse <T> response = new ServerResponse <T>(); try { SignatureHelper c = await GetSignatureHelper(resp.Object.Fingerprint, response); T obj = c.Verify <ServerSignedRequest <T>, T>(resp); return(new ServerResponse <T> { ResultCode = ResultCodes.Ok, Response = obj }); } catch (Exception e) { response.PopulateFromException(e, Logger); return(response); } }
public async Task <ClientSignedResponse> Payment(ServerSignedRequest <TransactionCallback> transaction) { return(await SignWrapper(transaction, t => CallbackImplementation.Payment(t))); }
public async Task <ClientSignedResponse> Instrument(ServerSignedRequest <IntrumentCallback> instrument) { return(await SignWrapper(instrument, i => CallbackImplementation.Instrument(i))); }