NAV
Shell PHP Go

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:

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:

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 ccauthy 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 modes 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