Fiz a adição do type "customer" à requisição do payment, estou usando a biblioteca dx-php 1.2.1 (mas também testei no postman)
<?php
$url = "https://api.mercadopago.com/v1/card_tokens?public_key=$this->publicToken";
$data = [ "card_id" => $card->id ];
$client = new Client(); // HTTP Client
$result = $client->request("POST", $url, [ 'json' => $data ])->getBody();
$cardToken = json_decode($result->getContents(), true);
$paymentMethodId = $card->payment_method->id;
$this->logger->debug([ $card->id, $cardToken['id'] ]);
$this->logger->debug("\n");
$payment = new MercadoPago\Payment();
$payment->transaction_amount = 121;
$payment->token = $cardToken['id'];
$payment->statement_descriptor = "Assinatura";
$payment->description = "Assinatura do serviço tal";
$payment->installments = 1;
$payment->payment_method_id = $paymentMethodId;
$payment->payer = [ 'id' => $customer->id, 'type' => 'customer' ];
$payment->notification_url = $this->notificationUrl;
$payment->capture = true;
$payment->binary_mode = true;
$payment->save();
no entanto ocorre o erro:
{ "message": "security_code_id cant be null",
"error": "bad_request",
"status": 400,
"cause": [
{
"code": 3031,
"description": "security_code_id cant be null",
"data": null
}
]
}
Tanto no php quanto no postman.
Não achei nada na documentação quanto a isso. Esse erro só ocorre quando eu uso o card token gerado na rota card_tokens, ele não ocorre usando um card token gerado pelo formulário do browser.
Bom dia, voce precisa adicionar o security_code ao gerar o segundo cardtoken, exemplo:
Veja essa documentação: https://www.mercadopago.com.br/developers/pt/guides/payments/api/advanced-integration