为什么我的PayPal集成无法使用Ionic?

时间:2016-05-04 11:13:26

标签: angularjs ionic-framework

我正在尝试将PayPal集成添加到我的Ionic应用程序中并按照this文章中的说明进行操作,但它似乎无法正常工作。这是我的代码:

控制器

$scope.openpaypal= function(PaypalService) {
  PaypalService.initPaymentUI().then(function () {
    PaypalService.makePayment(90, $scope.totalamountpay).then(function (response) {
      alert("success"+JSON.stringify(response));
    }, function (error) {
      alert("Transaction Canceled");
    });
  });
}

工厂

var app = angular.module('starter.payPalService', ['ionic'])

app.factory('PaypalService', ['$q', '$ionicPlatform', 'shopSettings', '$filter', '$timeout', function ($q, $ionicPlatform, shopSettings, $filter, $timeout) {
  var init_defer;

  /**
  * Service object
  * @type object
  */

  var service = {
    initPaymentUI: initPaymentUI,
    createPayment: createPayment,
    configuration: configuration,
    onPayPalMobileInit: onPayPalMobileInit,
    makePayment: makePayment
  };

  /**
  * @ngdoc method
  * @name initPaymentUI
  * @methodOf app.PaypalService
  * @description
  * Inits the payapl ui with certain envs.
  *
  *
  * @returns {object} Promise paypal ui init done
  */

function initPaymentUI() {
  init_defer = $q.defer();
  $ionicPlatform.ready().then(function () {
    var clientIDs = {
      "PayPalEnvironmentProduction": shopSettings.payPalProductionId,
      "PayPalEnvironmentSandbox": shopSettings.payPalSandboxId
    };

    PayPalMobile.init(clientIDs, onPayPalMobileInit);
  });
  return init_defer.promise;
}
/**
* @ngdoc method
* @name createPayment
* @methodOf app.PaypalService
* @param {string|number} total total sum. Pattern 12.23
* @param {string} name name of the item in paypal
* @description
* Creates a paypal payment object
*
*
* @returns {object} PayPalPaymentObject
*/
function createPayment(total, name) {
// "Sale == > immediate payment
// "Auth" for payment authorization only, to be captured separately at a later time.
// "Order" for taking an order, with authorization and capture to be done separately at a later time.
var payment = new PayPalPayment("" + total, "EUR", "" + name, "Sale");
return payment;
}
/**
* @ngdoc method
* @name configuration
* @methodOf app.PaypalService
* @description
* Helper to create a paypal configuration object
*
*
* @returns {object} PayPal configuration
*/
function configuration() {
// for more options see `paypal-mobile-js-helper.js`
var config = new PayPalConfiguration({merchantName: shopSettings.payPalShopName, merchantPrivacyPolicyURL: shopSettings.payPalMerchantPrivacyPolicyURL, merchantUserAgreementURL: shopSettings.payPalMerchantUserAgreementURL});
return config;
}
function onPayPalMobileInit() {
$ionicPlatform.ready().then(function () {
// must be called
// use PayPalEnvironmentNoNetwork mode to get look and feel of the flow
PayPalMobile.prepareToRender(shopSettings.payPalEnv, configuration(), function () {
$timeout(function () {
init_defer.resolve();
});
});
});
}
/**
* @ngdoc method
* @name makePayment
* @methodOf app.PaypalService
* @param {string|number} total total sum. Pattern 12.23
* @param {string} name name of the item in paypal
* @description
* Performs a paypal single payment
*
*
* @returns {object} Promise gets resolved on successful payment, rejected on error
*/
function makePayment(total, name) {
var defer = $q.defer();
total = $filter('number')(total, 2);
$ionicPlatform.ready().then(function () {
PayPalMobile.renderSinglePaymentUI(createPayment(total, name), function (result) {
$timeout(function () {
defer.resolve(result);
});
}, function (error) {
$timeout(function () {
defer.reject(error);
});
});
});
return defer.promise;
}
return service;
}]);

这是我得到的错误,尽管我已经在我的控制器中注入了工厂:

angular js factory method paymentinitUI undefined

2 个答案:

答案 0 :(得分:0)

尝试使用以下命令再次删除并添加它:

1)private func parseJSONData(_ data: Data) { do { let temp: NSString = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! let myNSData = temp.data(using: String.Encoding.utf8.rawValue)! guard let jsonResult = try JSONSerialization.jsonObject(with: myNSData, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary else { return } guard let jsonNews = jsonResult["categories"] as? [AnyObject] else { print("Empty array") return } let realm = try Realm() let category = realm.objects(NewsCount.self) var array = [Int]() for i in category { array.append(i.newsCount) } print(array) print("News COUNT2 \(category)") for jsonnewes in jsonNews { let newsJson = NewsCount() //HERE I COMPARE if !UserDefaults.standard.bool(forKey: "AppStarted") || jsonnewes["count"] as! Int > array[jsonnewes as! Int]{ newsJson.newsID = jsonnewes["term_id"] as! Int newsJson.newsCount = jsonnewes["count"] as! Int //print("News COUNT2 \(newsJson.newsCount)") NotificationCenter.default.post(name: NSNotification.Name(rawValue: "downloadNew"), object: nil) } else { newsJson.newsID = jsonnewes["term_id"] as! Int newsJson.newsCount = jsonnewes["count"] as! Int //print("News COUNT3 \(newsJson.newsCount)") } insertOrUpdate(newsJson) } } catch { print(error) } }

2)cordova plugin rm com.paypal.cordova.mobilesdk

答案 1 :(得分:0)

添加此plugin

<强> cordova plugin add com.paypal.cordova.mobilesdk

<强>控制器

 var app = {
     // Application Constructor
     initialize: function() {
         this.bindEvents();
     },
     // Bind Event Listeners
     //
     // Bind any events that are required on startup. Common events are:
     // 'load', 'deviceready', 'offline', and 'online'.
     bindEvents: function() {
         document.addEventListener('deviceready', this.onDeviceReady, false);
     },
     // deviceready Event Handler
     //
     // The scope of 'this' is the event. In order to call the 'receivedEvent'
     // function, we must explicity call 'app.receivedEvent(...);'
     onDeviceReady: function() {
         app.receivedEvent('deviceready');
     },
     // Update DOM on a Received Event
     receivedEvent: function(id) {
         var parentElement = document.getElementById(id);
         var listeningElement = parentElement.querySelector('.listening');
         var receivedElement = parentElement.querySelector('.received');

         listeningElement.setAttribute('style', 'display:none;');
         receivedElement.setAttribute('style', 'display:block;');

         // start to initialize PayPalMobile library
         app.initPaymentUI();
     },
     initPaymentUI: function() {
        // Add your application keys
         var clientIDs = {
             "PayPalEnvironmentProduction": "YOUR_PRODUCTION_CLIENT_ID",
             "PayPalEnvironmentSandbox": "YOUR_SANDBOX_CLIENT_ID"
         };
         PayPalMobile.init(clientIDs, app.onPayPalMobileInit);

     },
     onSuccesfulPayment: function(payment) {
         console.log('payment done', payment);
     },
     // This code is only used for independent card.io scanning abilities
     onCardIOComplete: function(card) {},
     onAuthorizationCallback: function(authorization) {
         console.log('--------------------', authorization);


     },
     createPayment: function() {
         // for simplicity use predefined amount
         // optional payment details for more information check [helper js file](https://github.com/paypal/PayPal-Cordova-Plugin/blob/master/www/paypal-mobile-js-helper.js)
         var paymentDetails = new PayPalPaymentDetails($scope.amount, "0.00", "0.00");
         var payment = new PayPalPayment($scope.amount, "USD", "APP Name", "Sale", paymentDetails);
         return payment;
     },
     configuration: function() {
         // for more options see `paypal-mobile-js-helper.js`
         var config = new PayPalConfiguration({ merchantName: "My test shop", merchantPrivacyPolicyURL: "https://mytestshop.com/policy", merchantUserAgreementURL: "https://mytestshop.com/agreement" });
         return config;
     },
     onPrepareRender: function() {},
     onPayPalMobileInit: function() {
         // must be called
         // use PayPalEnvironmentNoNetwork mode to get look and feel of the flow
         PayPalMobile.prepareToRender("PayPalEnvironmentSandbox", app.configuration(), app.onPrepareRender);
     },
     onUserCanceled: function(result) {}
 };
 app.initialize();

然后拨打此功能进行付款。

$scope.openpaypal = function() {
     $scope.amount = 540;
     PayPalMobile.renderSinglePaymentUI(app.createPayment(), app.onSuccesfulPayment, app.onUserCanceled);
}

如果您有任何疑问,请告诉我