Giter Site home page Giter Site logo

openpay-dotnet's Introduction

Openpay NET Build status

This is a client implementing the payment services for Openpay at openpay.mx

Compatibility

  • .Net Framework 4.5 or later

Dependencies

Quick Start

Installation

It is recommended that you use NuGet for install this library. Or you can fork the code and build it.

Configuration

Before use the library will be necessary to set up your Merchant ID and Private key. Use:

var publicIp = "138.84.62.109";
OpenpayAPI openpayAPI = new OpenpayAPI(API_KEY, MERCHANT_ID, publicIp);

Sandbox/Production Mode

By convenience and security, the sandbox mode is activated by default in the client library. This allows you to test your own code when implementing Openpay, before charging any credit card in production environment. Once you have finished your integration, create OpenpayAPI object like this:

Boolean production = true;
var publicIp = "138.84.62.109";
OpenpayAPI openpayAPI = new OpenpayAPI(API_KEY, MERCHANT_ID, publicIp, production);

or use Production property:

var publicIp = "138.84.62.109";
OpenpayAPI openpayAPI = new OpenpayAPI(API_KEY, MERCHANT_ID, publicIp);
openpayAPI.Production = true;

API Services

Once configured the library, you can use it to interact with Openpay API services. All the API services are properties of the OpenpayAPI class.

openpayAPI.CustomerService
openpayAPI.CardService
openpayAPI.BankAccountService
openpayAPI.ChargeService
openpayAPI.TransferService
openpayAPI.PayoutService
openpayAPI.FeeService
openpayAPI.PlanService
openpayAPI.SubscriptionService

Each service has methods to create, get, update, delete or list resources according to the documetation described on http://docs.openpay.mx

Implementation

Usage for Mexico

Customers

Create a customer

Customer customer = new Customer();
customer.Name = "Net Client";
customer.LastName = "C#";
customer.Email = "[email protected]";
customer.Address = new Address();
customer.Address.Line1 = "line 1";
customer.Address.PostalCode = "12355";
customer.Address.City = "Queretaro";
customer.Address.CountryCode = "MX";
customer.Address.State = "Queretaro";

Customer customerCreated = openpayAPI.CustomerService.Create(customer);

Get a customer

string customer_id = "adyytoegxm6boiusecxm";
Customer customer = openpayAPI.CustomerService.Get(customer_id);

Delete a customer

string customer_id = "adyytoegxm6boiusecxm";
openpayAPI.CustomerService.Delete(customer.Id);

Update a customer

string customer_id = "adyytoegxm6boiusecxm";
Customer customer = openpayAPI.CustomerService.Get(customer_id);
customer.Name = "My new name";

customer = openpayAPI.CustomerService.Update(customer);

List customers

SearchParams search = new SearchParams();
search.Limit = 50;

List<Customer> customers = openpayAPI.CustomerService.List(search);

Charges

Create a charge

string customer_id = "adyytoegxm6boiusecxm";

ChargeRequest request = new ChargeRequest();
request.Method = "card";
request.SourceId = "kwkoqpg6fcvfse8k8mg2";
request.Description = "Testing from .Net";
request.Amount = new Decimal(9.99);

Charge charge = openpayAPI.ChargeService.Create(customer_id, request);

Capture a charge

string customer_id = "adyytoegxm6boiusecxm";

ChargeRequest request = new ChargeRequest();
request.Method = "card";
request.SourceId = "kwkoqpg6fcvfse8k8mg2";
request.Description = "Testing from .Net";
request.Amount = new Decimal(9.99);
request.Capture = false; //false indicate that only we want capture the amount

Charge charge = openpayAPI.ChargeService.Create(customer_id, request);

Refund a charge

string customer_id = "adyytoegxm6boiusecxm";
string charge_id = "ttcg5roe2py2bur38cx2";

Charge chargeRefunded = openpayAPI.ChargeService.Refund(customer_id, charge.Id, "refund desc");

Or:

string customer_id = "adyytoegxm6boiusecxm";
string charge_id = "ttcg5roe2py2bur38cx2";
RefundRequest refundRequest = new RefundRequest();
refundRequest.Description = "refund desc";

Charge chargeRefunded = openpayAPI.ChargeService.RefundWithRequest(customer_id, charge.Id, refundRequest);

Create a charge to be paid by bank transfer

string customer_id = "adyytoegxm6boiusecxm";

ChargeRequest request = new ChargeRequest();
request.Method = "bank_account";
request.Description = "Testing from .Net [BankAccount]";
request.Amount = new Decimal(9.99);

Charge charge = openpayAPI.ChargeService.Create(customer_id, request);

Payouts

Currently payouts are only allowed to accounts in Mexico.

Payout to bank account

string customer_id = "adyytoegxm6boiusecxm";
BankAccount bankAccount = new BankAccount();
bankAccount.CLABE = "012298026516924616";
bankAccount.HolderName = "Testing";

PayoutRequest request = new PayoutRequest();
request.Method = "bank_account";
request.BankAccount = bankAccount;
request.Amount = 800.00m;
request.Description = "Payout test";

Payout payout = openpayAPI.PayoutService.Create(customer_id, request);

Payout to debit card

string customer_id = "adyytoegxm6boiusecxm";
Card card = new Card();
card.CardNumber = "4111111111111111";
card.BankCode = "002";
card.HolderName = "Payout User";

PayoutRequest request = new PayoutRequest();
request.Method = "card";
request.Card = card;
request.Amount = 500.00m;
request.Description = "Payout test";

Payout payout = openpayAPI.PayoutService.Create(customer_id, request);

Subscriptions

Create a plan first

Plan plan = new Plan();
plan.Name = "Tv";
plan.Amount = 99.99m;
plan.RepeatEvery = 1;
plan.RepeatUnit = "month";
plan.StatusAfterRetry = "unpaid";
plan.TrialDays = 0;

Plan planCreated = openpayAPI.PlanService.Create(plan);

After you have your plan created, you can subscribe customers to it

string customer_id = "adyytoegxm6boiusecxm";
Card card = new Card();
card.CardNumber = "5243385358972033";
card.HolderName = "John Doe";
card.Cvv2 = "123";
card.ExpirationMonth = "01";
card.ExpirationYear = "14";

Subscription subscription = new Subscription();
subscription.PlanId = planCreated.Id;
subscription.Card = card;
subscription = openpayAPI.SubscriptionService.Create(customer_id, subscription);

Cancel susbscription

string customer_id = "adyytoegxm6boiusecxm";
openpayAPI.SubscriptionService.Delete(customer_id, subscription.Id);

Usage for Peru

Charges

####Create a charge

Without customer
ChargeRequest newCharge = new ChargeRequest();
newCharge.Method = "card";
newCharge.SourceId = "SourceId";
newCharge.Amount = 100;
newCharge.Currency = "PEN";
newCharge.Description = "Cargo de prueba";
newCharge.OrderId = "OrderId";
newCharge.DeviceSessionId = "DeviceSessionId";
Customer customer = new Customer();
customer.Name = "Cliente Perú";
customer.LastName = "Vazquez Juarez";
customer.PhoneNumber = "4448936475";
customer.Email = "[email protected]";
newCharge.Customer = customer;

Charge charge = openpayAPI.ChargeService.Create(newCharge);
With customer
ChargeRequest newCharge = new ChargeRequest();
newCharge.Method = "card";
newCharge.SourceId = "sourceId";
newCharge.Amount = 100;
newCharge.Currency = "PEN";
newCharge.Description = "Cargo de prueba";
newCharge.OrderId = "OrderId";
newCharge.DeviceSessionId = "DeviceSessionId";

Charge charge = openpayAPI.ChargeService.Create("customerId", newCharge);
Store charge
ChargeRequest newCharge = new ChargeRequest();
newCharge.Method = "store";
newCharge.SourceId = null;
newCharge.Amount = 100;
newCharge.Currency = "PEN";
newCharge.Description = "Cargo de prueba";
newCharge.OrderId = "OrderId";
newCharge.DeviceSessionId = null;

Customer customer = new Customer();
customer.Name = "Cliente Perú";
customer.LastName = "Vazquez Juarez";
customer.PhoneNumber = "4448936475";
customer.Email = "[email protected]";

newCharge.Customer = customer;
newCharge.Confirm = "false";
newCharge.RedirectUrl = "www.miempresa.pe";

Charge charge = openpayAPI.ChargeService.Create(newCharge);
Charge with redirection
ChargeRequest newCharge = new ChargeRequest();
newCharge.Method = "card";
newCharge.SourceId = null;
newCharge.Amount = 100;
newCharge.Currency = "PEN";
newCharge.Description = "Cargo de prueba";
newCharge.OrderId = "OrderId";
newCharge.DeviceSessionId = null;

Customer customer = new Customer();
customer.Name = "Cliente Perú";
customer.LastName = "Vazquez Juarez";
customer.PhoneNumber = "4448936475";
customer.Email = "[email protected]";

newCharge.Customer = customer;
newCharge.Confirm = "false";
newCharge.RedirectUrl = "www.miempresa.pe";

Charge charge = openpayAPI.ChargeService.Create(newCharge);

Get a charge

Charge charge = openpayAPI.ChargeService.Get("ChargeId");

List charges

SearchParams searchParams = new SearchParams();
searchParams.Amount = 100;
searchParams.Status = TransactionStatus.FAILED;
List<Charge> charges = openpayAPI.ChargeService.List(searchParams);

Checkouts

Create a checkout

Without customer
CheckoutRequest checkoutRequest = new CheckoutRequest();
checkoutRequest.Amount = 100;
checkoutRequest.Description = "Checkout de prueba";
checkoutRequest.OrderId = "OrderId";
checkoutRequest.Currency = "PEN";
checkoutRequest.RedirectUrl = "www.miempresa.com";

Customer customer = new Customer();
customer.Name = "Cliente Perú";
customer.LastName = "Vazquez Juarez";
customer.PhoneNumber = "4448936475";
customer.Email = "[email protected]";

checkoutRequest.Customer = customer;
Checkout checkout = openpayAPI.CheckoutService.Create(checkoutRequest);
With customer
CheckoutRequest checkoutRequest = new CheckoutRequest();
checkoutRequest.Amount = 100;
checkoutRequest.Description = "Checkout de prueba";
checkoutRequest.OrderId = "OrderId";
checkoutRequest.Currency = "PEN";
checkoutRequest.RedirectUrl = "www.miempresa.com";
Checkout checkout = openpayAPI.CheckoutService.Create("CustomerId", checkoutRequest);

List checkouts

SearchParams searchParams = new SearchParams();
searchParams.Limit = 10;
searchParams.StartDate = "20211001"; //Format yyyymmdd
searchParams.EndDate = "20211011";
List<Checkout> checkouts = openpayAPI.CheckoutService.List(searchParams);

Update checkout

Checkout checkout = openpayAPI.CheckoutService.Get("CheckoutId");

UpdateCheckoutRequest newData = new UpdateCheckoutRequest();
newData.ExpirationDate = "2021-10-26 13:43"; //Format: yyyy-mm-dd HH:mm
string newStatus = "available";
Checkout updatedCheckout = openpayAPI.CheckoutService.Update(checkout, newStatus, newData);

Allowed statuses:

  • available

Get checkout

Checkout checkout = openpayAPI.CheckoutService.Get("CheckoutId");

Customers

Create a customer

Customer customer = new Customer();
customer.Name = "Juanito";
customer.LastName = "De Peru";
customer.Email = "[email protected]";
customer.RequiresAccount = false;

Address address = new Address();
address.City = "Lima";
address.CountryCode = "PE";
address.PostalCode = "110511";
address.Line1 = "Av 5 de Febrero";
address.Line2 = "Roble 207";
address.Line3 = "col carrillo";
address.State = "Lima";
customer.Address = address;

Customer addedCustomer = openpayAPI.CustomerService.Create(customer);

Update a customer

Customer customer = openpayAPI.CustomerService.Get(customer.Id);
string newName = "Juan Ejemplo";
customer.Name = newName;
Customer updatedCustomer = openpayAPI.CustomerService.Update(customer);

Get a customer

Customer customer = openpayAPI.CustomerService.Get("CustomerId");

Delete a customer

