API de venta estándar de Juice
La API de ventas de Juice utiliza un conjunto de estándares REST API. Estos estándares tienen las siguientes atribuciones:
Todas las API tienen:
- Cifrado (https en un puerto estándar (443) o especial)
- Utiliza la “autenticación básica” como mínimo
- Utiliza el par de solicitudes key=value tal como GET o POST
- Puede devolver XML o JSON
- Atomica (Una solicitud por llamada a la API)
- Fácil de demostrar o depurar con cURL o un navegador web
La URL, el nombre de usuario y la contraseña reales varían según los sistemas de Juice, para todos los ejemplos se utiliza una versión genérica como : https://login:password@acme.utiliflex.com/acme/vending3.php .
Versionado
Este documento sólo se aplica a la versión 3 de la API de venta estándar de Juice. Para documentación sobre la versión anterior de esta API, ver Juice Vending v2 API documentation.
Manejo de la autenticación a la API
Comprobación de Autenticación (Básica Auth)
curl --basic --user 'login:password' --data 'mode=authtest' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=authtest');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "authtest")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"status": "OK",
"error": 0,
"message": "auth test and info",
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9477.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990522.6,
"vendor_limit": 50,
"vendor_owed": 0,
"vendor_available": 50
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65"
}
La autenticación básica envía username
y password
como una cadena codificada en Base64 en las cabeceras del HTTP, y en general está soportado por la mayoría, si no por todas las herranientas y marcos (frameworks) de forma nativa.
Solicitud HTTP
GET vending3.php?mode=authtest
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se realiza una autorización prueba:
Param | Value | Required | Default |
---|---|---|---|
mode | authtest | Yes | |
return | json, xml | No | json |
Comprobación de la autentificación (OAuth)
curl --header 'Authorization token jsmith:56d2bf16-9881-4e5d-bbeb-c79a72225a5b' \
--data 'mode=authtest' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_HTTPHEADER, array(
'Authorization: token jsmith:56d2bf16-9881-4e5d-bbeb-c79a72225a5b',
));
curl_setopt($chx, CURLOPT_URL, $url . '?mode=authtest');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.Header.Add(`Authorization`, `token jsmith:56d2bf16-9881-4e5d-bbeb-c79a72225a5b`)
q := req.URL.Query()
q.Set("mode", "authtest")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"email": "",
"error": 0,
"login": "jsmith",
"message": "auth test and info",
"name": "John Smith",
"seclevel": "65",
"sms1": "",
"status": "OK",
"system_role": "CSR3",
"vendor": {
"vendor_available": 50,
"vendor_group_available": 999989770.65,
"vendor_group_limit": 1000000000,
"vendor_group_owed": 10229.35,
"vendor_limit": 50,
"vendor_name": "County Electric",
"vendor_number": "CEC",
"vendor_owed": 0
}
}
Utilizando un token de la API el username
y el token de la API deben estar en el campo de cabecera de autorización en forma de token USERNAME:TOKEN
para que el sistema reconozca el token e intente validarlo.
Solicitud HTTP
Authorization token USERNAME:TOKEN
GET vending3.php?mode=authtest
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se realiza una prueba de autorización:
Param | Value | Required | Default |
---|---|---|---|
mode | authtest | Yes | |
return | json, xml | No | json |
Búsqueda de Cuenta
curl --basic --user 'login:password' --data 'mode=search&searchfor=c2da6e3e' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=search&searchfor=c2da6e3e');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "search")
q.Set("searchfor", "c2da6e3e")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"status": "OK",
"error": 0,
"message": "",
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9477.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990522.6,
"vendor_limit": 50,
"vendor_owed": 0,
"vendor_available": 50
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"search_results": [
{
"portal": "test",
"account": "03288",
"contract": "5004001",
"name": "John Lennon",
"serialnumber": "c2da6e3e",
"address1": "123 Foo St.",
"address2": "",
"city": "Chattanooga",
"state": "TN",
"sms1": "14235551001",
"email1": "jlennon@example.com"
}
]
}
Busca una cuenta de cliente activa en Juice, la información que se puede buscar incluye:
- Número de serie del medidor
- Número de cuenta de Juice
- Número de cuenta del legado CIS
- Nombre del cliente
- Números de teléfonos del cliente
- Números de SMS del cliente
- Dirección(es) de correo electrónico del cliente
- CIS/HeadEnd/MDM Identificador del Medidor
Se sugiere utilizar esta función de búsqueda para obtener un número de cuenta exacto o número de serie del medidor y usarlo para un control de balance y luego una venta cuando se hace interfaces de usuario para vendedores y cajeros.
Solicitud de HTTP
GET vending3.php?mode=search&searchfor=<string>
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se realiza una búsqueda de cuenta::
Param | Value | Required | Default |
---|---|---|---|
mode | search | Yes | |
searchfor | Una cadena de caracteres (string) para buscar en | Yes | |
return | json, xml | No | json |
Investigación del Balance
curl --basic --user 'login:password' --data 'mode=balance&account=03288' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=balance&account=03288');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "balance")
q.Set("account", "03288")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"status": "OK",
"error": 0,
"message": "",
"customer": {
"account": "03288",
"portal": "test",
"serialnumber": "c2da6e3e",
"locid": "L03293",
"com": "none",
"meterunits": "kWh",
"meterstate": "CONNECTED",
"vendable": 1,
"contract": "5004001",
"name": "John Lennon",
"group1": "",
"group2": "",
"group3": "",
"address1": "123 Foo St.",
"address2": "",
"notify_days": 3,
"phone1": "14235551001",
"phone2": "",
"phone_notify": 0,
"sms1": "14235551001",
"sms2": "",
"sms_notify": 1,
"email1": "jlennon@example.com",
"email2": "",
"email_notify": 0,
"city": "Chattanooga",
"postal_code": "",
"country_code": null,
"account_type": "PrePaid",
"loc_address1": "123 Foo St.",
"loc_address2": "",
"loc_city": "Chattanooga",
"loc_name": "1009002",
"loc_state": "TN",
"loc_zip": "55555",
"loc_lat": 0,
"loc_long": 0,
"wallet": 0,
"gimme5_bal": 0,
"gimme5_count": 0,
"purchased_kwh_this_month": 0,
"unitwallet": 27.99,
"arrears_balance": 0
},
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9477.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990522.6,
"vendor_limit": 50,
"vendor_owed": 0,
"vendor_available": 50
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"motd": "",
"transactions": [
{
"transaction": 375,
"timestamp": "1568315822",
"login": "jsmith",
"serialnumber": "c2da6e3e",
"type": "cash",
"created": "2019-09-12 15:17:02",
"due": "",
"ststoken": "",
"arrears": 0,
"services": 10,
"amount": 0,
"units": 27.988,
"unit": "kWh",
"govnum": "0",
"vendornumber": "CEC"
}
],
"readings": [],
"balance": {
"currency_wallet": 0,
"unit_wallet": 27.99
}
}
Realizar un control de saldo en un número de cuenta o un número de serie de un medidor es una forma de verificar si la cuenta o el medidor existe dentro de Juice. Este punto final (endpoint) devolverá todas las transacciones de la cuenta dentro de los últimos 180 días, las últimas 6 lecturas del medidor, según el tipo de medidor que tenga el cliente, y el saldo actual de la moneda y la billetera de la cuenta.
Solicitud HTTP
Por cuenta
GET vending3.php?mode=balance&account=<string>
Por número de serie del medidor
GET vending3.php?mode=balance&serialnumber=<string>
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se realiza una consulta de saldo
Param | Value | Required | Default |
---|---|---|---|
mode | saldo | Yes | |
account | Número de cuenta de Juice para consultar el saldo de | No | |
serialnumber | El número de serie del medidor para consultar el balance de | No | |
return | json, xml | No | json |
Transferencia de la cartera
curl --basic --user 'login:password' --data 'mode=wallettransfer&account=03288&towallet=03280&amount=10' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=wallettransfer&account=03288&towallet=03280&amount=10');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "wallettransfer")
q.Set("account", "03288")
q.Set("towallet", "03280")
q.Set("amount", "10")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"status": "OK",
"error": 0,
"message": "transfered 10 to 03280 Ringo Starr",
"customer": {
"account": "03288"
},
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9497.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990502.6,
"vendor_limit": 50,
"vendor_owed": 20,
"vendor_available": 30
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"wallet_transfer": {
"from_account": "03288",
"to_account": "03280",
"to_account_name": "Ringo Starr",
"amount": 10
}
}
Es posible que un cliente transfiera dinero de su cartera de divisas en Juice a otra cuenta de Juice..
Solicitud HTTP
GET vending3.php?mode=wallettransfer&account=<string>&towallet=<string>&amount=<string>
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se realiza una transferencia de cartera
Param | Value | Required | Default |
---|---|---|---|
mode | wallettransfer | Yes | |
account | La cuenta de Juice de la que se transfieren los fondos | Yes | |
towallet | La cuenta de jugo a la que se transfieren los fondos | Yes | |
amount | La cantidad a transferir entre cuentas | Yes | |
return | json, xml | No | json |
Ventas
El proceso de venta o financiación de la cartera monetaria de un cliente es un proceso de varios pasos. El primer paso es obtener un ID de transacción único de Juice, el segundo paso es llamar a la API con mode=vend
or mode=fund
utilizando el ID de la transacción como parámetro en la solicitud. El ID de transacción es un valor único y sólo puede ser utilizado una vez en una solicitud de venta o de fondos y sólo es válido durante un máximo de 1 hora después de que se genera. Las solicitudes de estimación son una excepción y el mismo ID de transacción puede ser usado para una estimación seguida de una acción de venta o financiamiento.
Detalles del Tipo de Venta
Dinero en efectivo
Ajustar el submodo a cash
es el uso típico, ya que se trata de dinero en efectivo que se debe a la empresa de servicios públicos.
No hay problema en Juice si la transacción real es una tarjeta de crédito, cheque, etc.
cc
Establecer el submodo a cc
(nótese las minúsculas)) es una transacción de tarjeta de crédito “fuera de Juice . La designación interna es cash-CC
a que se trata de una transacción en efectivo de una pasarela de tarjeta de crédito externa. Los campos adicionales ccauth
y cctrans
pueden utilizarse para almacenar cierta información sobre la transacción correspondiente en Google para facilitar la conciliación de los problemas y los estados de cuenta de las tarjetas de crédito más tarde..
CC
Definiendo el submodo a CC
(note las mayúsculas) espera que se pasen los campos de información sin procesar de la tarjeta de crédito. Estos campos son ccnum
, ccexpmth
, ccexpyr
, ccfirst
, cclast
, cczip
. Este modo aceptará esa información de tarjeta de crédito y la procesará internamente para Juice..
check
Al Al configurar el submodo en check
denota que el monto de la transacción fue pagado por un cheque, internamente estas transacciones se manejan como efectivo adeudado a la empresa de servicios públicos, pero con una designación interna de cash-Check
similar a cómo se manejan las transacciones cc
.
Arrears
Al configurar el submodo en arrears
denota que la transacción es una transacción de atrasos. Si bien no hay dinero intercambiando manos por adelantado para este tipo de transacción, el cliente está obligado a devolver el monto total de la transacción a la empresa de servicios públicos en futuras transacciones..
Gimme 5
Al configurar el submodo en gimme5
realizará un tipo especial de transacción de arrears
en Juice donde el sistema venderá una cantidad fija de 5 kWh al cliente. La empresa de servicios públicos puede tener limitaciones en cuanto a la cantidad de atrasos de las donaciones de Gimme 5, ya que el cliente todavía está pagando el saldo adeudado de la anterior donación de Gimme 5, una cuenta de cliente puede tener en un momento dado o la empresa de servicios públicos puede no permitir que se hagan donaciones de Gimme 5 en absoluto.
jc
Al configurar el submodo en jc
se realizará una transacción con la Tarjeta de Juice para la cuenta. Una tarjeta de Juice es una tarjeta prepaga para raspar, un voucher / cupón, una tarjeta de regalo que tiene una denominación fija para la que es válida. El cliente puede comprar el código de voucher / cupón en el momento de la transacción o con una anticipación por parte del cliente.
wallet
Al configurar el submodo en wallet
se realizará una transacción de cartera. Durante una transacción en la cartera no hay cambio de dinero, en su lugar se retira el monto de la transacción de la cartera de la moneda del cliente siempre y cuando haya suficientes fondos para el monto de la transacción.
Solicitar una ID de transacción
curl --basic --user 'login:password' --data 'mode=new-transaction&account=03288' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=new-transaction&account=03288');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "new-transaction")
q.Set("account", "03288")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"status": "OK",
"error": 0,
"message": "",
"customer": {
"account": "03288"
},
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9477.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990522.6,
"vendor_limit": 50,
"vendor_owed": 0,
"vendor_available": 50
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"transaction": {
"uuid": "af8d5fb2-0a3d-11ea-a672-df1c41ad4042"
}
}
Para poder realizar una acción de venta o de fondo, se debe generar una ID de transacción única. Esta ID de transacción está vinculada a la cuenta del proveedor, la cuenta del cliente y la transacción que se realiza. El ID de transacción generado será el campo uuid
en el objeto de transaction
.
Solicitud HTTP
GET vending3.php?mode=new-transaction&account=<string>
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se obtiene un ID de transacción:
Param | Value | Required | Default |
---|---|---|---|
mode | new-transaction | Yes | |
account | El número de cuenta de Juice para el que se realiza la transacción | Yes | |
return | json, xml | No | json |
Estimación de ventas
curl --basic --user 'login:password' --data 'mode=estimate&submode=cash&account=03288&amount=10&uuid=af8d5fb2-0a3d-11ea-a672-df1c41ad4042' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=estimate&submode=cash&account=03288&amount=10&uuid=af8d5fb2-0a3d-11ea-a672-df1c41ad4042');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "estimate")
q.Set("submode", "cash")
q.Set("account", "03288")
q.Set("amount", "10")
q.Set("uuid", "af8d5fb2-0a3d-11ea-a672-df1c41ad4042")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"uuid": "af8d5fb2-0a3d-11ea-a672-df1c41ad4042",
"status": "OK",
"error": 0,
"message": "",
"customer": {
"account": "03288",
"portal": "test",
"serialnumber": "c2da6e3e",
"locid": "L03293",
"com": "none",
"meterunits": "kWh",
"meterstate": "CONNECTED",
"vendable": 1,
"contract": "5004001",
"name": "John Lennon",
"group1": "",
"group2": "",
"group3": "",
"address1": "123 Foo St.",
"address2": "",
"notify_days": 3,
"phone1": "14235551001",
"phone2": "",
"phone_notify": 0,
"sms1": "14235551001",
"sms2": "",
"sms_notify": 1,
"email1": "jlennon@example.com",
"email2": "",
"email_notify": 0,
"city": "Chattanooga",
"postal_code": "",
"country_code": null,
"account_type": "PrePaid",
"loc_address1": "123 Foo St.",
"loc_address2": "",
"loc_city": "Chattanooga",
"loc_name": "1009002",
"loc_state": "TN",
"loc_zip": "55555",
"loc_lat": 0,
"loc_long": 0,
"wallet": 0,
"gimme5_bal": 0,
"gimme5_count": 0,
"purchased_kwh_this_month": 0,
"unitwallet": 27.99,
"arrears_balance": 0
},
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9477.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990522.6,
"vendor_limit": 50,
"vendor_owed": 0,
"vendor_available": 50
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"motd": "",
"transaction": {
"id": 0,
"action": "ESTIMATE",
"amount": 10,
"apply_to_arrears": 0,
"apply_to_fixed": 0,
"apply_to_services": 10,
"apply_to_taxes": 0,
"apply_to_fuel_charges": 0,
"apply_to_levy_charges": 0,
"apply_to_levy2_charges": 0,
"apply_to_wallet": 0,
"purchased_kwh": 27.9877,
"kva_demand_charge": 0,
"bt1amt": 10,
"bt2amt": 0,
"bt3amt": 0,
"bt4amt": 0,
"bt5amt": 0,
"bt6amt": 0,
"bt7amt": 0,
"bt8amt": 0,
"bt9amt": 0,
"bt1wh": 27987.7,
"bt2wh": 0,
"bt3wh": 0,
"bt4wh": 0,
"bt5wh": 0,
"bt6wh": 0,
"bt7wh": 0,
"bt8wh": 0,
"bt9wh": 0
}
}
Se puede hacer una estimación de ventas para probar una transacción sin realizar una venta. Esto es útil para ver cuál debe ser el desglose de la transacción, incluida la cantidad de unidades que comprará el cliente, y cuánto del monto de la transacción se utilizará para pagar los atrasos pendientes. Esto también le permitirá al proveedor verificar si la transacción excedió o no del límite de venta permitido..
Solicitud HTTP
Estimación de ventas con número de cuenta
GET vending3.php?mode=estimate&submode=<string>&account=<string>&amount=<number>&uuid=<string>
Estimación de ventas con número de serie de medidor
GET vending3.php?mode=estimate&submode=<string>&serialnumber=<string>&amount=<number>&uuid=<string>
Parámetros disponibles
Los siguientes parámetros de URL están disponibles al realizar una estimación de ventas
Param | Value | Required | Default |
---|---|---|---|
mode | estimate | Yes | |
submode | cash, cc, CC, check, arrears, gimme5, jc, wallet | Yes | |
account | La cuenta de Juice que está siendo vendida/abonada | No | |
serialnumber | Número de serie del medidor de la cuenta que se vende / abona | No | |
amount | El monto de la transacción | Yes*1 | |
coupon | Si submode=jc entonces este campo es el código único para la tarjeta de Juice |
No | |
ccauth | Si submode=cc entonces este campo es el código de autorización de la Terminal de la Tarjeta de Crédito |
No | |
cctrans | Si submode=cc entonces este campo es el código de transacción de la Terminal de la Tarjeta de Crédito |
No | |
ccnum | Si submode=CC entonces este es el número de la Tarjeta de Crédito que se enviará a la pasarela de CC para su procesamiento |
No | |
ccexpnth | Si submode=CC entonces este es el mes de expiración de la tarjeta para ser enviada al portal de CC para su procesamiento |
No | |
ccexpyr | Si submode=CC entonces este es el año de expiración de la tarjeta para ser enviada al portal de CC para su procesamiento |
No | |
ccfirst | Si submode=CC entonces este es el primer nombre de la tarjeta que se enviará a la puerta de enlace CC para su procesamiento |
No | |
cclast | Si submode=CC entonces este es el apellido de la tarjeta que se enviará a la puerta de enlace CC para su procesamiento |
No | |
cczip | Si submode=CC entonces este es el código postal de facturación que se enviará a la puerta de enlace CC para su procesamiento |
No | |
uuid | La identificación única de la transacción generada por Juice | Yes | |
return | json, xml | No | json |
Ventas / Vending
curl --basic --user 'login:password' --data 'mode=vend&submode=cash&account=03288&amount=10&uuid=af8d5fb2-0a3d-11ea-a672-df1c41ad4042' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=vend&submode=cash&account=03288&amount=10&uuid=af8d5fb2-0a3d-11ea-a672-df1c41ad4042');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "vend")
q.Set("submode", "cash")
q.Set("account", "03288")
q.Set("amount", "10")
q.Set("uuid", "af8d5fb2-0a3d-11ea-a672-df1c41ad4042")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"uuid": "af8d5fb2-0a3d-11ea-a672-df1c41ad4042",
"status": "OK",
"error": 0,
"message": "",
"customer": {
"account": "03288",
"portal": "test",
"serialnumber": "c2da6e3e",
"locid": "L03293",
"com": "none",
"meterunits": "kWh",
"meterstate": "CONNECTED",
"vendable": 1,
"contract": "5004001",
"name": "John Lennon",
"group1": "",
"group2": "",
"group3": "",
"address1": "123 Foo St.",
"address2": "",
"notify_days": 3,
"phone1": "14235551001",
"phone2": "",
"phone_notify": 0,
"sms1": "14235551001",
"sms2": "",
"sms_notify": 1,
"email1": "jlennon@example.com",
"email2": "",
"email_notify": 0,
"city": "Chattanooga",
"postal_code": "",
"country_code": null,
"account_type": "PrePaid",
"loc_address1": "123 Foo St.",
"loc_address2": "",
"loc_city": "Chattanooga",
"loc_name": "1009002",
"loc_state": "TN",
"loc_zip": "55555",
"loc_lat": 0,
"loc_long": 0,
"wallet": 0,
"gimme5_bal": 0,
"gimme5_count": 0,
"purchased_kwh_this_month": 0,
"unitwallet": "27.99",
"arrears_balance": 0
},
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9487.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990512.6,
"vendor_limit": 50,
"vendor_owed": 10,
"vendor_available": 40
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"motd": "",
"transaction": {
"id": 430,
"action": "SALE",
"type": "cash",
"amount": 10,
"apply_to_arrears": 0,
"apply_to_fixed": 0,
"apply_to_services": 10,
"apply_to_taxes": 0,
"apply_to_fuelcharges": 0,
"apply_to_wallet": 0,
"purchased_kwh": 27.99,
"kva_demand_charge": 0,
"bt1wh": 27988,
"bt1amt": 10,
"bt2wh": 0,
"bt2amt": 0,
"bt3wh": 0,
"bt3amt": 0,
"bt4wh": 0,
"bt4amt": 0,
"bt5wh": 0,
"bt5amt": 0,
"bt6wh": 0,
"bt6amt": 0,
"bt7wh": 0,
"bt7amt": 0,
"bt8wh": 0,
"bt8amt": 0,
"bt9wh": 0,
"bt9amt": 0,
"govnum": "0"
}
}
Este punto final realiza una venta a la cuenta del cliente, el submodo de venta más común es cash
ya que se trata de dinero en efectivo que se debe a la empresa de servicios públicos y ésta no suele aceptar los riesgos asociados a otros métodos de pago basados en el crédito por parte de un proveedor externo. Hay excepciones cuando se utiliza la API de venta para una integración estrecha con un proveedor de pagos que actúa como un front-end (cajero) para la empresa de servicios públicos.
Solicitud HTTP
Estimación de ventas con número de cuenta
GET vending3.php?mode=vend&submode=<string>&account=<string>&amount=<number>&uuid=<string>
Estimación de ventas con número de serie de medidor
GET vending3.php?mode=vend&submode=<string>&serialnumber=<string>&amount=<number>&uuid=<string>
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se realiza una estimación de ventas
Param | Value | Required | Default |
---|---|---|---|
mode | vend | Yes | |
submode | cash, cc, CC, check, arrears, gimme5, jc, wallet | Yes | |
account | Juice account that is being vended to/funded | No | |
serialnumber | La cuenta de Juice que se está vendiendo o abonando | No | |
amount | The transaction amount | Yes*1 | |
coupon | Si submode=jc entonces este campo es el código único para la Tarjeta de Juice |
No | |
ccauth | Si submode=cc entonces este campo es el código de autorización de la Terminal de la Tarjeta de Crédito |
No | |
cctrans | Si submode=cc entonces este campo es el código de transacción de la Terminal de la Tarjeta de Crédito |
No | |
ccnum | Si submode=CC entonces este es el número de la tarjeta de crédito que se enviará a la pasarela de CC para su procesamiento |
No | |
ccexpnth | Si submode=CC entonces este es el mes de expiración de la tarjeta para ser enviada al portal de CC para su procesamiento |
No | |
ccexpyr | Si submode=CC entonces este es el año de expiración de la tarjeta para ser enviada al portal de CC para su procesamiento |
No | |
ccfirst | Si submode=CC entonces este es el primer nombre de la tarjeta que se enviará a la puerta de enlace CC para su procesamiento |
No | |
cclast | Si submode=CC entonces este es el apellido de la tarjeta que se enviará a la puerta de enlace CC para su procesamiento |
No | |
cczip | Si submode=CC entonces este es el código postal de facturación que se enviará a la puerta de enlace CC para su procesamiento |
No | |
uuid | El ID de transacción único generado por Juice | Yes | |
return | json, xml | No | json |
Abonar a una billetera de divisas
curl --basic --user 'login:password' --data 'mode=fund&submode=cash&account=03288&amount=10&uuid=3743f6c0-0bb3-11ea-b926-0832e398a56c' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=fund&submode=cash&account=03288&amount=10&uuid=3743f6c0-0bb3-11ea-b926-0832e398a56c');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "fund")
q.Set("submode", "cash")
q.Set("account", "03288")
q.Set("amount", "10")
q.Set("uuid", "3743f6c0-0bb3-11ea-b926-0832e398a56c")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"uuid": "3743f6c0-0bb3-11ea-b926-0832e398a56c",
"status": "OK",
"error": 0,
"message": "",
"customer": {
"account": "03288",
"portal": "test",
"serialnumber": "c2da6e3e",
"locid": "L03293",
"com": "none",
"meterunits": "kWh",
"meterstate": "CONNECTED",
"vendable": 1,
"contract": "5004001",
"name": "John Lennon",
"group1": "",
"group2": "",
"group3": "",
"address1": "123 Foo St.",
"address2": "",
"notify_days": 3,
"phone1": "14235551001",
"phone2": "",
"phone_notify": 0,
"sms1": "14235551001",
"sms2": "",
"sms_notify": 1,
"email1": "jlennon@example.com",
"email2": "",
"email_notify": 0,
"city": "Chattanooga",
"postal_code": "",
"country_code": null,
"account_type": "PrePaid",
"loc_address1": "123 Foo St.",
"loc_address2": "",
"loc_city": "Chattanooga",
"loc_name": "1009002",
"loc_state": "TN",
"loc_zip": "55555",
"loc_lat": 0,
"loc_long": 0,
"wallet": 0,
"gimme5_bal": 0,
"gimme5_count": 0,
"purchased_kwh_this_month": 28,
"unitwallet": 27.99,
"arrears_balance": 0
},
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9497.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990502.6,
"vendor_limit": 50,
"vendor_owed": 20,
"vendor_available": 30
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"motd": "",
"wallet": {
"transaction_id": 431,
"action": "FUND",
"fund_amount": 10,
"balance": 10
}
}
Cuando se financie la cartera de divisas de un cliente, los fondos se añadirán a su el saldo actual para su uso posterior. La financiación de una cartera no genera una transacción a menos que el cliente tenga fijado un porcentaje de venta automática.
Solicitud HTTP
GET vending3.php?mode=fund&submode=<string>&account=<string>&amount=<string>&uuid=<string>
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se realiza un abono de billetera
Param | Values | Required | Default |
---|---|---|---|
mode | fund | Yes | |
submode | cash, cc | Yes | |
account | La cuenta de Juice que se está vendiendo o abonando | No | |
serialnumber | Número de serie del medidor de la cuenta que se está vendiendo o abonando | No | |
amount | El monto de la transacción | Yes | |
ccauth | Si submode=cc entonces este campo es el código de autorización de la Terminal de la Tarjeta de Crédito |
No | |
cctrans | SI submode=cc entonces este campo es el código de transacción de la Terminal de la tarjeta de Crédito |
No | |
uuid | El ID de transacción único generado por Juice | Yes | |
return | json, xml | No | json |
Verificación de la transacción
curl --basic --user 'login:password' --data 'mode=vend-check&uuid=af8d5fb2-0a3d-11ea-a672-df1c41ad4042' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=vend-check&uuid=af8d5fb2-0a3d-11ea-a672-df1c41ad4042');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "vend-check")
q.Set("uuid", "af8d5fb2-0a3d-11ea-a672-df1c41ad4042")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"uuid": "af8d5fb2-0a3d-11ea-a672-df1c41ad4042",
"status": "OK",
"error": 0,
"message": "",
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9497.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990502.6,
"vendor_limit": 50,
"vendor_owed": 20,
"vendor_available": 30
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"transaction": {
"id": 430,
"type": "cash",
"amount": 10,
"apply_to_arrears": 0,
"apply_to_fixed": 0,
"apply_to_services": 10,
"apply_to_taxes": 0,
"apply_to_fuelcharges": 0,
"apply_to_wallet": 0,
"purchased_kwh": 27.99,
"kva_demand_charge": 0,
"bt1wh": 27988,
"bt1amt": 10,
"bt2wh": 0,
"bt2amt": 0,
"bt3wh": 0,
"bt3amt": 0,
"bt4wh": 0,
"bt4amt": 0,
"bt5wh": 0,
"bt5amt": 0,
"bt6wh": 0,
"bt6amt": 0,
"bt7wh": 0,
"bt7amt": 0,
"bt8wh": 0,
"bt8amt": 0,
"bt9wh": 0,
"bt9amt": 0,
"govnum": "0"
}
}
El punto final (endpoint) mode=vend-check
permite devolver los detalles de la transacción para un ID de transacción específico de Juice o un UUID de transacción. Este endpoint es útil para verificar si Juice ha recibido y procesado una solicitud de venta previa..
Solicitud HTTP
Verificación de transacción con ID de transacción de Juice
GET vending3.php?mode=vend-check&transaction=<int>
Verificación de transacción con UUID de transacción de Juice
GET vending3.php?mode=vend-check&uuid=<string>
Parámetros disponibles
Los parámetros de URL disponibles durante una verificación de venta son los siguientes:
Param | Value | Required | Default |
---|---|---|---|
mode | vend-check | Yes | |
transaction | La identificación de la transacción de Juice | No | |
uuid | El UUID de Juice que se usó para la transacción | No | |
return | json, xml | No | json |
Llave (key) / Valores a enviar
Llave general / Valores
Los siguientes pares llave/valor son válidos para todas las solicitudes a esta API:
Key | Value | Description/Comments |
---|---|---|
mode | authtest, wallettransfer, balance, estimate, vend, fund, updatecustomer, search, new-transaction | Acción de nivel superior a realizar, este parámetro siempre se requiere |
account | número de cuenta de los clientes en Juice | en la mayoría de los casos el número de serie del medidor puede ser usado en su lugar |
serialnumber | número de serie del medidor | debe ser único en este portal |
lang | cualquier código de lenguaje de dos caracteres | opcional, en está predeterminado, afecta principalmente a los mensajes de error |
return | xml, json |
Búsqueda de cuentas Llave / Valores
Los siguientes pares llave/valor adicionales son válidos sólo para la búsqueda de cuentas::
mode=search
:
Key | Value | Description/Comments |
---|---|---|
searchfor | una cadena (string) para buscar una cuenta en Juice.. | Ver la sección de Account Search para obtener una lista de los campos en los que se pueden realizar búsquedas. |
Ventas / Abonar Llaves / Valores
Los siguientes pares llave / valor son válidos solo para abonos o ventas.
Key | Value | Description/Comments |
---|---|---|
submode | cash, cc, CC, check, arrears, gimme5, jc, wallet | Dependiendo del mode s se limita el tipo de submodos disponibles que se pueden utilizar para cada tipo de venta/abono |
transaction | la identificación numérica de la transacción de Juice | |
uuid | el único UUID generado por esta API para realizar una acción de venta/abonos | |
ccauth | cadena (string) de autenticación de tarjeta de crédito | when submode=cc |
cctrans | número de transacción de la tarjeta de crédito | when submode=cc |
ccnum | número de tarjeta de crédito | when submode=CC |
ccexpmth | mes de vencimiento de la tarjeta de crédito | when submode=CC |
ccexpyr | año de vencimiento de la tarjeta de crédito | when submode=CC |
ccfirst | el nombre del titular de la tarjeta tal como aparece en la tarjeta | when submode=CC |
cclast | apellido del titular de la tarjeta tal como aparece en la tarjeta | when submode=CC |
cczip | código postal de facturación del titular de la tarjeta | when submode=CC |
cccountry | código de país del titular de la tarjeta | when submode=CC |
amount | cantidad en la moneda local / del sistema | |
smsto | enviar un recibo SMS (con un Token si es aplicable) a cualquiera de los dos números de teléfono móvil en el archivo, o a un número enviado | Los números válidos son 1 o 2 o cualquier número de teléfono celular válido. Este valor es opcional. |
towallet | el número de cuenta de Juice para una transferencia de cartera | Este parámetro sólo es válido cuando se hace una transferencia de cartera |
includereceipt | devuelve un recibo formateado de Juice para una transacción si includereceipt=yes |
Sólo válido para transacciones (mode=vend ) |
Actualizar una cuenta Llave / Valores
Los siguientes pares llave / valor adicionales son válidos sólo para la actualización de la cuenta:
Key | Value | Description/Comments |
---|---|---|
phone1/phone2 | permite actualizar la información de los clientes phone1 o phone2 |
Sólo es válido si mode=updatecustomer |
email1/email2 | permite actualizar la información de los clientes email1 o email2 |
Sólo es válido si mode=updatecustomer |
sms1/sms2 | permite actualizar la información de los clientes sms1 o sms2 |
Sólo es válido si mode=updatecustomer |
notifydays | permite cambiar el número de días en que el cliente debe empezar a recibir notificaciones de saldo bajo | Sólo es válido si mode=updatecustomer |
emailnotify | permite cambiar si el cliente debe recibir avisos de saldo bajo por correo electrónico | Sólo es válido si mode=updatecustomer |
smsnotify | permite cambiar si el cliente debe recibir avisos de saldo bajo por SMS | Sólo es válido si mode=updatecustomer |
address1/address2 | permite cambiar la información de la dirección de facturación de los clientes | Sólo es válido si mode=updatecustomer |
city | permite cambiar la información de la ciudad de facturación de los clientes | Sólo es válido si mode=updatecustomer |
postalcode | permite cambiar el código postal de facturación de los clientes | Sólo es válido si mode=updatecustomer |
countrycode | permite cambiar el código de país de facturación de los clientes | Sólo es válido si mode=updatecustomer |
Errores
La API de venta de Juice usa los siguientes códigos de error:
C;odigo del error | Significado |
---|---|
0 | No hay error |
1001 | No se pudo encontrar un número de serie o cuenta de medidor coincidente |
1002 | Se requiere una cantidad de dinero para esta transacción |
1003 | La cantidad excede el límite de transacción única de puerta de enlace |
1004 | El parámetro mode no está presente en la solicitud. |
1005 | El submodo es inválido o falta para el modo. |
1006 | Submodo no válido para fondos de billetera |
1007 | POST duplicado detectado, reenviar en 2 minutos si es válido |
1010 | Venta no permitida u otro error ha ocurrido |
1011 | Error al actualizar la información del cliente. |
1080 | Importe o tipo de moneda incorrecto |
1090 | No se proporciona UUID para la acción de venta/fondo |
1091 | UUID no válido dado para la acción de venta / fondo |
1099 | Error de transacción: (el texto variará de acuerdo al error, este es un error no-API) |
1101 | Error de transacción: La tarjeta de crédito no tiene validez o la fecha de caducidad ha fallado |
9999 | Se produjo un error general al procesar la solicitud |
y— title: “Account Update” date: 2020-07-15T13:43:53-04:00 weight: 17
Actualización de la información del cliente
curl --basic --user 'login:password' --data 'mode=updatecustomer&account=03288&phone1=14235290857' \
--url 'https://acme.utiliflex.com/acme/vending3.php'
<?php
$url = 'https://acme.utiliflex.com/acme/vending3.php';
$chx = curl_init();
curl_setopt($chx, CURLOPT_USERPWD, 'login:password');
curl_setopt($chx, CURLOPT_URL, $url . '?mode=updatecustomer&account=03288&phone1=14235290857');
curl_setopt($chx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chx, CURLOPT_TIMEOUT, 10);
echo curl_exec($chx);
curl_close($chx);
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://acme.utiliflex.com/acme/vending3.php", nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth("login", "password")
q := req.URL.Query()
q.Set("mode", "updatecustomer")
q.Set("account", "03288")
q.Set("phone1", "14235290857")
req.URL.RawQuery = q.Encode()
resp, err := client.Do(req)
defer resp.Body.Close()
json, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", json)
}
{
"status": "OK",
"error": 0,
"message": "account 03288 updated",
"customer": {
"account": "03288",
"portal": "test",
"serialnumber": "c2da6e3e",
"locid": "L03293",
"com": "none",
"meterunits": "kWh",
"meterstate": "CONNECTED",
"vendable": 1,
"contract": "5004001",
"name": "John Lennon",
"group1": "",
"group2": "",
"group3": "",
"address1": "123 Foo St.",
"address2": "",
"notify_days": 3,
"phone1": "14235290856",
"phone2": "",
"phone_notify": 0,
"sms1": "14235551001",
"sms2": "",
"sms_notify": 1,
"email1": "jlennon@example.com",
"email2": "",
"email_notify": 0,
"city": "Chattanooga",
"postal_code": "",
"country_code": null,
"account_type": "PrePaid",
"loc_address1": "123 Foo St.",
"loc_address2": "",
"loc_city": "Chattanooga",
"loc_name": "1009002",
"loc_state": "TN",
"loc_zip": "55555",
"loc_lat": 0,
"loc_long": 0,
"wallet": 0,
"gimme5_bal": 0,
"gimme5_count": 0,
"purchased_kwh_this_month": 28,
"unitwallet": 27.99,
"arrears_balance": 0
},
"vendor": {
"vendor_number": "CEC",
"vendor_name": "County Electric",
"vendor_group_owed": 9497.4,
"vendor_group_limit": 100000000,
"vendor_group_available": 99990502.6,
"vendor_limit": 50,
"vendor_owed": 20,
"vendor_available": 30
},
"login": "jsmith",
"name": "John Smith",
"email": "",
"sms1": "",
"system_role": "CSR3",
"seclevel": "65",
"motd": ""
}
Es posible actualizar un conjunto limitado de información de facturación de los clientes utilizando este punto final (end point).
HTTP Request
GET vending3.php?mode=updatecustomer&account=<string>&<field>=<string>
Parámetros disponibles
Los siguientes parámetros de URL están disponibles cuando se actualiza la información del cliente:
Param | Value | Required | Default |
---|---|---|---|
mode | updatecustomer | Yes | |
phone1 | Actualiza el número de teléfono principal del cliente | No | |
phone2 | Actualiza el número de teléfono secundario del cliente | No | |
email1 | Actualiza la dirección de correo electrónico principal del cliente | No | |
email2 | Actualiza la dirección de correo electrónico secundaria del cliente | No | |
sms1 | Actualiza el número de SMS principal del cliente | No | |
sms2 | Actualiza el número de SMS secundario del cliente | No | |
notifydays | Actualiza el número de días antes de enviar un aviso de saldo bajo al cliente | No | |
emailnotify | Actualiza si el cliente debe recibir notificaciones por correo electrónico (el valor debe ser 1 = si 0 = no) | No | |
smsnotify | Actualiza si el cliente debe recibir notificaciones por SMS (el valor debe ser 1 = si 0 = no) | No | |
address1 | Actualiza la información de la dirección del cliente | No | |
address2 | Actualiza la información de la dirección del cliente | No | |
city | Actualiza la información de la ciudad del cliente | No | |
postalcode | Actualiza el código postal del cliente | No | |
countrycode | Actualiza la información del país del cliente. | No | |
return | json, xml | No | json |