Skip to content

Instantly share code, notes, and snippets.

@darolo
Last active August 29, 2015 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darolo/e6f5ff396445ef37562f to your computer and use it in GitHub Desktop.
Save darolo/e6f5ff396445ef37562f to your computer and use it in GitHub Desktop.
Adaptación API de MercadoPago para Symfony 2.7
# src\Acme\AppBundle\MercadoPago\MP.php
<?php
namespace Acme\AppBundle\MercadoPago;
/**
* MercadoPago Integration Library
* Access MercadoPago for payments integration
*
* @author hcasatti
*
*/
use Acme\AppBundle\MercadoPago\MPRestClient;
class MP{
const version = "0.3.2";
private $client_id;
private $client_secret;
private $ll_access_token;
private $access_data;
private $sandbox = FALSE;
function __construct() {
$i = func_num_args();
if ($i > 2 || $i < 1) {
throw new \Exception("Invalid arguments. Use CLIENT_ID and CLIENT SECRET, or ACCESS_TOKEN");
}
if ($i == 1) {
$this->ll_access_token = func_get_arg(0);
}
if ($i == 2) {
$this->client_id = func_get_arg(0);
$this->client_secret = func_get_arg(1);
}
}
public function sandbox_mode($enable = NULL) {
if (!is_null($enable)) {
$this->sandbox = $enable === TRUE;
}
return $this->sandbox;
}
/**
* Get Access Token for API use
*/
public function get_access_token() {
if (isset ($this->ll_access_token) && !is_null($this->ll_access_token)) {
return $this->ll_access_token;
}
$app_client_values = $this->build_query(array(
'client_id' => $this->client_id,
'client_secret' => $this->client_secret,
'grant_type' => 'client_credentials'
));
$access_data = MPRestClient::post("/oauth/token", $app_client_values, "application/x-www-form-urlencoded");
if ($access_data["status"] != 200) {
throw new \Exception ($access_data['response']['message'], $access_data['status']);
}
$this->access_data = $access_data['response'];
return $this->access_data['access_token'];
}
/**
* Get information for specific payment
* @param int $id
* @return array(json)
*/
public function get_payment($id) {
$access_token = $this->get_access_token();
$uri_prefix = $this->sandbox ? "/sandbox" : "";
$payment_info = MPRestClient::get($uri_prefix."/collections/notifications/" . $id . "?access_token=" . $access_token);
return $payment_info;
}
public function get_payment_info($id) {
return $this->get_payment($id);
}
/**
* Get information for specific authorized payment
* @param id
* @return array(json)
*/
public function get_authorized_payment($id) {
$access_token = $this->get_access_token();
$authorized_payment_info = MPRestClient::get("/authorized_payments/" . $id . "?access_token=" . $access_token);
return $authorized_payment_info;
}
/**
* Refund accredited payment
* @param int $id
* @return array(json)
*/
public function refund_payment($id) {
$access_token = $this->get_access_token();
$refund_status = array(
"status" => "refunded"
);
$response = MPRestClient::put("/collections/" . $id . "?access_token=" . $access_token, $refund_status);
return $response;
}
/**
* Cancel pending payment
* @param int $id
* @return array(json)
*/
public function cancel_payment($id) {
$access_token = $this->get_access_token();
$cancel_status = array(
"status" => "cancelled"
);
$response = MPRestClient::put("/collections/" . $id . "?access_token=" . $access_token, $cancel_status);
return $response;
}
/**
* Cancel preapproval payment
* @param int $id
* @return array(json)
*/
public function cancel_preapproval_payment($id) {
$access_token = $this->get_access_token();
$cancel_status = array(
"status" => "cancelled"
);
$response = MPRestClient::put("/preapproval/" . $id . "?access_token=" . $access_token, $cancel_status);
return $response;
}
/**
* Search payments according to filters, with pagination
* @param array $filters
* @param int $offset
* @param int $limit
* @return array(json)
*/
public function search_payment($filters, $offset = 0, $limit = 0) {
$access_token = $this->get_access_token();
$filters["offset"] = $offset;
$filters["limit"] = $limit;
$filters = $this->build_query($filters);
$uri_prefix = $this->sandbox ? "/sandbox" : "";
$collection_result = MPRestClient::get($uri_prefix."/collections/search?" . $filters . "&access_token=" . $access_token);
return $collection_result;
}
/**
* Create a checkout preference
* @param array $preference
* @return array(json)
*/
public function create_preference($preference) {
$access_token = $this->get_access_token();
$preference_result = MPRestClient::post("/checkout/preferences?access_token=" . $access_token, $preference);
return $preference_result;
}
/**
* Update a checkout preference
* @param string $id
* @param array $preference
* @return array(json)
*/
public function update_preference($id, $preference) {
$access_token = $this->get_access_token();
$preference_result = MPRestClient::put("/checkout/preferences/{$id}?access_token=" . $access_token, $preference);
return $preference_result;
}
/**
* Get a checkout preference
* @param string $id
* @return array(json)
*/
public function get_preference($id) {
$access_token = $this->get_access_token();
$preference_result = MPRestClient::get("/checkout/preferences/{$id}?access_token=" . $access_token);
return $preference_result;
}
/**
* Create a preapproval payment
* @param array $preapproval_payment
* @return array(json)
*/
public function create_preapproval_payment($preapproval_payment) {
$access_token = $this->get_access_token();
$preapproval_payment_result = MPRestClient::post("/preapproval?access_token=" . $access_token, $preapproval_payment);
return $preapproval_payment_result;
}
/**
* Get a preapproval payment
* @param string $id
* @return array(json)
*/
public function get_preapproval_payment($id) {
$access_token = $this->get_access_token();
$preapproval_payment_result = MPRestClient::get("/preapproval/{$id}?access_token=" . $access_token);
return $preapproval_payment_result;
}
/**
* Update a preapproval payment
* @param string $preapproval_payment, $id
* @return array(json)
*/
public function update_preapproval_payment($id, $preapproval_payment) {
$access_token = $this->get_access_token();
$preapproval_payment_result = MPRestClient::put("/preapproval/" . $id . "?access_token=" . $access_token, $preapproval_payment);
return $preapproval_payment_result;
}
/* Generic resource call methods */
/**
* Generic resource get
* @param uri
* @param params
* @param authenticate = true
*/
public function get($uri, $params = null, $authenticate = true) {
$params = is_array ($params) ? $params : array();
if ($authenticate !== false) {
$access_token = $this->get_access_token();
$params["access_token"] = $access_token;
}
if (count($params) > 0) {
$uri .= (strpos($uri, "?") === false) ? "?" : "&";
$uri .= $this->build_query($params);
}
$result = MPRestClient::get($uri);
return $result;
}
/**
* Generic resource post
* @param uri
* @param data
* @param params
*/
public function post($uri, $data, $params = null) {
$params = is_array ($params) ? $params : array();
$access_token = $this->get_access_token();
$params["access_token"] = $access_token;
if (count($params) > 0) {
$uri .= (strpos($uri, "?") === false) ? "?" : "&";
$uri .= $this->build_query($params);
}
$result = MPRestClient::post($uri, $data);
return $result;
}
/**
* Generic resource put
* @param uri
* @param data
* @param params
*/
public function put($uri, $data, $params = null) {
$params = is_array ($params) ? $params : array();
$access_token = $this->get_access_token();
$params["access_token"] = $access_token;
if (count($params) > 0) {
$uri .= (strpos($uri, "?") === false) ? "?" : "&";
$uri .= $this->build_query($params);
}
$result = MPRestClient::put($uri, $data);
return $result;
}
/**
* Generic resource delete
* @param uri
* @param data
* @param params
*/
public function delete($uri, $params = null) {
$params = is_array ($params) ? $params : array();
$access_token = $this->get_access_token();
$params["access_token"] = $access_token;
if (count($params) > 0) {
$uri .= (strpos($uri, "?") === false) ? "?" : "&";
$uri .= $this->build_query($params);
}
$result = MPRestClient::delete($uri);
return $result;
}
/* **************************************************************************************** */
private function build_query($params) {
if (function_exists("http_build_query")) {
return http_build_query($params, "", "&");
} else {
foreach ($params as $name => $value) {
$elements[] = "{$name}=" . urlencode($value);
}
return implode("&", $elements);
}
}
}
# src\Acme\AppBundle\MercadoPago\MPRestClient.php
<?php
namespace Acme\AppBundle\MercadoPago;
/**
* MercadoPago Integration Library
* Access MercadoPago for payments integration
*
* @author hcasatti
*
*/
class MPRestClient {
const API_BASE_URL = "https://api.mercadopago.com";
private static function get_connect($uri, $method, $content_type) {
if (!extension_loaded ("curl")) {
throw new \Exception("cURL extension not found. You need to enable cURL in your php.ini or another configuration you have.");
}
$connect = curl_init(self::API_BASE_URL . $uri);
curl_setopt($connect, CURLOPT_USERAGENT, "MercadoPago PHP SDK v" . MP::version);
curl_setopt($connect, CURLOPT_RETURNTRANSFER, true);
curl_setopt($connect, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($connect, CURLOPT_HTTPHEADER, array("Accept: application/json", "Content-Type: " . $content_type));
return $connect;
}
private static function set_data(&$connect, $data, $content_type) {
if ($content_type == "application/json") {
if (gettype($data) == "string") {
json_decode($data, true);
} else {
$data = json_encode($data);
}
if(function_exists('json_last_error')) {
$json_error = json_last_error();
if ($json_error != JSON_ERROR_NONE) {
throw new \Exception("JSON Error [{$json_error}] - Data: {$data}");
}
}
}
curl_setopt($connect, CURLOPT_POSTFIELDS, $data);
}
private static function exec($method, $uri, $data, $content_type) {
$connect = self::get_connect($uri, $method, $content_type);
if ($data) {
self::set_data($connect, $data, $content_type);
}
$api_result = curl_exec($connect);
$api_http_code = curl_getinfo($connect, CURLINFO_HTTP_CODE);
if ($api_result === FALSE) {
throw new \Exception (curl_error ($connect));
}
$response = array(
"status" => $api_http_code,
"response" => json_decode($api_result, true)
);
if ($response['status'] >= 400) {
throw new \Exception ($response['response']['message'], $response['status']);
}
curl_close($connect);
return $response;
}
public static function get($uri, $content_type = "application/json") {
return self::exec("GET", $uri, null, $content_type);
}
public static function post($uri, $data, $content_type = "application/json") {
return self::exec("POST", $uri, $data, $content_type);
}
public static function put($uri, $data, $content_type = "application/json") {
return self::exec("PUT", $uri, $data, $content_type);
}
public static function delete($uri, $content_type = "application/json") {
return self::exec("DELETE", $uri, $null, $content_type);
}
}
# src/Acme/AppBundle/Controller/MyController.php
<?php
namespace Acme/AppBundle/Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// use ...
class MyController extends Controller {
public function indexAction(){
// ...
$mp = $this->get( 'mercado_pago' );
$access_token = $mp->get_access_token();
// ...
}
}
# app/config/services.yml
parameters:
client_id: 4654213216546542
client_secret: ASDKasdaksdalskdASLdkañskdakjsdk
services:
mercado_pago:
class: Acme\AppBundle\MercadoPago\MP
arguments: ["%client_id%", "%client_secret%"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment