Quantcast
Channel: Preguntas activas con las etiquetas mercadopago - Stack Overflow en español
Viewing all articles
Browse latest Browse all 213

Mercadopago Flutter api OAuth

$
0
0

Estoy intentando integrar la API de OAuth de mercadopago para vincular la cuenta de mercadopago del vendedor con mi aplicación flutter, pero mercadopago devuelve 'Lo siento, la aplicación no puede conectarse a tu cuenta'.Actualmente estoy usando servero como túnel https para probar la API.

tengo el codigo payment_method.dart:

import 'dart:convert';import 'package:flutter/material.dart';import 'package:fluttertoast/fluttertoast.dart';import 'package:http/http.dart' as http;import 'package:shared_preferences/shared_preferences.dart';import 'package:url_launcher/url_launcher.dart';class PaymentMethods {  static const String clientId = '35662xxx060';  static const String clientSecret = 'DCL2CZc3xxxOemR1zNRLxxxen8O';  static const String redirectUri = 'https://dc039780c67e97c553c8a2551a103c7b.serveo.net/oauth/callback';  PaymentMethods();  Future<String> _getSellerUid() async {    SharedPreferences prefs = await SharedPreferences.getInstance();    return prefs.getString('uid') ?? '';  }  Future<void> linkMercadoPagoAccount(BuildContext context) async {    String sellerUid = await _getSellerUid();    String authUrlString = 'https://auth.mercadopago.com/authorization?client_id=$clientId&response_type=code&platform_id=mp&redirect_uri=$redirectUri';    Uri authUrl = Uri.parse(authUrlString); // Usa Uri.parse para convertir la cadena en un objeto Uri    if (await canLaunchUrl(authUrl)) {      await launchUrl(authUrl);    } else {      throw 'Could not launch $authUrl';    }  }  Future<void> handleOAuthCallback(String code) async {    final response = await http.post(      Uri.parse('https://api.mercadopago.com/oauth/token'),      headers: {'Content-Type': 'application/json',      },      body: jsonEncode({'client_id': clientId,'client_secret': clientSecret,'code': code,'grant_type': 'authorization_code','redirect_uri': redirectUri,      }),    );    if (response.statusCode == 200) {      final Map<String, dynamic> data = jsonDecode(response.body);      final String accessToken = data['access_token'];      final String refreshToken = data['refresh_token'];      final int expiresIn = data['expires_in'];      SharedPreferences prefs = await SharedPreferences.getInstance();      await prefs.setString('access_token', accessToken);      await prefs.setString('refresh_token', refreshToken);      await prefs.setInt('expires_in', expiresIn);      Fluttertoast.showToast(msg: 'Cuenta vinculada exitosamente');    } else {      Fluttertoast.showToast(msg: 'Error vinculando cuenta: ${response.body}');    }  }}

Para este código creé una cuenta de prueba en Mercadopago, dentro de esta cuenta de prueba creé la aplicación correspondiente, de la cual obtengo el Id del cliente y el Secreto del cliente.

luego desde mi cuenta principal de mercadopago crear un usuario de prueba "vendedor", con el cual estoy intentando vincularme

mi codigo home_screen.dart:

import 'package:cloud_firestore/cloud_firestore.dart';import 'package:flutter/material.dart';import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';import 'package:fluttertoast/fluttertoast.dart';import 'package:sellers_app/assistantMethods/payment_methods.dart';import 'package:sellers_app/global/global.dart';import 'package:sellers_app/model/menus.dart';import 'package:sellers_app/splash_Screen/splash_screen.dart';import 'package:sellers_app/uploadScreens/menus_upload_screen.dart';import 'package:sellers_app/widgets/info_design.dart';import 'package:sellers_app/widgets/my_drawer.dart';import 'package:sellers_app/widgets/progress_bar.dart';import 'package:sellers_app/widgets/text_widget_header.dart';  class HomeScreen extends StatefulWidget {    const HomeScreen({super.key});    @override    State<HomeScreen> createState() => _HomeScreenState();  }  class _HomeScreenState extends State<HomeScreen>  {    bool isPaymentActivated = false;    void paymentMethod() async {      try {        await PaymentMethods().linkMercadoPagoAccount(context);        setState(() {          isPaymentActivated = true;        });      } catch (e) {        print('Error linking MercadoPago account: $e');      }    }    restrictBlockedSellersFromUsingApp() async    {      await FirebaseFirestore.instance.collection('sellers')          .doc(firebaseAuth.currentUser!.uid)          .get().then((snapshot)      {        if(snapshot.data()!['status'] != 'aproved')        {          Fluttertoast.showToast(msg: 'Has sido Bloqueado');          firebaseAuth.signOut();          Navigator.push(context, MaterialPageRoute(builder: (c)=> const MySplashScreen()));        }      });    }    @override    void initState() {      super.initState();      restrictBlockedSellersFromUsingApp();    }    @override    Widget build(BuildContext context) {      return Scaffold(        drawer: const MyDrawer(),        appBar: AppBar(          flexibleSpace: Container(            decoration: BoxDecoration(              gradient: const LinearGradient(                colors: [                  Colors.white,                  Colors.white10,                ],                begin: FractionalOffset(0.0, 0.0),                end:  FractionalOffset(1.0, 0.0),                stops: [0.0, 1.0],                tileMode: TileMode.clamp,              ),              boxShadow: [                BoxShadow(                  color: Colors.black.withOpacity(0.2), // The color of the shading                  spreadRadius: 5, // Shading dispersion radius                  blurRadius: 7, // The blur radius of the shading                  offset: const Offset(0, 1), // The position of the shading                ),              ],            ),          ),          title: Text(            sharedPreferences!.getString('name')!,            style: const TextStyle(fontSize: 22, fontFamily: 'Lobster', color: Colors.black),          ),          centerTitle: true,          automaticallyImplyLeading: true,          actions: [            IconButton(              icon: Icon(Icons.credit_card, color: isPaymentActivated ? Colors.green : Colors.red),              onPressed: () {                paymentMethod(); // Llama al método para vincular la cuenta de MercadoPago              },            ),            IconButton(              icon: Icon(Icons.post_add, color: isPaymentActivated ? Colors.cyan : Colors.grey),              onPressed: () {                Navigator.push(context, MaterialPageRoute(builder: (context) => const MenusUploadScreen()));              },            ),          ],        ),        body: Container(          decoration: const BoxDecoration(            gradient: LinearGradient(              colors: [                Colors.white,                Colors.white,              ],              begin: FractionalOffset(0.3, 1.5),              end:  FractionalOffset(0.5, 0.3),              stops: [0.0, 1.0],              tileMode: TileMode.clamp,            ),          ),          child: CustomScrollView(            slivers: [              SliverPersistentHeader(                  pinned: true,                  delegate: TextWidgetHeader(title: 'Mis Productos')),              StreamBuilder<QuerySnapshot>(                stream: FirebaseFirestore.instance                    .collection('sellers')                    .doc(sharedPreferences!.getString('uid'))                    .collection('products')                    .orderBy('publishedDate', descending: true) //ordena por fecha mas reciente                    .snapshots(),                builder: (context, snapshot) {                  return !snapshot.hasData                      ? SliverToBoxAdapter(child: Center(child: circularProgress(),),)                      : SliverStaggeredGrid.countBuilder(                        crossAxisCount: 4,                        mainAxisSpacing: 4.0,                        crossAxisSpacing: 4.0,                        itemBuilder: (context, index)                        {                          Menus model = Menus.fromJson(                            snapshot.data!.docs[index].data()! as Map<String, dynamic>,                          );                          return InfoDesignWidget(                            model: model,                            context: context,                          );                        },                        itemCount: snapshot.data!.docs.length,                        staggeredTileBuilder: (index) => const StaggeredTile.fit(4),                      );                },              ),            ],          ),        ),      );    }  }

la vinculación se produce al presionar el iconbutton credit_card

Soy novato en programación, comencé hace 2 años, con ayuda de IA, pero no logro solucionar este problema.Mi app está casi terminada, solo falta incorporar un método de pago y no puedo hacerlo, no quiero abandonar mi proyecto, pero no encuentro solución a esto.

Sería de mucha ayuda si alguien pudiera darme alguna orientación sobre esto, ya que no existe una IA que pueda darme una respuesta que me funcione, o al menos que pueda entender que yo haya encontrado.


Viewing all articles
Browse latest Browse all 213

Trending Articles