Cargo único
Genera pagos de una sola ocasión con SPEI
1. Añade tu llave privada y versión del API
Necesitarás tu llave privada de pruebas. Si aún no cuentas con ella, puedes obtenerla en tu Panel Conekta.
using Conekta.net.Api;
using Conekta.net.Client;
using Conekta.net.Model;
Configuration config = new Configuration();
config.AccessToken = "key_xxxxx";
require "conekta"
Conekta.api_key = "key_eYvWV7gSDkNYXsmr"
Conekta.api_version = "2.0.0"
require_once("/path/to/lib/Conekta.php");
\Conekta\Conekta::setApiKey("key_eYvWV7gSDkNYXsmr");
\Conekta\Conekta::setApiVersion("2.0.0");
import conekta
conekta.api_key = "key_eYvWV7gSDkNYXsmr"
conekta.api_version = "2.0.0"
var conekta = require('conekta');
conekta.api_key = 'key_eYvWV7gSDkNYXsmr';
conekta.api_version = '2.0.0';
import com.conekta;
Conekta.setApiKey("key_eYvWV7gSDkNYXsmr");
Conekta.apiVersion = "2.0.0";
import (
conekta "github.com/conekta/conekta-go"
)
conekta.APIKey = "key_pMcnDF4zFyWKyLG15LuqwA"
# N/A
2. Crea una orden
Al crear un order se generará el cargo de tu cliente. Si no deseas crear el cargo inmediato, puedes preparar la orden y después generar el cargo mandando la información del arreglo charges.
Los campos mostrados en el ejemplo son los mínimos requeridos, si deseas saber más sobre el objeto order revisa nuestra REST API.
curl --request POST \
--url https://api.conekta.io/orders \
--header 'accept: application/vnd.conekta-v2.1.0+json' \
-u key_eYvWV7gSDkNYXsmr: \
--header 'content-type: application/json' \
--data '{
"line_items": [{
"name": "Tacos",
"unit_price": 1000,
"quantity": 12
}],
"shipping_lines": [{
"amount": 1500,
"carrier": "FEDEX"
}],
"currency": "MXN",
"customer_info": {
"name": "Fulanito Pérez",
"email": "[email protected]",
"phone": "+5218181818181"
},
"shipping_contact":{
"address": {
"street1": "Calle 123, int 2",
"postal_code": "06100",
"country": "MX"
}
},
"charges":[{
"payment_method": {
"type": "spei",
"expires_at": 1600886061
}
}]
}'
using System.Collections.Generic;
using System.Diagnostics;
using Conekta.net.Api;
using Conekta.net.Client;
using Conekta.net.Model;
namespace Example
{
public class CreateOrderExample
{
public static void Main()
{
Configuration config = new Configuration();
config.AccessToken = "key_DwaOLXoX6YCGGvfNifZ3IPwi";
var apiInstance = new OrdersApi(config);
List<Product> products = new()
{
new(
name: "toshiba",
description: "Mes de Febrero.",
quantity: 1,
unitPrice: 1555,
tags: new List<string> {"pago", "mensualidad"}
)
};
DateTime thirtyDaysFromNowDateTime = DateTime.Now.AddDays(30);
var expiresAt = (Int64)thirtyDaysFromNowDateTime.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
List<ChargeRequest> charges = new()
{
new(
paymentMethod: new ChargeRequestPaymentMethod(
type:"spei",
expiresAt: expiresAt
)
)
};
OrderRequestCustomerInfo customerInfo = new(new CustomerInfoJustCustomerId("cus_2tKcHxhTz7xU5SymF2"));
OrderRequest orderRequest = new(
currency: "MXN",
customerInfo: customerInfo,
lineItems: products,
charges: charges
);
var acceptLanguage = "es"; // string | Use for knowing which language to use (optional) (default to es)
try
{
// Create order
OrderResponse result = apiInstance.CreateOrder(orderRequest, acceptLanguage);
Debug.WriteLine(result);
}
catch (ApiException e)
{
Debug.Print("Exception when calling OrdersApi.CreateOrder: " + e.Message);
Debug.Print("Status Code: " + e.ErrorCode);
Debug.Print(e.StackTrace);
}
}
}
}
try{
$thirty_days_from_now = (new DateTime())->add(new DateInterval('P30D'))->getTimestamp();
$order = \Conekta\Order::create(
[
"line_items" => [
[
"name" => "Tacos",
"unit_price" => 1000,
"quantity" => 12
]
],
"shipping_lines" => [
[
"amount" => 1500,
"carrier" => "FEDEX"
]
], //shipping_lines - physical goods only
"currency" => "MXN",
"customer_info" => [
"name" => "Fulanito Pérez",
"email" => "[email protected]",
"phone" => "+5218181818181"
],
"shipping_contact" => [
"address" => [
"street1" => "Calle 123, int 2",
"postal_code" => "06100",
"country" => "MX"
]
], //shipping_contact - required only for physical goods
"charges" => [
[
"payment_method" => [
"type" => "spei",
"expires_at" => $thirty_days_from_now
]
]
]
]
);
} catch (\Conekta\ParameterValidationError $error){
echo $error->getMessage();
} catch (\Conekta\Handler $error){
echo $error->getMessage();
}
begin
thirty_days_from_now = Time.now.advance(days: 30).to_i
order = Conekta::Order.create({
line_items: [{
name: "Tacos",
unit_price: 1000,
quantity: 12
}],
shipping_lines: [{
amount: 1500,
carrier: "FEDEX"
}], #shipping_lines - physical goods only
currency: "MXN",
customer_info: {
name: "Fulanito Pérez",
email: "[email protected]",
phone: "+5218181818181"
},
shipping_contact: {
address: {
street1: "Calle 123, int 2",
postal_code: "06100",
country: "MX"
}
}, #shipping_contact - required for physical goods only
charges: [{
payment_method: {
type: "spei",
expires_at: thirty_days_from_now
}
}]
})
rescue Conekta::Error => error
for error_detail in error.details do
puts error_detail.message
end
end
try:
from datetime import datetime
from datetime import timedelta
thirty_days_from_now = int((datetime.now() + timedelta(days=1)).timestamp())
order = conekta.Order.create({
"line_items": [{
"name": "Tacos",
"unit_price": 1000,
"quantity": 12
}],
"shipping_lines": [{
"amount": 1500,
"carrier": "FEDEX"
}], #shipping_lines - physical goods only
"currency": "MXN",
"customer_info": {
"name": "Fulanito Pérez",
"email": "[email protected]",
"phone": "+5218181818181"
},
"shipping_contact":{
"address": {
"street1": "Calle 123, int 2",
"postal_code": "06100",
"country": "MX"
}
}, #shipping_contact - required only for physical goods
"charges":[{
"payment_method": {
"type": "spei",
"expires_at": thirty_days_from_now
}
}]
})
except conekta.ConektaError as e:
print e.message
thirty_days_from_now = (Math.round(Date.now()/1000 + 60 \* 60 \* 24 \* 30)).toString();
order = conekta.Order.create({
"line_items": [{
"name": "Tacos",
"unit_price": 1000,
"quantity": 12
}],
"shipping_lines": [{
"amount": 1500,
"carrier": "FEDEX"
}], //shipping_lines - physical goods only
"currency": "MXN",
"customer_info": {
"name": "Fulanito Pérez",
"email": "[email protected]",
"phone": "+5218181818181"
},
"shipping_contact":{
"address": {
"street1": "Calle 123, int 2",
"postal_code": "06100",
"country": "MX"
}
}, //shipping_contact - required only for physical goods
"charges":[{
"payment_method": {
"type": "spei",
"expires_at": thirty_days_from_now
}
}]
}, function(err, res) {
console.log(res.toObject());
});
try {
Long nowUnixTimestamp = System.currentTimeMillis();
Long thirtyDaysFromNowUnixTimestamp = (nowUnixTimestamp + 30L * 24 * 60 * 60 * 1000) / 1000L;
String thirtyDaysFromNow = thirtyDaysFromNowUnixTimestamp.toString();
Order order = Order.create(
new JSONObject("{"
+ "'line_items': [{"
+ "'name': 'Tacos',"
+ "'unit_price': 1000,"
+ "'quantity': 12"
+ "}],"
+ "'shipping_lines': [{"
+ "'amount': 1500,"
+ "'carrier': 'FEDEX'"
+ "}]," //shipping_lines - physical goods only
+ "'currency': 'MXN',"
+ "'customer_info': {"
+ "'name': 'Fulanito Pérez',"
+ "'email': '[email protected]',"
+ "'phone': '+5218181818181'"
+ "},"
+ "'shipping_contact':{"
+ "'address': {"
+ "'street1': 'Calle 123, int 2',"
+ "'postal_code': '06100',"
+ "'country': 'MX'"
+ "}"
+ "}," //shipping_contact - required only for physical goods
+ "'charges':[{"
+ "'payment_method': {"
+ "'type': 'spei',"
+ "'expires_at': " + thirtyDaysFromNow
+ "}"
+ "}]"
+ "}"
)
);
} catch (io.conekta.Error e) {
System.out.println(e.message);
} catch (io.conekta.ErrorList e) {
System.out.println(e.details.get(0).message);
}
Address := &conekta.Address{
Street1: "Street1",
Street2: "Street2",
City: "City",
State: "State",
Country: "Country",
PostalCode: "PostalCode",
}
customerParams := &conekta.CustomerParams{
//ID: "cus_2nD9kZfqRzMuF8czZ",
Name: "Fulanito Perez",
Phone: "5512345678",
Email: "[email protected]",
}
lineItemParams := &conekta.LineItemsParams{
Name: "Naranjas Robadas",
UnitPrice: 10000,
Quantity: 2,
}
shippingParams := &conekta.ShippingLinesParams{
Amount: 200,
TrackingNumber: "123",
Carrier: "Test Carrier",
Method: "method",
}
shippingContactParams := &conekta.ShippingContactParams{
Phone: "55-5555-5555",
Receiver: "Miguel",
BetweenStreets: "BetweenStreets",
Address: Address,
}
chargeParams := &conekta.ChargeParams{
PaymentMethod: &conekta.PaymentMethodParams{
Type: "spei",
ExpiresAt: time.Now().AddDate(0, 0, 90).Unix(),
},
}
orderParams := &conekta.OrderParams{}
orderParams.Currency = "MXN"
orderParams.CustomerInfo = customerParams
orderParams.LineItems = append(orderParams.LineItems, lineItemParams)
orderParams.ShippingLines = append(orderParams.ShippingLines, shippingParams)
orderParams.ShippingContact = shippingContactParams
orderParams.Charges = append(orderParams.Charges, chargeParams)
ord, err := order.Create(orderParams)
if err != nil {
code := err.(conekta.Error).Details[0].Code
fmt.Printf(code)
} else {
fmt.Println(ord)
}
3. Procesar respuesta
Una vez creada la orden y el cargo, deberás procesar la respuesta y presentar la ficha de pago.
Recuerda que la respuesta de una orden es formato JSON.
Console.WriteLine("ID: " + order.Id);
Console.WriteLine("Bank: " + order.Charges.Data[0].PaymentMethod.GetPaymentMethodBankTransfer().ReceivingAccountBank);
Console.WriteLine("CLABE: " + order.Charges.Data[0].PaymentMethod.GetPaymentMethodBankTransfer().ReceivingAccountNumber);
Console.WriteLine("$" + (order.Amount/100) + order.Currency);
Console.WriteLine("Order");
Console.WriteLine(order.LineItems.Data[0].Quantity + " - "
+ order.LineItems.Data[0].Name + " - "
+ (order.LineItems.Data[0].UnitPrice/100));
// Response
// ID: ord_2fsQdMUmsFNP2WjqS
// Bank: STP
// CLABE: 646180111812345678
// $ 135.0 MXN
// Order
// 12 - Tacos - $10.0
System.out.println("ID: " + order.id);
System.out.println("$" + (order.amount/100) + order.currency);
System.out.println("Order");
System.out.println(order.line_items.data[0].quantity + " - "
+ order.line_items.data[0].name + " - "
+ (order.line_items.data.unit_price/100));
// Response
// ID: ord_2fsQdMUmsFNP2WjqS
// $ 135.0 MXN
// Order
// 12 - Tacos - $10.0
echo $order;
echo "ID: ". $order->id;
echo "Bank: ". $order->charges[0]->payment_method->receiving_account_bank;
echo "CLABE: ". $order->charges[0]->payment_method->receiving_account_number;
echo "$". $order->amount/100 . $order->currency;
echo "Order";
echo $order->line_items[0]->quantity .
"-". $order->line_items[0]->name .
"- $". $order->line_items[0]->unit_price/100;
// Response
// ID: ord_2fsQdMUmsFNP2WjqS
// Bank: STP
// CLABE: 646180111812345678
// $ 135.0 MXN
// Order
// 12 - Tacos - $10.0
puts "ID: #{order.id}"
puts "Bank: #{order.charges.data[0].payment_method.receiving_account_bank}"
puts "CLABE: #{order.charges.data[0].payment_method.receiving_account_number}"
puts "$ #{(order.amount/100).to_f} #{order.currency}"
puts "Order"
puts "#{order.line_items.data[0].quantity}
- #{order.line_items.data[0].name}
- $ #{(order.line_items.data.unit_price/100).to_f}"
# Response
# ID: ord_2fsQdMUmsFNP2WjqS
# Bank: STP
# CLABE: 646180111812345678
# $ 135.0 MXN
# Order
# 12 - Tacos - $10.0
print("ID: " + order.id)
print("Bank: " + order.charges.data[0].payment_method.receiving_account_bank)
print("CLABE: " + order.charges.data[0].payment_method.receiving_account_number)
print("$" + (order.amount/100) + order.currency)
print("Order")
print(order.line_items.data[0].quantity + " - "
+ order.line_items.data[0].name + " - "
+ (order.line_items.data.unit_price/100))
# Response
# ID: ord_2fsQdMUmsFNP2WjqS
# Payment Method: OxxoPay
# Reference: 123456789012
# $ 135.0 MXN
# Order
# 12 - Tacos - $10.0
console.log("ID: " + order.id);
console.log("Bank: " + order.charges.data[0].payment_method.receiving_account_bank);
console.log("CLABE: " + order.charges.data[0].payment_method.receiving_account_number);
console.log("$" + (order.amount/100) + order.currency);
console.log("Order");
console.log(order.line_items.data[0].quantity + " - "
+ order.line_items.data[0].name + " - "
+ (order.line_items.data.unit_price/100));
// Response
// ID: ord_2fsQdMUmsFNP2WjqS
// Bank: STP
// CLABE: 646180111812345678
// $ 135.0 MXN
// Order
// 12 - Tacos - $10.0
fmt.Println("ID: ", o.ID)
fmt.Println("Payment Method: ", o.Charges.Data[0].PaymentMethod.ServiceName)
fmt.Println("Reference: ", o.Charges.Data[0].PaymentMethod.Reference)
fmt.Println("$",o.Amount/100, o.Currency)
fmt.Println("------Order------")
fmt.Println(" - ", o.LineItems.Data[0].Quantity)
fmt.Println(" - ", o.LineItems.Data[0].Name)
fmt.Println(" - ", o.LineItems.Data[0].UnitPrice/100)
//Response
//ID: ord_2nCsbdLXvdAgDVcKr
//Payment Method: OxxoPay
//Reference: 98000004875830
//$ 152 MXN
//------Order------
// - 1
// - Producto 7
// - 152
4. Presentar ficha de pago
Utiliza una ficha como esta para darle a tu cliente la referencia de pago junto con los pasos necesarios para completar la compra.
Ficha SPEI
Puedes incluirla en tu checkout o envíala por correo para ofrecer una mejor experiencia.
Consulta el repo en GitHub.
5. Recibir notificación
Para poder confirmar los pagos que se realicen con SPEI deberás añadir un Webhook en tu Panel Conekta para recibir las notificaciones POST (HTTP JSON) correctamente.
Consultar la referencia sobre Webhooks
Utiliza URLs públicos: Si no tienes un IP público o un domino a tu disposición, puedes utilizar servicios como ultrahook o localtunnel.
6. Notifica a tu cliente
Una buena práctica es notificar a tu usuario vía email.
Recuerda:
Cambiar tus llaves públicas y privadas de pruebas por tus llaves de producción después de realizar pruebas.
Updated 9 months ago