From 55585f8ce1b27a679a031eb62688fd65b492850d Mon Sep 17 00:00:00 2001 From: Daniel Stange Date: Fri, 20 Nov 2015 17:33:27 +0100 Subject: [PATCH 1/7] Added missing fields that were referenced by code to the Stripe_Webhook__c-object --- src/objects/Stripe_Settings__c.object | 6 ++++ src/objects/Stripe_Webhook__c.object | 45 +++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/objects/Stripe_Settings__c.object b/src/objects/Stripe_Settings__c.object index c24432d..03167d1 100644 --- a/src/objects/Stripe_Settings__c.object +++ b/src/objects/Stripe_Settings__c.object @@ -10,6 +10,7 @@ 18 false + false Text false @@ -19,6 +20,7 @@ false Check this to use the LIVE key in all API operations. + false Checkbox @@ -27,6 +29,7 @@ 40 true + false Text false @@ -36,6 +39,7 @@ 40 true + false Text false @@ -46,6 +50,7 @@ 40 true + false Text false @@ -56,6 +61,7 @@ 40 true + false Text false diff --git a/src/objects/Stripe_Webhook__c.object b/src/objects/Stripe_Webhook__c.object index b40a235..7c1fb62 100644 --- a/src/objects/Stripe_Webhook__c.object +++ b/src/objects/Stripe_Webhook__c.object @@ -4,6 +4,10 @@ Accept Default + + CancelEdit + Default + Clone Default @@ -16,6 +20,10 @@ Edit Default + + Follow + Default + List Default @@ -24,6 +32,10 @@ New Default + + SaveEdit + Default + Tab Default @@ -32,12 +44,16 @@ View Default + SYSTEM Deployed Records created to assist with the processing of delayed webhooks from stripe. false + true false false false + true + true Attempts__c 1 @@ -47,9 +63,30 @@ 2 true 0 + false Number false + + Error_Message__c + false + + 255 + false + false + Text + false + + + Event_ID__c + false + + 255 + false + false + Text + false + Status__c false @@ -69,6 +106,7 @@ false + false Picklist @@ -76,6 +114,7 @@ false 32768 + false LongTextArea 10 @@ -85,6 +124,7 @@ 40 true + false Text false @@ -99,6 +139,11 @@ Everything + + All1 + Everything + + HK-{00000} From c2e3a6949dc82249c8e769fba49e311547a633ea Mon Sep 17 00:00:00 2001 From: Daniel Stange Date: Sat, 6 Feb 2016 10:06:42 +0100 Subject: [PATCH 2/7] Some refurbishments to adapt to current API Make some minor adjustments to adapt to the current API. TODO: - Clean up / modernize test data. - Check API compatibility for all components --- src/classes/StripExceptionTests.cls | 22 +++ src/classes/StripExceptionTests.cls-meta.xml | 5 + src/classes/StripeAPI.cls | 133 +++++++++--------- src/classes/StripeAPI.cls-meta.xml | 2 +- src/classes/StripeBalance.cls | 39 +++++ src/classes/StripeBalance.cls-meta.xml | 5 + src/classes/StripeCard.cls-meta.xml | 2 +- src/classes/StripeCardTests.cls | 9 ++ src/classes/StripeCardTests.cls-meta.xml | 2 +- src/classes/StripeCharge.cls | 90 ++++++++---- src/classes/StripeCharge.cls-meta.xml | 2 +- src/classes/StripeChargeTests.cls-meta.xml | 2 +- src/classes/StripeCoupon.cls-meta.xml | 2 +- src/classes/StripeCouponTests.cls-meta.xml | 2 +- src/classes/StripeCustomer.cls | 32 +++-- src/classes/StripeCustomer.cls-meta.xml | 2 +- src/classes/StripeCustomerTests.cls-meta.xml | 2 +- src/classes/StripeDispute.cls | 6 + src/classes/StripeDispute.cls-meta.xml | 5 + src/classes/StripeError.cls-meta.xml | 2 +- src/classes/StripeEvent.cls | 47 +++++-- src/classes/StripeEvent.cls-meta.xml | 2 +- src/classes/StripeEventTests.cls | 88 ++++++++++++ src/classes/StripeEventTests.cls-meta.xml | 2 +- src/classes/StripeException.cls-meta.xml | 2 +- src/classes/StripeInvoice.cls-meta.xml | 2 +- .../StripeInvoiceItemResponse.cls-meta.xml | 2 +- ...tripeInvoiceItemResponseTests.cls-meta.xml | 2 +- src/classes/StripeInvoiceTests.cls | 3 +- src/classes/StripeInvoiceTests.cls-meta.xml | 2 +- src/classes/StripePlan.cls-meta.xml | 2 +- src/classes/StripePlanList.cls-meta.xml | 2 +- src/classes/StripePlanSubscription.cls | 3 + .../StripePlanSubscription.cls-meta.xml | 5 + src/classes/StripePlanTests.cls-meta.xml | 2 +- src/classes/StripeSampleController.cls | 101 +++++++++++++ .../StripeSampleController.cls-meta.xml | 5 + src/classes/StripeSubscription.cls-meta.xml | 2 +- .../StripeSubscriptionTests.cls-meta.xml | 2 +- src/classes/StripeToken.cls-meta.xml | 2 +- src/classes/StripeTokenTests.cls | 1 - src/classes/StripeTokenTests.cls-meta.xml | 2 +- src/classes/StripeUtil.cls | 10 +- src/classes/StripeUtil.cls-meta.xml | 2 +- src/classes/StripeUtilTests.cls | 6 +- src/classes/StripeUtilTests.cls-meta.xml | 2 +- .../StripeWebhookListener.cls-meta.xml | 2 +- .../StripeWebhookListenerTests.cls-meta.xml | 2 +- src/classes/TestStripe.cls | 2 + src/classes/TestStripe.cls-meta.xml | 2 +- .../WebhookDelayedProcessor.cls-meta.xml | 2 +- src/objects/Stripe_Settings__c.object | 6 - src/objects/Stripe_Webhook__c.object | 45 ------ 53 files changed, 525 insertions(+), 203 deletions(-) create mode 100644 src/classes/StripExceptionTests.cls create mode 100644 src/classes/StripExceptionTests.cls-meta.xml create mode 100644 src/classes/StripeBalance.cls create mode 100644 src/classes/StripeBalance.cls-meta.xml create mode 100644 src/classes/StripeDispute.cls create mode 100644 src/classes/StripeDispute.cls-meta.xml create mode 100644 src/classes/StripePlanSubscription.cls create mode 100644 src/classes/StripePlanSubscription.cls-meta.xml create mode 100644 src/classes/StripeSampleController.cls create mode 100644 src/classes/StripeSampleController.cls-meta.xml mode change 100644 => 100755 src/objects/Stripe_Settings__c.object mode change 100644 => 100755 src/objects/Stripe_Webhook__c.object diff --git a/src/classes/StripExceptionTests.cls b/src/classes/StripExceptionTests.cls new file mode 100644 index 0000000..62057cc --- /dev/null +++ b/src/classes/StripExceptionTests.cls @@ -0,0 +1,22 @@ +@isTest +private class StripExceptionTests { + + @isTest + private static void testStripeException() { + Test.startTest(); + StripeError err = new StripeError(); + err.code = '123'; + err.message = 'void'; + err.param = 'none'; + err.stripeType = 'Charge'; + + StripeException ex = new StripeException(err); + String s = ex.getMessage(); + + StripeError res = ex.getError(); + + Test.stopTest(); + } + + +} \ No newline at end of file diff --git a/src/classes/StripExceptionTests.cls-meta.xml b/src/classes/StripExceptionTests.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripExceptionTests.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripeAPI.cls b/src/classes/StripeAPI.cls index aa29c0d..e3c93ac 100644 --- a/src/classes/StripeAPI.cls +++ b/src/classes/StripeAPI.cls @@ -1,69 +1,72 @@ global class StripeAPI { - global static String ApiKey { - get { - Stripe_Settings__c s = Stripe_Settings__c.getInstance(); - if (s != null) { - if (StripeAPI.isTest) { - return s.Stripe_Secret_Test_Key__c; - } else { - return s.Stripe_Secret_Live_Key__c; - } - } - return null; - } - } - - global static String PublishableKey { - get { - Stripe_Settings__c s = Stripe_Settings__c.getInstance(); - if (s != null) { - if (StripeAPI.isTest) { - return s.Stripe_Publishable_Test_Key__c; - } else { - return s.Stripe_Publishable_Live_Key__c; - } - } - return null; - } - } - - global static Boolean isWebhookProcessorRunning() { - Stripe_Settings__c s = Stripe_Settings__c.getOrgDefaults(); - if (s != null) { - if (s.Delayed_Webhook_Processor_ID__c == null) { - return false; - } else { - System.debug(System.LoggingLevel.INFO, '\n**** stripe settings: '+s); - try { - CronTrigger sched = [Select State, NextFireTime From CronTrigger Where Id =: s.Delayed_Webhook_Processor_ID__c]; - if (sched.NextFireTime != null) return true; - } catch (System.QueryException e) {} - } - } + global static String ApiKey { + get { + + Stripe_Settings__c s = Stripe_Settings__c.getInstance(); + + if (s != null) { + if (StripeAPI.isTest) { + return s.Stripe_Secret_Test_Key__c; + } else { + return s.Stripe_Secret_Live_Key__c; + } + } + return null; + } + } + + global static String PublishableKey { + get { + Stripe_Settings__c s = Stripe_Settings__c.getInstance(); + if (s != null) { + if (StripeAPI.isTest) { + return s.Stripe_Publishable_Test_Key__c; + } else { + return s.Stripe_Publishable_Live_Key__c; + } + } + return null; + } + } + + global static Boolean isWebhookProcessorRunning() { + Stripe_Settings__c s = Stripe_Settings__c.getOrgDefaults(); + if (s != null) { + if (s.Delayed_Webhook_Processor_ID__c == null) { + return false; + } else { + System.debug(System.LoggingLevel.INFO, '\n**** stripe settings: '+s); + try { + CronTrigger sched = [Select State, NextFireTime From CronTrigger Where Id =: s.Delayed_Webhook_Processor_ID__c]; + if (sched.NextFireTime != null) return true; + } catch (System.QueryException e) {} + } + } - return false; - } - - global static void startWebhookProcessor() { - if (isWebhookProcessorRunning() == false) { - WebhookDelayedProcessor proc = new WebhookDelayedProcessor(); - Id jobId = System.scheduleBatch(proc, 'delayed webhook processor', 5); - - Stripe_Settings__c s = Stripe_Settings__c.getOrgDefaults(); - s.Delayed_Webhook_Processor_ID__c = jobId; - update s; - } - } - - global static Boolean isTest { - get { - Stripe_Settings__c s = Stripe_Settings__c.getInstance(); - if (s != null) { - return !s.Is_Live_Environment__c; - } - return true; - } - } - + return false; + } + + global static void startWebhookProcessor() { + if (isWebhookProcessorRunning() == false) { + WebhookDelayedProcessor proc = new WebhookDelayedProcessor(); + Id jobId = System.scheduleBatch(proc, 'delayed webhook processor', 5); + + Stripe_Settings__c s = Stripe_Settings__c.getOrgDefaults(); + s.Delayed_Webhook_Processor_ID__c = jobId; + update s; + } + } + + global static Boolean isTest { + get { + Stripe_Settings__c s = Stripe_Settings__c.getInstance(); + + if (s != null) { + return !s.Is_Live_Environment__c; + } + return true; + } + } + } \ No newline at end of file diff --git a/src/classes/StripeAPI.cls-meta.xml b/src/classes/StripeAPI.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeAPI.cls-meta.xml +++ b/src/classes/StripeAPI.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeBalance.cls b/src/classes/StripeBalance.cls new file mode 100644 index 0000000..fd968b7 --- /dev/null +++ b/src/classes/StripeBalance.cls @@ -0,0 +1,39 @@ +global class StripeBalance { + + global String SripeObject; + global StripeTransaction[] available; + global StripeTransaction[] pending; + global Boolean livemode; + + global class StripeBalanceTransaction { + global string id; + global string stripeObject; + global integer amount; + global string timestamp; + global string StripeCurrency; + global string description; + global integer fee; + global String[] fee_details; + global integer net; + global string source; + global String[] sourced_transfers; // child attributes + global String status; + global String type; + } + + global class stripeTransaction { + global integer amount; + global string stripeCurrency; + } + + global class StripeFeeDetails { + global integer amount; + global string StripeCurrency; + global string description; + global string type; + global integer net; + global string source; + global Map sourced_transfers; // TODO: Sourced Transfers object + } + +} \ No newline at end of file diff --git a/src/classes/StripeBalance.cls-meta.xml b/src/classes/StripeBalance.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripeBalance.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripeCard.cls-meta.xml b/src/classes/StripeCard.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeCard.cls-meta.xml +++ b/src/classes/StripeCard.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeCardTests.cls b/src/classes/StripeCardTests.cls index 1f95e77..fdd31ef 100644 --- a/src/classes/StripeCardTests.cls +++ b/src/classes/StripeCardTests.cls @@ -26,4 +26,13 @@ public class StripeCardTests { '}'; } } + + @isTest + public static void createStripeCardTest () { + + + Test.startTest(); + StripeCard.create('cus_1234567abcdef', 'tok_8901234ghijk'); + Test.stopTest(); + } } \ No newline at end of file diff --git a/src/classes/StripeCardTests.cls-meta.xml b/src/classes/StripeCardTests.cls-meta.xml index b211a09..b12420e 100644 --- a/src/classes/StripeCardTests.cls-meta.xml +++ b/src/classes/StripeCardTests.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 31.0 Active diff --git a/src/classes/StripeCharge.cls b/src/classes/StripeCharge.cls index c2fbe42..ef6c98f 100644 --- a/src/classes/StripeCharge.cls +++ b/src/classes/StripeCharge.cls @@ -1,32 +1,51 @@ global class StripeCharge { private static final String SERVICE_URL = 'https://api.stripe.com/v1/charges'; - global Integer amount; - global Integer created; - global String stripeCurrency; - global String customer_id; + global Integer fee; // legacy + global String api_version; // legacy + global StripeCard card; // legacy + global List fee_details; // legacy + global StripeError error; //legacy + + global String id; // + global String stripeObject; + global Integer amount; + global Integer amount_refunded; + global String application_fee; + global String balance_transaction; + global Boolean captured; + global Integer created; + global String stripeCurrency; + global String customer_id; // legacy global StripeCustomer customer; - global String description; - global Boolean disputed; - global Integer fee; - global String id; - global Boolean livemode; - global String stripeObject; - global Boolean paid; - global Boolean refunded; - global Integer amount_refunded; - global StripeCard card; - global List fee_details; - global StripeError error; + global String description; + global String destination; + global StripeDispute dispute; + global Boolean disputed; // legacy + global String failure_code; + global String failure_message; + global Map fraud_details; global String invoice_id; global StripeInvoice invoice; - global String failure_message; + global Boolean livemode; global Map metadata; - + global String order; + global Boolean paid; + global String receipt_email; + global String receipt_number; + global Boolean refunded; + global Refunds refunds; + global Shipping shipping; + global StripeCard source; + global String statement_descriptor; + global String status; + global String transfer; + // This has changed in the 2013-02-13 API // https://stripe.com/docs/upgrades#2013-02-13 // And more recently on 2013-08-13 // https://stripe.com/docs/upgrades#2013-08-13 + global class Fee_details { global String stripeType; global String description; @@ -35,6 +54,20 @@ global class StripeCharge { global String stripeCurrency; } + global class Shipping { + + } + + global class StripeDispute { + + } + + global class Refunds { + + } + + + global static StripeCharge getCharge(String chargeId) { return StripeCharge.getCharge(chargeId, false); } @@ -104,15 +137,9 @@ global class StripeCharge { } global static StripeCharge create(String customerId, Decimal amount, Map properties, Map metadata) { - HttpRequest http = new HttpRequest(); - http.setEndpoint(SERVICE_URL); - http.setMethod('POST'); - Blob headerValue = Blob.valueOf(StripeAPI.ApiKey + ':'); - String authorizationHeader = 'BASIC ' + - EncodingUtil.base64Encode(headerValue); - http.setHeader('Authorization', authorizationHeader); Integer amount_int = Math.round(amount * 100);//.intValue(); + Map payload = new Map{ 'customer' => customerId, 'amount' => String.valueOf(amount_int) @@ -120,7 +147,7 @@ global class StripeCharge { // set the default currency to USD if it's not specified if (properties == null || properties.containsKey('usd') == false) { - payload.put('currency', 'usd'); + payload.put('currency', 'EUR'); } if (properties != null) { @@ -139,7 +166,16 @@ global class StripeCharge { } } - http.setBody(StripeUtil.urlify(payload)); + String params = StripeUtil.urlify(payload); + + HttpRequest http = new HttpRequest(); + http.setEndpoint(SERVICE_URL + params); + http.setMethod('POST'); + Blob headerValue = Blob.valueOf(StripeAPI.ApiKey + ':'); + String authorizationHeader = 'BASIC ' + + EncodingUtil.base64Encode(headerValue); + http.setHeader('Authorization', authorizationHeader); + System.debug(System.LoggingLevel.INFO, '\n**** REQUEST BODY:\n'+http.getBody()); String response; diff --git a/src/classes/StripeCharge.cls-meta.xml b/src/classes/StripeCharge.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeCharge.cls-meta.xml +++ b/src/classes/StripeCharge.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeChargeTests.cls-meta.xml b/src/classes/StripeChargeTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeChargeTests.cls-meta.xml +++ b/src/classes/StripeChargeTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeCoupon.cls-meta.xml b/src/classes/StripeCoupon.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeCoupon.cls-meta.xml +++ b/src/classes/StripeCoupon.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeCouponTests.cls-meta.xml b/src/classes/StripeCouponTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeCouponTests.cls-meta.xml +++ b/src/classes/StripeCouponTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeCustomer.cls b/src/classes/StripeCustomer.cls index ce84353..27dbd56 100644 --- a/src/classes/StripeCustomer.cls +++ b/src/classes/StripeCustomer.cls @@ -72,7 +72,7 @@ global class StripeCustomer { global static StripeCustomer create(String token, String description) { Map properties = new Map{ - 'card' => token, + 'source' => token, 'description' => description }; return StripeCustomer.create(properties, null); @@ -131,18 +131,6 @@ global class StripeCustomer { } global static StripeCustomer updateCustomer(String customerId, Map properties, Map metadata) { - HttpRequest http = new HttpRequest(); - - if (customerId == null) - http.setEndpoint(StripeCustomer.SERVICE_URL); - else - http.setEndpoint(StripeCustomer.SERVICE_URL+'/'+customerId); - - http.setMethod('POST'); - Blob headerValue = Blob.valueOf(StripeAPI.ApiKey + ':'); - String authorizationHeader = 'BASIC ' + - EncodingUtil.base64Encode(headerValue); - http.setHeader('Authorization', authorizationHeader); Map payload = new Map(); if (properties != null) { @@ -159,9 +147,25 @@ global class StripeCustomer { payload.put('metadata['+key+']', metadata.get(key)); } } + } - http.setBody(StripeUtil.urlify(payload)); + HttpRequest http = new HttpRequest(); + + if (customerId == null) + http.setEndpoint(StripeCustomer.SERVICE_URL + StripeUtil.urlify(payload)); + else + http.setEndpoint(StripeCustomer.SERVICE_URL+'/'+customerId + StripeUtil.urlify(payload)); + + http.setMethod('POST'); + System.debug('DIA API Key' + StripeAPI.ApiKey); + Blob headerValue = Blob.valueOf(StripeAPI.ApiKey + ':'); + String authorizationHeader = 'BASIC ' + + EncodingUtil.base64Encode(headerValue); + http.setHeader('Authorization', authorizationHeader); + + //http.setBody(StripeUtil.urlify(payload)); + System.debug(System.LoggingLevel.INFO, '\n**** REQUEST BODY:\n'+http.getBody()); String response; diff --git a/src/classes/StripeCustomer.cls-meta.xml b/src/classes/StripeCustomer.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeCustomer.cls-meta.xml +++ b/src/classes/StripeCustomer.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeCustomerTests.cls-meta.xml b/src/classes/StripeCustomerTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeCustomerTests.cls-meta.xml +++ b/src/classes/StripeCustomerTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeDispute.cls b/src/classes/StripeDispute.cls new file mode 100644 index 0000000..f48e74d --- /dev/null +++ b/src/classes/StripeDispute.cls @@ -0,0 +1,6 @@ +global class StripeDispute { + + global string id; + global string stripeOobject; + global string amount; +} \ No newline at end of file diff --git a/src/classes/StripeDispute.cls-meta.xml b/src/classes/StripeDispute.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripeDispute.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripeError.cls-meta.xml b/src/classes/StripeError.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeError.cls-meta.xml +++ b/src/classes/StripeError.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeEvent.cls b/src/classes/StripeEvent.cls index 4da4b4d..09f910b 100644 --- a/src/classes/StripeEvent.cls +++ b/src/classes/StripeEvent.cls @@ -1,11 +1,15 @@ global class StripeEvent { - global String stripeType; - global Integer created; + global String stripeType; + global Integer created; global EventData stripeData; - global Boolean livemode; - global String id; + global Boolean livemode; + global String id; global StripeError error; + global String stripeObject; + global String apiVersion; + global Integer pendingWebhooks; + global String request; // map the event to the stripeData object that will be filled private static Map supported_events = new Map{ @@ -23,6 +27,24 @@ global class StripeEvent { 'ping' => 'object' // leave it alone }; + // Fix to serialize values that formerly broke the webservice + // SOBCRM-38 + // https://interaktiv.jira.com/projects/SOBCRM/issues/SOBCRM-38 + // DSt 2016-02-05 + + global class PreviousRefunds { + StripeCharge.Refunds [] stripeData; + Integer total_count; + + } + + global class PreviousAttributes { + Integer amount_refunded; + Boolean refunded; + PreviousRefunds refunds; + String default_card; + } + global class EventData { // One of the following members will be populated, depending on the event type global StripeCharge StripeCharge; @@ -31,21 +53,26 @@ global class StripeEvent { global StripeCustomer StripeCustomer; global StripeCard StripeCard; - global Map previous_attributes; + //global Map previous_attributes; + global PreviousRefunds previous_attributes; } + // SOBCRM 38 --> public static StripeEvent parse(String json) { json = rationalize(json); - json = StripeUtil.cleanJson(json); - - System.debug(System.LoggingLevel.INFO, '\n**** StripeEvent Parsed JSON:\n'+json); - return (StripeEvent) System.JSON.deserialize(json, StripeEvent.class); + json = StripeUtil.cleanJson(json); + + System.debug(System.LoggingLevel.INFO, '\n**** StripeEvent Parsed JSON:\n'+json); + StripeEvent oStripeEvent = (StripeEvent) System.JSON.deserialize(json, StripeEvent.class); + + return oStripeEvent; } // changes the generic 'object' property to a typed property that Apex can serialize into the appropriate object based on the event type // Accepts the raw JSON string from the webhook listener private static String rationalize(String json) { // identify the type of event + String event_type = json.substring( json.indexOf('"type"')+9, json.indexOf('"', json.indexOf('"type"')+9) @@ -56,7 +83,7 @@ global class StripeEvent { if (data_member == null) throw new UnknownWebhookException('Unknown webhook event'); json = json.replaceFirst('"object":\\s?\\{', '"'+data_member+'": {'); - return json; + return json; } diff --git a/src/classes/StripeEvent.cls-meta.xml b/src/classes/StripeEvent.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeEvent.cls-meta.xml +++ b/src/classes/StripeEvent.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeEventTests.cls b/src/classes/StripeEventTests.cls index ea41ba3..14b7a90 100644 --- a/src/classes/StripeEventTests.cls +++ b/src/classes/StripeEventTests.cls @@ -603,6 +603,94 @@ public class StripeEventTests { } } + public static String testData_CustomerCreated { + get { + return '{'+ + ' "id": "evt_103ctn2BONonlYaUjvgdxaMj",'+ + ' "created": 1394260283,'+ + ' "livemode": false,'+ + ' "type": "customer.created",'+ + ' "data": {'+ + ' "object": {'+ + ' "object": "customer",'+ + ' "created": 1383951929,'+ + ' "id": "cus_00000000000000",'+ + ' "livemode": false,'+ + ' "description": "Life in the Clouds",'+ + ' "email": null,'+ + ' "delinquent": false,'+ + ' "metadata": {},'+ + ' "subscriptions": {'+ + ' "object": "list",'+ + ' "count": 0,'+ + ' "url": "/v1/customers/cus_00000000000000/subscriptions",'+ + ' "data": []'+ + ' },'+ + ' "discount": null,'+ + ' "account_balance": 0,'+ + ' "currency": null,'+ + ' "cards": {'+ + ' "object": "list",'+ + ' "count": 2,'+ + ' "url": "/v1/customers/cus_00000000000000/cards",'+ + ' "data": ['+ + ' {'+ + ' "id": "card_103ctg2BONonlYaUl4Njcd7V",'+ + ' "object": "card",'+ + ' "last4": "1881",'+ + ' "type": "Visa",'+ + ' "exp_month": 3,'+ + ' "exp_year": 2016,'+ + ' "fingerprint": "oVSfQJDcxFfCBlGB",'+ + ' "customer": "cus_00000000000000",'+ + ' "country": "US",'+ + ' "name": null,'+ + ' "address_line1": null,'+ + ' "address_line2": null,'+ + ' "address_city": null,'+ + ' "address_state": null,'+ + ' "address_zip": null,'+ + ' "address_country": null,'+ + ' "cvc_check": "pass",'+ + ' "address_line1_check": null,'+ + ' "address_zip_check": null'+ + ' },'+ + ' {'+ + ' "id": "card_102uCj2BONonlYaULwspZstB",'+ + ' "object": "card",'+ + ' "last4": "4242",'+ + ' "type": "Visa",'+ + ' "exp_month": 11,'+ + ' "exp_year": 2014,'+ + ' "fingerprint": "jTU2IfFVCVRg8CCh",'+ + ' "customer": "cus_00000000000000",'+ + ' "country": "US",'+ + ' "name": null,'+ + ' "address_line1": null,'+ + ' "address_line2": null,'+ + ' "address_city": null,'+ + ' "address_state": null,'+ + ' "address_zip": null,'+ + ' "address_country": null,'+ + ' "cvc_check": "pass",'+ + ' "address_line1_check": null,'+ + ' "address_zip_check": null'+ + ' }'+ + ' ]'+ + ' },'+ + ' "default_card": "card_103ctg2BONonlYaUl4Njcd7V",'+ + ' "subscription": null'+ + ' },'+ + ' "previous_attributes": {'+ + ' "default_card": "card_102uCj2BONonlYaULwspZstB"'+ + ' }'+ + ' },'+ + ' "object": "event",'+ + ' "request": "iar_3ctnxZZ4RjfXuK"'+ + '}'; + } + } + private static testMethod void test_general() { new StripeEvent(); new StripeEvent.EventData(); diff --git a/src/classes/StripeEventTests.cls-meta.xml b/src/classes/StripeEventTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeEventTests.cls-meta.xml +++ b/src/classes/StripeEventTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeException.cls-meta.xml b/src/classes/StripeException.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeException.cls-meta.xml +++ b/src/classes/StripeException.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeInvoice.cls-meta.xml b/src/classes/StripeInvoice.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeInvoice.cls-meta.xml +++ b/src/classes/StripeInvoice.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeInvoiceItemResponse.cls-meta.xml b/src/classes/StripeInvoiceItemResponse.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeInvoiceItemResponse.cls-meta.xml +++ b/src/classes/StripeInvoiceItemResponse.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeInvoiceItemResponseTests.cls-meta.xml b/src/classes/StripeInvoiceItemResponseTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeInvoiceItemResponseTests.cls-meta.xml +++ b/src/classes/StripeInvoiceItemResponseTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeInvoiceTests.cls b/src/classes/StripeInvoiceTests.cls index 0819580..fee89a5 100644 --- a/src/classes/StripeInvoiceTests.cls +++ b/src/classes/StripeInvoiceTests.cls @@ -142,7 +142,7 @@ public class StripeInvoiceTests { '}'; } } - + private static testMethod void testParse() { String json = testData_getInvoice; StripeInvoice obj = StripeInvoice.parse(json); @@ -174,5 +174,4 @@ public class StripeInvoiceTests { new StripeInvoice.Lines(); new StripeInvoice.InvoiceItem(); } - } \ No newline at end of file diff --git a/src/classes/StripeInvoiceTests.cls-meta.xml b/src/classes/StripeInvoiceTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeInvoiceTests.cls-meta.xml +++ b/src/classes/StripeInvoiceTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripePlan.cls-meta.xml b/src/classes/StripePlan.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripePlan.cls-meta.xml +++ b/src/classes/StripePlan.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripePlanList.cls-meta.xml b/src/classes/StripePlanList.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripePlanList.cls-meta.xml +++ b/src/classes/StripePlanList.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripePlanSubscription.cls b/src/classes/StripePlanSubscription.cls new file mode 100644 index 0000000..2f8fd43 --- /dev/null +++ b/src/classes/StripePlanSubscription.cls @@ -0,0 +1,3 @@ +public class StripePlanSubscription { + +} \ No newline at end of file diff --git a/src/classes/StripePlanSubscription.cls-meta.xml b/src/classes/StripePlanSubscription.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripePlanSubscription.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripePlanTests.cls-meta.xml b/src/classes/StripePlanTests.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripePlanTests.cls-meta.xml +++ b/src/classes/StripePlanTests.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeSampleController.cls b/src/classes/StripeSampleController.cls new file mode 100644 index 0000000..b14cc0d --- /dev/null +++ b/src/classes/StripeSampleController.cls @@ -0,0 +1,101 @@ +public class StripeSampleController { + + public boolean isStep1 {public get; set;} + public boolean isStep2 {public get; set;} + public Account acc {get; set;} + public Contact cont {get; set;} + public final String StripePublicKey = 'pk_test_mHVVylBD66Fk6kUmPKifGc2G'; + protected final String StripeSecretKey = 'sk_test_Mvypcczfz1ypm8YyMwOX9eWd'; + + private Map parameters; + + public StripeSampleController () { + this.isStep1 = true; + this.acc = new Account(); + this.cont = new Contact(); + } + + public string getStripePk () { + return this.StripePublicKey; + } + + public void save() { + + insert this.Acc; + this.Cont.AccountId = this.Acc.Id; + this.Cont.LastName = this.Acc.Name; // and again, name should better be split, looked up etc. + insert this.Cont; + + // drops all post variables into a map of strings + this.parameters = ApexPages.currentPage().getParameters(); + + // controls which page blocks to show + this.isStep2 = true; + this.isStep1 = false; + + Map properties = new Map(); + Map metadata = new Map(); + + StripeSampleController.createCustomerAndCharge(this.acc.Id, this.cont.id, this.parameters.get('stripeToken')); + } + + @future (callout=true) + private static void createCustomerAndCharge(string acc, String cont, String token) { + + Account a = new Account(); + Contact c = new Contact(); + StripeCustomer customer = new StripeCustomer(); + StripeCharge charge = new StripeCharge(); + + Map properties = new Map(); + Map metadata = new Map(); + + try { + a = [SELECT id, StripeCustomerID__c FROM Account WHERE Id = : acc LIMIT 1]; + c = [SELECT id, Email FROM Contact WHERE Id = : cont LIMIT 1]; + + properties.put('source', token); + properties.put('email', c.Email); + properties.put('description','Sample Payment Form'); + + metadata.put('SFDCAccount', a.Id); + metadata.put('SGDCContact', c.Id); + + customer = StripeCustomer.create(properties, metadata); + a.StripeCustomerID__c = customer.Id; + + Integer amount = 100; + // clearing properties to set up required and optional fields for charges + properties = new Map(); + properties.put('customer', customer.id); + properties.put('currency', 'eur'); + + charge = StripeCharge.create(customer.Id, amount, properties, metadata); + } + + catch (DmlException d) { + System.debug('DML Exception ' + d.getMessage()); + } + + catch (StripeException e) { + System.debug('Stripe Exception ' + e.getMessage()); + } + + catch (Exception e) { + System.debug('Exception ' + e.getMessage()); + } + finally { + if (a != null) { + update a; + } + if (c != null) { + update c; + } + } + } + + public string getToken () { + return JSON.serialize(this.parameters); + } + +} \ No newline at end of file diff --git a/src/classes/StripeSampleController.cls-meta.xml b/src/classes/StripeSampleController.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripeSampleController.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripeSubscription.cls-meta.xml b/src/classes/StripeSubscription.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeSubscription.cls-meta.xml +++ b/src/classes/StripeSubscription.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeSubscriptionTests.cls-meta.xml b/src/classes/StripeSubscriptionTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeSubscriptionTests.cls-meta.xml +++ b/src/classes/StripeSubscriptionTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeToken.cls-meta.xml b/src/classes/StripeToken.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeToken.cls-meta.xml +++ b/src/classes/StripeToken.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeTokenTests.cls b/src/classes/StripeTokenTests.cls index 1222d9b..a3b5beb 100644 --- a/src/classes/StripeTokenTests.cls +++ b/src/classes/StripeTokenTests.cls @@ -34,5 +34,4 @@ public class StripeTokenTests { private static testMethod void test() { new StripeToken(); } - } \ No newline at end of file diff --git a/src/classes/StripeTokenTests.cls-meta.xml b/src/classes/StripeTokenTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeTokenTests.cls-meta.xml +++ b/src/classes/StripeTokenTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeUtil.cls b/src/classes/StripeUtil.cls index b043718..12a6944 100644 --- a/src/classes/StripeUtil.cls +++ b/src/classes/StripeUtil.cls @@ -12,12 +12,20 @@ global class StripeUtil { return DateTime.newInstance(l).date(); } - global static String urlify(Map params) { + /*global static String urlify(Map params) { String url = '&'; for (String key : params.keySet()) { url += EncodingUtil.urlEncode(key, 'UTF-8') + '=' + EncodingUtil.urlEncode(blankValue(params.get(key), ''), 'UTF-8') + '&'; } return url; + }*/ + + global static String urlify(Map params) { + String url = '?'; + for (String key : params.keySet()) { + url += EncodingUtil.urlEncode(key, 'UTF-8') + '=' + EncodingUtil.urlEncode(blankValue(params.get(key), ''), 'UTF-8') + '&'; + } + return url; } global static String cleanJson(String json) { diff --git a/src/classes/StripeUtil.cls-meta.xml b/src/classes/StripeUtil.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeUtil.cls-meta.xml +++ b/src/classes/StripeUtil.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeUtilTests.cls b/src/classes/StripeUtilTests.cls index 62c58c4..2e31c1b 100644 --- a/src/classes/StripeUtilTests.cls +++ b/src/classes/StripeUtilTests.cls @@ -12,10 +12,12 @@ private class StripeUtilTests { System.assertEquals('def', StripeUtil.blankValue(s, 'def')); System.assertEquals('def', StripeUtil.blankValue('', 'def')); - System.assertEquals(Date.newInstance(2012, 1, 17), StripeUtil.getDate(1326853478)); + // 1326853478 converts to Wed, 18 Jan 2012 02:24:38 GMT + System.assertEquals(Date.newInstance(2012, 1, 18), StripeUtil.getDate(1326853478)); String urlified = StripeUtil.urlify(new Map{'a'=>'1','b'=>'2'}); - System.assert(urlified=='&a=1&b=2&'||urlified=='&b=2&a=1&', urlified); + // assertion wasn't properly writen + System.assert(urlified=='?a=1&b=2&'||urlified=='?b=2&a=1&'); } } \ No newline at end of file diff --git a/src/classes/StripeUtilTests.cls-meta.xml b/src/classes/StripeUtilTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeUtilTests.cls-meta.xml +++ b/src/classes/StripeUtilTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeWebhookListener.cls-meta.xml b/src/classes/StripeWebhookListener.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeWebhookListener.cls-meta.xml +++ b/src/classes/StripeWebhookListener.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeWebhookListenerTests.cls-meta.xml b/src/classes/StripeWebhookListenerTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeWebhookListenerTests.cls-meta.xml +++ b/src/classes/StripeWebhookListenerTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/TestStripe.cls b/src/classes/TestStripe.cls index 01260fb..5bcfe92 100644 --- a/src/classes/TestStripe.cls +++ b/src/classes/TestStripe.cls @@ -20,6 +20,7 @@ public class TestStripe { } private static testmethod void testStripeAPI() { + Test.startTest(); System.assertEquals(null, StripeAPI.ApiKey); System.assertEquals(null, StripeAPI.PublishableKey); System.assertEquals(true, StripeAPI.isTest); @@ -38,6 +39,7 @@ public class TestStripe { System.assertEquals(true, StripeAPI.isTest); System.assertEquals('123', StripeAPI.ApiKey); System.assertEquals('def', StripeAPI.PublishableKey); + Test.stopTest(); } public static void StripeDataSetup() { diff --git a/src/classes/TestStripe.cls-meta.xml b/src/classes/TestStripe.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/TestStripe.cls-meta.xml +++ b/src/classes/TestStripe.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/WebhookDelayedProcessor.cls-meta.xml b/src/classes/WebhookDelayedProcessor.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/WebhookDelayedProcessor.cls-meta.xml +++ b/src/classes/WebhookDelayedProcessor.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/objects/Stripe_Settings__c.object b/src/objects/Stripe_Settings__c.object old mode 100644 new mode 100755 index 03167d1..c24432d --- a/src/objects/Stripe_Settings__c.object +++ b/src/objects/Stripe_Settings__c.object @@ -10,7 +10,6 @@ 18 false - false Text false @@ -20,7 +19,6 @@ false Check this to use the LIVE key in all API operations. - false Checkbox @@ -29,7 +27,6 @@ 40 true - false Text false @@ -39,7 +36,6 @@ 40 true - false Text false @@ -50,7 +46,6 @@ 40 true - false Text false @@ -61,7 +56,6 @@ 40 true - false Text false diff --git a/src/objects/Stripe_Webhook__c.object b/src/objects/Stripe_Webhook__c.object old mode 100644 new mode 100755 index 7c1fb62..b40a235 --- a/src/objects/Stripe_Webhook__c.object +++ b/src/objects/Stripe_Webhook__c.object @@ -4,10 +4,6 @@ Accept Default - - CancelEdit - Default - Clone Default @@ -20,10 +16,6 @@ Edit Default - - Follow - Default - List Default @@ -32,10 +24,6 @@ New Default - - SaveEdit - Default - Tab Default @@ -44,16 +32,12 @@ View Default - SYSTEM Deployed Records created to assist with the processing of delayed webhooks from stripe. false - true false false false - true - true Attempts__c 1 @@ -63,30 +47,9 @@ 2 true 0 - false Number false - - Error_Message__c - false - - 255 - false - false - Text - false - - - Event_ID__c - false - - 255 - false - false - Text - false - Status__c false @@ -106,7 +69,6 @@ false - false Picklist @@ -114,7 +76,6 @@ false 32768 - false LongTextArea 10 @@ -124,7 +85,6 @@ 40 true - false Text false @@ -139,11 +99,6 @@ Everything - - All1 - Everything - - HK-{00000} From a9ca799067ce1ae89b4215f1c34dab58474ed2d9 Mon Sep 17 00:00:00 2001 From: Daniel Stange Date: Sat, 6 Feb 2016 12:07:12 +0100 Subject: [PATCH 3/7] Improvements to Charges and Events to match the current API version --- src/classes/StripExceptionTests.cls | 22 +++ src/classes/StripExceptionTests.cls-meta.xml | 5 + src/classes/StripeAPI.cls | 133 +++++++++--------- src/classes/StripeAPI.cls-meta.xml | 2 +- src/classes/StripeBalance.cls | 39 +++++ src/classes/StripeBalance.cls-meta.xml | 5 + src/classes/StripeCard.cls-meta.xml | 2 +- src/classes/StripeCardTests.cls | 9 ++ src/classes/StripeCardTests.cls-meta.xml | 2 +- src/classes/StripeCharge.cls | 90 ++++++++---- src/classes/StripeCharge.cls-meta.xml | 2 +- src/classes/StripeChargeTests.cls-meta.xml | 2 +- src/classes/StripeCoupon.cls-meta.xml | 2 +- src/classes/StripeCouponTests.cls-meta.xml | 2 +- src/classes/StripeCustomer.cls | 32 +++-- src/classes/StripeCustomer.cls-meta.xml | 2 +- src/classes/StripeCustomerTests.cls-meta.xml | 2 +- src/classes/StripeDispute.cls | 6 + src/classes/StripeDispute.cls-meta.xml | 5 + src/classes/StripeError.cls-meta.xml | 2 +- src/classes/StripeEvent.cls | 47 +++++-- src/classes/StripeEvent.cls-meta.xml | 2 +- src/classes/StripeEventTests.cls | 88 ++++++++++++ src/classes/StripeEventTests.cls-meta.xml | 2 +- src/classes/StripeException.cls-meta.xml | 2 +- src/classes/StripeInvoice.cls-meta.xml | 2 +- .../StripeInvoiceItemResponse.cls-meta.xml | 2 +- ...tripeInvoiceItemResponseTests.cls-meta.xml | 2 +- src/classes/StripeInvoiceTests.cls | 3 +- src/classes/StripeInvoiceTests.cls-meta.xml | 2 +- src/classes/StripePlan.cls-meta.xml | 2 +- src/classes/StripePlanList.cls-meta.xml | 2 +- src/classes/StripePlanSubscription.cls | 3 + .../StripePlanSubscription.cls-meta.xml | 5 + src/classes/StripePlanTests.cls-meta.xml | 2 +- src/classes/StripeSampleController.cls | 101 +++++++++++++ .../StripeSampleController.cls-meta.xml | 5 + src/classes/StripeSubscription.cls-meta.xml | 2 +- .../StripeSubscriptionTests.cls-meta.xml | 2 +- src/classes/StripeToken.cls-meta.xml | 2 +- src/classes/StripeTokenTests.cls | 1 - src/classes/StripeTokenTests.cls-meta.xml | 2 +- src/classes/StripeUtil.cls | 10 +- src/classes/StripeUtil.cls-meta.xml | 2 +- src/classes/StripeUtilTests.cls | 6 +- src/classes/StripeUtilTests.cls-meta.xml | 2 +- .../StripeWebhookListener.cls-meta.xml | 2 +- .../StripeWebhookListenerTests.cls-meta.xml | 2 +- src/classes/TestStripe.cls | 2 + src/classes/TestStripe.cls-meta.xml | 2 +- .../WebhookDelayedProcessor.cls-meta.xml | 2 +- src/objects/Stripe_Settings__c.object | 0 src/objects/Stripe_Webhook__c.object | 0 53 files changed, 525 insertions(+), 152 deletions(-) create mode 100644 src/classes/StripExceptionTests.cls create mode 100644 src/classes/StripExceptionTests.cls-meta.xml create mode 100644 src/classes/StripeBalance.cls create mode 100644 src/classes/StripeBalance.cls-meta.xml create mode 100644 src/classes/StripeDispute.cls create mode 100644 src/classes/StripeDispute.cls-meta.xml create mode 100644 src/classes/StripePlanSubscription.cls create mode 100644 src/classes/StripePlanSubscription.cls-meta.xml create mode 100644 src/classes/StripeSampleController.cls create mode 100644 src/classes/StripeSampleController.cls-meta.xml mode change 100644 => 100755 src/objects/Stripe_Settings__c.object mode change 100644 => 100755 src/objects/Stripe_Webhook__c.object diff --git a/src/classes/StripExceptionTests.cls b/src/classes/StripExceptionTests.cls new file mode 100644 index 0000000..62057cc --- /dev/null +++ b/src/classes/StripExceptionTests.cls @@ -0,0 +1,22 @@ +@isTest +private class StripExceptionTests { + + @isTest + private static void testStripeException() { + Test.startTest(); + StripeError err = new StripeError(); + err.code = '123'; + err.message = 'void'; + err.param = 'none'; + err.stripeType = 'Charge'; + + StripeException ex = new StripeException(err); + String s = ex.getMessage(); + + StripeError res = ex.getError(); + + Test.stopTest(); + } + + +} \ No newline at end of file diff --git a/src/classes/StripExceptionTests.cls-meta.xml b/src/classes/StripExceptionTests.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripExceptionTests.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripeAPI.cls b/src/classes/StripeAPI.cls index aa29c0d..e3c93ac 100644 --- a/src/classes/StripeAPI.cls +++ b/src/classes/StripeAPI.cls @@ -1,69 +1,72 @@ global class StripeAPI { - global static String ApiKey { - get { - Stripe_Settings__c s = Stripe_Settings__c.getInstance(); - if (s != null) { - if (StripeAPI.isTest) { - return s.Stripe_Secret_Test_Key__c; - } else { - return s.Stripe_Secret_Live_Key__c; - } - } - return null; - } - } - - global static String PublishableKey { - get { - Stripe_Settings__c s = Stripe_Settings__c.getInstance(); - if (s != null) { - if (StripeAPI.isTest) { - return s.Stripe_Publishable_Test_Key__c; - } else { - return s.Stripe_Publishable_Live_Key__c; - } - } - return null; - } - } - - global static Boolean isWebhookProcessorRunning() { - Stripe_Settings__c s = Stripe_Settings__c.getOrgDefaults(); - if (s != null) { - if (s.Delayed_Webhook_Processor_ID__c == null) { - return false; - } else { - System.debug(System.LoggingLevel.INFO, '\n**** stripe settings: '+s); - try { - CronTrigger sched = [Select State, NextFireTime From CronTrigger Where Id =: s.Delayed_Webhook_Processor_ID__c]; - if (sched.NextFireTime != null) return true; - } catch (System.QueryException e) {} - } - } + global static String ApiKey { + get { + + Stripe_Settings__c s = Stripe_Settings__c.getInstance(); + + if (s != null) { + if (StripeAPI.isTest) { + return s.Stripe_Secret_Test_Key__c; + } else { + return s.Stripe_Secret_Live_Key__c; + } + } + return null; + } + } + + global static String PublishableKey { + get { + Stripe_Settings__c s = Stripe_Settings__c.getInstance(); + if (s != null) { + if (StripeAPI.isTest) { + return s.Stripe_Publishable_Test_Key__c; + } else { + return s.Stripe_Publishable_Live_Key__c; + } + } + return null; + } + } + + global static Boolean isWebhookProcessorRunning() { + Stripe_Settings__c s = Stripe_Settings__c.getOrgDefaults(); + if (s != null) { + if (s.Delayed_Webhook_Processor_ID__c == null) { + return false; + } else { + System.debug(System.LoggingLevel.INFO, '\n**** stripe settings: '+s); + try { + CronTrigger sched = [Select State, NextFireTime From CronTrigger Where Id =: s.Delayed_Webhook_Processor_ID__c]; + if (sched.NextFireTime != null) return true; + } catch (System.QueryException e) {} + } + } - return false; - } - - global static void startWebhookProcessor() { - if (isWebhookProcessorRunning() == false) { - WebhookDelayedProcessor proc = new WebhookDelayedProcessor(); - Id jobId = System.scheduleBatch(proc, 'delayed webhook processor', 5); - - Stripe_Settings__c s = Stripe_Settings__c.getOrgDefaults(); - s.Delayed_Webhook_Processor_ID__c = jobId; - update s; - } - } - - global static Boolean isTest { - get { - Stripe_Settings__c s = Stripe_Settings__c.getInstance(); - if (s != null) { - return !s.Is_Live_Environment__c; - } - return true; - } - } - + return false; + } + + global static void startWebhookProcessor() { + if (isWebhookProcessorRunning() == false) { + WebhookDelayedProcessor proc = new WebhookDelayedProcessor(); + Id jobId = System.scheduleBatch(proc, 'delayed webhook processor', 5); + + Stripe_Settings__c s = Stripe_Settings__c.getOrgDefaults(); + s.Delayed_Webhook_Processor_ID__c = jobId; + update s; + } + } + + global static Boolean isTest { + get { + Stripe_Settings__c s = Stripe_Settings__c.getInstance(); + + if (s != null) { + return !s.Is_Live_Environment__c; + } + return true; + } + } + } \ No newline at end of file diff --git a/src/classes/StripeAPI.cls-meta.xml b/src/classes/StripeAPI.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeAPI.cls-meta.xml +++ b/src/classes/StripeAPI.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeBalance.cls b/src/classes/StripeBalance.cls new file mode 100644 index 0000000..fd968b7 --- /dev/null +++ b/src/classes/StripeBalance.cls @@ -0,0 +1,39 @@ +global class StripeBalance { + + global String SripeObject; + global StripeTransaction[] available; + global StripeTransaction[] pending; + global Boolean livemode; + + global class StripeBalanceTransaction { + global string id; + global string stripeObject; + global integer amount; + global string timestamp; + global string StripeCurrency; + global string description; + global integer fee; + global String[] fee_details; + global integer net; + global string source; + global String[] sourced_transfers; // child attributes + global String status; + global String type; + } + + global class stripeTransaction { + global integer amount; + global string stripeCurrency; + } + + global class StripeFeeDetails { + global integer amount; + global string StripeCurrency; + global string description; + global string type; + global integer net; + global string source; + global Map sourced_transfers; // TODO: Sourced Transfers object + } + +} \ No newline at end of file diff --git a/src/classes/StripeBalance.cls-meta.xml b/src/classes/StripeBalance.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripeBalance.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripeCard.cls-meta.xml b/src/classes/StripeCard.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeCard.cls-meta.xml +++ b/src/classes/StripeCard.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeCardTests.cls b/src/classes/StripeCardTests.cls index 1f95e77..fdd31ef 100644 --- a/src/classes/StripeCardTests.cls +++ b/src/classes/StripeCardTests.cls @@ -26,4 +26,13 @@ public class StripeCardTests { '}'; } } + + @isTest + public static void createStripeCardTest () { + + + Test.startTest(); + StripeCard.create('cus_1234567abcdef', 'tok_8901234ghijk'); + Test.stopTest(); + } } \ No newline at end of file diff --git a/src/classes/StripeCardTests.cls-meta.xml b/src/classes/StripeCardTests.cls-meta.xml index b211a09..b12420e 100644 --- a/src/classes/StripeCardTests.cls-meta.xml +++ b/src/classes/StripeCardTests.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 31.0 Active diff --git a/src/classes/StripeCharge.cls b/src/classes/StripeCharge.cls index c2fbe42..ef6c98f 100644 --- a/src/classes/StripeCharge.cls +++ b/src/classes/StripeCharge.cls @@ -1,32 +1,51 @@ global class StripeCharge { private static final String SERVICE_URL = 'https://api.stripe.com/v1/charges'; - global Integer amount; - global Integer created; - global String stripeCurrency; - global String customer_id; + global Integer fee; // legacy + global String api_version; // legacy + global StripeCard card; // legacy + global List fee_details; // legacy + global StripeError error; //legacy + + global String id; // + global String stripeObject; + global Integer amount; + global Integer amount_refunded; + global String application_fee; + global String balance_transaction; + global Boolean captured; + global Integer created; + global String stripeCurrency; + global String customer_id; // legacy global StripeCustomer customer; - global String description; - global Boolean disputed; - global Integer fee; - global String id; - global Boolean livemode; - global String stripeObject; - global Boolean paid; - global Boolean refunded; - global Integer amount_refunded; - global StripeCard card; - global List fee_details; - global StripeError error; + global String description; + global String destination; + global StripeDispute dispute; + global Boolean disputed; // legacy + global String failure_code; + global String failure_message; + global Map fraud_details; global String invoice_id; global StripeInvoice invoice; - global String failure_message; + global Boolean livemode; global Map metadata; - + global String order; + global Boolean paid; + global String receipt_email; + global String receipt_number; + global Boolean refunded; + global Refunds refunds; + global Shipping shipping; + global StripeCard source; + global String statement_descriptor; + global String status; + global String transfer; + // This has changed in the 2013-02-13 API // https://stripe.com/docs/upgrades#2013-02-13 // And more recently on 2013-08-13 // https://stripe.com/docs/upgrades#2013-08-13 + global class Fee_details { global String stripeType; global String description; @@ -35,6 +54,20 @@ global class StripeCharge { global String stripeCurrency; } + global class Shipping { + + } + + global class StripeDispute { + + } + + global class Refunds { + + } + + + global static StripeCharge getCharge(String chargeId) { return StripeCharge.getCharge(chargeId, false); } @@ -104,15 +137,9 @@ global class StripeCharge { } global static StripeCharge create(String customerId, Decimal amount, Map properties, Map metadata) { - HttpRequest http = new HttpRequest(); - http.setEndpoint(SERVICE_URL); - http.setMethod('POST'); - Blob headerValue = Blob.valueOf(StripeAPI.ApiKey + ':'); - String authorizationHeader = 'BASIC ' + - EncodingUtil.base64Encode(headerValue); - http.setHeader('Authorization', authorizationHeader); Integer amount_int = Math.round(amount * 100);//.intValue(); + Map payload = new Map{ 'customer' => customerId, 'amount' => String.valueOf(amount_int) @@ -120,7 +147,7 @@ global class StripeCharge { // set the default currency to USD if it's not specified if (properties == null || properties.containsKey('usd') == false) { - payload.put('currency', 'usd'); + payload.put('currency', 'EUR'); } if (properties != null) { @@ -139,7 +166,16 @@ global class StripeCharge { } } - http.setBody(StripeUtil.urlify(payload)); + String params = StripeUtil.urlify(payload); + + HttpRequest http = new HttpRequest(); + http.setEndpoint(SERVICE_URL + params); + http.setMethod('POST'); + Blob headerValue = Blob.valueOf(StripeAPI.ApiKey + ':'); + String authorizationHeader = 'BASIC ' + + EncodingUtil.base64Encode(headerValue); + http.setHeader('Authorization', authorizationHeader); + System.debug(System.LoggingLevel.INFO, '\n**** REQUEST BODY:\n'+http.getBody()); String response; diff --git a/src/classes/StripeCharge.cls-meta.xml b/src/classes/StripeCharge.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeCharge.cls-meta.xml +++ b/src/classes/StripeCharge.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeChargeTests.cls-meta.xml b/src/classes/StripeChargeTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeChargeTests.cls-meta.xml +++ b/src/classes/StripeChargeTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeCoupon.cls-meta.xml b/src/classes/StripeCoupon.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeCoupon.cls-meta.xml +++ b/src/classes/StripeCoupon.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeCouponTests.cls-meta.xml b/src/classes/StripeCouponTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeCouponTests.cls-meta.xml +++ b/src/classes/StripeCouponTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeCustomer.cls b/src/classes/StripeCustomer.cls index ce84353..27dbd56 100644 --- a/src/classes/StripeCustomer.cls +++ b/src/classes/StripeCustomer.cls @@ -72,7 +72,7 @@ global class StripeCustomer { global static StripeCustomer create(String token, String description) { Map properties = new Map{ - 'card' => token, + 'source' => token, 'description' => description }; return StripeCustomer.create(properties, null); @@ -131,18 +131,6 @@ global class StripeCustomer { } global static StripeCustomer updateCustomer(String customerId, Map properties, Map metadata) { - HttpRequest http = new HttpRequest(); - - if (customerId == null) - http.setEndpoint(StripeCustomer.SERVICE_URL); - else - http.setEndpoint(StripeCustomer.SERVICE_URL+'/'+customerId); - - http.setMethod('POST'); - Blob headerValue = Blob.valueOf(StripeAPI.ApiKey + ':'); - String authorizationHeader = 'BASIC ' + - EncodingUtil.base64Encode(headerValue); - http.setHeader('Authorization', authorizationHeader); Map payload = new Map(); if (properties != null) { @@ -159,9 +147,25 @@ global class StripeCustomer { payload.put('metadata['+key+']', metadata.get(key)); } } + } - http.setBody(StripeUtil.urlify(payload)); + HttpRequest http = new HttpRequest(); + + if (customerId == null) + http.setEndpoint(StripeCustomer.SERVICE_URL + StripeUtil.urlify(payload)); + else + http.setEndpoint(StripeCustomer.SERVICE_URL+'/'+customerId + StripeUtil.urlify(payload)); + + http.setMethod('POST'); + System.debug('DIA API Key' + StripeAPI.ApiKey); + Blob headerValue = Blob.valueOf(StripeAPI.ApiKey + ':'); + String authorizationHeader = 'BASIC ' + + EncodingUtil.base64Encode(headerValue); + http.setHeader('Authorization', authorizationHeader); + + //http.setBody(StripeUtil.urlify(payload)); + System.debug(System.LoggingLevel.INFO, '\n**** REQUEST BODY:\n'+http.getBody()); String response; diff --git a/src/classes/StripeCustomer.cls-meta.xml b/src/classes/StripeCustomer.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeCustomer.cls-meta.xml +++ b/src/classes/StripeCustomer.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeCustomerTests.cls-meta.xml b/src/classes/StripeCustomerTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeCustomerTests.cls-meta.xml +++ b/src/classes/StripeCustomerTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeDispute.cls b/src/classes/StripeDispute.cls new file mode 100644 index 0000000..f48e74d --- /dev/null +++ b/src/classes/StripeDispute.cls @@ -0,0 +1,6 @@ +global class StripeDispute { + + global string id; + global string stripeOobject; + global string amount; +} \ No newline at end of file diff --git a/src/classes/StripeDispute.cls-meta.xml b/src/classes/StripeDispute.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripeDispute.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripeError.cls-meta.xml b/src/classes/StripeError.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeError.cls-meta.xml +++ b/src/classes/StripeError.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeEvent.cls b/src/classes/StripeEvent.cls index 4da4b4d..09f910b 100644 --- a/src/classes/StripeEvent.cls +++ b/src/classes/StripeEvent.cls @@ -1,11 +1,15 @@ global class StripeEvent { - global String stripeType; - global Integer created; + global String stripeType; + global Integer created; global EventData stripeData; - global Boolean livemode; - global String id; + global Boolean livemode; + global String id; global StripeError error; + global String stripeObject; + global String apiVersion; + global Integer pendingWebhooks; + global String request; // map the event to the stripeData object that will be filled private static Map supported_events = new Map{ @@ -23,6 +27,24 @@ global class StripeEvent { 'ping' => 'object' // leave it alone }; + // Fix to serialize values that formerly broke the webservice + // SOBCRM-38 + // https://interaktiv.jira.com/projects/SOBCRM/issues/SOBCRM-38 + // DSt 2016-02-05 + + global class PreviousRefunds { + StripeCharge.Refunds [] stripeData; + Integer total_count; + + } + + global class PreviousAttributes { + Integer amount_refunded; + Boolean refunded; + PreviousRefunds refunds; + String default_card; + } + global class EventData { // One of the following members will be populated, depending on the event type global StripeCharge StripeCharge; @@ -31,21 +53,26 @@ global class StripeEvent { global StripeCustomer StripeCustomer; global StripeCard StripeCard; - global Map previous_attributes; + //global Map previous_attributes; + global PreviousRefunds previous_attributes; } + // SOBCRM 38 --> public static StripeEvent parse(String json) { json = rationalize(json); - json = StripeUtil.cleanJson(json); - - System.debug(System.LoggingLevel.INFO, '\n**** StripeEvent Parsed JSON:\n'+json); - return (StripeEvent) System.JSON.deserialize(json, StripeEvent.class); + json = StripeUtil.cleanJson(json); + + System.debug(System.LoggingLevel.INFO, '\n**** StripeEvent Parsed JSON:\n'+json); + StripeEvent oStripeEvent = (StripeEvent) System.JSON.deserialize(json, StripeEvent.class); + + return oStripeEvent; } // changes the generic 'object' property to a typed property that Apex can serialize into the appropriate object based on the event type // Accepts the raw JSON string from the webhook listener private static String rationalize(String json) { // identify the type of event + String event_type = json.substring( json.indexOf('"type"')+9, json.indexOf('"', json.indexOf('"type"')+9) @@ -56,7 +83,7 @@ global class StripeEvent { if (data_member == null) throw new UnknownWebhookException('Unknown webhook event'); json = json.replaceFirst('"object":\\s?\\{', '"'+data_member+'": {'); - return json; + return json; } diff --git a/src/classes/StripeEvent.cls-meta.xml b/src/classes/StripeEvent.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeEvent.cls-meta.xml +++ b/src/classes/StripeEvent.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeEventTests.cls b/src/classes/StripeEventTests.cls index ea41ba3..14b7a90 100644 --- a/src/classes/StripeEventTests.cls +++ b/src/classes/StripeEventTests.cls @@ -603,6 +603,94 @@ public class StripeEventTests { } } + public static String testData_CustomerCreated { + get { + return '{'+ + ' "id": "evt_103ctn2BONonlYaUjvgdxaMj",'+ + ' "created": 1394260283,'+ + ' "livemode": false,'+ + ' "type": "customer.created",'+ + ' "data": {'+ + ' "object": {'+ + ' "object": "customer",'+ + ' "created": 1383951929,'+ + ' "id": "cus_00000000000000",'+ + ' "livemode": false,'+ + ' "description": "Life in the Clouds",'+ + ' "email": null,'+ + ' "delinquent": false,'+ + ' "metadata": {},'+ + ' "subscriptions": {'+ + ' "object": "list",'+ + ' "count": 0,'+ + ' "url": "/v1/customers/cus_00000000000000/subscriptions",'+ + ' "data": []'+ + ' },'+ + ' "discount": null,'+ + ' "account_balance": 0,'+ + ' "currency": null,'+ + ' "cards": {'+ + ' "object": "list",'+ + ' "count": 2,'+ + ' "url": "/v1/customers/cus_00000000000000/cards",'+ + ' "data": ['+ + ' {'+ + ' "id": "card_103ctg2BONonlYaUl4Njcd7V",'+ + ' "object": "card",'+ + ' "last4": "1881",'+ + ' "type": "Visa",'+ + ' "exp_month": 3,'+ + ' "exp_year": 2016,'+ + ' "fingerprint": "oVSfQJDcxFfCBlGB",'+ + ' "customer": "cus_00000000000000",'+ + ' "country": "US",'+ + ' "name": null,'+ + ' "address_line1": null,'+ + ' "address_line2": null,'+ + ' "address_city": null,'+ + ' "address_state": null,'+ + ' "address_zip": null,'+ + ' "address_country": null,'+ + ' "cvc_check": "pass",'+ + ' "address_line1_check": null,'+ + ' "address_zip_check": null'+ + ' },'+ + ' {'+ + ' "id": "card_102uCj2BONonlYaULwspZstB",'+ + ' "object": "card",'+ + ' "last4": "4242",'+ + ' "type": "Visa",'+ + ' "exp_month": 11,'+ + ' "exp_year": 2014,'+ + ' "fingerprint": "jTU2IfFVCVRg8CCh",'+ + ' "customer": "cus_00000000000000",'+ + ' "country": "US",'+ + ' "name": null,'+ + ' "address_line1": null,'+ + ' "address_line2": null,'+ + ' "address_city": null,'+ + ' "address_state": null,'+ + ' "address_zip": null,'+ + ' "address_country": null,'+ + ' "cvc_check": "pass",'+ + ' "address_line1_check": null,'+ + ' "address_zip_check": null'+ + ' }'+ + ' ]'+ + ' },'+ + ' "default_card": "card_103ctg2BONonlYaUl4Njcd7V",'+ + ' "subscription": null'+ + ' },'+ + ' "previous_attributes": {'+ + ' "default_card": "card_102uCj2BONonlYaULwspZstB"'+ + ' }'+ + ' },'+ + ' "object": "event",'+ + ' "request": "iar_3ctnxZZ4RjfXuK"'+ + '}'; + } + } + private static testMethod void test_general() { new StripeEvent(); new StripeEvent.EventData(); diff --git a/src/classes/StripeEventTests.cls-meta.xml b/src/classes/StripeEventTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeEventTests.cls-meta.xml +++ b/src/classes/StripeEventTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeException.cls-meta.xml b/src/classes/StripeException.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeException.cls-meta.xml +++ b/src/classes/StripeException.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeInvoice.cls-meta.xml b/src/classes/StripeInvoice.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeInvoice.cls-meta.xml +++ b/src/classes/StripeInvoice.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeInvoiceItemResponse.cls-meta.xml b/src/classes/StripeInvoiceItemResponse.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeInvoiceItemResponse.cls-meta.xml +++ b/src/classes/StripeInvoiceItemResponse.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeInvoiceItemResponseTests.cls-meta.xml b/src/classes/StripeInvoiceItemResponseTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeInvoiceItemResponseTests.cls-meta.xml +++ b/src/classes/StripeInvoiceItemResponseTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeInvoiceTests.cls b/src/classes/StripeInvoiceTests.cls index 0819580..fee89a5 100644 --- a/src/classes/StripeInvoiceTests.cls +++ b/src/classes/StripeInvoiceTests.cls @@ -142,7 +142,7 @@ public class StripeInvoiceTests { '}'; } } - + private static testMethod void testParse() { String json = testData_getInvoice; StripeInvoice obj = StripeInvoice.parse(json); @@ -174,5 +174,4 @@ public class StripeInvoiceTests { new StripeInvoice.Lines(); new StripeInvoice.InvoiceItem(); } - } \ No newline at end of file diff --git a/src/classes/StripeInvoiceTests.cls-meta.xml b/src/classes/StripeInvoiceTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeInvoiceTests.cls-meta.xml +++ b/src/classes/StripeInvoiceTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripePlan.cls-meta.xml b/src/classes/StripePlan.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripePlan.cls-meta.xml +++ b/src/classes/StripePlan.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripePlanList.cls-meta.xml b/src/classes/StripePlanList.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripePlanList.cls-meta.xml +++ b/src/classes/StripePlanList.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripePlanSubscription.cls b/src/classes/StripePlanSubscription.cls new file mode 100644 index 0000000..2f8fd43 --- /dev/null +++ b/src/classes/StripePlanSubscription.cls @@ -0,0 +1,3 @@ +public class StripePlanSubscription { + +} \ No newline at end of file diff --git a/src/classes/StripePlanSubscription.cls-meta.xml b/src/classes/StripePlanSubscription.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripePlanSubscription.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripePlanTests.cls-meta.xml b/src/classes/StripePlanTests.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripePlanTests.cls-meta.xml +++ b/src/classes/StripePlanTests.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeSampleController.cls b/src/classes/StripeSampleController.cls new file mode 100644 index 0000000..b14cc0d --- /dev/null +++ b/src/classes/StripeSampleController.cls @@ -0,0 +1,101 @@ +public class StripeSampleController { + + public boolean isStep1 {public get; set;} + public boolean isStep2 {public get; set;} + public Account acc {get; set;} + public Contact cont {get; set;} + public final String StripePublicKey = 'pk_test_mHVVylBD66Fk6kUmPKifGc2G'; + protected final String StripeSecretKey = 'sk_test_Mvypcczfz1ypm8YyMwOX9eWd'; + + private Map parameters; + + public StripeSampleController () { + this.isStep1 = true; + this.acc = new Account(); + this.cont = new Contact(); + } + + public string getStripePk () { + return this.StripePublicKey; + } + + public void save() { + + insert this.Acc; + this.Cont.AccountId = this.Acc.Id; + this.Cont.LastName = this.Acc.Name; // and again, name should better be split, looked up etc. + insert this.Cont; + + // drops all post variables into a map of strings + this.parameters = ApexPages.currentPage().getParameters(); + + // controls which page blocks to show + this.isStep2 = true; + this.isStep1 = false; + + Map properties = new Map(); + Map metadata = new Map(); + + StripeSampleController.createCustomerAndCharge(this.acc.Id, this.cont.id, this.parameters.get('stripeToken')); + } + + @future (callout=true) + private static void createCustomerAndCharge(string acc, String cont, String token) { + + Account a = new Account(); + Contact c = new Contact(); + StripeCustomer customer = new StripeCustomer(); + StripeCharge charge = new StripeCharge(); + + Map properties = new Map(); + Map metadata = new Map(); + + try { + a = [SELECT id, StripeCustomerID__c FROM Account WHERE Id = : acc LIMIT 1]; + c = [SELECT id, Email FROM Contact WHERE Id = : cont LIMIT 1]; + + properties.put('source', token); + properties.put('email', c.Email); + properties.put('description','Sample Payment Form'); + + metadata.put('SFDCAccount', a.Id); + metadata.put('SGDCContact', c.Id); + + customer = StripeCustomer.create(properties, metadata); + a.StripeCustomerID__c = customer.Id; + + Integer amount = 100; + // clearing properties to set up required and optional fields for charges + properties = new Map(); + properties.put('customer', customer.id); + properties.put('currency', 'eur'); + + charge = StripeCharge.create(customer.Id, amount, properties, metadata); + } + + catch (DmlException d) { + System.debug('DML Exception ' + d.getMessage()); + } + + catch (StripeException e) { + System.debug('Stripe Exception ' + e.getMessage()); + } + + catch (Exception e) { + System.debug('Exception ' + e.getMessage()); + } + finally { + if (a != null) { + update a; + } + if (c != null) { + update c; + } + } + } + + public string getToken () { + return JSON.serialize(this.parameters); + } + +} \ No newline at end of file diff --git a/src/classes/StripeSampleController.cls-meta.xml b/src/classes/StripeSampleController.cls-meta.xml new file mode 100644 index 0000000..d219ea1 --- /dev/null +++ b/src/classes/StripeSampleController.cls-meta.xml @@ -0,0 +1,5 @@ + + + 35.0 + Active + diff --git a/src/classes/StripeSubscription.cls-meta.xml b/src/classes/StripeSubscription.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeSubscription.cls-meta.xml +++ b/src/classes/StripeSubscription.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeSubscriptionTests.cls-meta.xml b/src/classes/StripeSubscriptionTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeSubscriptionTests.cls-meta.xml +++ b/src/classes/StripeSubscriptionTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeToken.cls-meta.xml b/src/classes/StripeToken.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeToken.cls-meta.xml +++ b/src/classes/StripeToken.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeTokenTests.cls b/src/classes/StripeTokenTests.cls index 1222d9b..a3b5beb 100644 --- a/src/classes/StripeTokenTests.cls +++ b/src/classes/StripeTokenTests.cls @@ -34,5 +34,4 @@ public class StripeTokenTests { private static testMethod void test() { new StripeToken(); } - } \ No newline at end of file diff --git a/src/classes/StripeTokenTests.cls-meta.xml b/src/classes/StripeTokenTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeTokenTests.cls-meta.xml +++ b/src/classes/StripeTokenTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeUtil.cls b/src/classes/StripeUtil.cls index b043718..12a6944 100644 --- a/src/classes/StripeUtil.cls +++ b/src/classes/StripeUtil.cls @@ -12,12 +12,20 @@ global class StripeUtil { return DateTime.newInstance(l).date(); } - global static String urlify(Map params) { + /*global static String urlify(Map params) { String url = '&'; for (String key : params.keySet()) { url += EncodingUtil.urlEncode(key, 'UTF-8') + '=' + EncodingUtil.urlEncode(blankValue(params.get(key), ''), 'UTF-8') + '&'; } return url; + }*/ + + global static String urlify(Map params) { + String url = '?'; + for (String key : params.keySet()) { + url += EncodingUtil.urlEncode(key, 'UTF-8') + '=' + EncodingUtil.urlEncode(blankValue(params.get(key), ''), 'UTF-8') + '&'; + } + return url; } global static String cleanJson(String json) { diff --git a/src/classes/StripeUtil.cls-meta.xml b/src/classes/StripeUtil.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeUtil.cls-meta.xml +++ b/src/classes/StripeUtil.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeUtilTests.cls b/src/classes/StripeUtilTests.cls index 62c58c4..2e31c1b 100644 --- a/src/classes/StripeUtilTests.cls +++ b/src/classes/StripeUtilTests.cls @@ -12,10 +12,12 @@ private class StripeUtilTests { System.assertEquals('def', StripeUtil.blankValue(s, 'def')); System.assertEquals('def', StripeUtil.blankValue('', 'def')); - System.assertEquals(Date.newInstance(2012, 1, 17), StripeUtil.getDate(1326853478)); + // 1326853478 converts to Wed, 18 Jan 2012 02:24:38 GMT + System.assertEquals(Date.newInstance(2012, 1, 18), StripeUtil.getDate(1326853478)); String urlified = StripeUtil.urlify(new Map{'a'=>'1','b'=>'2'}); - System.assert(urlified=='&a=1&b=2&'||urlified=='&b=2&a=1&', urlified); + // assertion wasn't properly writen + System.assert(urlified=='?a=1&b=2&'||urlified=='?b=2&a=1&'); } } \ No newline at end of file diff --git a/src/classes/StripeUtilTests.cls-meta.xml b/src/classes/StripeUtilTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeUtilTests.cls-meta.xml +++ b/src/classes/StripeUtilTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/StripeWebhookListener.cls-meta.xml b/src/classes/StripeWebhookListener.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/StripeWebhookListener.cls-meta.xml +++ b/src/classes/StripeWebhookListener.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/StripeWebhookListenerTests.cls-meta.xml b/src/classes/StripeWebhookListenerTests.cls-meta.xml index 6dc8b22..d219ea1 100644 --- a/src/classes/StripeWebhookListenerTests.cls-meta.xml +++ b/src/classes/StripeWebhookListenerTests.cls-meta.xml @@ -1,5 +1,5 @@ - 27.0 + 35.0 Active diff --git a/src/classes/TestStripe.cls b/src/classes/TestStripe.cls index 01260fb..5bcfe92 100644 --- a/src/classes/TestStripe.cls +++ b/src/classes/TestStripe.cls @@ -20,6 +20,7 @@ public class TestStripe { } private static testmethod void testStripeAPI() { + Test.startTest(); System.assertEquals(null, StripeAPI.ApiKey); System.assertEquals(null, StripeAPI.PublishableKey); System.assertEquals(true, StripeAPI.isTest); @@ -38,6 +39,7 @@ public class TestStripe { System.assertEquals(true, StripeAPI.isTest); System.assertEquals('123', StripeAPI.ApiKey); System.assertEquals('def', StripeAPI.PublishableKey); + Test.stopTest(); } public static void StripeDataSetup() { diff --git a/src/classes/TestStripe.cls-meta.xml b/src/classes/TestStripe.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/TestStripe.cls-meta.xml +++ b/src/classes/TestStripe.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/classes/WebhookDelayedProcessor.cls-meta.xml b/src/classes/WebhookDelayedProcessor.cls-meta.xml index b211a09..d219ea1 100644 --- a/src/classes/WebhookDelayedProcessor.cls-meta.xml +++ b/src/classes/WebhookDelayedProcessor.cls-meta.xml @@ -1,5 +1,5 @@ - 28.0 + 35.0 Active diff --git a/src/objects/Stripe_Settings__c.object b/src/objects/Stripe_Settings__c.object old mode 100644 new mode 100755 diff --git a/src/objects/Stripe_Webhook__c.object b/src/objects/Stripe_Webhook__c.object old mode 100644 new mode 100755 From abdf7d9e1e9b29fa5afa97f5adb0ccb6ec446975 Mon Sep 17 00:00:00 2001 From: Daniel Stange Date: Sat, 6 Feb 2016 12:25:03 +0100 Subject: [PATCH 4/7] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 5b242f1..4a13468 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +Development Fork of StripeForce - A Stripe SDK for the Force.com Platform +======================================== +The groundwork for this library was done by Ryan Huff. Feel free to use my development fork, but please consider helping to improve the original StripeForce by sending back all significant improvements as pull requests. So much said, here comes the original README content... + Stripe SDK for Force.com ======================================== From bd0cb673601797a9fd34f6049b563f636932542e Mon Sep 17 00:00:00 2001 From: Daniel Stange Date: Sat, 6 Feb 2016 12:25:53 +0100 Subject: [PATCH 5/7] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 4a13468..ea105f0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ Development Fork of StripeForce - A Stripe SDK for the Force.com Platform ======================================== The groundwork for this library was done by Ryan Huff. Feel free to use my development fork, but please consider helping to improve the original StripeForce by sending back all significant improvements as pull requests. So much said, here comes the original README content... + + Deploy to Salesforce + Stripe SDK for Force.com ======================================== From dfff5e29fdd91dddf54536c695429e9c2114f37b Mon Sep 17 00:00:00 2001 From: Daniel Stange Date: Sat, 6 Feb 2016 12:26:13 +0100 Subject: [PATCH 6/7] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ea105f0..c09b3dd 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ Development Fork of StripeForce - A Stripe SDK for the Force.com Platform ======================================== -The groundwork for this library was done by Ryan Huff. Feel free to use my development fork, but please consider helping to improve the original StripeForce by sending back all significant improvements as pull requests. So much said, here comes the original README content... +The groundwork for this library was done by Ryan Huff. Feel free to use my development fork, but please consider helping to improve the original StripeForce by sending back all significant improvements as pull requests. So much said, here comes the original README content... +

Deploy to Salesforce - +

Stripe SDK for Force.com ======================================== From ce28f0c8927e1a03d97c438fc465f54e88ddbb79 Mon Sep 17 00:00:00 2001 From: Daniel Stange Date: Fri, 26 Feb 2016 20:59:45 +0100 Subject: [PATCH 7/7] Added runAs() to test Test data bound the successful execution of StripeUtilTests to the timezone of the running user. David Boukhors contributed a patch. Thank you, David! --- src/classes/StripeUtilTests.cls | 41 +++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/classes/StripeUtilTests.cls b/src/classes/StripeUtilTests.cls index 2e31c1b..e5bfb11 100644 --- a/src/classes/StripeUtilTests.cls +++ b/src/classes/StripeUtilTests.cls @@ -6,18 +6,39 @@ private class StripeUtilTests { } private static testMethod void testUtil() { + + List prof = [Select id From Profile where Name='Standard User']; + + User u = new User( + FirstName = 'John', + LastName = 'Doe', + Username = 'john.doe.test@testcase.com', + Email = 'john.doe.test@testcase.com', + IsActive = true, + Alias = 'jdoe', + TimeZoneSidKey = 'GMT', + LocaleSidKey = 'en_US', + EmailEncodingKey = 'ISO-8859-1', + LanguageLocaleKey = 'en_US', + ProfileId = prof[0].id); - String s = null; - System.assertEquals('abc', StripeUtil.blankValue('abc', 'def')); - System.assertEquals('def', StripeUtil.blankValue(s, 'def')); - System.assertEquals('def', StripeUtil.blankValue('', 'def')); + insert U; - // 1326853478 converts to Wed, 18 Jan 2012 02:24:38 GMT - System.assertEquals(Date.newInstance(2012, 1, 18), StripeUtil.getDate(1326853478)); + system.runAs(U){ + String s = null; + System.assertEquals('abc', StripeUtil.blankValue('abc', 'def')); + System.assertEquals('def', StripeUtil.blankValue(s, 'def')); + System.assertEquals('def', StripeUtil.blankValue('', 'def')); - String urlified = StripeUtil.urlify(new Map{'a'=>'1','b'=>'2'}); - // assertion wasn't properly writen - System.assert(urlified=='?a=1&b=2&'||urlified=='?b=2&a=1&'); + // 1326853478 converts to Wed, 18 Jan 2012 02:24:38 GMT + System.assertEquals(Date.newInstance(2012, 1, 18), StripeUtil.getDate(1326853478)); + + String urlified = StripeUtil.urlify(new Map{'a'=>'1','b'=>'2'}); + + // assertion wasn't properly written + System.assert(urlified=='?a=1&b=2&'||urlified=='?b=2&a=1&'); + } + } -} \ No newline at end of file +}