solucion - Tarjeta por defecto de actualización de clientes(PHP)
undefined index variable error in php (3)
1. Información general
La respuesta de @tim Peterson es completa y satisface la pregunta planteada originalmente. Sin embargo, esta pregunta de Stackoverflow es uno de los primeros éxitos para configurar la tarjeta predeterminada para Stripe, así que quería documentar mis propios hallazgos con un poco más de detalle.
2. Flujo
Primero es importante comprender el flujo de guardar una tarjeta, y es importante para almacenar de forma segura las referencias a las tarjetas de crédito.
En general, agregará una tarjeta y la configurará como predeterminada en el momento, o almacenará la identificación de la tarjeta de crédito (¡no el número de la tarjeta de crédito!) En su base de datos para realizar acciones en su contra.
Tenga en cuenta que al agregar una primera tarjeta a un usuario, será la predeterminada por, bueno, por defecto.
2.1. Creación de clientes
- Desde tu aplicación crea un cliente en Stripe a través de la api
- Un objeto de cliente es devuelto por Stripe , incluyendo,
customer->id
- Como mínimo, almacene el
customer->id
en su aplicación . Esto normalmente estaría en la tabla deuser
o similar.
Un VARCHAR con 255 caracteres parece apropiado; sin embargo , después de conversar directamente con Stripe, no tienen una longitud de documento de ID en su sistema.
2.2. Creación de tarjetas
En una etapa posterior, querrá agregar una tarjeta.
- Primero use la biblioteca Stripe JS como se documenta en su site . La idea aquí es que la acción de envío del formulario apunta directamente a los servidores de Stripe, de modo que cuando se envía el formulario, los detalles reales de la tarjeta de crédito nunca llegan a su servidor. Aunque es técnicamente posible crear tarjetas sin la Raya JS, a menos que haya una buena razón, me atendré a la forma recomendada y dejaré que haga el trabajo pesado.
- El usuario está en el formulario de su tarjeta de crédito y ocurre lo siguiente:
- Ingresan los datos de su tarjeta de crédito en su formulario.
- Pulsan enviar
- Todas las entradas de formulario se envían a Stripe a través de ajax
En caso de éxito, Stripe JS devolverá una respuesta con los siguientes datos:
- response.id
- response.card.id
- response.card.last4
- response.card.brand
- response.card.exp_month
- response.card.exp_year
En los ejemplos de Stripe, añaden al DOM un grupo de elementos de formulario ocultos, llenan los datos anteriores y luego "envían el formulario para realz esta vez".
- Su backend, sea lo que sea, recibirá los datos anteriores, y puede almacenarlo como mejor le parezca.
2.3. Establecer el valor predeterminado
Ahora volvamos a la pregunta original. En algún momento, es posible que tenga un usuario con varias tarjetas y necesite configurar una como predeterminada.
Debido a que almacenó los datos de retorno del formulario anterior, ahora debería tener una lista de tarjetas, identificaciones de tarjetas y otras cosas en su base de datos. Así que simplemente haga un bucle sobre ellos, y la tarjeta que haga clic en el usuario como predeterminada, busque la identificación de la tarjeta y actualice la propiedad default_source
respecto al objeto del cliente con el valor de la identificación de la tarjeta.
3 ejemplos
Esto reflejará los tres pasos anteriores con algunos fragmentos de código muy sueltos (usar PHP pero debería ser lo suficientemente fácil de seguir).
Tenga en cuenta que me estoy saltando la captura de errores y las excepciones por razones de brevedad. Al realizar cualquier interacción con una fuente externa, siempre es una buena práctica ser diligente con su manejo de excepciones; básicamente, suponga que el servicio fallará.
3.1 Creación de clientes
// Send details to Stripe
$customer = /Stripe/Customer::create([
''email'' => $this->user->email,
''description'' => $this->user->name,
]);
// Then update our application
$this->user->stripe_customer_id = $customer->id;
$this->user->save();
3.2 Creación de la tarjeta
3.2.1 Javascript
module.exports = (function() {
function CreditCard() {
$(''#payment-form'').submit(function(e) {
var $form = $(this);
// Disable the submit button to prevent repeated clicks
$form.find(''button'').prop(''disabled'', true);
Stripe.card.createToken($form, function(status, response) {
var $form = $(''#payment-form'');
if (response.error) {
// Show the errors on the form
$form.find(''.payment-errors'').text(response.error.message);
$form.find(''.payment-errors'').parents(".row").show();
$form.find(''button'').prop(''disabled'', false);
} else {
// token contains id, last4, and card type
var token = response.id;
var cardId = response.card.id;
var last4 = response.card.last4;
var brand = response.card.brand;
var expMonth = response.card.exp_month;
var expYear = response.card.exp_year;
// Insert the token into the form so it gets submitted to the server
$form.append($(''<input type="hidden" name="stripeToken" />'').val(token));
$form.append($(''<input type="hidden" name="cardId" />'').val(cardId));
$form.append($(''<input type="hidden" name="last4" />'').val(last4));
$form.append($(''<input type="hidden" name="brand" />'').val(brand));
$form.append($(''<input type="hidden" name="expMonth" />'').val(expMonth));
$form.append($(''<input type="hidden" name="expYear" />'').val(expYear));
// and re-submit
$form.get(0).submit();
}
});
// Prevent the form from submitting with the default action
return false;
});
}
return CreditCard;
})();
3.2.2 Backend
public function save(string $token, string $cardId, string $last4, string $brand, int $expMonth, int $expYear)
{
// Store in our application
$creditCard = $this->user->creditCards()->create([
''token_id'' => $token,
''card_id'' => $cardId,
''last4'' => $last4,
''brand'' => $brand,
''exp_month'' => $expMonth,
''exp_year'' => $expYear
]);
}
3.3 Configuración de la predeterminada
Customer::retrieve($this->user->stripe_customer_id);
$customer->default_source = $cardId;
$customer->save();
Me gustaría actualizar la tarjeta predeterminada para un cliente utilizando Stripe.
En los documentos de update customer
API del update customer
no está claro qué introducir para el parámetro de la card
.
En PHP, he intentado configurar la card
según el método de retrieve card
esta manera:
$customer->card=$card[''id'']
pero eso no parece funcionar. Tampoco usando el token de esta manera:
$customer->source=$_POST[''stripe_token]
así que estoy un poco perdido. ¿Pensamientos?
Crear una nueva tarjeta y asignar una tarjeta como fuente predeterminada
Si desea crear una nueva tarjeta y configurarla para que sea la tarjeta predeterminada, intente esto.
* Tenga en cuenta que el token de banda debe provenir de una solicitud de banda js y la identificación del cliente de banda probablemente provendrá del usuario autenticado.
// Get the customer
$customer = Customer::retrieve("cus_9jF6ku4f2pztRo");
// Add a new card to the customer
$card = $customer->sources->create([''source'' => "tok_19PmcMI94XzVK71QeIwtUJmM"]);
// Set the new card as the customers default card
$customer->default_source = $card->id;
$customer->save();
Pude responder mi propia pregunta con el soporte de Stripe en el canal IRC #stripe :
El parámetro de la card
está especificado por default_source
esta manera:
Stripe::setApiKey($stripe_private_key);
$customer = Stripe_Customer::retrieve($stripe_cus_id);
$customer->default_source=$card[''id''];
$customer->save();