public async Task SchedulePaymentsAsync_requests_proper_api() { // arrange var aRequest = new SchedulePaymentsRequest { CustomerId = Guid.NewGuid().ToString(), Schedules = new PaymentSchedule[] { new PaymentSchedule { Amount = 1024, ScheduleAt = DateTime.UtcNow.AddDays(30), TransactionId = Guid.NewGuid().ToString(), }, new PaymentSchedule { Amount = 1024, ScheduleAt = DateTime.UtcNow.AddDays(60), TransactionId = Guid.NewGuid().ToString(), }, } }; var expectedResult = new IamportResponse <ScheduledPayment[]> { HttpStatusCode = HttpStatusCode.OK, Content = new ScheduledPayment[] { new ScheduledPayment { TransactionId = aRequest.Schedules[0].TransactionId, Amount = aRequest.Schedules[0].Amount, ScheduleAt = aRequest.Schedules[0].ScheduleAt, }, new ScheduledPayment { TransactionId = aRequest.Schedules[1].TransactionId, Amount = aRequest.Schedules[1].Amount, ScheduleAt = aRequest.Schedules[1].ScheduleAt, }, } }; var client = GetMockClient(aRequest, expectedResult); var sut = new SubscribeApi(client); // act var result = await sut.SchedulePaymentsAsync(aRequest); // assert Mock.Get(client) .Verify(mocked => mocked.RequestAsync <SchedulePaymentsRequest, ScheduledPayment[]>( It.Is <IamportRequest <SchedulePaymentsRequest> >(req => req.Method == HttpMethod.Post && req.Content == aRequest && req.ApiPathAndQueryString.EndsWith($"subscribe/payments/schedule")))); }
/// <summary> /// [POST] /subscribe/payments/schedule /// iamport: 비인증 결제요청을 미리 예약해두면 아임포트가 자동으로 해당 시간에 맞춰 결제를 진행하는 방식입니다.(/subscribe/payments/again 를 아임포트가 대신 수행하는 개념) /// 결제가 이뤄지고나면 Notification URL로 결제성공/실패 결과를 POST request로 보내드립니다. /// /// 1. 기존에 빌링키가 등록된 customeruid가 존재하는 경우 해당 customer_uid와 해당되는 빌링키로 schedule정보가 예약됩니다.(카드정보 선택사항) /// 2. 등록된 customer_uid가 없는 경우 빌링키 신규 발급을 먼저 진행한 후 schedule정보를 예약합니다.(카드정보 필수사항) /// /// 예약건 별로 고유의 merchant_uid를 전달해주셔야 합니다. /// /// schedules의 상세정보(선택정보) buyer_name, buyer_email, buyer_tel, buyer_addr, buyer_postcode는 누락되는 경우에 한해, /// customer_uid에 해당되는 customer_name, customer_email, customer_tel, customer_addr, customer_postcode 정보로 대체됩니다. /// (buyer 정보는 customer_정보에 우선합니다) /// </summary> /// <param name="request">스케줄 등록 정보</param> /// <returns>등록된 스케줄의 목록</returns> public async Task <ScheduledPayment[]> SchedulePaymentsAsync(SchedulePaymentsRequest request) { if (request == null) { throw new ArgumentNullException(nameof(request)); } ValidateObject(request); var iamportRequest = new IamportRequest <SchedulePaymentsRequest> { ApiPathAndQueryString = GetPaymentsPathAndQuerystring("schedule"), Content = request, Method = HttpMethod.Post }; return(await SendRequestAsync <SchedulePaymentsRequest, ScheduledPayment[]>(iamportRequest)); }