Skip to content

Commit ca6ea80

Browse files
committed
PayPal Plus: Refunding
1 parent 1954599 commit ca6ea80

5 files changed

Lines changed: 74 additions & 13 deletions

File tree

src/Plugins/SmartStore.PayPal/Filters/PayPalPlusWidgetZoneFilter.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
using System;
2+
using System.Web;
23
using System.Web.Mvc;
34
using SmartStore.Web.Framework.UI;
45

56
namespace SmartStore.PayPal.Filters
67
{
78
public class PayPalPlusWidgetZoneFilter : IActionFilter, IResultFilter
89
{
10+
private readonly Lazy<HttpContextBase> _httpContext;
911
private readonly Lazy<IWidgetProvider> _widgetProvider;
1012

11-
public PayPalPlusWidgetZoneFilter(Lazy<IWidgetProvider> widgetProvider)
13+
public PayPalPlusWidgetZoneFilter(
14+
Lazy<HttpContextBase> httpContext,
15+
Lazy<IWidgetProvider> widgetProvider)
1216
{
17+
_httpContext = httpContext;
1318
_widgetProvider = widgetProvider;
1419
}
1520

@@ -36,8 +41,13 @@ public void OnResultExecuting(ResultExecutingContext filterContext)
3641

3742
if (action.IsCaseInsensitiveEqual("Completed") && controller.IsCaseInsensitiveEqual("Checkout"))
3843
{
39-
_widgetProvider.Value.RegisterAction("checkout_completed_top", "CheckoutCompleted", "PayPalPlus", new { area = Plugin.SystemName });
40-
_widgetProvider.Value.RegisterAction("mobile_checkout_completed_top", "CheckoutCompleted", "PayPalPlus", new { area = Plugin.SystemName });
44+
var instruct = _httpContext.Value.Session[PayPalPlusProvider.CheckoutCompletedKey] as string;
45+
46+
if (instruct.HasValue())
47+
{
48+
_widgetProvider.Value.RegisterAction("checkout_completed_top", "CheckoutCompleted", "PayPalPlus", new { area = Plugin.SystemName });
49+
_widgetProvider.Value.RegisterAction("mobile_checkout_completed_top", "CheckoutCompleted", "PayPalPlus", new { area = Plugin.SystemName });
50+
}
4151
}
4252
}
4353

src/Plugins/SmartStore.PayPal/Providers/PayPalPlusProvider.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,11 @@ namespace SmartStore.PayPal
1515
public partial class PayPalPlusProvider : PayPalRestApiProviderBase<PayPalPlusPaymentSettings>
1616
{
1717
private readonly HttpContextBase _httpContext;
18-
private readonly IPayPalService _payPalService;
1918

2019
public PayPalPlusProvider(
21-
HttpContextBase httpContext,
22-
IPayPalService payPalService)
20+
HttpContextBase httpContext)
2321
{
2422
_httpContext = httpContext;
25-
_payPalService = payPalService;
2623
}
2724

2825
public static string SystemName
@@ -62,7 +59,7 @@ public override ProcessPaymentResult ProcessPayment(ProcessPaymentRequest proces
6259

6360
processPaymentRequest.OrderGuid = session.OrderGuid;
6461

65-
var apiResult = _payPalService.ExecutePayment(settings, session);
62+
var apiResult = PayPalService.ExecutePayment(settings, session);
6663

6764
if (apiResult.Success && apiResult.Json != null)
6865
{
@@ -99,7 +96,7 @@ public override ProcessPaymentResult ProcessPayment(ProcessPaymentRequest proces
9996
}
10097
}
10198

102-
session.PaymentInstruction = _payPalService.ParsePaymentInstruction(apiResult.Json.payment_instruction) as PayPalPaymentInstruction;
99+
session.PaymentInstruction = PayPalService.ParsePaymentInstruction(apiResult.Json.payment_instruction) as PayPalPaymentInstruction;
103100
}
104101
}
105102
else
@@ -122,7 +119,7 @@ public override void PostProcessPayment(PostProcessPaymentRequest postProcessPay
122119
if (postProcessPaymentRequest.Order.PaymentStatus == PaymentStatus.Paid)
123120
return;
124121

125-
var instruction = _payPalService.CreatePaymentInstruction(_httpContext.GetPayPalSessionData().PaymentInstruction);
122+
var instruction = PayPalService.CreatePaymentInstruction(_httpContext.GetPayPalSessionData().PaymentInstruction);
126123

127124
if (instruction.HasValue())
128125
{

src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
using System.Web.Routing;
44
using SmartStore.Core.Configuration;
55
using SmartStore.Core.Domain.Orders;
6+
using SmartStore.Core.Domain.Payments;
67
using SmartStore.Core.Logging;
78
using SmartStore.Core.Plugins;
9+
using SmartStore.PayPal.Services;
810
using SmartStore.PayPal.Settings;
911
using SmartStore.Services;
1012
using SmartStore.Services.Orders;
@@ -23,6 +25,7 @@ protected PayPalRestApiProviderBase()
2325
public ICommonServices Services { get; set; }
2426
public IOrderService OrderService { get; set; }
2527
public IOrderTotalCalculationService OrderTotalCalculationService { get; set; }
28+
public IPayPalService PayPalService { get; set; }
2629

2730
protected string GetControllerName()
2831
{
@@ -89,10 +92,29 @@ public override RefundPaymentResult Refund(RefundPaymentRequest request)
8992
};
9093

9194
var settings = Services.Settings.LoadSetting<TSetting>(request.Order.StoreId);
95+
var session = new PayPalSessionData();
9296

93-
var transactionId = request.Order.CaptureTransactionId;
94-
95-
// TODO
97+
var apiResult = PayPalService.EnsureAccessToken(session, settings);
98+
if (result.Success)
99+
{
100+
apiResult = PayPalService.Refund(settings, session, request);
101+
102+
if (apiResult.Success && apiResult.Json != null)
103+
{
104+
if (request.IsPartialRefund)
105+
result.NewPaymentStatus = PaymentStatus.PartiallyRefunded;
106+
else
107+
result.NewPaymentStatus = PaymentStatus.Refunded;
108+
}
109+
else
110+
{
111+
result.Errors.Add(apiResult.ErrorMessage);
112+
}
113+
}
114+
else
115+
{
116+
result.Errors.Add(apiResult.ErrorMessage);
117+
}
96118

97119
return result;
98120
}

src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using SmartStore.Core.Domain.Orders;
44
using SmartStore.Core.Domain.Stores;
55
using SmartStore.PayPal.Settings;
6+
using SmartStore.Services.Payments;
67

78
namespace SmartStore.PayPal.Services
89
{
@@ -33,5 +34,7 @@ PayPalResponse CreatePayment(
3334
string cancelUrl);
3435

3536
PayPalResponse ExecutePayment(PayPalApiSettingsBase settings, PayPalSessionData session);
37+
38+
PayPalResponse Refund(PayPalApiSettingsBase settings, PayPalSessionData session, RefundPaymentRequest request);
3639
}
3740
}

src/Plugins/SmartStore.PayPal/Services/PayPalService.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,35 @@ public PayPalResponse ExecutePayment(PayPalApiSettingsBase settings, PayPalSessi
715715

716716
return result;
717717
}
718+
719+
public PayPalResponse Refund(PayPalApiSettingsBase settings, PayPalSessionData session, RefundPaymentRequest request)
720+
{
721+
var data = new Dictionary<string, object>();
722+
var saleId = request.Order.CaptureTransactionId;
723+
724+
if (request.IsPartialRefund)
725+
{
726+
var store = _services.StoreService.GetStoreById(request.Order.StoreId);
727+
728+
var amount = new Dictionary<string, object>();
729+
amount.Add("total", Math.Round(request.AmountToRefund, 2));
730+
amount.Add("currency", store.PrimaryStoreCurrency.CurrencyCode);
731+
732+
data.Add("amount", amount);
733+
}
734+
735+
var result = CallApi("POST", "/v1/payments/sale/{0}/refund".FormatInvariant(saleId), session.AccessToken, settings,
736+
data.Any() ? JsonConvert.SerializeObject(data) : null);
737+
738+
if (result.Success && result.Json != null)
739+
{
740+
result.Id = (string)result.Json.id;
741+
742+
//Logger.InsertLog(LogLevel.Information, "PayPal Refund", JsonConvert.SerializeObject(data, Formatting.Indented) + "\r\n\r\n" + result.Json.ToString());
743+
}
744+
745+
return result;
746+
}
718747
}
719748

720749

0 commit comments

Comments
 (0)