<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jorge Arraga</title>
    <description>The latest articles on DEV Community by Jorge Arraga (@jarraga).</description>
    <link>https://dev.to/jarraga</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F492136%2F751e0590-b423-40b3-8318-f970ff6895ad.jpg</url>
      <title>DEV Community: Jorge Arraga</title>
      <link>https://dev.to/jarraga</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jarraga"/>
    <language>en</language>
    <item>
      <title>✨ Introducing data2ui | turn any JSON into a clear, navigable UI</title>
      <dc:creator>Jorge Arraga</dc:creator>
      <pubDate>Sun, 30 Nov 2025 15:55:58 +0000</pubDate>
      <link>https://dev.to/jarraga/introducing-data2ui-turn-any-json-into-a-clear-navigable-ui-4npl</link>
      <guid>https://dev.to/jarraga/introducing-data2ui-turn-any-json-into-a-clear-navigable-ui-4npl</guid>
      <description>&lt;p&gt;&lt;strong&gt;data2ui&lt;/strong&gt; is a small tool that lets you paste or load any JSON and immediately explore it through a clean UI. No setup, no accounts required. Just open the app, drop your data, and browse it in a way that’s easier than scrolling through raw text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9stpxubhzma9x7gie6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9stpxubhzma9x7gie6h.png" alt="home" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use it entirely locally in your browser, or switch to the cloud version if you want to keep your files online and share them with your team in read-only mode.&lt;/p&gt;

&lt;p&gt;The project is built and maintained by one developer, and new features are already on the way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📁 Folder support&lt;/li&gt;
&lt;li&gt;🧩 New UI components&lt;/li&gt;
&lt;li&gt;🔌 A full REST API to manipulate files&lt;/li&gt;
&lt;li&gt;📴 Offline support&lt;/li&gt;
&lt;li&gt;…and many more enhancements already in progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your JSON changes as you work, data2ui lets you see how the structure evolves in real time. And if you’re collaborating, you can just send someone a share link and they’ll see exactly what you see.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://data2ui.jarraga.dev" rel="noopener noreferrer"&gt;https://data2ui.jarraga.dev&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Try it in &lt;a href="https://marketplace.visualstudio.com/items?itemName=jarraga.data2ui-preview" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; — you’ll love it!&lt;/p&gt;

&lt;p&gt;Thanks for testing the app and giving it a try. Feedback is always welcome.&lt;/p&gt;

</description>
      <category>ui</category>
      <category>json</category>
      <category>data</category>
      <category>tooling</category>
    </item>
    <item>
      <title>env-literal [node.js]</title>
      <dc:creator>Jorge Arraga</dc:creator>
      <pubDate>Mon, 11 Oct 2021 21:45:46 +0000</pubDate>
      <link>https://dev.to/jarraga/env-literal-node-js-34mo</link>
      <guid>https://dev.to/jarraga/env-literal-node-js-34mo</guid>
      <description>&lt;p&gt;This package iterates the variables of the process.env object, and parses them as if it were a literal javascript string, and injects them back into the same object&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:3000
&lt;span class="nv"&gt;API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, the API variable will have the value &lt;a href="http://localhost:3000/api" rel="noopener noreferrer"&gt;http://localhost:3000/api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unlike dotenv or dotenv-expand, variables are read directly from the system environment and not from an .env file&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage: as soon as possible, run the function:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;envLiteral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@jarraga/env-literal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;envLiteral&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// call envLiteral(true) for debugging&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@jarraga/env-literal" rel="noopener noreferrer"&gt;Link to NPM&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DOM 3D view | Edge devTools</title>
      <dc:creator>Jorge Arraga</dc:creator>
      <pubDate>Fri, 23 Apr 2021 21:24:27 +0000</pubDate>
      <link>https://dev.to/jarraga/dom-3d-view-edge-devtools-1di0</link>
      <guid>https://dev.to/jarraga/dom-3d-view-edge-devtools-1di0</guid>
      <description>&lt;p&gt;I discovered this functionality a couple of days ago and wanted to share it here&lt;/p&gt;

&lt;p&gt;To test it, enter a page or the same page that you are reading with Microsoft Edge, then open the console with F12, go to the three points &amp;gt; More tools &amp;gt; 3D view&lt;/p&gt;

&lt;p&gt;You can view the position of a particular element, or the entire DOM&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foeoi1wr3mcmco6svimqb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foeoi1wr3mcmco6svimqb.png" alt="dom3D" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can also be accessed by clicking the icon next to the &lt;code&gt;z-index&lt;/code&gt; property in the styles section of devTools&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkm3b8fl6e6l2fbfakiod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkm3b8fl6e6l2fbfakiod.png" alt="zIndex" width="228" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let you the official docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/microsoft-edge/devtools-guide-chromium/3d-view" rel="noopener noreferrer"&gt;Microsoft docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>edge</category>
      <category>debug</category>
      <category>console</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Prevent app crash Node JS</title>
      <dc:creator>Jorge Arraga</dc:creator>
      <pubDate>Fri, 16 Apr 2021 00:42:54 +0000</pubDate>
      <link>https://dev.to/jarraga/prevent-app-crash-node-js-3m7c</link>
      <guid>https://dev.to/jarraga/prevent-app-crash-node-js-3m7c</guid>
      <description>&lt;p&gt;There are two main reasons why our node application crashes, uncaught exceptions, and unhandled rejections&lt;/p&gt;

&lt;p&gt;While the correct way to fix this problem would be to handle all these exceptions and rejections, sometimes our application crashes due to a error in one part of the code, and this causes the entire app flow to not be able to continue&lt;/p&gt;

&lt;p&gt;I show you how to prevent this behavior&lt;/p&gt;

&lt;p&gt;The trick is add two listeners in the top of app, for the unhandled exceptions and rejections, this way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uncaughtException&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;----- Uncaught exception -----&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;----- Exception origin -----&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unhandledRejection&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;----- Unhandled Rejection at -----&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;----- Reason -----&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To demonstrate that works, I add a setInterval function next to the listeners&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app still running&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to make app crash, I call a function that doesn't exists&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;nonExistingFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see, the uncaughtException runs, and app continues its execution&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-----&lt;/span&gt; Uncaught exception &lt;span class="nt"&gt;-----&lt;/span&gt;
ReferenceError: nonExistingFunction is not defined
    at Object.&amp;lt;anonymous&amp;gt; &lt;span class="o"&gt;(&lt;/span&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\J&lt;/span&gt;orge&lt;span class="se"&gt;\D&lt;/span&gt;esktop&lt;span class="se"&gt;\t&lt;/span&gt;est&lt;span class="se"&gt;\t&lt;/span&gt;.js:19:1&lt;span class="o"&gt;)&lt;/span&gt;
    at Module._compile &lt;span class="o"&gt;(&lt;/span&gt;internal/modules/cjs/loader.js:999:30&lt;span class="o"&gt;)&lt;/span&gt;
    at Object.Module._extensions..js &lt;span class="o"&gt;(&lt;/span&gt;internal/modules/cjs/loader.js:1027:10&lt;span class="o"&gt;)&lt;/span&gt;
    at Module.load &lt;span class="o"&gt;(&lt;/span&gt;internal/modules/cjs/loader.js:863:32&lt;span class="o"&gt;)&lt;/span&gt;
    at Function.Module._load &lt;span class="o"&gt;(&lt;/span&gt;internal/modules/cjs/loader.js:708:14&lt;span class="o"&gt;)&lt;/span&gt;
    at Function.executeUserEntryPoint &lt;span class="o"&gt;[&lt;/span&gt;as runMain] &lt;span class="o"&gt;(&lt;/span&gt;internal/modules/run_main.js:60:12&lt;span class="o"&gt;)&lt;/span&gt;
    at internal/main/run_main_module.js:17:47
&lt;span class="nt"&gt;-----&lt;/span&gt; Exception origin &lt;span class="nt"&gt;-----&lt;/span&gt;
uncaughtException
app still running
app still running
app still running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I let you official node JS documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/api/process.html#process_event_uncaughtexception" rel="noopener noreferrer"&gt;Uncaught exception&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/api/process.html#process_warning_using_uncaughtexception_correctly" rel="noopener noreferrer"&gt;Warning: Using 'uncaughtException' correctly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/api/process.html#process_event_unhandledrejection" rel="noopener noreferrer"&gt;Unhandled rejection&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>crash</category>
      <category>errors</category>
    </item>
    <item>
      <title>Multiple fetches + params</title>
      <dc:creator>Jorge Arraga</dc:creator>
      <pubDate>Wed, 10 Mar 2021 19:02:02 +0000</pubDate>
      <link>https://dev.to/jarraga/multiple-fetches-params-214a</link>
      <guid>https://dev.to/jarraga/multiple-fetches-params-214a</guid>
      <description>&lt;p&gt;Suppose we need get data from multiple endpoints and proccess all toghether when all requests are finished.&lt;br&gt;
Together with the request we need to pass other parameters to identify them or do something else.&lt;/p&gt;

&lt;p&gt;In order to make a requests adding parameters, we'll create our own function that will contain the fetch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ownFetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now we can create an empty array of requests (promises), I'll use jsonplaceholder to get fake info and test code.&lt;br&gt;
Suppose we want to take somethings todos, and each todo has its respective id and thus its own endpoint.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;todos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ownFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://jsonplaceholder.typicode.com/todos/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`Request #&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The final step is to run all the requests through the Promise.all() function and get results:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The result:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    data: &lt;span class="o"&gt;{&lt;/span&gt;
        userId: 1,
        &lt;span class="nb"&gt;id&lt;/span&gt;: 1,
        title: &lt;span class="s1"&gt;'delectus aut autem'&lt;/span&gt;,
        completed: &lt;span class="nb"&gt;false&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    params: &lt;span class="s1"&gt;'Request #0'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
    data: &lt;span class="o"&gt;{&lt;/span&gt;
        userId: 1,
        &lt;span class="nb"&gt;id&lt;/span&gt;: 3,
        title: &lt;span class="s1"&gt;'fugiat veniam minus'&lt;/span&gt;,
        completed: &lt;span class="nb"&gt;false&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    params: &lt;span class="s1"&gt;'Request #1'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
    data: &lt;span class="o"&gt;{&lt;/span&gt;
        userId: 1,
        &lt;span class="nb"&gt;id&lt;/span&gt;: 5,
        title: &lt;span class="s1"&gt;'laboriosam mollitia...'&lt;/span&gt;,
        completed: &lt;span class="nb"&gt;false&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    params: &lt;span class="s1"&gt;'Request #2'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
    data: &lt;span class="o"&gt;{&lt;/span&gt;
        userId: 1,
        &lt;span class="nb"&gt;id&lt;/span&gt;: 10,
        title: &lt;span class="s1"&gt;'illo est ratione...'&lt;/span&gt;,
        completed: &lt;span class="nb"&gt;true&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    params: &lt;span class="s1"&gt;'Request #3'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can use Promise.allSettled() instead of Promise.all(), the differences is explained by Victor in this post:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/viclafouch" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F264616%2Fbb2fd5c3-b52c-49fd-962f-2e9e1f67c381.jpeg" alt="viclafouch"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/viclafouch/promise-allsettled-vs-promise-all-in-javascript-4mle" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🤝 Promise.allSettled() VS Promise.all() in JavaScript 🍭&lt;/h2&gt;
      &lt;h3&gt;Victor de la Fouchardière ・ Aug 16 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#node&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;I leave you the complete code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ownFetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;todos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ownFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://jsonplaceholder.typicode.com/todos/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`Request #&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👋🏽&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>promise</category>
      <category>fetch</category>
      <category>requests</category>
    </item>
    <item>
      <title>Vite.js + Vue 3 + router + vuex + tailwindcss template</title>
      <dc:creator>Jorge Arraga</dc:creator>
      <pubDate>Sun, 07 Mar 2021 17:23:01 +0000</pubDate>
      <link>https://dev.to/jarraga/vite-js-vue-3-router-vuex-tailwindcss-template-e05</link>
      <guid>https://dev.to/jarraga/vite-js-vue-3-router-vuex-tailwindcss-template-e05</guid>
      <description>&lt;h3&gt;
  
  
  Github CLI usage
&lt;/h3&gt;

&lt;p&gt;If you don't use github CLI to manage yours repositories I recommend that you do it. &lt;a href="https://cli.github.com" rel="noopener noreferrer"&gt;Install here&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can create a repo using this code as a template, the command will create your repo directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh repo create &amp;lt;ownRepoName&amp;gt; &lt;span class="nt"&gt;--private&lt;/span&gt; &lt;span class="nt"&gt;--template&lt;/span&gt; jarraga/vite-vue3-template
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;? This will create the &lt;span class="s2"&gt;"&amp;lt;ownRepoName&amp;gt;"&lt;/span&gt; repository on Github, Continue? &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt; -&amp;gt; YES
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;? Create a &lt;span class="nb"&gt;local &lt;/span&gt;project directory &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;ownRepoName&amp;gt;"&lt;/span&gt;? &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt; -&amp;gt; YES
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, you have new repository created on Github and local files to start coding.&lt;br&gt;
Let's install dependencies and run dev server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;ownRepoName&amp;gt;
npm i
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it, open folder with your code editor and start make changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recomended plugins if you're using visual studio code:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=octref.vetur" rel="noopener noreferrer"&gt;vetur&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss" rel="noopener noreferrer"&gt;tailwind&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thing to keep in mind for tailwindcss
&lt;/h3&gt;

&lt;p&gt;If you want to make components using dynamic tailwind classes, you have to literal write the entire classes in an object and acces to it, instead of use something like  &lt;code&gt;bg-${color}-300&lt;/code&gt;&lt;br&gt;
Simon explain this in detail in this video:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/HZn2LtBT59w?t=509" rel="noopener noreferrer"&gt;https://youtu.be/HZn2LtBT59w?t=509&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you find it useful! 👋🏽&lt;/p&gt;

</description>
      <category>vite</category>
      <category>vue</category>
      <category>vuex</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Mercadopago | Checkout PRO (postman, no library)</title>
      <dc:creator>Jorge Arraga</dc:creator>
      <pubDate>Wed, 17 Feb 2021 15:01:02 +0000</pubDate>
      <link>https://dev.to/jarraga/mercadopago-checkout-pro-postman-no-library-1kh3</link>
      <guid>https://dev.to/jarraga/mercadopago-checkout-pro-postman-no-library-1kh3</guid>
      <description>&lt;p&gt;Hace unos días tuve la oportunidad de certificarme como Certified Developer para la integración del checkout pro, muy buen producto de mercadopago.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys7gm3f7q2u9krotmti1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys7gm3f7q2u9krotmti1.png" alt="certificado" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este post quiero dejarles el paso a paso para probar el funcionamiento de la API  ya que, a pesar de la documentación y los ejemplos, hay cosas que no quedan del todo claras.&lt;/p&gt;

&lt;p&gt;Para realizar este proyecto no vamos a utilizar ninguna librería externa o tecnología en particular, sino que vamos a hacer las consultas HTTP utilizando postman, y luego podremos exportarlas en formato de código.&lt;/p&gt;

&lt;p&gt;Para quienes no conocen postman es una herramienta que permite crear solicitudes HTTP con todos los datos necesarios, utilizar diferentes entornos, y que luego se pueden exportar a una variedad de códigos para usar en los desarrollos.&lt;br&gt;
A continuación les dejo un link a la colección de requests pública que cree para este ejercicio, y explico cómo usarla para que todo funcione correctamente.&lt;/p&gt;


&lt;h3&gt;
  
  
  Postman
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1GxUZGiydqHzEFGemY0lYn49mSJpskoZe/view?usp=sharing" rel="noopener noreferrer"&gt;Postman collection&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con el enlace anterior podemos bajar el json de una colección de Postman, vamos a utilizar dos secciones para hacer las pruebas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1f0ei9t9m6wj29ydmkbn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1f0ei9t9m6wj29ydmkbn.png" alt="entorno" width="685" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Environments
&lt;/h4&gt;

&lt;p&gt;Variables de entorno. Utilizaremos 3 tipos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Globals&lt;/strong&gt;: variables que están siempre disponibles, como por ejemplo la url base que es '&lt;a href="https://api.mercadopago.com" rel="noopener noreferrer"&gt;https://api.mercadopago.com&lt;/a&gt;'&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV_ENVIRONMENT&lt;/strong&gt;: variables para realizar pruebas con dinero ficticio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PROD_ENVIRONMENT&lt;/strong&gt;: variables para realizar operaciones en producción con dinero real.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Es mandatorio que seleccionemos el entorno correspondiente en cada consulta, de lo contrario las solicitudes no van a funcionar.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para utilizar estas variables, podemos escribirlas donde queramos con la sintaxis &lt;code&gt;{{variable}}&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Collections
&lt;/h4&gt;

&lt;p&gt;Colección de solicitudes GET, POST, que vamos a necesitar para ir probando la integración. Estas ya están preparadas con las variables de entorno, por lo que luego de configurarlas ya se las puede ejecutar.&lt;/p&gt;

&lt;p&gt;Pueden observar en cada una de las peticiones los valores de url, headers, body.&lt;/p&gt;
&lt;h4&gt;
  
  
  Exportar código
&lt;/h4&gt;

&lt;p&gt;La parte más útil de esto, es que cambiando las variables de entorno y seleccionando el entorno adecuado, puedan hacer sus propias pruebas y también exportar las consultas al lenguaje con el que trabajen.&lt;br&gt;
Para esto, deben presionar el botón &amp;lt;/&amp;gt; que se encuentra en la barra lateral derecha, seleccionar el lenguaje y copiar el código.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2For4fjkd7lxccm3jynbtf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2For4fjkd7lxccm3jynbtf.png" alt="postman" width="470" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este ejemplo se puede ver el código generado para utilizar fetch en javascript para el navegador, lo cual no podríamos hacer porque este código debe ser ejecutado del lado del servidor, pero yo utilizo node.js y la librería &lt;code&gt;node-fetch&lt;/code&gt; con lo cual el código es muy parecido.&lt;/p&gt;


&lt;h3&gt;
  
  
  Documentación oficial
&lt;/h3&gt;

&lt;p&gt;A lo largo del tutorial voy a ir dejando los links a la documentación oficial.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/es/guides/online-payments/checkout-pro/integration" rel="noopener noreferrer"&gt;Integración checkout pro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/en/reference" rel="noopener noreferrer"&gt;Referencia a la API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En la referencia a la API, los ejemplos de consulta estan escritos en cURL, les dejo una web app que parsea cURL a fetch, para poder copiar mejor los datos si quieren agregar consultas a postman luego.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kigiri.github.io/fetch" rel="noopener noreferrer"&gt;Web app para parsear peticiones cURL a feth&lt;/a&gt; &lt;/p&gt;


&lt;h3&gt;
  
  
  Comencemos
&lt;/h3&gt;

&lt;p&gt;En este proceso vamos a utilizar 3 cuentas diferentes de mercadopago, por lo que debemos tener en claro cual estamos usando en cada momento, voy a indicarlo pero hay que prestar especial atención.&lt;/p&gt;

&lt;p&gt;Las 3 cuentas son las siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cuenta &lt;strong&gt;REAL&lt;/strong&gt;: es nuestra propia cuenta de MP, donde vamos a recibir los pagos una vez que pongamos la aplicación en producción.&lt;/li&gt;
&lt;li&gt;Cuenta &lt;strong&gt;VENDEDOR&lt;/strong&gt;, es una cuenta de prueba, de la cual vamos a tomar las credenciales para testear la API.&lt;/li&gt;
&lt;li&gt;Cuenta &lt;strong&gt;COMPRADOR&lt;/strong&gt;, es una cuenta de prueba, con la que vamos a estar logueados para efectuar la compra a la cuenta vendedor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para utilizar los diferentes usuarios podemos tener varios navegadores como chrome, edge, firefox, o utilizar los modos incógnitos, de manera de no tener que entrar y salir de las cuentas constantemente.&lt;/p&gt;


&lt;h3&gt;
  
  
  1 Crear usuarios de prueba
&lt;/h3&gt;

&lt;p&gt;Lo primero que tenemos que hacer es crear el usuario &lt;strong&gt;VENDEDOR&lt;/strong&gt; y &lt;strong&gt;COMPRADOR&lt;/strong&gt;.&lt;br&gt;
Para esto, debemos acceder a las credenciales de nuestra cuenta &lt;strong&gt;REAL&lt;/strong&gt;.&lt;br&gt;
En todas las cuentas vamos a encontrar que tenemos dos tipos de credenciales, de &lt;strong&gt;PRUEBA&lt;/strong&gt; y de &lt;strong&gt;PRODUCCIÓN&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos a ingresar a las credenciales de &lt;strong&gt;PRUEBA&lt;/strong&gt; de la cuenta &lt;strong&gt;REAL&lt;/strong&gt;, y tomar el valor de Access Token.&lt;br&gt;
Para esto, debemos estar logueados con nuestro usuario real a la hora de ir al siguiente enlace:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/panel/credentials" rel="noopener noreferrer"&gt;Credenciales usuario REAL&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En postman, asignamos este string a la variable de entorno &lt;code&gt;devAccessToken&lt;/code&gt; en la sección &lt;strong&gt;Globals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Con esto ya podemos crear los usuarios de prueba ejecutando la solicitud "Generar usuarios de prueba" en la lista de la colección, vamos a obtener un resultado como este:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xtxusn0i8kvvotrvfbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xtxusn0i8kvvotrvfbl.png" alt="usuario prueba" width="455" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Debemos ejecutar la consulta dos veces para obtener el usuario &lt;strong&gt;VENDEDOR&lt;/strong&gt; y &lt;strong&gt;COMPRADOR&lt;/strong&gt;.&lt;br&gt;
Anotamos bien los datos en algún lugar ya que no lo podremos consultar luego.&lt;br&gt;
Mercadopago permite crear hasta 10 usuarios de prueba, y estos caducan después de 60 días de inactividad.&lt;br&gt;
Cualquiera de los 2 usuarios creados puede ser el vendedor o comprador, lo importante es que ambas partes sean de prueba.&lt;/p&gt;


&lt;h3&gt;
  
  
  2 Obtener credenciales del usuario &lt;strong&gt;VENDEDOR&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para continuar vamos a tomar las credenciales de &lt;strong&gt;PRODUCCIÓN&lt;/strong&gt; del usuario &lt;strong&gt;VENDEDOR&lt;/strong&gt;.&lt;br&gt;
Para esto, debemos loguearnos con el usuario de prueba que hayamos elegido como vendedor, podemos hacerlo en otro explorador, o en una pestaña de incógnito (para no desloguearnos con nuestro usuario real)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/panel/credentials" rel="noopener noreferrer"&gt;Credenciales usuario VENDEDOR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Siguiendo el link anterior, podrán acceder a las credenciales de producción, tomamos el valor de Access Token y lo asignamos a la variable de entorno &lt;code&gt;accessToken&lt;/code&gt; en &lt;strong&gt;DEV_ENVIRONMENT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyv8pml7mlpntc5mncdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyv8pml7mlpntc5mncdi.png" alt="credenciales vendedor" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ya podemos probar la API ejecutando la consulta "Tipos de documento" del listado en postman, seleccionando primero como entorno  &lt;strong&gt;DEV_ENVIRONMENT&lt;/strong&gt; y ver el resultado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8qd6449jzbttar86llr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8qd6449jzbttar86llr.png" alt="seleccionar entorno" width="280" height="195"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  3 Crear una preferencia de pago
&lt;/h3&gt;

&lt;p&gt;Una preferencia de pago es un documento en formato JSON que representa todas las partes de una operación, como ser datos del comprador, vendedor, ítems, cantidades, precios, urls de estado, etc.&lt;/p&gt;

&lt;p&gt;Si bien se puede crear una preferencia con unos pocos campos obligatorios, es mejor proveer la mayor información posible en este paso, ya que mercadopago tiene un motor antifraude, el cual realiza comprobaciones internas cruzando algunos de los datos que le brindamos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/en/reference/preferences/_checkout_preferences/post" rel="noopener noreferrer"&gt;Preferencia completa&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veamos un ejemplo de preferencia y analicemos los campos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1234"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Smartphone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"currency_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ARS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"picture_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pics.com/sf.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dispositivo móvil"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"category_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"art"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"unit_price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ricardo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"surname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alvarez"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ralvarez@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"area_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"22223333"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"identification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DNI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345678"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"street_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Calle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"street_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"zip_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1111"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"back_urls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"myapp.com/success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"failure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"myapp.com/failure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"myapp.com/pending"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"auto_return"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"approved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payment_methods"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"excluded_payment_methods"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amex"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"excluded_payment_types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"atm"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"installments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"notification_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"myapp.com/webhook"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"statement_descriptor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tienda eCommerce"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"external_reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mlplesoj9b"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Veamos las partes:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;items&lt;/strong&gt;: array de productos en nuestro carro de compras.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;payer&lt;/strong&gt;: información del pagador, si tienen registrado al usuario en su sitio seguramente tengan ya algunos datos para completar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;back_urls&lt;/strong&gt;: muy importante, urls a las que será redirigido tu usuario luego de haber completado una operación (sin cerrar el checkout) cualquiera sea el resultado, "success" si el pago fue aprobado, "failure" si rechazado, y "pending" si se utiliza medios de pagos físicos u otro que requiera una comprobación luego.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;auto_return&lt;/strong&gt;: si se deja en &lt;strong&gt;approved&lt;/strong&gt;, el usuario es redirigido automáticamente al sitio de success que figura en las &lt;code&gt;back_urls&lt;/code&gt; luego de 5 segundos (sin necesidad de que presione ningún botón).
También puede tener el valor &lt;strong&gt;all&lt;/strong&gt;, para que cualquiera sea el resultado se redirija automáticamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;payment_methods&lt;/strong&gt;: configuración de métodos de pago, se pueden excluir tipos y medios, y configurar la cantidad de cuotas para las tarjetas de crédito (installments).
Para ver la información sobre los métodos de pago se puede ejecutar la consulta "Metodos de pago" en la colección de postman.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;notification_url (webhook)&lt;/strong&gt;: muy importante, url a la que mercadopago hará una POST request informándonos de la creación o actualización de un pago, es necesario que tomemos estos datos, más abajo veremos cómo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;statement_descriptor&lt;/strong&gt;: texto que aparecerá en el resumen de tarjeta de tu comprador.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;external_reference&lt;/strong&gt;: string interno de tu aplicación para corroborar la operación con información de tu base de datos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una vez completado nuestro JSON para crear la preferencia, podemos ejecutar la consulta "Crear preferencia" de postman &lt;strong&gt;(el ejemplo anterior se encuentra en el body de dicha solicitud)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Obtendremos como resultado un JSON bastante extenso, del cual vamos a utilizar la propiedad &lt;code&gt;init_point&lt;/code&gt;, que es la url a la cual deberemos dirigir a nuestro usuario.&lt;br&gt;
Se ve como este ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"init_point": "https://www.mercadopago.com.ar/checkout/v1/redirect?pref_id=716087195-bcec52a0-1cae-4650-aa12-ae316f2f2674"&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  4 Iniciar flujo de pago
&lt;/h3&gt;

&lt;p&gt;Una vez que hayamos obtenido nuestra url para comenzar el flujo de pago, deberemos redirigir a nuestro usuario a esta. &lt;/p&gt;

&lt;p&gt;Para probar el flujo, debemos iniciar sesión con los datos de nuestro usuario de prueba &lt;strong&gt;COMPRADOR&lt;/strong&gt;, y acceder al link.&lt;br&gt;
Si por error accedemos al link con nuestro usuario &lt;strong&gt;REAL&lt;/strong&gt;, o &lt;strong&gt;VENDEDOR&lt;/strong&gt;, podemos obtener estos errores respectivamente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6g83rzqhytirri260la3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6g83rzqhytirri260la3.png" alt="errores" width="625" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accediendo al link con nuestro usuario &lt;strong&gt;COMPRADOR&lt;/strong&gt; entonces, veremos la siguiente pantalla:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogtzdx9ecs74ywp00wrk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogtzdx9ecs74ywp00wrk.png" alt="checkout" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si elegimos pagar con efectivo, el resultado de la operación siempre será "pending".&lt;/p&gt;

&lt;p&gt;Para probar los resultados "success" y "failure", podemos usar los datos de unas tarjetas de prueba que MP dispone para tal fin. Estas son las tarjetas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/es/guides/online-payments/checkout-pro/test-integration#bookmark_tarjetas_de_prueba" rel="noopener noreferrer"&gt;Tarjetas de prueba&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como pueden observar dependiendo del "nombre" que completen, será el resultado y la razón de la operación.&lt;br&gt;
En los campos de código de seguridad y DNI podemos poner cualquier número.&lt;/p&gt;

&lt;p&gt;Por ejemplo, usando la &lt;strong&gt;Visa 4509 9535 6623 3704&lt;/strong&gt; y el nombre &lt;strong&gt;APRO&lt;/strong&gt;, obtenemos como resultado un pago aprobado, y la redirección automática en 5 segundos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn5yw8j0ioqi97o33c88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn5yw8j0ioqi97o33c88.png" alt="aprobado" width="632" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O si ponemos por ejemplo FUND, nos rechaza por falta de fondos, y no redirige a menos que hagamos clic en "volver al sitio" o hayamos configurado &lt;code&gt;auto_return: all&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F443naq5kzbn7z7o9e33u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F443naq5kzbn7z7o9e33u.png" alt="sin fondos" width="632" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si vamos a la página principal de los usuarios VENDEDOR y COMPRADOR veremos sus respectivas actividades:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapo497wfegj5d42jzwzk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapo497wfegj5d42jzwzk.png" alt="actividad" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A continuación veremos como utilizar las &lt;code&gt;back_urls&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  5 Hacer uso de las back_urls
&lt;/h3&gt;

&lt;p&gt;Si nuestro usuario finaliza el flujo del checkout pro, es decir, si no cierra la página o pestaña antes de que termine, dependiendo del valor que hayamos pasado en la propiedad  &lt;code&gt;auto_return&lt;/code&gt; de la preferencia, sera redirigido automaticamente a la back_url que corresponda en base al resultado de la operación, o, al hacer clic en el botón "Volver al sitio".&lt;/p&gt;

&lt;p&gt;Cualquiera sea el caso debemos redirigir al usuario a la dirección que corresponda y capturar los parámetros que mercadopago nos pasa en el &lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1gbwv92y16ngof66qov9.png" rel="noopener noreferrer"&gt;query string&lt;/a&gt; de la url.&lt;br&gt;
Tiene este formato:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://myapp.com/?merchant_order_id=2334717960&amp;amp;merchant_account_id=null&amp;amp;processing_mode=aggregator&amp;amp;status=approved&amp;amp;collection_status=approved&amp;amp;payment_id=13710864554&amp;amp;payment_type=credit_card&amp;amp;site_id=MLA&amp;amp;external_reference=mlplesoj9b&amp;amp;collection_id=13710864554&amp;amp;preference_id=716087195-e9128a3b-f93e-40eb-8326-048cebbb1b1f&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Podemos usar la herramienta &lt;a href="https://www.freeformatter.com/url-parser-query-string-splitter.html" rel="noopener noreferrer"&gt;query string splitter&lt;/a&gt; para parsear los parámetros de esta url, obteniendo los siguientes datos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;merchant_order_id: 2334717960&lt;/code&gt;&lt;br&gt;
&lt;code&gt;merchant_account_id: null&lt;/code&gt;&lt;br&gt;
&lt;code&gt;processing_mode: aggregator&lt;/code&gt;&lt;br&gt;
&lt;code&gt;status: approved&lt;/code&gt;&lt;br&gt;
&lt;code&gt;collection_status: approved&lt;/code&gt;&lt;br&gt;
&lt;code&gt;payment_id: 13710864554&lt;/code&gt;&lt;br&gt;
&lt;code&gt;payment_type: credit_card&lt;/code&gt;&lt;br&gt;
&lt;code&gt;site_id: MLA&lt;/code&gt;&lt;br&gt;
&lt;code&gt;external_reference: mlplesoj9b&lt;/code&gt;&lt;br&gt;
&lt;code&gt;collection_id: 13710864554&lt;/code&gt;&lt;br&gt;
&lt;code&gt;preference_id: 716087195-e9128a3b-f93e-40eb-8326-048cebbb1b1f&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Con el valor de &lt;code&gt;payment_id&lt;/code&gt; podremos consultar el estado del pago mediante la API, completando el valor &lt;code&gt;paymentId&lt;/code&gt; en "DEV_ENVIRONMENT" y ejecutando la request "Consultar pago" de la colección de postman.&lt;br&gt;
Obtendremos un JSON con toda la información del pago.&lt;br&gt;
Los campos importantes a mirar acá son &lt;code&gt;status&lt;/code&gt; y &lt;code&gt;status_detail&lt;/code&gt;, si tienen los valores "approved" y "accredited" respectivamente, tenemos la seguridad de que el dinero ya se encuentra en nuestra cuenta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"approved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status_detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"accredited"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En caso de que un pago pendiente veremos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status_detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending_waiting_payment"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En caso de un pago rechazado por fondos por ejemplo veremos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rejected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status_detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cc_rejected_insufficient_amount"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora vamos a ver cómo obtener información de las operaciones sin depender de que el usuario vuelva a nuestro sitio o tener que consultar el payment desde los parámetros de las back urls.&lt;/p&gt;




&lt;h3&gt;
  
  
  6 Crear endpoint para el webhook o url de notificación
&lt;/h3&gt;

&lt;p&gt;Cuando un pago se crea o actualiza, mercadopago hace un POST request a la dirección que hayamos configurado en la propiedad &lt;code&gt;notification_url&lt;/code&gt; de nuestra preferencia.&lt;br&gt;
Para informar a mercadopago que hemos recibido correctamente la información, debemos responderle con un STATUS 200 o 201 desde nuestro servidor.&lt;/p&gt;

&lt;p&gt;En caso de que aún no hayamos creado el código para ejecutar del lado del servidor, podemos usar una herramienta muy útil para capturar estas solicitudes.&lt;br&gt;
Se trata de Hookbin, esta web app nos permite crear una url a la que podemos apuntar, y se encarga de capturar todas las peticiones.&lt;br&gt;
Ingresamos y presionamos "Create new endpoint"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hookbin.com/" rel="noopener noreferrer"&gt;Hookbin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqliwrsitapz3j4i1kks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqliwrsitapz3j4i1kks.png" alt="hookin" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez generada nuestra nueva url, vamos a usarla para recibir el webhook.&lt;br&gt;
Cambiemos la variable de entorno &lt;code&gt;webHook&lt;/code&gt; en "DEV_ENVIRONMENT" por la url de hookin, y ejecutemos la request "Crear preferencia", no olvidemos de chequear que este seleccionado el entorno correcto.&lt;/p&gt;

&lt;p&gt;Con esto obtendremos una nueva preferencia de pago, que tendrá como url de notificación la dirección de hookbin que le pasamos, y obtendremos el nuevo &lt;code&gt;init_point&lt;/code&gt; para hacer nuestra prueba.&lt;/p&gt;

&lt;p&gt;Accedemos al &lt;code&gt;init_point&lt;/code&gt; con nuestro usuario &lt;strong&gt;COMPRADOR&lt;/strong&gt;, y realizamos el proceso.&lt;br&gt;
En este caso voy a mostrar una operación aprobada o "success".&lt;br&gt;
Para ver la información recibida, nos vamos a la pestaña de hookbin y le damos actualizar o F5.&lt;br&gt;
Podemos ver que hay un par de solicitudes recibidas, nos interesa la que tiene la propiedad &lt;code&gt;"action": "payment.created"&lt;/code&gt;, lo que la identifica como la creación de un pago, veremos que en el body trae algunos valores:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74cebdo7fc09p4cz81f8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74cebdo7fc09p4cz81f8.png" alt="hook" width="430" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De estos datos es importante que tomemos el valor de &lt;strong&gt;id&lt;/strong&gt;, pero dentro del objeto &lt;strong&gt;data&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13711992133&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con este id podremos consultar el estado del pago cambiando la variable de entorno &lt;code&gt;paymentId&lt;/code&gt; y ejecutando "Consultar pago" como habíamos hecho anteriormente.&lt;br&gt;
Si se trata de un pago en efectivo, podemos guardar este id en nuestra base de datos para consultarlo luego.&lt;/p&gt;

&lt;p&gt;Si al consultar un pago nos encontramos con que esta pendiente, y el usuario realiza el pago luego (por ejemplo en pagofacil o rapipago), recibiremos otro hook con un action distinto &lt;code&gt;"action": "payment.updated"&lt;/code&gt;, lo que significa que la información del pago se actualizo, y podemos consultar nuevamente para ver si se aprobó o cual es su estado.&lt;/p&gt;

&lt;p&gt;Recuerden que en la creación de la preferencia siempre podemos pasar un valor en &lt;code&gt;external_reference&lt;/code&gt; para corroborar la operación con nuestra base de datos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/es/guides/notifications/webhooks" rel="noopener noreferrer"&gt;Documentación webhooks&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  7 Pasar a producción
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkq6clmn3t8dg4o0lh04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkq6clmn3t8dg4o0lh04.png" alt="produccion" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez realizadas todas estas pruebas con éxito podemos efectuar los pasos para pasar a producción.&lt;/p&gt;

&lt;p&gt;Lo primero que debemos hacer es loguearnos con nuestro usuario &lt;strong&gt;REAL&lt;/strong&gt;, y tomar el Acces Token de las credenciales de &lt;strong&gt;PRODUCCIÓN&lt;/strong&gt;.&lt;br&gt;
Mercadopago puede pedir algunas cosas adicionales al intentar activar las credenciales de producción, como verificación de DNI por ejemplo, solo seguir los pasos.&lt;br&gt;
Colocamos este valor en la variable de entorno &lt;code&gt;accessToken&lt;/code&gt;, pero esta vez en el entorno "PROD_ENVIRONMENT"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/panel/credentials" rel="noopener noreferrer"&gt;Credenciales producción&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez tengamos la dirección que finalmente vamos a usar para obtener los hooks deberemos asignarla a la variable de entorno &lt;code&gt;webHook&lt;/code&gt; del "PROD_ENVIRONMENT".&lt;br&gt;
Si queremos que todas nuestras preferencias tengan la misma url de notificación o webhook, podemos configurarlos y excluir la propiedad &lt;code&gt;notificaion_url&lt;/code&gt; de la preferencia de pago.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com/mla/account/webhooks" rel="noopener noreferrer"&gt;Configurar webhook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eso es todo, ahora podemos crear una referencia de pago utilizando el entorno "PROD_ENVIRONMENT" con un monto bajo, por ejemplo ARS 50, y pasarle el &lt;code&gt;init_point&lt;/code&gt; a un compañero para que efectúe la compra, luego podemos hacerle la devolución desde la app de MP.&lt;/p&gt;


&lt;h3&gt;
  
  
  Conclusión
&lt;/h3&gt;

&lt;p&gt;Hemos visto cómo probar la API para recibir pagos, sin embargo hay muchas otas funcionalidades que mercadopago ofrece y están todas asentadas en la documentación de la API, es cuestion de agregarlas a postman y probar.&lt;/p&gt;

&lt;p&gt;Solo queda que pasen las consultas al código que usen para el backend, y subir la app a plataformas como heroku, vercel o su propio servidor.&lt;/p&gt;

&lt;p&gt;Espero les sea de utilidad.&lt;br&gt;
Saludos.&lt;/p&gt;


&lt;h3&gt;
  
  
  Recursos
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLCazXKuqZp3iixwB2AGaCMhDTCeBtZ3lb" rel="noopener noreferrer"&gt;Lista reproducción de mercadopago | Youtube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.ar/developers/es/guides/manage-account/account/payment-rejections" rel="noopener noreferrer"&gt;Mejora tus pagos&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Video demostrativo
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/mlL6RjlUpVM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Github repo
&lt;/h3&gt;

&lt;p&gt;Estoy acomodando algunos archivos cuando termine subo un repositorio que use para probar con vue y node.js&lt;/p&gt;

</description>
      <category>mercadopago</category>
      <category>postman</category>
      <category>api</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Local mp3 files to spotify playlist! (own app)</title>
      <dc:creator>Jorge Arraga</dc:creator>
      <pubDate>Sun, 14 Feb 2021 15:52:20 +0000</pubDate>
      <link>https://dev.to/jarraga/local-mp3-files-to-spotify-playlist-own-app-473f</link>
      <guid>https://dev.to/jarraga/local-mp3-files-to-spotify-playlist-own-app-473f</guid>
      <description>&lt;p&gt;For anxious people like me:&lt;/p&gt;

&lt;p&gt;YouTube quick demonstration:&lt;br&gt;
&lt;a href="https://youtu.be/zv0ewC9OgdE" rel="noopener noreferrer"&gt;https://youtu.be/zv0ewC9OgdE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link to app:&lt;br&gt;
&lt;a href="https://localtospotify.web.app" rel="noopener noreferrer"&gt;https://localtospotify.web.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github repository:&lt;br&gt;
&lt;a href="https://github.com/jarraga/local-to-spotify" rel="noopener noreferrer"&gt;https://github.com/jarraga/local-to-spotify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Several years ago I uploaded all my photos taken with digital cameras to google photos, my personal files to the drive, and as a programmer I have my repositories saved in GitHub, it feels good to know that everything is safe in the cloud and available from any device.&lt;/p&gt;

&lt;p&gt;But these days I was checking my hard drive and I still have about 35 GB of music in mp3 format, since that was the way to have music before, when we got it from some platforms, you know.&lt;/p&gt;

&lt;p&gt;And although I wanted to erase them, I didn't want to lose all those songs that I had to work so hard to get, so I thought about making playlists on Spotify, since almost any song can be found in its catalog.&lt;/p&gt;

&lt;p&gt;Seeing that this task would be very tedious, I started to investigate the Spotify API, and then I created this web app developed with Vue for the frontend, and node.js in the backend.&lt;/p&gt;

&lt;p&gt;I tell you how it works:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fps6fodozdfspromtfi07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fps6fodozdfspromtfi07.png" alt="Alt Text" width="700" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can select up to 100 mp3 files, the app reads the metadata and generates a table.&lt;br&gt;
The name of the song and the artist can be edited, only the items that have both data will be searched, you can also play the song or copy the file name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F823y0hgzfeux05wzllaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F823y0hgzfeux05wzllaf.png" alt="Alt Text" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By pressing the search button, the Spotify API is consulted for each song and the most relevant result is displayed.&lt;br&gt;
If no match is obtained, this screen allows you to modify the data and perform an individual search for each item.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2kn1mt2b88194c1456uh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2kn1mt2b88194c1456uh.png" alt="Alt Text" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, you can choose the name of your new list and press the create button.&lt;br&gt;
You can see the new list in the embedded preview, or on any of your devices with Spotify.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjx5kczsmaogqq4h08y30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjx5kczsmaogqq4h08y30.png" alt="Alt Text" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you like it and it will be useful!&lt;br&gt;
👋🏽&lt;/p&gt;

</description>
      <category>vue</category>
      <category>node</category>
      <category>api</category>
      <category>spotify</category>
    </item>
  </channel>
</rss>