openpayAPI.CustomerService.Delete("CustomerId");

List clients

SearchParams searchParams = new SearchParams();
searchParams.CreationLte = DateTime.Now;
List<Customer> customers = openpayAPI.CustomerService.List(searchParams);

Cards

Create a card

With customer
Card card = new Card();
card.HolderName = "Juan Perez";
card.CardNumber = "4111111111111111";
card.Cvv2 = "110";
card.ExpirationMonth = "12";
card.ExpirationYear = "21";
Card addedCard = openpayAPI.CardService.Create("CustomerId", card);
Without customer
Card card = new Card();
card.HolderName = "Juan Perez";
card.CardNumber = "4111111111111111";
card.Cvv2 = "110";
card.ExpirationMonth = "12";
card.ExpirationYear = "21";
Card addedCard = openpayAPI.CardService.Create(card);
With Token
Card card = new Card();
card.DeviceSessionId = "DeviceSessionId";
card.TokenId = "TokenId";
Card addedCard = openpayAPI.CardService.Create(card);

Get a card

Card card = openpayAPI.CardService.Get("CardId");

Delete a card

openpayAPI.CardService.Delete("CardId");

List cards

SearchParams searchParams = new SearchParams();
searchParams.CreationLte = DateTime.Now;
List<Card> cards = openpayAPI.CardService.List(searchParams);

Webhooks

Create a webhook

Webhook newWebhook = new Webhook();
newWebhook.Url = "www.mysite.com";
newWebhook.User = "juanito";
newWebhook.Password = "juanitoPass";
List<String> events = new List<string>
{
    "charge.refunded",
    "charge.failed",
    "charge.cancelled",
    "charge.created",
    "chargeback.accepted"
};
newWebhook.EventTypes = events;
Webhook addedWebhook = openpayAPI.WebhooksService.Create(newWebhook);

The allowed values fot the field event_types are:

  • charge.refunded
  • charge.failed
  • charge.cancelled
  • charge.created
  • charge.succeeded
  • charge.rescored.to.decline
  • subscription.charge.failed
  • payout.created
  • payout.succeeded
  • payout.failed
  • transfer.succeeded
  • fee.succeeded
  • fee.refund.succeeded
  • spei.received
  • chargeback.created
  • chargeback.rejected
  • chargeback.accepted
  • order.created
  • order.activated
  • order.payment.received
  • order.completed
  • order.expired
  • order.cancelled
  • order.payment.cancelled

Get a webhook

Webhook webhook = openpayAPI.WebhooksService.Get("WebhookId");

Delete a webhook

openpayAPI.WebhooksService.Delete("WebhookId");

List webhooks

List<Webhook> webhooks = openpayAPI.WebhooksService.List();

Tokens

Create a token

TokenRequest tokenRequest = new TokenRequest();
tokenRequest.CardNumber = "4111111111111111";
tokenRequest.HolderName = "Juan Perez Ramirez";
tokenRequest.ExpirationYear = "21";
tokenRequest.ExpirationMonth = "12";
tokenRequest.Cvv2 = "110";

Address address = new Address();
address.City = "Lima";
address.CountryCode = "PE";
address.PostalCode = "110511";
address.Line1 = "Av 5 de Febrero";
address.Line2 = "Roble 207";
address.Line3 = "col carrillo";
address.State = "Lima";

tokenRequest.Address = address;
Token addedToken = openpayAPI.TokenService.Create(tokenRequest);

Get a token

 Token token_ = openpayAPI.TokenService.Get("TokenId");

openpay-dotnet's People

Contributors

carlos-galvan-openpay avatar carloshepe avatar darkaz avatar eli-lopez avatar guillermo-delucio avatar ismaelem avatar jose-openpay avatar m1slash avatar marcoqrtcpip avatar marcosalvarado avatar mecoronado avatar oswaldopenpay avatar pablogonzalez25 avatar sergioqopenpay avatar thyagodemorais avatar yisusgtz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

openpay-dotnet's Issues

Samples

I'm sorry to post for help in here, but OpenPay support limits its responses to: You have to look at the API's reference.

I can't find a single working sample on how to implement credit card payments in my website using .net

Any help would be appreciated.

