Skip to content

Commit 47cac40

Browse files
committed
Initial commit: consumer/payment services, workflow draft
1 parent 33e15b8 commit 47cac40

15 files changed

+619
-1
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System.Collections.Specialized;
2+
3+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay.Configuration
4+
{
5+
public class PaymentProviderSettings
6+
{
7+
public PaymentProviderSettings()
8+
{
9+
10+
}
11+
12+
public PaymentProviderSettings(NameValueCollection appSettings)
13+
{
14+
GatewayBaseUrl = appSettings[Constants.Configuration.GatewayBaseUrlKey];
15+
16+
WpfUrl = appSettings[Constants.Configuration.WpfUrlKey];
17+
18+
Username = appSettings[Constants.Configuration.UsernameKey];
19+
20+
Password = appSettings[Constants.Configuration.PasswordKey];
21+
}
22+
23+
public string GatewayBaseUrl { get; set; }
24+
25+
public string WpfUrl { get; set; }
26+
27+
public string Username { get; set; }
28+
29+
public string Password { get; set; }
30+
}
31+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+

2+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay
3+
{
4+
public class Constants
5+
{
6+
public const string WorkflowId = "b2731255-2e48-4345-9ae5-aaf5b8bfb10a";
7+
8+
public static class Configuration
9+
{
10+
public const string Settings = "Umbraco:Forms:Integrations:Commerce:eMerchantPay:Settings";
11+
12+
public const string GatewayBaseUrlKey = "Umbraco.Forms.Integrations.Commerce.eMerchantPay.GatewayBaseurl";
13+
14+
public const string WpfUrlKey = "Umbraco.Forms.Integrations.Commerce.eMerchantPay.WpfUrl";
15+
16+
public const string UsernameKey = "Umbraco.Forms.Integrations.Commerce.eMerchantPay.Username";
17+
18+
public const string PasswordKey = "Umbraco.Forms.Integrations.Commerce.eMerchantPay.Password";
19+
}
20+
21+
public static class ErrorCode
22+
{
23+
public const string ConsumerExists = "701";
24+
}
25+
26+
public static class RootNode
27+
{
28+
public const string CreateConsumerRequest = "create_consumer_request";
29+
30+
public const string CreateConsumerResponse = "create_consumer_response";
31+
32+
public const string RetrieveConsumerRequest = "retrieve_consumer_request";
33+
34+
public const string RetrieveConsumerResponse = "retrieve_consumer_response";
35+
36+
public const string WpfPayment = "wpf_payment";
37+
}
38+
}
39+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System.Xml.Serialization;
2+
3+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay.Models.Dtos
4+
{
5+
public class AddressDto
6+
{
7+
[XmlElement("first_name")]
8+
public string FirstName { get; set; }
9+
10+
[XmlElement("last_name")]
11+
public string LastName { get; set; }
12+
13+
[XmlElement("address1")]
14+
public string Address1 { get; set; }
15+
16+
[XmlElement("address2")]
17+
public string Address2 { get; set; }
18+
19+
[XmlElement("zip_code")]
20+
public string ZipCode { get; set; }
21+
22+
[XmlElement("city")]
23+
public string City { get; set; }
24+
25+
[XmlElement("state")]
26+
public string State { get; set; }
27+
28+
[XmlElement("country")]
29+
public string Country { get; set; }
30+
}
31+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System.Xml.Serialization;
2+
3+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay.Models.Dtos
4+
{
5+
public class BusinessAttribute
6+
{
7+
/// <summary>
8+
/// date format: dd-mm-yyyy
9+
/// </summary>
10+
[XmlElement("event_start_date")]
11+
public string EventStartDate { get; set; }
12+
13+
[XmlElement("event_end_date")]
14+
public string EventEndDate { get; set; }
15+
16+
[XmlElement("event_organizer_id")]
17+
public string EventOrganizerId { get; set; }
18+
19+
[XmlElement("event_id")]
20+
public string EventId { get; set; }
21+
22+
[XmlElement("date_of_order")]
23+
public string DateOfOrder { get; set; }
24+
25+
[XmlElement("delivery_date")]
26+
public string DeliveryDate { get; set; }
27+
28+
[XmlElement("name_of_the_supplier")]
29+
public string NameOfTheSupplier { get; set; }
30+
}
31+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Xml.Serialization;
2+
3+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay.Models.Dtos
4+
{
5+
public class ConsumerDto : ResponseDto
6+
{
7+
[XmlElement("consumer_id")]
8+
public string Id { get; set; }
9+
10+
[XmlElement("email")]
11+
public string Email { get; set; }
12+
}
13+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using System.Collections.Generic;
2+
using System.Xml.Serialization;
3+
4+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay.Models.Dtos
5+
{
6+
public class PaymentDto : ResponseDto
7+
{
8+
[XmlElement("transaction_id")]
9+
public string TransactionId { get; set; }
10+
11+
[XmlElement("usage")]
12+
public string Usage { get; set; }
13+
14+
[XmlElement("amount")]
15+
public int Amount { get; set; }
16+
17+
[XmlElement("currency")]
18+
public string Currency { get; set; }
19+
20+
[XmlElement("consumer_id")]
21+
public string ConsumerId { get; set; }
22+
23+
[XmlElement("customer_email")]
24+
public string CustomerEmail { get; set; }
25+
26+
[XmlElement("customer_phone")]
27+
public string CustomerPhone { get; set; }
28+
29+
[XmlElement("billing_address")]
30+
public AddressDto BillingAddress { get; set; }
31+
32+
[XmlElement("transaction_types")]
33+
public TransactionTypeDto TransactionTypes { get; set; }
34+
35+
[XmlElement("business_attributes")]
36+
public BusinessAttribute BusinessAttribute { get; set; }
37+
38+
[XmlElement("notification_url")]
39+
public string NotificationUrl { get; set; }
40+
41+
[XmlElement("return_success_url")]
42+
public string ReturnSuccessUrl { get; set; }
43+
44+
[XmlElement("return_failure_url")]
45+
public string ReturnFailureUrl { get; set; }
46+
47+
[XmlElement("return_cancel_url")]
48+
public string ReturnCancelUrl { get; set; }
49+
}
50+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Xml.Serialization;
2+
3+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay.Models.Dtos
4+
{
5+
public abstract class ResponseDto
6+
{
7+
[XmlElement("status")]
8+
public string Status { get; set; }
9+
10+
[XmlElement("code")]
11+
public string Code { get; set; }
12+
13+
[XmlElement("message")]
14+
public string Message { get; set; }
15+
16+
[XmlElement("technical_message")]
17+
public string TechnicalMessage { get; set; }
18+
19+
}
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Collections.Generic;
2+
using System.Xml.Serialization;
3+
4+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay.Models.Dtos
5+
{
6+
public class TransactionTypeDto
7+
{
8+
[XmlElement("transaction_type")]
9+
public List<TransactionTypeRecordDto> TransactionTypes { get; set; }
10+
}
11+
12+
public class TransactionTypeRecordDto
13+
{
14+
[XmlAttribute("name")]
15+
public string TransactionType { get; set; }
16+
}
17+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#if NETCOREAPP
2+
using Microsoft.Extensions.DependencyInjection;
3+
4+
using Umbraco.Cms.Core.Composing;
5+
using Umbraco.Cms.Core.DependencyInjection;
6+
using Umbraco.Forms.Integrations.Commerce.EMerchantPay.Configuration;
7+
using Umbraco.Forms.Integrations.Commerce.EMerchantPay.Services;
8+
#else
9+
using Umbraco.Core;
10+
using Umbraco.Core.Composing;
11+
using Umbraco.Forms.Integrations.Commerce.EMerchantPay.Services;
12+
#endif
13+
14+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay
15+
{
16+
public class PaymentProviderComposer : IComposer
17+
{
18+
#if NETCOREAPP
19+
public void Compose(IUmbracoBuilder builder)
20+
{
21+
var options = builder.Services
22+
.AddOptions<PaymentProviderSettings>()
23+
.Bind(builder.Config.GetSection(Constants.Configuration.Settings));
24+
25+
builder.Services.AddSingleton<ConsumerService>();
26+
27+
builder.Services.AddSingleton<PaymentService>();
28+
}
29+
#else
30+
public void Compose(Composition composition)
31+
{
32+
composition.Register<ConsumerService>(Lifetime.Singleton);
33+
34+
composition.Register<PaymentService>(Lifetime.Singleton);
35+
}
36+
#endif
37+
}
38+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
using Umbraco.Forms.Core;
5+
using Umbraco.Forms.Core.Enums;
6+
using Umbraco.Forms.Integrations.Commerce.EMerchantPay.Models.Dtos;
7+
using Umbraco.Forms.Integrations.Commerce.EMerchantPay.Services;
8+
9+
#if NETCOREAPP
10+
#else
11+
using System.Threading.Tasks;
12+
using Umbraco.Forms.Core.Persistence.Dtos;
13+
#endif
14+
15+
namespace Umbraco.Forms.Integrations.Commerce.EMerchantPay
16+
{
17+
public class PaymentProviderWorkflow : WorkflowType
18+
{
19+
private readonly ConsumerService _consumerService;
20+
21+
private readonly PaymentService _paymentService;
22+
23+
public PaymentProviderWorkflow(ConsumerService consumerService, PaymentService paymentService)
24+
{
25+
Id = new Guid(Constants.WorkflowId);
26+
Name = "eMerchantPay Gateway";
27+
Description = "eMerchantPay provider handling form-based payments.";
28+
Icon = "icon-multiple-credit-cards";
29+
30+
_consumerService = consumerService;
31+
32+
_paymentService = paymentService;
33+
}
34+
35+
#if NETCOREAPP
36+
public override WorkflowExecutionStatus Execute(WorkflowExecutionContext context)
37+
{
38+
return WorkflowExecutionStatus.Completed;
39+
}
40+
#else
41+
public override WorkflowExecutionStatus Execute(Record record, RecordEventArgs e)
42+
{
43+
var consumer = new ConsumerDto {Email = "[email protected]"};
44+
45+
// step 1. Create Consumer
46+
var createConsumerTask = Task.Run(async () => await _consumerService.Create(consumer));
47+
48+
var result = createConsumerTask.Result;
49+
if (result.Code == Constants.ErrorCode.ConsumerExists)
50+
{
51+
// step 1.1. Get Consumer
52+
var retrieveConsumerTask = Task.Run(async () => await _consumerService.Retrieve(consumer));
53+
consumer = retrieveConsumerTask.Result;
54+
}
55+
56+
57+
// step 2. Create Payment
58+
var transactionId = Guid.NewGuid();
59+
60+
var payment = new PaymentDto
61+
{
62+
TransactionId = transactionId.ToString(),
63+
Usage = "Umbraco Forms Test",
64+
NotificationUrl = "https://www.example.com/notification",
65+
ReturnSuccessUrl = "https://www.example.com/success",
66+
ReturnFailureUrl = "https://www.example.com/failure",
67+
ReturnCancelUrl = "https://www.example.com/cancel",
68+
Amount = 100,
69+
Currency = "EUR",
70+
ConsumerId = consumer.Id,
71+
CustomerEmail = consumer.Email,
72+
CustomerPhone = "+1987987987987",
73+
BillingAddress = new AddressDto
74+
{
75+
FirstName = "Adrian",
76+
LastName = "Cojocariu",
77+
Address1 = "TEST1",
78+
Address2 = "TEST2",
79+
ZipCode = "10178",
80+
City = "Los Angeles",
81+
State = "CA",
82+
Country = "US"
83+
},
84+
BusinessAttribute = new BusinessAttribute { NameOfTheSupplier = "Umbraco" },
85+
TransactionTypes = new TransactionTypeDto
86+
{
87+
TransactionTypes = new List<TransactionTypeRecordDto>
88+
{
89+
new TransactionTypeRecordDto { TransactionType = "authorize" },
90+
new TransactionTypeRecordDto { TransactionType = "sale" }
91+
}
92+
}
93+
};
94+
95+
96+
var createPaymentTask = Task.Run(async () => await _paymentService.Create(payment));
97+
98+
var createPaymentResult = createPaymentTask.Result;
99+
100+
return WorkflowExecutionStatus.Completed;
101+
}
102+
#endif
103+
104+
public override List<Exception> ValidateSettings()
105+
{
106+
return new List<Exception>();
107+
}
108+
}
109+
}

0 commit comments

Comments
 (0)