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.