اذهب إلى المحتوى
  • 0

كيفية تغير تصميم صفحة PayPal

Marwan800

السؤال

 

السلام عليكم ورحمة الله وبركاته

تحيه طيبه للجميع 

ي اخوان استعمل كود لدفع بواسطة بوابة PayPal

شكل الصفحة كالتالي الان:

 

601e30f5d4cb6_2021-02-04195536.png.e1f380d3dc3613602a8c6e97a0b193a2.png

 

 

وارغب بتغير شكل تصميم الصفحة الى النظام الجديد ل PayPal للحصول على الخيارات المتاحه مثل الشكل  التالي:

601e322e265c3_2021-02-06100712.png.dcd7d520e488dd029940321510f85cbc.png

 

 

 

 

هذا هو تصميم الصفحه التي ارغب بتحول لها وهو يحتوي على خيارين لدفع ايضا وبشكل افضل من السابق

ماذا يجب ان اغير في الكود الخاص فيني؟

 

الكود المستعمل كالتالي:

 

 

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,),
                    ),

                  ],
                ),
              )
          ),
        )
    );
  }

}

ياليت الذي لديه خبره في الامر يساعدنا

تم التعديل في بواسطة Marwan800
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

يمكنك صفحة الدفع تغيير شكلها كيف ما تريد بحيث تضع تحت المجموع أي طريقة دفع, يعني مجرد تغيير ستايل الواجهة الأمر متروك لك كيف تخلي شكل الواجهة.

عند دخول الزبون للدفع عن طريق بي بال, باي بال تخيره الدفع من حسابه أو من بطاقة أئتمانية.

ما بتقدر تغير شكل صفحة بي بال لأنه انتا بتفتحها من ويب فيو في التطبيق.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 48 دقائق مضت قال بلال زيادة:

يمكنك صفحة الدفع تغيير شكلها كيف ما تريد بحيث تضع تحت المجموع أي طريقة دفع, يعني مجرد تغيير ستايل الواجهة الأمر متروك لك كيف تخلي شكل الواجهة.

عند دخول الزبون للدفع عن طريق بي بال, باي بال تخيره الدفع من حسابه أو من بطاقة أئتمانية.

ما بتقدر تغير شكل صفحة بي بال لأنه انتا بتفتحها من ويب فيو في التطبيق.

يعني ماذا يجب علي ان اغير اخي حتى تصبح بشكل الصوره الثانية؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
اقتباس

يعني ماذا يجب علي ان اغير اخي حتى تصبح بشكل الصوره الثانية؟

اخي هاي عبارة عن صورة واحدة بتوضع للزبون انه يمكنك باستخدام باي بال أنك تقدر تدفع من حسابك و ايضا من البطاقة الأئتمانية.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 دقائق مضت قال بلال زيادة:

اخي هاي عبارة عن صورة واحدة بتوضع للزبون انه يمكنك باستخدام باي بال أنك تقدر تدفع من حسابك و ايضا من البطاقة الأئتمانية.

لم تفهم قصدي اخي

انا ارغب بتغير الكود الذي لدي لتكون مثلها ولكن لا اعلم ماذا يجب ان اقوم بتغيره

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ الآن قال Marwan800:

لم تفهم قصدي اخي

انا ارغب بتغير الكود الذي لدي لتكون مثلها ولكن لا اعلم ماذا يجب ان اقوم بتغيره

هل من الممكن إرفاق المشروع الخاص بك ؟ سأعمل على تصميم واجهة سلتي كاملاً بحيث تشبه التصميم الذي تريده مع إرفاق طرق الدفع.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 20 دقائق مضت قال بلال زيادة:

هل من الممكن إرفاق المشروع الخاص بك ؟ سأعمل على تصميم واجهة سلتي كاملاً بحيث تشبه التصميم الذي تريده مع إرفاق طرق الدفع.

ربي يعطيك العافيه

تفضل اخي المشروع مرفق

flutter_apptests.rar

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
اقتباس

ربي يعطيك العافيه

تفضل اخي المشروع مرفق

هذا ملف 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,),
                          ),
                        ],
                      ),
                    )
                  ),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

2021-02-06_15-19-46.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...