Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Stripe
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Extensions
Stripe
Commits
427095e7
Commit
427095e7
authored
4 years ago
by
mattwire
Committed by
mattwire
4 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Initial refactor to support different payment elements
parent
272160cf
Branches
Branches containing commit
Tags
Tags containing commit
1 merge request
!152
6.6 to master
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
css/elements.css
+5
-0
5 additions, 0 deletions
css/elements.css
js/civicrm_stripe.js
+127
-53
127 additions, 53 deletions
js/civicrm_stripe.js
with
132 additions
and
53 deletions
css/elements.css
+
5
−
0
View file @
427095e7
...
...
@@ -20,3 +20,8 @@
margin
:
2%
;
display
:
none
;
}
#payment-request-button
{
max-width
:
400px
;
margin
:
2%
auto
;
}
This diff is collapsed.
Click to expand it.
js/civicrm_stripe.js
+
127
−
53
View file @
427095e7
...
...
@@ -5,7 +5,10 @@
// On initial load...
var
scriptName
=
'
civicrmStripe
'
;
var
stripe
=
null
;
var
card
=
null
;
var
elements
=
{
card
:
null
,
paymentrequest
:
null
};
var
form
;
var
submitButtons
;
var
stripeLoading
=
false
;
...
...
@@ -131,27 +134,35 @@
}
}
function
getPaymentElements
()
{
function
get
JQuery
PaymentElements
()
{
return
{
card
:
$
(
'
div#card-element
'
)
card
:
$
(
'
div#card-element
'
),
paymentrequest
:
$
(
'
div#paymentrequest-element
'
)
};
}
/**
* Hide any visible payment elements
*/
function
hidePaymentElements
()
{
getPaymentElements
().
card
.
hide
();
function
hideJQueryPaymentElements
()
{
var
jQueryPaymentElements
=
getJQueryPaymentElements
();
for
(
var
elementName
in
jQueryPaymentElements
)
{
var
element
=
jQueryPaymentElements
[
elementName
];
element
.
hide
();
}
}
/**
* Destroy any payment elements we have already created
*/
function
destroyPaymentElements
()
{
if
(
card
!==
null
)
{
debugging
(
"
destroying card element
"
);
card
.
destroy
();
card
=
null
;
for
(
var
elementName
in
elements
)
{
var
element
=
elements
[
elementName
];
if
(
element
!==
null
)
{
debugging
(
"
destroying
"
+
elementName
+
"
element
"
);
element
.
destroy
();
elements
[
elementName
]
=
null
;
}
}
}
...
...
@@ -160,17 +171,21 @@
* @returns {boolean}
*/
function
checkPaymentElementsAreValid
()
{
var
elements
=
getPaymentElements
();
if
((
elements
.
card
.
length
!==
0
)
&&
(
elements
.
card
.
children
().
length
===
0
))
{
debugging
(
'
card element is empty
'
);
return
false
;
var
jQueryPaymentElements
=
getJQueryPaymentElements
();
for
(
var
elementName
in
jQueryPaymentElements
)
{
var
element
=
jQueryPaymentElements
[
elementName
];
if
((
element
.
length
!==
0
)
&&
(
element
.
children
().
length
!==
0
))
{
debugging
(
elementName
+
'
element found
'
);
return
true
;
}
}
return
true
;
debugging
(
'
no valid elements found
'
);
return
false
;
}
function
handleCardPayment
()
{
debugging
(
'
handle card payment
'
);
stripe
.
createPaymentMethod
(
'
card
'
,
card
).
then
(
function
(
result
)
{
stripe
.
createPaymentMethod
(
'
card
'
,
elements
.
card
).
then
(
function
(
result
)
{
if
(
result
.
error
)
{
// Show error in payment form
displayError
(
result
.
error
.
message
,
true
);
...
...
@@ -314,45 +329,10 @@
debugging
(
'
New Stripe ID:
'
+
CRM
.
vars
.
stripe
.
id
+
'
pubKey:
'
+
CRM
.
vars
.
stripe
.
publishableKey
);
stripe
=
Stripe
(
CRM
.
vars
.
stripe
.
publishableKey
);
debugging
(
'
locale:
'
+
CRM
.
vars
.
stripe
.
locale
);
var
stripeElements
=
stripe
.
elements
({
locale
:
CRM
.
vars
.
stripe
.
locale
});
var
style
=
{
base
:
{
fontSize
:
'
1.1em
'
,
fontWeight
:
'
lighter
'
}
};
var
elementsCreateParams
=
{
style
:
style
,
value
:
{}};
var
postCodeElement
=
document
.
getElementById
(
'
billing_postal_code-
'
+
CRM
.
vars
.
stripe
.
billingAddressID
);
if
(
postCodeElement
)
{
var
postCode
=
document
.
getElementById
(
'
billing_postal_code-
'
+
CRM
.
vars
.
stripe
.
billingAddressID
).
value
;
debugging
(
'
existing postcode:
'
+
postCode
);
elementsCreateParams
.
value
.
postalCode
=
postCode
;
}
// Cleanup any classes leftover from previous switching payment processors
getPaymentElements
().
card
.
removeClass
();
// Create an instance of the card Element.
card
=
stripeElements
.
create
(
'
card
'
,
elementsCreateParams
);
card
.
mount
(
'
#card-element
'
);
debugging
(
"
created new card element
"
,
card
);
if
(
postCodeElement
)
{
// Hide the CiviCRM postcode field so it will still be submitted but will contain the value set in the stripe card-element.
if
(
document
.
getElementById
(
'
billing_postal_code-5
'
).
value
)
{
document
.
getElementById
(
'
billing_postal_code-5
'
)
.
setAttribute
(
'
disabled
'
,
true
);
}
else
{
document
.
getElementsByClassName
(
'
billing_postal_code-
'
+
CRM
.
vars
.
stripe
.
billingAddressID
+
'
-section
'
)[
0
].
setAttribute
(
'
hidden
'
,
true
);
}
}
card
.
addEventListener
(
'
change
'
,
function
(
event
)
{
cardElementChanged
(
event
);
});
createElementCard
(
stripeElements
);
//createElementPaymentRequest(stripeElements);
setBillingFieldsRequiredForJQueryValidate
();
submitButtons
=
getBillingSubmit
();
...
...
@@ -568,6 +548,100 @@
return
true
;
}
function
createElementCard
(
stripeElements
)
{
var
style
=
{
base
:
{
fontSize
:
'
1.1em
'
,
fontWeight
:
'
lighter
'
}
};
var
elementsCreateParams
=
{
style
:
style
,
value
:
{}};
var
postCodeElement
=
document
.
getElementById
(
'
billing_postal_code-
'
+
CRM
.
vars
.
stripe
.
billingAddressID
);
if
(
postCodeElement
)
{
var
postCode
=
document
.
getElementById
(
'
billing_postal_code-
'
+
CRM
.
vars
.
stripe
.
billingAddressID
).
value
;
debugging
(
'
existing postcode:
'
+
postCode
);
elementsCreateParams
.
value
.
postalCode
=
postCode
;
}
// Cleanup any classes leftover from previous switching payment processors
getJQueryPaymentElements
().
card
.
removeClass
();
// Create an instance of the card Element.
elements
.
card
=
stripeElements
.
create
(
'
card
'
,
elementsCreateParams
);
elements
.
card
.
mount
(
'
#card-element
'
);
debugging
(
"
created new card element
"
,
elements
.
card
);
if
(
postCodeElement
)
{
// Hide the CiviCRM postcode field so it will still be submitted but will contain the value set in the stripe card-element.
if
(
document
.
getElementById
(
'
billing_postal_code-5
'
).
value
)
{
document
.
getElementById
(
'
billing_postal_code-5
'
)
.
setAttribute
(
'
disabled
'
,
true
);
}
else
{
document
.
getElementsByClassName
(
'
billing_postal_code-
'
+
CRM
.
vars
.
stripe
.
billingAddressID
+
'
-section
'
)[
0
].
setAttribute
(
'
hidden
'
,
true
);
}
}
elements
.
card
.
addEventListener
(
'
change
'
,
function
(
event
)
{
cardElementChanged
(
event
);
});
}
function
createElementPaymentRequest
(
stripeElements
)
{
var
paymentRequest
=
null
;
try
{
paymentRequest
=
stripe
.
paymentRequest
({
country
:
CRM
.
vars
.
stripe
.
country
,
currency
:
CRM
.
vars
.
stripe
.
currency
.
toLowerCase
(),
total
:
{
label
:
document
.
title
,
amount
:
0
},
requestPayerName
:
true
,
requestPayerEmail
:
true
});
}
catch
(
err
)
{
if
(
err
.
name
===
'
IntegrationError
'
)
{
debugging
(
'
Cannot enable paymentRequestButton:
'
+
err
.
message
);
return
;
}
}
// Check the availability of the Payment Request API first.
paymentRequest
.
canMakePayment
().
then
(
function
(
result
)
{
elements
.
paymentrequest
=
stripeElements
.
create
(
'
paymentRequestButton
'
,
{
paymentRequest
:
paymentRequest
,
style
:
{
paymentRequestButton
:
{
// One of 'default', 'book', 'buy', or 'donate'
type
:
'
default
'
,
// One of 'dark', 'light', or 'light-outline'
theme
:
'
dark
'
,
// Defaults to '40px'. The width is always '100%'.
height
:
'
64px
'
}
}
});
elements
.
paymentrequest
.
on
(
'
click
'
,
function
()
{
debugging
(
'
PaymentRequest clicked
'
);
paymentRequest
.
update
({
total
:
{
label
:
document
.
title
,
amount
:
CRM
.
payment
.
getTotalAmount
()
*
100
}
});
});
if
(
result
)
{
elements
.
paymentrequest
.
mount
(
'
#paymentrequest-element
'
);
document
.
getElementById
(
'
paymentrequest-element
'
).
style
.
display
=
'
block
'
;
}
else
{
document
.
getElementById
(
'
paymentrequest-element
'
).
style
.
display
=
'
none
'
;
}
});
}
/**
* Validate a reCaptcha if it exists on the form.
* Ideally we would use grecaptcha.getResponse() but the reCaptcha is already render()ed by CiviCRM
...
...
@@ -773,7 +847,7 @@
*/
function
triggerEventCrmBillingFormReloadFailed
()
{
triggerEvent
(
'
crmBillingFormReloadFailed
'
);
hidePaymentElements
();
hide
JQuery
PaymentElements
();
displayError
(
ts
(
'
Could not load payment element - Is there a problem with your network connection?
'
),
true
);
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment