Android Studio: прозрачное оформление заказа с использованием Mercado Pago - PullRequest
1 голос
/ 14 мая 2019

Я впервые пытаюсь реализовать прозрачную проверку Mercado Pago в Android.

Я уже скачал самую новую версию SDK, предоставленную в https://github.com/mercadopago/px-android, и нормально выполнил ее в эмуляторе.

На упомянутой выше странице GitHub у нас есть объяснение того, как реализовать проверку Mercado Pago с помощью только одной строки кода:

new MercadoPagoCheckout.Builder("public_key", "checkout_preference_id")
    .build()
    .startPayment(activityOrContext, requestCode);

Где public_key мы можем получить на веб-странице учетных данных. Но String checkout_preference_id Я понятия не имею, как его создать, хотя они показали, как его создать в конце веб-страницы GitHub.

Создайте свой идентификатор предпочтения

curl -X POST \
     'https://api.mercadopago.com/checkout/preferences?access_token=ACCESS_TOKEN' \
     -H 'Content-Type: application/json' \
     -d '{
           "items": [
               {
               "title": "Dummy Item",
               "description": "Multicolor Item",
               "quantity": 1,
               "currency_id": "ARS",
               "unit_price": 10.0
               }
           ],
           "payer": {
               "email": "payer@email.com"
           }
     }'

Я пытался вставить случайную String в checkout_preference_id, но это не сработало. Работает только String в примере приложения Mercado Pago.

private static final String DUMMY_PREFERENCE_ID = "243962506-0bb62e22-5c7b-425e-a0a6-c22d0f4758a9";

Все остальные способы его реализации, представленные в примере приложения Mercado Pago, требуют поддельного подтверждения оплаты.

Буду признателен, если кто-нибудь покажет какой-нибудь код того, как создать и передать переменную checkout_preference_id в основную команду платежа Mercado Pago.

EDIT

Я также признателен, если кто-нибудь может дать нам пример Не поддельного подтверждения платежа с некоторым кодом.

Я думаю, к checkout_preference_id можно получить доступ через веб-сайт Marketplace или, возможно, создать curl с помощью веб-сервиса Android. Тогда для меня все еще остается загадкой.

Что касается альтернативного способа оплаты с MercadoPago, у нас есть следующие аргументы:

new MercadoPagoCheckout.Builder("public_key", checkoutPreference, paymentConfiguration)
                .build()
                .startPayment(activityOrContext, requestCode);

Где checkoutPreference позволяет вам создать пользовательский элемент для продажи.

final Item item = new Item.Builder("Product Title", 1, new BigDecimal(12.3)).setDescription("Product Description").build();
CheckoutPreference checkoutPreference = new CheckoutPreference.Builder(Sites.BRASIL, "a@a.a", Collections.singletonList(item)).setDefaultInstallments(1).build();

paymentConfiguration Реализовано Поддельное подтверждение оплаты .

PaymentConfiguration paymentConfiguration = new PaymentConfiguration.Builder(new MyPaymentProcessor()).build();

Где класс MyPaymentProcessor() и другие классы, от которых он зависит, можно найти в примере GitHub.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Алиссон Александр помог понять, как сгенерировать String checkout_preference_id.

Ниже вы увидите минимальный код, необходимый для получения платежа через MercadoPago.

Во-первых, вы должны добавить зависимости в build.gradle (Модуль: приложение)

// Dealing with HTTP internet connection
implementation 'com.android.volley:volley:1.1.1'

//Dealing with MercadoPago SDK and dependencies
implementation 'com.mercadopago.android.px:checkout:4.0.+'

Некоторые люди рекомендуют добавить разрешение Интернета в Манифест

<uses-permission android:name="android.permission.INTERNET" />

Далее вам необходимо создать JSONObject, и для этого есть разные способы.

Таким образом:

    StringBuilder strjsonobj = new StringBuilder();
    String strJson = "{\n" +
            "           \"items\": [\n" +
            "               {\n" +
            "               \"title\": \"Item\",\n" +
            "               \"description\": \"Multicolor Item\",\n" +
            "               \"quantity\": 1,\n" +
            "               \"currency_id\": \"BRL\",\n" +
            "               \"unit_price\": 35.0\n" +
            "               }\n" +
            "           ],\n" +
            "           \"payer\": {\n" +
            "\t\t    \"name\": \"Núbia\",\n" +
            "\t\t    \"surname\": \"Macedo\",\n" +
            "\t\t    \"email\": \"leann@gmail.com\",\n" +
            "\t\t    \"date_created\": \"2015-06-02T12:58:41.425-04:00\",\n" +
            "\t\t    \"phone\": {\n" +
            "\t\t      \"area_code\": \"\",\n" +
            "\t\t      \"number\": \"880.402.7555\"\n" +
            "\t\t    },\n" +
            "\t\t    \"identification\": {\n" +
            "\t\t      \"type\": \"DNI\",\n" +
            "\t\t      \"number\": \"123456789\"\n" +
            "\t\t    },\n" +
            "\t\t    \"address\": {\n" +
            "\t\t      \"street_name\": \"Núbia Viela\",\n" +
            "\t\t      \"street_number\": 25598,\n" +
            "\t\t      \"zip_code\": \"8972\"\n" +
            "\t\t    }\n" +
            "\t\t  }\n" +
            "     }";

    strjsonobj.append(strJson);
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject = new JSONObject(strjsonobj.toString());
        Log.i("debinf MainAct", "object is : "+jsonObject);
    } catch (JSONException e) {
        e.printStackTrace();
    }

Илитаким образом:

    JSONObject jsonObject = new JSONObject();
    final JSONObject itemJSON = new JSONObject();
    final JSONObject payerJSON = new JSONObject();
    JSONArray itemJsonArray = new JSONArray();
    try {

        itemJSON.put("title", "Dummy Item");
        itemJSON.put("description", "Multicolor Item");
        itemJSON.put("quantity", 1);
        itemJSON.put("currency_id", "BRL");
        itemJSON.put("unit_price", 2.10);

        itemJsonArray.put(itemJSON);

        JSONObject phoneJSON = new JSONObject();
        phoneJSON.put("area_code", "");
        phoneJSON.put("number", "880.402.7555");
        JSONObject idJSON = new JSONObject();
        idJSON.put("type", "DNI");
        idJSON.put("number", "123456789");
        JSONObject addressJSON = new JSONObject();
        addressJSON.put("street_name", "Núbia Viela");
        addressJSON.put("street_number", 25598);
        addressJSON.put("zip_code", "8972");

        payerJSON.put("name", "Núbia");
        payerJSON.put("surname", "Macedo");
        payerJSON.put("email", "leann@gmail.com");
        payerJSON.put("date_created", "2015-06-02T12:58:41.425-04:00");
        payerJSON.put("phone", phoneJSON);
        payerJSON.put("identification", idJSON);
        payerJSON.put("address", addressJSON);


        jsonObject.put("items", itemJsonArray);
        jsonObject.put("payer", payerJSON);
    } catch (JSONException e) {
        e.printStackTrace();
    }

MercadoPago предлагает отправить как можно больше информации о плательщике, чтобы повысить скорость конвертации платежей.Но вы можете отправить как можно меньше, как показано в вопросе.

Кроме того, вы можете персонализировать другие вещи в JSONObject, такие как показано здесь

Теперь давайте создадимпеременная Строка checkout_preference_id.Для этого я использовал метод volley.Когда сервер MercadoPago отправляет обратно нашу переменную, мы автоматически начнем платеж.

    RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
    final String url = "https://api.mercadopago.com/checkout/preferences?access_token="+ACCESS_TOKEN_SANDBOX;
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, jsonObject, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                Log.i("debinf MainAct", "response JSONObject: "+response);
                String checkoutPreferenceId = response.getString("id");
                new MercadoPagoCheckout.Builder(PUBLIC_KEY_SANDBOX, checkoutPreferenceId).build().startPayment(MainActivity.this,REQUEST_CODE);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.i("debinf MainAct", "response ERROR: "+error.networkResponse.allHeaders);
        }
    }){
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new HashMap<>();
            headers.put("Content-Type", "application/json");
            return headers;
        }
    };
    requestQueue.add(jsonObjectRequest);

Используйте REQUEST_CODE, отправленный startPayment , чтобы получить результат проверки в onActivityResult .

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    if (requestCode == REQUEST_CODE) {
        if (resultCode == MercadoPagoCheckout.PAYMENT_RESULT_CODE) {
            final Payment payment = (Payment) data.getSerializableExtra(MercadoPagoCheckout.EXTRA_PAYMENT_RESULT);
            ((TextView) findViewById(R.id.mp_results)).setText("Resultado del pago: " + payment.getStatus());
            //Done!
        } else if (resultCode == RESULT_CANCELED) {
            if (data != null && data.getExtras() != null
                && data.getExtras().containsKey(MercadoPagoCheckout.EXTRA_ERROR)) {
                final MercadoPagoError mercadoPagoError =
                    (MercadoPagoError) data.getSerializableExtra(MercadoPagoCheckout.EXTRA_ERROR);
                ((TextView) findViewById(R.id.mp_results)).setText("Error: " +  mercadoPagoError.getMessage());
                //Resolve error in checkout
            } else {
                //Resolve canceled checkout
            }
        }
    }
}

Вот и все!Пожалуйста, будьте свободны, чтобы улучшить код выше.В основном по вопросам безопасности.

1 голос
/ 28 мая 2019
val queue = Volley.newRequestQueue(this)

    val strJson = "{\n" +
            "           \"items\": [\n" +
            "               {\n" +
            "               \"title\": \"Item\",\n" +
            "               \"description\": \"Multicolor Item\",\n" +
            "               \"quantity\": 1,\n" +
            "               \"currency_id\": \"BRL\",\n" +
            "               \"unit_price\": 35.0\n" +
            "               }\n" +
            "           ],\n" +
            "           \"payer\": {\n" +
            "\t\t    \"name\": \"Núbia\",\n" +
            "\t\t    \"surname\": \"Macedo\",\n" +
            "\t\t    \"email\": \"leann@gmail.com\",\n" +
            "\t\t    \"date_created\": \"2015-06-02T12:58:41.425-04:00\",\n" +
            "\t\t    \"phone\": {\n" +
            "\t\t      \"area_code\": \"\",\n" +
            "\t\t      \"number\": \"880.402.7555\"\n" +
            "\t\t    },\n" +
            "\t\t    \"identification\": {\n" +
            "\t\t      \"type\": \"DNI\",\n" +
            "\t\t      \"number\": \"123456789\"\n" +
            "\t\t    },\n" +
            "\t\t    \"address\": {\n" +
            "\t\t      \"street_name\": \"Núbia Viela\",\n" +
            "\t\t      \"street_number\": 25598,\n" +
            "\t\t      \"zip_code\": \"8972\"\n" +
            "\t\t    }\n" +
            "\t\t  }\n" +
            "     }"

    val obj = JSONObject(strJson)

    //val url = "https://api.mercadopago.com/checkout/preferences"
    val url = "https://api.mercadopago.com/checkout/preferences?access_token=TEST-XXXXXXXXXXXX-XXXXXXX-XXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXX"
    val stringRequest = object : JsonObjectRequest(Method.POST, url, obj,
        Response.Listener<JSONObject> {response ->
            val checkoutPreferenceId: String= response.getString("id")
            MercadoPagoCheckout.Builder("TEST-XXXXXXXX-XXXX-XXXX-XXXXX-XXXXXXXXXX", checkoutPreferenceId)
                .build().startPayment(this, REQUEST_CODE)
        },
        Response.ErrorListener { error ->
            val erros = error.toString()
            val teste1 = "sdsds"
            val teste12 = "sdsds"
            val teste13 = "sdsds"
        }

    ) {
        @Throws(AuthFailureError::class)
        override fun getHeaders(): Map<String, String> {
            val headers = HashMap<String, String>()
            headers["Content-Type"] = "application/json"
            return headers
        }

    }

    val policy = DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 10, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)
    stringRequest.retryPolicy = policy
    queue.add(stringRequest)

Не забудьте обменять свой access_token.

Пример Json: https://www.mercadopago.com.br/developers/pt/guides/payments/web-checkout/personalization/

пакеты:

implementation 'com.mercadopago.android.px:checkout:4.5.2'
implementation 'com.android.volley:volley:1.1.0'
...