making pay, & refactoring
parent
d590df1c92
commit
5bbe8bdfbd
@ -0,0 +1,104 @@
|
|||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNet.Mvc;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.OptionsModel;
|
||||||
|
using PayPal.Api;
|
||||||
|
using Yavsc.Helpers;
|
||||||
|
using Yavsc.Models;
|
||||||
|
|
||||||
|
namespace Yavsc.ApiControllers
|
||||||
|
{
|
||||||
|
[Route("api/payment")]
|
||||||
|
public class PaymentApiController : Controller
|
||||||
|
{
|
||||||
|
private ApplicationDbContext dbContext;
|
||||||
|
PayPalSettings paymentSettings;
|
||||||
|
private SiteSettings siteSettings;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
public PaymentApiController(
|
||||||
|
ApplicationDbContext dbContext,
|
||||||
|
IOptions<PayPalSettings> paypalSettingsReceiver,
|
||||||
|
IOptions<SiteSettings> siteSettingsReceiver,
|
||||||
|
ILoggerFactory loggerFactory)
|
||||||
|
{
|
||||||
|
this.dbContext = dbContext;
|
||||||
|
paymentSettings = paypalSettingsReceiver.Value;
|
||||||
|
siteSettings = siteSettingsReceiver.Value;
|
||||||
|
_logger = loggerFactory.CreateLogger<PaymentApiController>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[HttpPost("execute")]
|
||||||
|
public async Task<IActionResult> Execute(string paymentId, string payerId)
|
||||||
|
{
|
||||||
|
Payment result=null;
|
||||||
|
await Task.Run( () => {
|
||||||
|
var apiContext = paymentSettings.CreateAPIContext();
|
||||||
|
var payment = Payment.Get(apiContext,paymentId);
|
||||||
|
var execution = new PaymentExecution();
|
||||||
|
execution.payer_id = payerId;
|
||||||
|
execution.transactions = payment.transactions;
|
||||||
|
result = payment.Execute(apiContext,execution);
|
||||||
|
});
|
||||||
|
return Ok(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost("create")]
|
||||||
|
public async Task<IActionResult> Create()
|
||||||
|
{
|
||||||
|
var apiContext = paymentSettings.CreateAPIContext();
|
||||||
|
var payment = Payment.Create(apiContext,
|
||||||
|
new Payment
|
||||||
|
{
|
||||||
|
intent = "authorize", // "sale", "order", "authorize"
|
||||||
|
payer = new Payer
|
||||||
|
{
|
||||||
|
payment_method = "paypal"
|
||||||
|
},
|
||||||
|
transactions = new List<Transaction>
|
||||||
|
{
|
||||||
|
new Transaction
|
||||||
|
{
|
||||||
|
description = "Transaction description.",
|
||||||
|
invoice_number = "001",
|
||||||
|
amount = new Amount
|
||||||
|
{
|
||||||
|
currency = "EUR",
|
||||||
|
total = "0.11",
|
||||||
|
details = new Details
|
||||||
|
{
|
||||||
|
tax = "0.01",
|
||||||
|
shipping = "0.02",
|
||||||
|
subtotal = "0.08"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
item_list = new ItemList
|
||||||
|
{
|
||||||
|
items = new List<Item>
|
||||||
|
{
|
||||||
|
new Item
|
||||||
|
{
|
||||||
|
name = "nah",
|
||||||
|
currency = "EUR",
|
||||||
|
price = "0.02",
|
||||||
|
quantity = "4",
|
||||||
|
sku = "sku"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
redirect_urls = new RedirectUrls
|
||||||
|
{
|
||||||
|
return_url = siteSettings.Audience+ "/Manage/Credit/Return",
|
||||||
|
cancel_url = siteSettings.Audience+ "/Manage/Credit/Cancel"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return Json(payment);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,97 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using PayPal.Api;
|
||||||
|
using Yavsc.Models.Billing;
|
||||||
|
using Yavsc.Models.Haircut;
|
||||||
|
|
||||||
|
namespace Yavsc.Helpers
|
||||||
|
{
|
||||||
|
public static class PayPalHelpers
|
||||||
|
{
|
||||||
|
public static APIContext CreateAPIContext(this PayPalSettings settings)
|
||||||
|
{
|
||||||
|
Dictionary<string,string> config = new Dictionary<string,string>();
|
||||||
|
config.Add("mode",settings.Mode);
|
||||||
|
config.Add("clientId",settings.ClientId);
|
||||||
|
config.Add("clientSecret",settings.Secret);
|
||||||
|
var accessToken = new OAuthTokenCredential(config).GetAccessToken();
|
||||||
|
var apiContext = new APIContext(accessToken);
|
||||||
|
return apiContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Payment CreatePaiement(this APIContext apiContext, NominativeServiceCommand query, string intent = "sale")
|
||||||
|
{
|
||||||
|
var queryType = query.GetType().Name;
|
||||||
|
var transaction = new Transaction
|
||||||
|
{
|
||||||
|
description = query.Description+"\nVotre commande du "+query.DateCreated.ToLongDateString(),
|
||||||
|
invoice_number = $"{query.ActivityCode}/{queryType}/{query.Id}"
|
||||||
|
};
|
||||||
|
transaction.item_list.shipping_address.line1 = query.Client.PostalAddress.Address;
|
||||||
|
transaction.item_list.shipping_phone_number = query.Client.PhoneNumber;
|
||||||
|
transaction.item_list.items = new List<Item> { };
|
||||||
|
var item = new Item();
|
||||||
|
|
||||||
|
return new Payment
|
||||||
|
{
|
||||||
|
intent = intent, // "sale", "order", "authorize"
|
||||||
|
payer = new Payer
|
||||||
|
{
|
||||||
|
payment_method = "paypal"
|
||||||
|
},
|
||||||
|
transactions = new List<Transaction> { transaction }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Payment CreatePaiement(this APIContext apiContext, Estimate estimation)
|
||||||
|
{
|
||||||
|
var payment = Payment.Create(apiContext,
|
||||||
|
new Payment
|
||||||
|
{
|
||||||
|
intent = "order", // "sale", "order", "authorize"
|
||||||
|
payer = new Payer
|
||||||
|
{
|
||||||
|
payment_method = "paypal"
|
||||||
|
},
|
||||||
|
transactions = new List<Transaction>
|
||||||
|
{
|
||||||
|
new Transaction
|
||||||
|
{
|
||||||
|
description = "Transaction description.",
|
||||||
|
invoice_number = estimation.Id.ToString(),
|
||||||
|
amount = new Amount
|
||||||
|
{
|
||||||
|
currency = "EUR",
|
||||||
|
total = "0.11",
|
||||||
|
details = new Details
|
||||||
|
{
|
||||||
|
tax = "0.01",
|
||||||
|
shipping = "0.02",
|
||||||
|
subtotal = "0.08"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
item_list = new ItemList
|
||||||
|
{
|
||||||
|
items = new List<Item>
|
||||||
|
{
|
||||||
|
new Item
|
||||||
|
{
|
||||||
|
name = "nah",
|
||||||
|
currency = "EUR",
|
||||||
|
price = "0.02",
|
||||||
|
quantity = "4",
|
||||||
|
sku = "sku"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
redirect_urls = new RedirectUrls
|
||||||
|
{
|
||||||
|
return_url = Startup.Audience+ "/Manage/Credit/Return",
|
||||||
|
cancel_url = Startup.Audience+ "/Manage/Credit/Cancel"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return payment;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,8 +1,10 @@
|
|||||||
namespace Yavsc
|
namespace Yavsc
|
||||||
{
|
{
|
||||||
public class PayPalSettings {
|
public class PayPalSettings {
|
||||||
|
|
||||||
|
public string Mode { get; set; }
|
||||||
public string Secret { get; set; }
|
public string Secret { get; set; }
|
||||||
public string UserId { get; set; }
|
public string ClientId { get; set; }
|
||||||
public string Signature { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
namespace Yavsc.ViewModels.PayPal
|
||||||
|
{
|
||||||
|
public class Amount
|
||||||
|
{
|
||||||
|
public string total { get; set; }
|
||||||
|
public string currency { get; set; } = "EUR";
|
||||||
|
public class Details
|
||||||
|
{
|
||||||
|
public string subtotal { get; set; }
|
||||||
|
public string shipping { get; set; }
|
||||||
|
public string tax { get; set; }
|
||||||
|
public string shipping_discount { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
public Details details;
|
||||||
|
public class ItemList
|
||||||
|
{
|
||||||
|
public Item[] items;
|
||||||
|
public string description { get; set; }
|
||||||
|
public string invoice_number { get; set; }
|
||||||
|
public string custom { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace Yavsc.ViewModels.PayPal
|
||||||
|
{
|
||||||
|
public class CreatePaymentRequest
|
||||||
|
{
|
||||||
|
[Required]
|
||||||
|
public string intent { get; set; } = "sale"; // sale,
|
||||||
|
public string experience_profile_id { get; set; }
|
||||||
|
public class RedirectUrls
|
||||||
|
{
|
||||||
|
public string return_url { get; set; } = "";
|
||||||
|
public string cancel_url { get; set; }
|
||||||
|
}
|
||||||
|
public RedirectUrls redirect_urls;
|
||||||
|
public class Payer
|
||||||
|
{
|
||||||
|
public string payment_method { get; set; } = "paypal";
|
||||||
|
}
|
||||||
|
Payer payer;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
namespace Yavsc.ViewModels.PayPal
|
||||||
|
{
|
||||||
|
public class Item
|
||||||
|
{
|
||||||
|
public string quantity { get; set; }
|
||||||
|
public string name { get; set; }
|
||||||
|
public string price { get; set; }
|
||||||
|
public string currency { get; set; } = "EUR";
|
||||||
|
public string description { get; set; }
|
||||||
|
public string tax { get; set; } = "1";
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
@{
|
||||||
|
ViewData["Title"] = @"Créditer";
|
||||||
|
}
|
||||||
|
<h1>@ViewData["Title"]</h1>
|
||||||
|
<environement names="Development">
|
||||||
|
<em>Gimmy da flooze</em>
|
||||||
|
</environement>
|
||||||
|
|
||||||
|
<div id="paypal-button"></div>
|
||||||
|
|
||||||
|
<script src="https://www.paypalobjects.com/api/checkout.js"></script>
|
||||||
|
<environement names="lua,coiffure,zicmoove,yavsc,yavscpre">
|
||||||
|
<script>
|
||||||
|
var CREATE_PAYMENT_URL = 'https://lua.pschneider.fr/api/payment/create';
|
||||||
|
var EXECUTE_PAYMENT_URL = 'https://lua.pschneider.fr/api/payment/execute';
|
||||||
|
var PAYPAL_ENV = 'sandbox';
|
||||||
|
</script>
|
||||||
|
</environement>
|
||||||
|
<environement names="Development">
|
||||||
|
<script>
|
||||||
|
var CREATE_PAYMENT_URL = 'https://dev.pschneider.fr/api/payment/create';
|
||||||
|
var EXECUTE_PAYMENT_URL = 'https://dev.pschneider.fr/api/payment/execute';
|
||||||
|
var PAYPAL_ENV = 'sandbox';
|
||||||
|
</script>
|
||||||
|
</environement>
|
||||||
|
<script>
|
||||||
|
paypal.Button.render({
|
||||||
|
|
||||||
|
env: PAYPAL_ENV, // 'production', Optional: specify 'sandbox' environment
|
||||||
|
|
||||||
|
payment: function(resolve, reject) {
|
||||||
|
|
||||||
|
return paypal.request.post(CREATE_PAYMENT_URL)
|
||||||
|
.then(function(data) { resolve(data.id); })
|
||||||
|
.catch(function(err) { reject(err); });
|
||||||
|
},
|
||||||
|
|
||||||
|
onAuthorize: function(data) {
|
||||||
|
|
||||||
|
// Note: you can display a confirmation page before executing
|
||||||
|
|
||||||
|
return paypal.request.post(EXECUTE_PAYMENT_URL,
|
||||||
|
{ paymentID: data.paymentID, payerID: data.payerID })
|
||||||
|
|
||||||
|
.then(function(data) { /* Go to a success page */ })
|
||||||
|
.catch(function(err) { /* Go to an error page */ });
|
||||||
|
}
|
||||||
|
|
||||||
|
}, '#paypal-button');
|
||||||
|
</script>
|
||||||
@ -0,0 +1,127 @@
|
|||||||
|
@model DoDirectCreditViewModel
|
||||||
|
|
||||||
|
<form asp-action="DoDirectCredit">
|
||||||
|
<div asp-validation-summary="ValidationSummary.All" class="text-danger" id="ValidationSummary"></div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
|
||||||
|
<label asp-for="PaymentType" class="col-md-2 control-label">Type de paiement</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="PaymentType" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="PaymentType" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="PayerName" class="col-md-2 control-label">Votre nom complet</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="PayerName" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="PayerName" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="FirstName" class="col-md-2 control-label">Prénom</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="FirstName" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="FirstName" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="LastName" class="col-md-2 control-label">Nom de fammille</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="LastName" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="LastName" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="CreditCardNumber" class="col-md-2 control-label">Numéro de carte de crédit</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="CreditCardNumber" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="CreditCardNumber" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="CreditCardType" class="col-md-2 control-label">Type de carte</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="CreditCardType" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="CreditCardType" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="Cvv2Number" class="col-md-2 control-label">Code de vérification visuelle</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="Cvv2Number" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="Cvv2Number" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="CardExpiryDate" class="col-md-2 control-label">Date d'expritation</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="CardExpiryDate" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="CardExpiryDate" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="Street1" class="col-md-2 control-label">Adresse</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="Street1" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="Street1" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="Street2" class="col-md-2 control-label">Adresse (2ième ligne)</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="Street2" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="Street2" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="City" class="col-md-2 control-label">Ville</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="City" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="City" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="State" class="col-md-2 control-label">État</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="State" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="State" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="Country" class="col-md-2 control-label">Pays</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="Country" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="Country" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="PostalCode" class="col-md-2 control-label">Code postal</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="PostalCode" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="PostalCode" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="Phone" class="col-md-2 control-label">Téléphone</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="Phone" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="Phone" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="CurrencyCode" class="col-md-2 control-label">Monaie</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="CurrencyCode" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="CurrencyCode" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="Amount" class="col-md-2 control-label">Montant</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<input asp-for="Amount" class="form-control" type="text" />
|
||||||
|
<span asp-validation-for="Amount" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><input asp-for="IpnNotificationUrl" type="hidden" />
|
||||||
|
</form>
|
||||||
@ -1,10 +1,16 @@
|
|||||||
namespace YavscLib.Models.Workflow
|
namespace YavscLib.Models.Workflow
|
||||||
{
|
{
|
||||||
|
using System.Collections.Generic;
|
||||||
using YavscLib;
|
using YavscLib;
|
||||||
|
using YavscLib.Billing;
|
||||||
|
|
||||||
public interface IQuery: IBaseTrackedEntity
|
public interface IQuery: IBaseTrackedEntity, IBillable
|
||||||
{
|
{
|
||||||
QueryStatus Status { get; set; }
|
QueryStatus Status { get; set; }
|
||||||
}
|
}
|
||||||
|
public interface IBillable {
|
||||||
|
string Description { get; set; }
|
||||||
|
List<IBillItem> GetBillItems();
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue