Search code examples
meteorbalanced-payments

Working with Meteor and Async balanced-payments functions


I'm using balanced-payments and their version 1.1 of balanced.js within Meteor.

I'm trying to create a new customer using balanced.marketplace.customers.create(formData);

Here is my CheckFormSubmitEvents.js file

Template.CheckFormSubmit.events({
    'submit form': function (e, tmpl) {
        e.preventDefault();
        var recurringStatus = $(e.target).find('[name=is_recurring]').is(':checked');
        var checkForm = {
            name: $(e.target).find('[name=name]').val(),
            account_number: $(e.target).find('[name=account_number]').val(),
            routing_number: $(e.target).find('[name=routing_number]').val(),
            recurring: { is_recurring: recurringStatus },
            created_at: new Date
        }
        checkForm._id = Donations.insert(checkForm);

            Meteor.call("balancedCardCreate", checkForm, function(error, result) {
                console.log(result);
                // Successful tokenization
            if(result.status_code === 201 && result.href) {
                // Send to your backend
                jQuery.post(responseTarget, {
                    uri: result.href
                }, function(r) {
                    // Check your backend result
                    if(r.status === 201) {
                        // Your successful logic here from backend
                    } else {
                        // Your failure logic here from backend
                    }
                });
            } else {
                // Failed to tokenize, your error logic here
            }

            // Debuging, just displays the tokenization result in a pretty div
            $('#response .panel-body pre').html(JSON.stringify(result, false, 4));
            $('#response').slideDown(300);
            });
      }
});

Here is my Methods.js file

var wrappedDelayedFunction = Async.wrap(balanced.marketplace.customers.create);

Meteor.methods({
    balancedCardCreate: function (formData) {
        console.log(formData);
        var response =  wrappedDelayedFunction(formData);
        console.log(response);
        return response;    
    }
});

I get nothing back when I submit the form, except that on the server console I do see the log of the form data.

I'm sure I'm not calling some of these async functions correctly. The hard part for me here is that the balanced function are async, but I don't know if they fit into the same mold as some of the examples I've seen.

I've tried to follow this example code. http://meteorhacks.com/improved-async-utilities-in-meteor-npm.html

Is there a specific change that needs to be done in regard to working with balanced here? Does anyone have any tips for working with Async functions or see something specific about my code that I've done wrong?

Thanks


Solution

  • What I ended up doing was using a future. This works great, I just need to do better at catching errors. Which will be a question for a pro I think ; - )

    Credit should go to user3374348 for answering another similar question of mine, which solved both of these. https://stackoverflow.com/a/23777507/582309

        var Future = Npm.require("fibers/future");
    
          function extractFromPromise(promise) {
            var fut = new Future();
            promise.then(function (result) {
              fut["return"](result);
            }, function (error) {
              fut["throw"](error);
            });
            return fut.wait();
          }
    
        Meteor.methods({
          createCustomer: function (data) {
          balanced.configure(Meteor.settings.balancedPaymentsAPI);
    
          var customerData =  extractFromPromise(balanced.marketplace.customers.create({
            'name': data.fname + " " + data.lname,
            "address": {
              "city": data.city,
              "state": data.region,
              "line1": data.address_line1,
              "line2": data.address_line2,
              "postal_code": data.postal_code,
            },
            'email': data.email_address, 
            'phone': data.phone_number
            }));
    var card = extractFromPromise(balanced.marketplace.cards.create({
              'number': data.card_number,
              'expiration_year': data.expiry_year,
              'expiration_month': data.expiry_month,
              'cvv': data.cvv
            }));
              var associate = extractFromPromise(card.associate_to_customer(customerData.href).debit({
              "amount": data.total_amount*100,
              "appears_on_statement_as": "Trash Mountain" })); 
        });