/// <summary>
        /// <para>
        ///     Осуществляет рекуррентный (повторный) платеж — безакцептное списание денежных средств со счета банковской карты
        ///     Покупателя. Для возможности его использования Покупатель должен совершить хотя бы один платеж в пользу
        ///     Продавца, который должен быть указан как рекуррентный (см. параметр recurrent в методе <see cref="Init" />),
        ///     фактически являющийся первичным.
        /// </para>
        /// <list type="number">
        ///     <listheader>
        ///         <description>
        ///             Другими словами, для использования рекуррентных платежей необходима следующая
        ///             последовательность действий:
        ///         </description>
        ///     </listheader>
        ///     <item>
        ///         <description>
        ///             Совершить родительский платеж путем вызова <see cref="Init" /> с указанием дополнительного параметра
        ///             Recurrent=Y.
        ///         </description>
        ///     </item>
        ///     <item>
        ///         <description>
        ///             2. Получить RebillId, предварительно вызвав метод <see cref="GetCardList" />
        ///         </description>
        ///     </item>
        ///     <item>
        ///         <description>
        ///             3. Спустя некоторое время для совершения рекуррентного платежа необходимо вызвать метод
        ///             <see cref="Init" /> со стандартным набором параметров (параметр Recurrent здесь не нужен).
        ///         </description>
        ///     </item>
        ///     <item>
        ///         <description>
        ///             4. Получить в ответ на <see cref="Init" /> параметр PaymentId.
        ///         </description>
        ///     </item>
        ///     <item>
        ///         <description>
        ///             5. Вызвать метод <see cref="Charge" /> с параметром <paramref name="rebillId" /> полученным в п.2 и
        ///             параметром <paramref name="paymentId" /> полученным в п.4.
        ///         </description>
        ///     </item>
        /// </list>
        /// </summary>
        /// <param name="paymentId">Уникальный идентификатор транзакции в системе Банка.</param>
        /// <param name="rebillId">Идентификатор рекуррентного платежа. См. метод <see cref="GetCardList" />.</param>
        /// <returns>Информация о платеже.</returns>
        public async Task <PaymentInfo> Charge(string paymentId, string rebillId)
        {
            var request = new ChargeRequestBuilder(password, terminalKey, journal)
                          .SetPaymentId(paymentId)
                          .SetRebillId(rebillId)
                          .Build();

            try
            {
                var response = await GetApi(request.Operation).Charge(request);

                if (response.Success)
                {
                    return(new PaymentInfo
                    {
                        OrderId = response.OrderId,
                        PaymentId = response.PaymentId,
                        Status = response.Status
                    });
                }
                throw new AcquiringApiException(response);
            }
            catch (AcquiringApiException ex)
            {
                journal.Log(ex);
                throw;
            }
            catch (Exception ex)
            {
                journal.Log(ex);
                throw new AcquiringSdkException(ex.Message);
            }
        }
Beispiel #2
0
        public async Task ChargeCustomerFromChargeFlowTest()
        {
            try
            {
                var createTokenRequest = _tokenRequestBuilder.Build();
                var token = await _gateway.CreateToken(createTokenRequest);

                token = await _gateway.RetrieveToken(token.Id);

                var chargeRequest = _chargeRequestBuilder.WithCard(_cardRequestBuilder.WithId(token.Id)).Build();
                var charge        = await _gateway.CreateCharge(chargeRequest);

                var customerRequest = _customerRequestBuilder.WithCard(_cardRequestBuilder.WithId(charge.Id)).Build();
                var customer        = await _gateway.CreateCustomer(customerRequest);

                var chargeRequest2 = new ChargeRequestBuilder().WithCustomerId(customer.Id).Build();
                charge = await _gateway.CreateCharge(chargeRequest2);

                Assert.AreEqual(chargeRequest2.Amount, charge.Amount);
                Assert.AreEqual(customer.Id, charge.CustomerId);
            }
            catch (SecurionPayException exc)
            {
                HandleApiException(exc);
            }
        }