566 karma · joined September 23, 2008
Email me at dan@manges.com
http://usa.visa.com/merchants/products-services/processing-s...
However, when the link was used, canonical_username was once again applied
So after they sent the password reset link, they called "fetchUserIdByName" again, but they passed in a username that had already been canonicalized once. Because of this bug, I wonder if password resets worked at all for users with unicode characters in their names.While I don't think Kiera should be charged with a felony, the encouragement to experiment needs to be tempered with an understanding of risks and proper safety procedures.
I've seen a couple of cases where backwards compatibility can be broken in unexpected ways. For one application that we built at Braintree, we had a client that was sending us an application/x-www-form-urlencoded POST body without the Content-Type request header. We upgraded the version of Rails that this app was using, and it broke that integration because Rails made a change where it wouldn't parse the POST body without the Content-Type header. Unfortunately, we didn't have any test cases in our test suite that made POSTs without a Content-Type. We were able to identify the issue and resolve it quickly, but it was a surprising bug. With client libraries, we can test every version against the upgraded app and know that all clients will continue to work.
Are there interesting request profiling techniques that can be executed on production traffic to analyze requests? I think the challenging part of backwards compatibility is making sure unintentional use cases, that were never intended to be supported, continue to work.
Even for merchants that use third-party hosted payment forms, it's still common to need to complete SAQ A (a short self-assessment questionnaire) and have quarterly network scans. For example, with PayPal[1]: "Our hosted solution takes a lot of the work out of meeting these standards. The only remaining requirements are a Security Self-Assessment Questionnaire (SAQ) and Quarterly Security Scans."
According to MasterCard[2]: "All merchants that store, process, or transmit cardholder data must be PCI compliant." It's subjective whether using Stripe.js could be considered transmitting cardholder data.
Visa[3] holds Acquirers responsible for ensuring their merchants are PCI compliant. Requirements vary depending on processing volume: "In addition to adhering to the PCI DSS, compliance validation is required for Level 1, Level 2, and Level 3 merchants, and may be required for Level 4 merchants." Notice that for Level 4 merchants, validation only may be required, although those merchants should still be adhering to the PCI DSS.
Stripe has several PCI requirements in their terms of service[4], and their FAQ does seem to indicate[5] that merchants have some responsibility for PCI compliance. According to the TOS "It is your responsibility to comply with these standards." and according to the FAQ: "Most Qualified Security Assesors (QSAs) will want to talk through many of the implementation details before giving an opinion"
Disclosure: I work for Braintree.
Disclaimer: This response is my opinion; I'm not speaking for Braintree.
[1] https://merchant.paypal.com/us/cgi-bin/?cmd=_render-content&...
[2] http://www.mastercard.com/us/company/en/whatwedo/determine_m...
[3] http://usa.visa.com/merchants/risk_management/cisp_merchants...
[4] https://stripe.com/terms/US
[5] https://answers.stripe.com/questions/what-exactly-do-i-need-...
On the price points, it will depend on your volumes for which pricing is more competitive. Here’s some insight into the approach that we took with our pricing as we bootstrapped Braintree:
http://www.braintreepayments.com/inside-braintree/reaching-y...
http://www.braintreepayments.com/inside-braintree/three-less...
Regarding the customer signup process, we think there is value in getting to know our clients and their business when they sign up with Braintree. It helps to make sure we can deliver the rave-worthy support our customers have come to expect. As with everything we do at Braintree, nothing is ever good enough for us and we’re constantly striving to make things better for our customers.
class StoryService
def self.assign_story(params)
story = Story.find(params[:story_id])
user = User.find(params[:user_id])
story.assign_to(user)
end
end
This example is fairly minimal, but with service classes handling workflow and object coordination instead of the controller, the code is easier to test and reuse.We mostly work with Ruby/Rails. Our team is talented, our practices are collaborative (pairing, agile), we work on challenging problems (high availability, quality of service, scaling, security), and our devs have 10% time to work on whatever they want. Developers use and love our product. Although we mostly work with Ruby, we also work with Python, Node, Java, .NET, PHP, and Perl. Braintree is profitable, you'll have standard benefits (health/dental/vision), 401k match, ample vacation, and an above market salary.
More about our people, practices, and software: http://www.braintreepayments.com/inside-braintree/how-we-bui...
Apply at http://joinbraintree.com or email me if you have any questions (address in profile).
We mostly work with Ruby/Rails. Our team is talented, our practices are collaborative (pairing, agile), we work on challenging problems (high availability, quality of service, scaling, security), and our devs have 10% time to work on whatever they want. Developers use and love our product. Although we mostly work with Ruby, we also work with Python, Node, Java, .NET, PHP, and Perl. Braintree is profitable, you'll have standard benefits (health/dental/vision), 401k match, ample vacation, an above market salary, and stock options.
More about our people, practices, and software: http://www.braintreepayments.com/inside-braintree/how-we-bui...
Apply at http://www.braintreepayments.com/braintree-careers or email me (address in profile).
http://rdist.root.org/2010/11/29/final-post-on-javascript-cr...