Marwan800 نشر 6 فبراير 2021 أرسل تقرير نشر 6 فبراير 2021 (معدل) السلام عليكم ورحمة الله وبركاته تحيه طيبه للجميع ي اخوان استعمل كود لدفع بواسطة بوابة PayPal شكل الصفحة كالتالي الان: وارغب بتغير شكل تصميم الصفحة الى النظام الجديد ل PayPal للحصول على الخيارات المتاحه مثل الشكل التالي: هذا هو تصميم الصفحه التي ارغب بتحول لها وهو يحتوي على خيارين لدفع ايضا وبشكل افضل من السابق ماذا يجب ان اغير في الكود الخاص فيني؟ الكود المستعمل كالتالي: import 'package:http/http.dart' as http; import 'dart:async'; import 'dart:convert' as convert; import 'package:http_auth/http_auth.dart'; class PaypalServices { String domain = "https://api.sandbox.paypal.com"; // for sandbox mode // String domain = "https://api.paypal.com"; // for production mode // change clientId and secret with your own, provided by paypal String clientId = '==============================='; String secret = '============================'; // for getting the access token from Paypal Future<String> getAccessToken() async { try { var client = BasicAuthClient(clientId, secret); var response = await client.post('$domain/v1/oauth2/token?grant_type=client_credentials'); if (response.statusCode == 200) { final body = convert.jsonDecode(response.body); return body["access_token"]; } return null; } catch (e) { print('sssssssssssss $e'); rethrow; } } // for creating the payment request with Paypal Future<Map<String, String>> createPaypalPayment( transactions, accessToken) async { try { var response = await http.post("$domain/v1/payments/payment", body: convert.jsonEncode(transactions), headers: { "content-type": "application/json", 'Authorization': 'Bearer ' + accessToken }); final body = convert.jsonDecode(response.body); if (response.statusCode == 201) { if (body["links"] != null && body["links"].length > 0) { List links = body["links"]; String executeUrl = ""; String approvalUrl = ""; final item = links.firstWhere((o) => o["rel"] == "approval_url", orElse: () => null); if (item != null) { approvalUrl = item["href"]; } final item1 = links.firstWhere((o) => o["rel"] == "execute", orElse: () => null); if (item1 != null) { executeUrl = item1["href"]; } return {"executeUrl": executeUrl, "approvalUrl": approvalUrl}; } return null; } else { throw Exception(body["message"]); } } catch (e) { rethrow; } } // for executing the payment transaction Future<String> executePayment(url, payerId, accessToken) async { try { var response = await http.post(url, body: convert.jsonEncode({"payer_id": payerId}), headers: { "content-type": "application/json", 'Authorization': 'Bearer ' + accessToken }); final body = convert.jsonDecode(response.body); if (response.statusCode == 200) { return body["id"]; } return null; } catch (e) { rethrow; } } } import 'dart:core'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'PaypalServices.dart'; class PaypalPayment extends StatefulWidget { var onFinish; PaypalPayment({this.onFinish}); @override State<StatefulWidget> createState() { return PaypalPaymentState(); } } class PaypalPaymentState extends State<PaypalPayment> { GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); String checkoutUrl; String executeUrl; String accessToken; PaypalServices services = PaypalServices(); // you can change default currency according to your need Map<dynamic,dynamic> defaultCurrency = {"symbol": "USD ", "decimalDigits": 2, "symbolBeforeTheNumber": true, "currency": "USD"}; bool isEnableShipping = false; bool isEnableAddress = false; String returnURL = 'return.example.com'; String cancelURL= 'cancel.example.com'; @override void initState() { super.initState(); Future.delayed(Duration.zero, () async { try { accessToken = await services.getAccessToken(); final transactions = getOrderParams(); final res = await services.createPaypalPayment(transactions, accessToken); if (res != null) { setState(() { checkoutUrl = res["approvalUrl"]; executeUrl = res["executeUrl"]; }); } } catch (e) { print('exception: '+e.toString()); final snackBar = SnackBar( content: Text(e.toString()), duration: Duration(seconds: 10), action: SnackBarAction( label: 'Close', onPressed: () { // Some code to undo the change. }, ), ); _scaffoldKey.currentState.showSnackBar(snackBar); } }); } // item name, price and quantity String itemName = 'iPhone X'; String itemPrice = '1.99'; int quantity = 1; Map<String, dynamic> getOrderParams() { List items = [ { "name": itemName, "quantity": quantity, "price": itemPrice, "currency": defaultCurrency["currency"] } ]; // checkout invoice details String totalAmount = '1.99'; String subTotalAmount = '1.99'; String shippingCost = '0'; int shippingDiscountCost = 0; String userFirstName = 'Gulshan'; String userLastName = 'Yadav'; String addressCity = 'Delhi'; String addressStreet = 'Mathura Road'; String addressZipCode = '110014'; String addressCountry = 'India'; String addressState = 'Delhi'; String addressPhoneNumber = '+919990119091'; Map<String, dynamic> temp = { "intent": "sale", "payer": {"payment_method": "paypal"}, "transactions": [ { "amount": { "total": totalAmount, "currency": defaultCurrency["currency"], "details": { "subtotal": subTotalAmount, "shipping": shippingCost, "shipping_discount": ((-1.0) * shippingDiscountCost).toString() } }, "description": "The payment transaction description.", "payment_options": { "allowed_payment_method": "INSTANT_FUNDING_SOURCE" }, "item_list": { "items": items, if (isEnableShipping && isEnableAddress) "shipping_address": { "recipient_name": userFirstName + " " + userLastName, "line1": addressStreet, "line2": "", "city": addressCity, "country_code": addressCountry, "postal_code": addressZipCode, "phone": addressPhoneNumber, "state": addressState }, } } ], "note_to_payer": "Contact us for any questions on your order.", "redirect_urls": { "return_url": returnURL, "cancel_url": cancelURL } }; return temp; } @override Widget build(BuildContext context) { print(checkoutUrl); if (checkoutUrl != null) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).backgroundColor, leading: GestureDetector( child: Icon(Icons.arrow_back_ios), onTap: () => Navigator.pop(context), ), ), body: WebView( initialUrl: checkoutUrl, javascriptMode: JavascriptMode.unrestricted, navigationDelegate: (NavigationRequest request) { if (request.url.contains(returnURL)) { final uri = Uri.parse(request.url); final payerID = uri.queryParameters['PayerID']; if (payerID != null) { services .executePayment(executeUrl, payerID, accessToken) .then((id) { widget.onFinish(id); Navigator.of(context).pop(); }); } else { Navigator.of(context).pop(); } Navigator.of(context).pop(); } if (request.url.contains(cancelURL)) { Navigator.of(context).pop(); } return NavigationDecision.navigate; }, ), ); } else { return Scaffold( key: _scaffoldKey, appBar: AppBar( leading: IconButton( icon: Icon(Icons.arrow_back), onPressed: () { Navigator.of(context).pop(); }), backgroundColor: Colors.black12, elevation: 0.0, ), body: Center(child: Container(child: CircularProgressIndicator())), ); } } } import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'PaypalPayment.dart'; void main() { runApp(MaterialApp( title: 'Navigation Basics', home: makePayment(), )); } class makePayment extends StatefulWidget { @override _makePaymentState createState() => _makePaymentState(); } class _makePaymentState extends State<makePayment> { var number; TextStyle style = TextStyle(fontFamily: 'Open Sans', fontSize: 15.0); final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); @override void initState() { super.initState(); number='1.99'; } @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: new Scaffold( backgroundColor: Colors.transparent, key: _scaffoldKey, appBar: PreferredSize( preferredSize: Size.fromHeight(45.0), child: new AppBar( backgroundColor: Colors.white, title: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Paypal Payment Example', style: TextStyle( fontSize: 16.0, color: Colors.red[900], fontWeight: FontWeight.bold, fontFamily: 'Open Sans'), ), ], ), ), ), body:Container( // width: MediaQuery.of(context).size.width, child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ RaisedButton( onPressed: (){ // make PayPal payment // Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) => PaypalPayment(onFinish: number) async { Navigator.push(context, MaterialPageRoute(builder: (context) => PaypalPayment(onFinish:number) // payment done // print('order id: '+number); // }, ), ); }, child: Text('Pay with Paypal', textAlign: TextAlign.center,), ), ], ), ) ), ) ); } } ياليت الذي لديه خبره في الامر يساعدنا تم التعديل في 6 فبراير 2021 بواسطة Marwan800 اقتباس
0 بلال زيادة نشر 6 فبراير 2021 أرسل تقرير نشر 6 فبراير 2021 يمكنك صفحة الدفع تغيير شكلها كيف ما تريد بحيث تضع تحت المجموع أي طريقة دفع, يعني مجرد تغيير ستايل الواجهة الأمر متروك لك كيف تخلي شكل الواجهة. عند دخول الزبون للدفع عن طريق بي بال, باي بال تخيره الدفع من حسابه أو من بطاقة أئتمانية. ما بتقدر تغير شكل صفحة بي بال لأنه انتا بتفتحها من ويب فيو في التطبيق. 1 اقتباس
0 Marwan800 نشر 6 فبراير 2021 الكاتب أرسل تقرير نشر 6 فبراير 2021 بتاريخ 48 دقائق مضت قال بلال زيادة: يمكنك صفحة الدفع تغيير شكلها كيف ما تريد بحيث تضع تحت المجموع أي طريقة دفع, يعني مجرد تغيير ستايل الواجهة الأمر متروك لك كيف تخلي شكل الواجهة. عند دخول الزبون للدفع عن طريق بي بال, باي بال تخيره الدفع من حسابه أو من بطاقة أئتمانية. ما بتقدر تغير شكل صفحة بي بال لأنه انتا بتفتحها من ويب فيو في التطبيق. يعني ماذا يجب علي ان اغير اخي حتى تصبح بشكل الصوره الثانية؟ 1 اقتباس
0 بلال زيادة نشر 6 فبراير 2021 أرسل تقرير نشر 6 فبراير 2021 اقتباس يعني ماذا يجب علي ان اغير اخي حتى تصبح بشكل الصوره الثانية؟ اخي هاي عبارة عن صورة واحدة بتوضع للزبون انه يمكنك باستخدام باي بال أنك تقدر تدفع من حسابك و ايضا من البطاقة الأئتمانية. 1 اقتباس
0 Marwan800 نشر 6 فبراير 2021 الكاتب أرسل تقرير نشر 6 فبراير 2021 بتاريخ 5 دقائق مضت قال بلال زيادة: اخي هاي عبارة عن صورة واحدة بتوضع للزبون انه يمكنك باستخدام باي بال أنك تقدر تدفع من حسابك و ايضا من البطاقة الأئتمانية. لم تفهم قصدي اخي انا ارغب بتغير الكود الذي لدي لتكون مثلها ولكن لا اعلم ماذا يجب ان اقوم بتغيره اقتباس
0 بلال زيادة نشر 6 فبراير 2021 أرسل تقرير نشر 6 فبراير 2021 بتاريخ الآن قال Marwan800: لم تفهم قصدي اخي انا ارغب بتغير الكود الذي لدي لتكون مثلها ولكن لا اعلم ماذا يجب ان اقوم بتغيره هل من الممكن إرفاق المشروع الخاص بك ؟ سأعمل على تصميم واجهة سلتي كاملاً بحيث تشبه التصميم الذي تريده مع إرفاق طرق الدفع. 1 اقتباس
0 Marwan800 نشر 6 فبراير 2021 الكاتب أرسل تقرير نشر 6 فبراير 2021 بتاريخ 20 دقائق مضت قال بلال زيادة: هل من الممكن إرفاق المشروع الخاص بك ؟ سأعمل على تصميم واجهة سلتي كاملاً بحيث تشبه التصميم الذي تريده مع إرفاق طرق الدفع. ربي يعطيك العافيه تفضل اخي المشروع مرفق flutter_apptests.rar 1 اقتباس
0 بلال زيادة نشر 6 فبراير 2021 أرسل تقرير نشر 6 فبراير 2021 اقتباس ربي يعطيك العافيه تفضل اخي المشروع مرفق هذا ملف makePayment.dart كاملا بعد التعديل عليه بحيث أصبح مثل التصميم الذي تريده. import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'PaypalPayment.dart'; class MakePayment extends StatefulWidget { @override _MakePaymentState createState() => _MakePaymentState(); } class _MakePaymentState extends State<MakePayment> { var number; TextStyle style = TextStyle(fontFamily: 'Open Sans', fontSize: 15.0); final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); @override void initState() { super.initState(); number = '1.99'; } @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, appBar: PreferredSize( preferredSize: Size.fromHeight(45.0), child: new AppBar( backgroundColor: Colors.white, title: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Paypal Payment Example', style: TextStyle( fontSize: 16.0, color: Colors.red[900], fontWeight: FontWeight.bold, fontFamily: 'Open Sans'), ), ], ), ), ), body: Container( padding: EdgeInsets.all(15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[ Text("Total: 30.53 USD"), Divider( thickness: 2, color: Colors.grey[300], ), Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("Name"), Text("bbbb"), ], ), Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("Code"), Container( padding: EdgeInsets.all(10), decoration: BoxDecoration(color: Colors.grey), child: Text("RP62800QL"), ), ], ), Divider( thickness: 2, color: Colors.grey[300], ), SizedBox( height: 10, ), Text("Pay with PayPal"), SizedBox( height: 10, ), Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( width: MediaQuery.of(context).size.width, height: 50, child: RaisedButton( color: Color(0xffffc43a), onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => PaypalPayment(onFinish: number)), ); }, child: RichText( text: TextSpan( text: "Pay ", style: TextStyle(color: Color(0xff013089), fontSize: 25, fontWeight: FontWeight.bold), children: <TextSpan>[ TextSpan(text: 'Pal', style: TextStyle(color: Color(0xff019cde))), ], ), ),/*Text( 'PayPal', textAlign: TextAlign.center, style: TextStyle(fontSize: 30), ),*/ ), ), SizedBox( height: 10, ), Container( width: MediaQuery.of(context).size.width, height: 50, child: RaisedButton( color: Color(0xff2d2e30), onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => PaypalPayment(onFinish: number)), ); }, child: RichText( text: TextSpan( children: [ TextSpan( text: "بطاقة سحب أو ائتمان ", style: TextStyle(color: Colors.white, fontSize: 20,), ), WidgetSpan( child: Icon(Icons.credit_card, size: 20, color: Colors.white,), ), ], ), ) ), ), ], ), ], ), ), ); } } اقتباس
السؤال
Marwan800
السلام عليكم ورحمة الله وبركاته
تحيه طيبه للجميع
ي اخوان استعمل كود لدفع بواسطة بوابة PayPal
شكل الصفحة كالتالي الان:
وارغب بتغير شكل تصميم الصفحة الى النظام الجديد ل PayPal للحصول على الخيارات المتاحه مثل الشكل التالي:
هذا هو تصميم الصفحه التي ارغب بتحول لها وهو يحتوي على خيارين لدفع ايضا وبشكل افضل من السابق
ماذا يجب ان اغير في الكود الخاص فيني؟
الكود المستعمل كالتالي:
ياليت الذي لديه خبره في الامر يساعدنا
تم التعديل في بواسطة Marwan8007 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.