Fix handling of payment intent values when returning created sub details #799
This commit is contained in:
parent
0d9da221a7
commit
8c61a27376
2 changed files with 42 additions and 10 deletions
|
|
@ -90,13 +90,30 @@ class SubscriptionController extends ApiController
|
||||||
// create subscription
|
// create subscription
|
||||||
// NOTE: for now we save ourselves the extra API call and assume the plan_id is valid since this won't change often anyway
|
// NOTE: for now we save ourselves the extra API call and assume the plan_id is valid since this won't change often anyway
|
||||||
$pm_sub = $pm->createSubscription($pm_cust['id'], $req->request->get('plan_id'));
|
$pm_sub = $pm->createSubscription($pm_cust['id'], $req->request->get('plan_id'));
|
||||||
if (!isset($pm_sub['response']['data']['id'])) {
|
$sub_pi = $pm_sub['response']['data']['attributes']['latest_invoice']['payment_intent'] ?? null;
|
||||||
|
|
||||||
|
// not the response we expected
|
||||||
|
if (empty($sub_pi)) {
|
||||||
return new ApiResponse(false, 'Error creating subscription. Please try again later.');
|
return new ApiResponse(false, 'Error creating subscription. Please try again later.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the payment intent must still be in a pending state
|
||||||
|
// TODO: log this somewhere
|
||||||
|
if ($sub_pi['status'] !== 'awaiting_payment_method') {
|
||||||
|
return new ApiResponse(false, 'Error creating subscription invoice. Please try again later.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetch payment intent details for client key
|
||||||
|
$pi = $pm->getPaymentIntent($sub_pi['id']);
|
||||||
|
if (empty($pi['response']['data']['id'])) {
|
||||||
|
return new ApiResponse(false, 'Error retrieving payment intent. Please try again later.');
|
||||||
|
}
|
||||||
|
|
||||||
// response
|
// response
|
||||||
return new ApiResponse(true, '', [
|
return new ApiResponse(true, '', [
|
||||||
'subscription_id' => $pm_sub['response']['data']['id'],
|
//'subscription_id' => $pm_sub['response']['data']['id'],
|
||||||
|
'payment_intent_id' => $pi['response']['data']['id'],
|
||||||
|
'payment_intent_client_key' => $pi['response']['data']['attributes']['client_key'],
|
||||||
'paymongo_public_key' => $this->getParameter('subscription_paymongo_public_key'),
|
'paymongo_public_key' => $this->getParameter('subscription_paymongo_public_key'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,9 @@ class PayMongoConnector
|
||||||
protected $base_url;
|
protected $base_url;
|
||||||
protected $public_key;
|
protected $public_key;
|
||||||
protected $secret_key;
|
protected $secret_key;
|
||||||
protected $hash;
|
|
||||||
|
protected $public_hash;
|
||||||
|
protected $secret_hash;
|
||||||
|
|
||||||
public function __construct($base_url)
|
public function __construct($base_url)
|
||||||
{
|
{
|
||||||
|
|
@ -25,7 +27,8 @@ class PayMongoConnector
|
||||||
{
|
{
|
||||||
$this->public_key = $public_key;
|
$this->public_key = $public_key;
|
||||||
$this->secret_key = $secret_key;
|
$this->secret_key = $secret_key;
|
||||||
$this->hash = $this->generateHash();
|
$this->public_hash = $this->generateHash($this->public_key);
|
||||||
|
$this->secret_hash = $this->generateHash($this->secret_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createCheckout(Customer $cust, $items, $ref_no = null, $description = null, $success_url = null, $cancel_url = null, $metadata = [])
|
public function createCheckout(Customer $cust, $items, $ref_no = null, $description = null, $success_url = null, $cancel_url = null, $metadata = [])
|
||||||
|
|
@ -278,6 +281,11 @@ class PayMongoConnector
|
||||||
return $this->doRequest('/v1/subscriptions', 'POST', $body);
|
return $this->doRequest('/v1/subscriptions', 'POST', $body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPaymentIntent($pi_id)
|
||||||
|
{
|
||||||
|
return $this->doRequest('/v1/payment_intents/' . $pi_id, 'GET');
|
||||||
|
}
|
||||||
|
|
||||||
public function attachPaymentIntent($pm_id, $pi_id)
|
public function attachPaymentIntent($pm_id, $pi_id)
|
||||||
{
|
{
|
||||||
$body = [
|
$body = [
|
||||||
|
|
@ -291,19 +299,26 @@ class PayMongoConnector
|
||||||
return $this->doRequest('/v1/payment_intents/' . $pi_id . '/attach', 'POST', $body);
|
return $this->doRequest('/v1/payment_intents/' . $pi_id . '/attach', 'POST', $body);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function generateHash()
|
protected function generateHash($key)
|
||||||
{
|
{
|
||||||
return base64_encode($this->secret_key);
|
return base64_encode($key);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function doRequest($url, $method, $request_body = [])
|
protected function buildHeaders($use_public_key = false)
|
||||||
{
|
{
|
||||||
$client = new Client();
|
$hash = $use_public_key ? $this->public_hash : $this->secret_hash;
|
||||||
$headers = [
|
|
||||||
|
return [
|
||||||
'Content-Type' => 'application/json',
|
'Content-Type' => 'application/json',
|
||||||
'accept' => 'application/json',
|
'accept' => 'application/json',
|
||||||
'authorization' => 'Basic '. $this->hash,
|
'authorization' => 'Basic '. $hash,
|
||||||
];
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function doRequest($url, $method, $request_body = [], $use_public_key = false)
|
||||||
|
{
|
||||||
|
$client = new Client();
|
||||||
|
$headers = $this->buildHeaders($use_public_key);
|
||||||
|
|
||||||
$request_params = ['headers' => $headers];
|
$request_params = ['headers' => $headers];
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue