Android Studio:使用Mercado Pago进行透明结帐

时间:2019-05-13 21:06:53

标签: android mercadopago

我正在尝试首次在Android中实现Mercado Pago的透明结帐。

我已经下载了https://github.com/mercadopago/px-android中提供的SDK的最新版本,并可以在仿真器中正常执行。

在上述GitHub页面上,我们仅用一行代码就如何实现Mercado Pago的结帐进行了说明:

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

我们可以在public_key处进入凭据网页。但是 String checkout_preference_id我不知道如何创建它,即使他们在GitHub网页的末尾展示了如何创建它。

创建您的偏好ID

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"
           }
     }'

我试图在checkout_preference_id中放入随机的 String ,但是没有用。仅Mercado Pago示例应用程序中的 String 有效。

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

Mercado Pago的示例应用程序中介绍的其他所有实现方式都需要伪造的付款确认书。

如果有人能展示如何创建变量checkout_preference_id并将其传递到Mercado Pago付款的主要命令中,我将不胜感激。

编辑

我也很感谢有人可以给我们提供非伪造付款确认示例的示例。

我想checkout_preference_id可以通过Marketplace网站访问,也可以使用Android的网络服务来创建curl。那对我来说仍然是个谜。

关于使用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();

可以在GitHub示例中找到MyPaymentProcessor()类及其依赖的其他类。

2 个答案:

答案 0 :(得分:1)

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'

答案 1 :(得分:1)

Álysson Alexandre帮助您了解如何生成 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.+'

有人建议在清单

中添加Internet权限
<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中的其他内容,例如here

现在,让我们创建变量 String 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);

使用 startPayment 发送的REQUEST_CODE 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
            }
        }
    }
}

就是这样!请随意改进上面的代码。主要是关于安全性问题。