Charge class needs to have theerror code

at Openpay.Entities.Charge there must be a field

[JsonProperty(PropertyName = "error_code")]
public String ErrorMessage { get; set; }

We can't translate error messages from ChargeService.Get()

Error de parseo de Json en servicio de cargos

Últimamente, en la última semana la librería me esta tirando esta excepción

"Unexpected character encountered while parsing value: <. Path '', line 0, position 0."

El fragmento de código relevante es este

            Customer openpayCustomer = openpay.CustomerService.Get(customer.OpenpayCustomerId);

            chargeRequest.SourceId = request.SourceId;
            chargeRequest.Amount = request.Amount;
            chargeRequest.Customer = openpayCustomer;
            chargeRequest.Method = _cardMethod;
            chargeRequest.DeviceSessionId = request.DeviceId;
            chargeRequest.OrderId = Guid.NewGuid().ToString();
            chargeRequest.Description = request.Description;
            chargeRequest.Currency = DefaultCurrency;
            chargeRequest.Use3DSecure = true;
            chargeRequest.RedirectUrl = request.RedirectUrl;

            charge = openpay.ChargeService.Create(chargeRequest);
            return charge;

al llamar a Create truena con esa excepción, antes funcionaba ese mismo código

Librería para .net core 3.0 Linux

Hola, buenos días.
Se que la librería de openpay para .net no esta compilada para .net core. Igualmente funciona en Windows y Linux sin problemas.

Pero ahora con la versión 3.0 de .net core se puso mas estricto con respecto a los certificados y creo que el certificado que utilizan para sandbox esta vencido y da un error "The SSL connection could not be established, see inner exception."

La solución que encontré fue ignorar esta validación de la siguiente forma en la clase OpenpayHttpClient:


ServicePointManager.ServerCertificateValidationCallback = (message, certificate, chain, sslPolicyErrors) =>
            {
                if (sslPolicyErrors == SslPolicyErrors.None)
                    return true;
                else
                {
                    Console.WriteLine("OpenPAy sslPolicyErrors {0}", sslPolicyErrors);
                }
                return true;
            };

            WebRequest req = SetupRequest(method.ToString(), endpoint);

Espero le dediquen unos momentos a .net core ya que la version 2.2 se deja de soportar en Diciembre y hoy en día se utiliza bastante.

Saludos!!

request.CodiOptions no existe Cliente dotnet

Basándose en la documentación de OpenPay "Generar código QR estático"
Hay una propiedad llamada: request.CodiOptions.Mode
en general no existe la propiedad CodiOptions,
es un fallo del cliente fue removido de la librería?
No han actualizado la documentación?

OpenPay error: Autenticación de 3D secure fallida

Buen día,

Estoy teniendo problemas en el front office de mi sitio con los pagos a través de OpenPay. Agradezco de antemano sus aportaciones y ayuda. El centro de atención OpenPay no ha sabido solucionarlo.
El error que me manda es: "Autenticación de 3D Secure fallida, favor de contactar a su banco emisor."

Y asi se ve el problema en modo Debug:

Table 'preciosd_pres337.psro_openpay_customer' doesn't exist

        SELECT openpay_customer_id
        FROM psro_openpay_customer
        WHERE id_customer = 3 AND (mode = "test" OR mode IS NULL) LIMIT 1

at line 769 in file classes/db/Db.php
764. if ($webservice_call && $errno) {
765. $dbg = debug_backtrace();
766. WebserviceRequest::getInstance()->setError(500, '[SQL Error] ' . $this->getMsgError() . '. From ' . (isset($dbg[3]['class']) ? $dbg[3]['class'] : '') . '->' . $dbg[3]['function'] . '() Query was : ' . $sql, 97);
767. } elseif (PS_DEBUG_SQL && $errno && !defined('PS_INSTALLATION_IN_PROGRESS')) {
768. if ($sql) {
769. throw new PrestaShopDatabaseException($this->getMsgError() . '

' . $sql . '
');
770. }
771.
772. throw new PrestaShopDatabaseException($this->getMsgError());
773. }
774. }
DbCore->displayError - [line 385 - classes/db/Db.php] - [1 Arguments]
DbCore->query - [line 663 - classes/db/Db.php] - [1 Arguments]
DbCore->getRow - [line 732 - modules/openpayprestashop/openpayprestashop.php] - [1 Arguments]
OpenpayPrestashop->getOpenpayCustomer - [line 52 - modules/openpayprestashop/controllers/front/confirm.php] - [1 Arguments]
OpenpayPrestashopConfirmModuleFrontController->initContent - [line 291 - classes/controller/Controller.php]
ControllerCore->run - [line 515 - classes/Dispatcher.php]
DispatcherCore->dispatch - [line 28 - index.php]

Customer.Get() usando Customer.email en lugar de Customer.id

Buenas tardes

Tomando como referencia este esquema:

SearchParams search = new SearchParams();
search.Limit = 100;
search.offset = 0;

        OpenpayAPI openpayAPI = new OpenpayAPI(Constants.API_KEY_LLAVE_PRIVADA, Constants.MERCHANT_ID);
        List<Customer> customers = openpayAPI.CustomerService.List(search);

Será posible implementar Customer.Get() pero utilizando el e-mail registrado para el Customer?

Obtener el List() y luego buscar por e-mail es demasiado tardado, y genera una carga innecesaria para el servicio de OpenPay

Se puede actulizar a usar System.Text.Json en ves de Newtonsoft.Json ?

Se puede actulizar a usar System.Text.Json en ves de Newtonsoft.Json ?
No es ningun issue es solo que tengo esa duda, ya que mi applicacion esta en core 3.0 hasta ahorita solo esta usando System.Text.Json, y estoy tratando de no usar Newtonsoft.Json, y no se si se pueda modificar o que tan complicado seria para mi modificar la libreria para solo usar Text.Json

Please specify a valid source_id

Estoy teniendo bastantes problemas al realizar cargo utilizando idCard de una tarjeta ya creada y asignada a un customer. La tarjeta se crea en front con js, en back asigno esa tarjeta a un customer que creo, y al realizar cargo me aparece ese error.
Espero su pronta respuesta, ya que tengo bastante con este error.
Lo que envío es lo siguiente:

{
"method": "card",
"source_id": "kz7pvzgbx3vjcxoflbvv",
"amount": 1.0,
"description": "Cargo Tarjeta Crédito - Inst 1",
"capture": true,
"device_session_id": "O76h4ppTx6qDS6sLqyDBT7dE0hRyqZtV",
"customer": {
"name": "GABRIELA LOPEZ",
"email": "[email protected]",
"balance": 0.0,
"creation_date": "2018-08-27T15:22:32-05:00",
"requires_account": false,
"id": "aipffgy7izdxfmswz7lr"
},
"confirm": true,
"send_email": false,
"use_3d_secure": false
}

Payout Getting rejected

El ejemplo Payout to debit card expuesto en https://github.com/open-pay/openpay-dotnet triggerea la excepcion Openpay.Openpay Exception: '1003: Please specify the bank account data'.

el ejemplo documentado en https://openpay.mx/en/docs/payout.html#tocAnchor-1-1-1 en 'Create a payment' lanza la excepcion 3006: Merchant does not allow payouts to third parties'

ya verifique que la llave privada sea la correcta y este en el servidor, la publica en el cliente, y que ambos tengan el merchant id

create token

hi i want to know how can create a token from card

Error System.TypeLoadException

Recientemente tuve la necesidad de incorporar Openpay a mi sistema. Al hacer la instalación del Nuget a mi sistema y comenzar a hacer pruebas, me encuentro con el siguiente error al compilar:
System.TypeLoadException: 'No se puede cargar el tipo 'Openpay.OpenpayAPI' del ensamblado'Openpay, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.'
issuevs

¿Cómo puedo solventar este error?

PSE Colombia

Buenos días Equipo OpenPay

tengo una pregunta,

revisando la documentación de la API de Colombia
https://documents.openpay.co/api/
encuentro la definición para openpayAPI.PseService.Create, pero en este código no lo encuentro.

Es este el mismo proyecto para conectar con la API de Colombia?
La API funciona con net framework, va a existir alguna migración a net core?

muchas gracias.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.