Paid Memberships Pro - Version 2.1

Version Description

  • 2019-09-13 =
  • FEATURE: Updated Stripe integration to support Stripe v3, Stripe Elements, and their Secure Customer Authorization process.
  • FEATURE: Updated how we store prices to support up to 8 decimals (e.g. for Bitcoin gateway implementations).
  • ENHANCEMENT: Improved error messaging on the update billing page when a gateway doesn't support it or the user's current membership doesn't have a subscription.
  • ENHANCEMENT: Added a pmpro_is_checkout() function that will return true if on the PMPro checkout page or a page with the PMPro checkout shortcode or block.
  • ENHANCEMENT: Showing a warning message when a user about to be deleted has a membership so admins know that existing subscriptions will be deleted at the gateway.
  • ENHANCEMENT: Added a pmpro_braintree_plan_id filter in case you need to adjust plan IDs. This is useful if you have several sites running on the same Braintree account.
  • ENHANCEMENT: Added a pmpro_num_expiration_years filter to adjust the number of years to include in the dropdown to set the year membership will expire.
  • ENHANCEMENT: Tweaked the UI of the orders list and members list in the dashboard.
  • ENHANCEMENT: Added pmpro_membership_levels_table_extra_cols_header and pmpro_membership_levels_table_extra_cols_body hooks to add columns to the members list.
  • ENHANCEMENT: Showing notices to admins when categories are hidden from them on the frontend of the site.
  • ENHANCEMENT: Added a pmpro_url filter to filter URLs returned from that function.
  • ENHANCEMENT: Adding a pmpro_checkout_gateway-stripe or pmpro_checkout_gateway-paypal/etc CSS class to the wrapping div for payment fields to aid in styling.
  • ENHANCEMENT: Using the site's date format option when printing orders.
  • BUG FIX/ENHANCEMENT: If a site has no paying levels, the test gateway will show as the "Default" gateway and we will no longer show a message about requiring gateway setup on the checkout page.
  • BUG FIX/ENHANCEMENT: Updated Russian Ruble definition to have 0 decimals and use   as the thousands separator. (Thanks, Airat Halitov)
  • BUG FIX/ENHANCEMENT: Using add_query_arg when generating IPN URLs to avoid issues on sites that aren't using pretty permalinks or have moved their admin directory.
  • BUG FIX/ENHANCEMENT: Fixed issue on advanced settings page where clicking on labels didn't check the corresponding check boxes.
  • BUG FIX/ENHANCEMENT: Updated our pmpro_generateUsername() function to be a bit smarter.
  • BUG FIX/ENHANCEMENT: Now using wp_generate_password() when choosing a random password for a user (e.g. when using the Sign Up Shortcode add on or the $skip_account_fields global).
  • BUG FIX/ENHANCEMENT: Setting autocomplete to false on the "fullname" honeypot field. This will prevent user's with certain autocomplete tools from accidentally filling it out.
  • BUG FIX/EHNANCEMENT: Now sending name and email fields to PayPay (using Website Payments Pro) even if no address was captured.
  • BUG FIX/ENHANCEMENT: More specific CSS selectors for checkout form elements to make sure errors are highlighted/etc with different themes.
  • BUG FIX: Fixed issue where the first 2000 or so orders might be skipped when exporting orders on large sites.
  • BUG FIX: Fixed issue with setting custom trials on discount codes.
  • BUG FIX: Fixed issue in the SQL query in the pmpro_calculateInitialPaymentRevenue() function. This function is deprecated, but still used by some custom code.
  • BUG FIX: Fixed issue where default templates would fail to load if a custom template was specified.
  • BUG FIX: Fixed fatal errors that could happen when using the PMPro REST API endpoints.
  • BUG FIX: Fixed bug where the invoices page would sometimes show data for the current (admin) users instead of the user the invoice was for.
  • BUG FIX: Fixed bug where the membership stats graphs would sometimes show up blank.
  • BUG FIX: Now falling back to using readfile() if fpassthru() doesn't existing.
  • BUG FIX: Fixed issue where the from name and email were not set properly if the Only Filter PMPro Emails setting was checked. (Thanks, mjulian87 on GitHub)
  • BUG FIX: Fixed several error handling issues with the Cybersource gateway integration.
  • REFACTOR: Moved JavaScript out of pages/checkout.php and other places into files in the /js/ folder. This will avoid issues where other JS at checkout breaks PMPro checkout and will improve compatibility with tools that optimize JS.
  • REFACTOR: Added unit testing and a started on coverage of some functions in includes/functions.php. (Thanks, Mike Auteri)
  • REFACTOR: The JS function askfirst is now prefixed as pmpro_askfirst.
Download this release

Release Info

Developer strangerstudios
Plugin Icon 128x128 Paid Memberships Pro
Version 2.1
Comparing to
See all releases

Code changes from version 2.0.7 to 2.1

Files changed (163) hide show
  1. CHANGELOG.txt +65 -2
  2. adminpages/admin_header.php +1 -1
  3. adminpages/discountcodes.php +28 -21
  4. adminpages/functions.php +66 -0
  5. adminpages/membershiplevels.php +38 -6
  6. adminpages/memberslist-csv.php +13 -8
  7. adminpages/orders-csv.php +14 -9
  8. adminpages/orders.php +43 -93
  9. adminpages/paymentsettings.php +17 -0
  10. adminpages/reports/memberships.php +2 -2
  11. adminpages/templates/orders-print.php +1 -1
  12. bin/install-wp-tests.sh +152 -0
  13. classes/class.pmproemail.php +104 -0
  14. classes/gateways/class.pmprogateway_authorizenet.php +1 -1
  15. classes/gateways/class.pmprogateway_braintree.php +50 -37
  16. classes/gateways/class.pmprogateway_cybersource.php +215 -165
  17. classes/gateways/class.pmprogateway_payflowpro.php +5 -5
  18. classes/gateways/class.pmprogateway_paypal.php +105 -55
  19. classes/gateways/class.pmprogateway_paypalexpress.php +28 -45
  20. classes/gateways/class.pmprogateway_paypalstandard.php +2 -2
  21. classes/gateways/class.pmprogateway_stripe.php +1422 -890
  22. css/admin.css +1 -1
  23. css/frontend.css +82 -8
  24. email/payment_action.html +4 -0
  25. email/payment_action_admin.html +7 -0
  26. includes/cleanup.php +31 -1
  27. includes/currencies.php +3 -0
  28. includes/filters.php +1 -1
  29. includes/functions.php +299 -36
  30. includes/init.php +0 -71
  31. includes/lib/Stripe/LICENSE +1 -1
  32. includes/lib/Stripe/README.md +103 -10
  33. includes/lib/Stripe/VERSION +1 -1
  34. includes/lib/Stripe/data/ca-certificates.crt +421 -694
  35. includes/lib/Stripe/init.php +54 -3
  36. includes/lib/Stripe/lib/Account.php +297 -46
  37. includes/lib/Stripe/lib/AccountLink.php +21 -0
  38. includes/lib/Stripe/lib/AlipayAccount.php +60 -1
  39. includes/lib/Stripe/lib/ApiOperations/All.php +34 -0
  40. includes/lib/Stripe/lib/ApiOperations/Create.php +28 -0
  41. includes/lib/Stripe/lib/ApiOperations/Delete.php +27 -0
  42. includes/lib/Stripe/lib/ApiOperations/NestedResource.php +118 -0
  43. includes/lib/Stripe/lib/ApiOperations/Request.php +61 -0
  44. includes/lib/Stripe/lib/ApiOperations/Retrieve.php +27 -0
  45. includes/lib/Stripe/lib/ApiOperations/Update.php +46 -0
  46. includes/lib/Stripe/lib/ApiRequestor.php +198 -16
  47. includes/lib/Stripe/lib/ApiResource.php +40 -130
  48. includes/lib/Stripe/lib/ApplePayDomain.php +8 -46
  49. includes/lib/Stripe/lib/ApplicationFee.php +51 -23
  50. includes/lib/Stripe/lib/ApplicationFeeRefund.php +16 -0
  51. includes/lib/Stripe/lib/Balance.php +7 -3
  52. includes/lib/Stripe/lib/BalanceTransaction.php +41 -24
  53. includes/lib/Stripe/lib/BankAccount.php +85 -1
  54. includes/lib/Stripe/lib/BitcoinReceiver.php +20 -69
  55. includes/lib/Stripe/lib/BitcoinTransaction.php +1 -0
  56. includes/lib/Stripe/lib/Capability.php +83 -0
  57. includes/lib/Stripe/lib/Card.php +118 -1
  58. includes/lib/Stripe/lib/Charge.php +86 -64
  59. includes/lib/Stripe/lib/Checkout/Session.php +40 -0
  60. includes/lib/Stripe/lib/Collection.php +27 -6
  61. includes/lib/Stripe/lib/CountrySpec.php +12 -32
  62. includes/lib/Stripe/lib/Coupon.php +22 -64
  63. includes/lib/Stripe/lib/CreditNote.php +74 -0
  64. includes/lib/Stripe/lib/Customer.php +204 -75
  65. includes/lib/Stripe/lib/CustomerBalanceTransaction.php +88 -0
  66. includes/lib/Stripe/lib/Discount.php +21 -0
  67. includes/lib/Stripe/lib/Dispute.php +33 -39
  68. includes/lib/Stripe/lib/EphemeralKey.php +6 -20
  69. includes/lib/Stripe/lib/Error/Base.php +9 -0
  70. includes/lib/Stripe/lib/Error/Card.php +6 -7
  71. includes/lib/Stripe/lib/Error/Idempotency.php +7 -0
  72. includes/lib/Stripe/lib/Error/OAuth/OAuthBase.php +2 -2
  73. includes/lib/Stripe/lib/Event.php +148 -24
  74. includes/lib/Stripe/lib/ExchangeRate.php +17 -0
  75. includes/lib/Stripe/lib/File.php +62 -0
  76. includes/lib/Stripe/lib/FileLink.php +29 -0
  77. includes/lib/Stripe/lib/FileUpload.php +2 -58
  78. includes/lib/Stripe/lib/HttpClient/ClientInterface.php +5 -2
  79. includes/lib/Stripe/lib/HttpClient/CurlClient.php +241 -39
  80. includes/lib/Stripe/lib/Invoice.php +137 -27
  81. includes/lib/Stripe/lib/InvoiceItem.php +26 -64
  82. includes/lib/Stripe/lib/InvoiceLineItem.php +32 -0
  83. includes/lib/Stripe/lib/IssuerFraudRecord.php +25 -0
  84. includes/lib/Stripe/lib/Issuing/Authorization.php +68 -0
  85. includes/lib/Stripe/lib/Issuing/Card.php +51 -0
  86. includes/lib/Stripe/lib/Issuing/CardDetails.php +21 -0
  87. includes/lib/Stripe/lib/Issuing/Cardholder.php +30 -0
  88. includes/lib/Stripe/lib/Issuing/Dispute.php +30 -0
  89. includes/lib/Stripe/lib/Issuing/Transaction.php +35 -0
  90. includes/lib/Stripe/lib/LoginLink.php +5 -0
  91. includes/lib/Stripe/lib/OAuth.php +3 -8
  92. includes/lib/Stripe/lib/Order.php +29 -53
  93. includes/lib/Stripe/lib/OrderItem.php +22 -0
  94. includes/lib/Stripe/lib/OrderReturn.php +13 -31
  95. includes/lib/Stripe/lib/PaymentIntent.php +107 -0
  96. includes/lib/Stripe/lib/PaymentMethod.php +60 -0
  97. includes/lib/Stripe/lib/Payout.php +43 -48
  98. includes/lib/Stripe/lib/Person.php +108 -0
  99. includes/lib/Stripe/lib/Plan.php +25 -76
  100. includes/lib/Stripe/lib/Product.php +30 -61
  101. includes/lib/Stripe/lib/Radar/EarlyFraudWarning.php +36 -0
  102. includes/lib/Stripe/lib/Radar/ValueList.php +32 -0
  103. includes/lib/Stripe/lib/Radar/ValueListItem.php +26 -0
  104. includes/lib/Stripe/lib/Recipient.php +22 -67
  105. includes/lib/Stripe/lib/RecipientTransfer.php +2 -1
  106. includes/lib/Stripe/lib/Refund.php +30 -49
  107. includes/lib/Stripe/lib/Reporting/ReportRun.php +28 -0
  108. includes/lib/Stripe/lib/Reporting/ReportType.php +24 -0
  109. includes/lib/Stripe/lib/RequestTelemetry.php +27 -0
  110. includes/lib/Stripe/lib/Review.php +57 -0
  111. includes/lib/Stripe/lib/SKU.php +21 -64
  112. includes/lib/Stripe/lib/SetupIntent.php +75 -0
  113. includes/lib/Stripe/lib/Sigma/ScheduledQueryRun.php +33 -0
  114. includes/lib/Stripe/lib/SingletonApiResource.php +3 -1
  115. includes/lib/Stripe/lib/Source.php +90 -52
  116. includes/lib/Stripe/lib/SourceTransaction.php +23 -0
  117. includes/lib/Stripe/lib/Stripe.php +97 -7
  118. includes/lib/Stripe/lib/StripeObject.php +344 -115
  119. includes/lib/Stripe/lib/Subscription.php +58 -57
  120. includes/lib/Stripe/lib/SubscriptionItem.php +23 -67
  121. includes/lib/Stripe/lib/SubscriptionSchedule.php +111 -0
  122. includes/lib/Stripe/lib/SubscriptionScheduleRevision.php +77 -0
  123. includes/lib/Stripe/lib/TaxId.php +81 -0
  124. includes/lib/Stripe/lib/TaxRate.php +31 -0
  125. includes/lib/Stripe/lib/Terminal/ConnectionToken.php +17 -0
  126. includes/lib/Stripe/lib/Terminal/Location.php +25 -0
  127. includes/lib/Stripe/lib/Terminal/Reader.php +30 -0
  128. includes/lib/Stripe/lib/ThreeDSecure.php +6 -23
  129. includes/lib/Stripe/lib/Token.php +14 -22
  130. includes/lib/Stripe/lib/Topup.php +60 -0
  131. includes/lib/Stripe/lib/Transfer.php +63 -47
  132. includes/lib/Stripe/lib/TransferReversal.php +10 -1
  133. includes/lib/Stripe/lib/UsageRecord.php +44 -0
  134. includes/lib/Stripe/lib/UsageRecordSummary.php +22 -0
  135. includes/lib/Stripe/lib/Util/AutoPagingIterator.php +3 -3
  136. includes/lib/Stripe/lib/Util/CaseInsensitiveArray.php +62 -0
  137. includes/lib/Stripe/lib/Util/DefaultLogger.php +2 -2
  138. includes/lib/Stripe/lib/Util/LoggerInterface.php +1 -1
  139. includes/lib/Stripe/lib/Util/RandomGenerator.php +34 -0
  140. includes/lib/Stripe/lib/Util/RequestOptions.php +34 -5
  141. includes/lib/Stripe/lib/Util/Set.php +2 -2
  142. includes/lib/Stripe/lib/Util/Util.php +216 -72
  143. includes/lib/Stripe/lib/Webhook.php +4 -4
  144. includes/lib/Stripe/lib/WebhookEndpoint.php +29 -0
  145. includes/lib/Stripe/lib/WebhookSignature.php +4 -3
  146. includes/lib/php-jwt/BeforeValidException.php +7 -0
  147. includes/lib/php-jwt/ExpiredException.php +7 -0
  148. includes/lib/php-jwt/JWT.php +379 -0
  149. includes/lib/php-jwt/SignatureInvalidException.php +7 -0
  150. includes/profile.php +39 -39
  151. includes/recaptcha.php +14 -2
  152. includes/rest-api.php +49 -44
  153. includes/scripts.php +99 -0
  154. includes/sessions.php +81 -36
  155. includes/upgradecheck.php +16 -9
  156. js/pmpro-admin.js +49 -0
  157. js/pmpro-braintree.js +25 -0
  158. js/pmpro-checkout.js +203 -0
  159. js/pmpro-paypal.js +24 -0
  160. js/pmpro-stripe.js +159 -0
  161. languages/paid-memberships-pro.mo +0 -0
  162. languages/paid-memberships-pro.po +1468 -918
  163. languages/paid-memberships-pro.pot +183 -138
CHANGELOG.txt CHANGED
@@ -1,6 +1,70 @@
1
  == Changelog ==
2
 
3
- = 2.0.4 - 2019-01-11 =
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  * BUG FIX: Fixed warning in code added in 2.0.3 that could cause issues at checkout.
5
  * BUG FIX: Setting priority of pmpro_check_admin_capabilities to 5 to ensure it runs before dashboard redirect.
6
  * BUG FIX: Removed duplicate id attribute on the Membership Account page "cancel" action link.
@@ -103,7 +167,6 @@
103
  * ENHANCEMENT: Showing the Stripe version we use on the Payment Settings page.
104
  * ENHANCEMENT: Updated Copyright date and GPLv2 link in license.txt.
105
 
106
-
107
  = 1.9.5.3 - 2018-06-26 =
108
  * BUG FIX: The pmpro_ipnhandler_extend_memberships function actually needed use $user_id instead of $current_user.
109
 
1
  == Changelog ==
2
 
3
+ = 2.1 - 2019-09-13 =
4
+ * FEATURE: Updated Stripe integration to support Stripe v3, Stripe Elements, and their Secure Customer Authorization process.
5
+ * FEATURE: Updated how we store prices to support up to 8 decimals (e.g. for Bitcoin gateway implementations).
6
+ * ENHANCEMENT: Improved error messaging on the update billing page when a gateway doesn't support it or the user's current membership doesn't have a subscription.
7
+ * ENHANCEMENT: Added a pmpro_is_checkout() function that will return true if on the PMPro checkout page or a page with the PMPro checkout shortcode or block.
8
+ * ENHANCEMENT: Showing a warning message when a user about to be deleted has a membership so admins know that existing subscriptions will be deleted at the gateway.
9
+ * ENHANCEMENT: Added a pmpro_braintree_plan_id filter in case you need to adjust plan IDs. This is useful if you have several sites running on the same Braintree account.
10
+ * ENHANCEMENT: Added a pmpro_num_expiration_years filter to adjust the number of years to include in the dropdown to set the year membership will expire.
11
+ * ENHANCEMENT: Tweaked the UI of the orders list and members list in the dashboard.
12
+ * ENHANCEMENT: Added pmpro_membership_levels_table_extra_cols_header and pmpro_membership_levels_table_extra_cols_body hooks to add columns to the members list.
13
+ * ENHANCEMENT: Showing notices to admins when categories are hidden from them on the frontend of the site.
14
+ * ENHANCEMENT: Added a pmpro_url filter to filter URLs returned from that function.
15
+ * ENHANCEMENT: Adding a pmpro_checkout_gateway-stripe or pmpro_checkout_gateway-paypal/etc CSS class to the wrapping div for payment fields to aid in styling.
16
+ * ENHANCEMENT: Using the site's date format option when printing orders.
17
+ * BUG FIX/ENHANCEMENT: If a site has no paying levels, the test gateway will show as the "Default" gateway and we will no longer show a message about requiring gateway setup on the checkout page.
18
+ * BUG FIX/ENHANCEMENT: Updated Russian Ruble definition to have 0 decimals and use   as the thousands separator. (Thanks, Airat Halitov)
19
+ * BUG FIX/ENHANCEMENT: Using add_query_arg when generating IPN URLs to avoid issues on sites that aren't using pretty permalinks or have moved their admin directory.
20
+ * BUG FIX/ENHANCEMENT: Fixed issue on advanced settings page where clicking on labels didn't check the corresponding check boxes.
21
+ * BUG FIX/ENHANCEMENT: Updated our pmpro_generateUsername() function to be a bit smarter.
22
+ * BUG FIX/ENHANCEMENT: Now using wp_generate_password() when choosing a random password for a user (e.g. when using the Sign Up Shortcode add on or the $skip_account_fields global).
23
+ * BUG FIX/ENHANCEMENT: Setting autocomplete to false on the "fullname" honeypot field. This will prevent user's with certain autocomplete tools from accidentally filling it out.
24
+ * BUG FIX/EHNANCEMENT: Now sending name and email fields to PayPay (using Website Payments Pro) even if no address was captured.
25
+ * BUG FIX/ENHANCEMENT: More specific CSS selectors for checkout form elements to make sure errors are highlighted/etc with different themes.
26
+ * BUG FIX: Fixed issue where the first 2000 or so orders might be skipped when exporting orders on large sites.
27
+ * BUG FIX: Fixed issue with setting custom trials on discount codes.
28
+ * BUG FIX: Fixed issue in the SQL query in the pmpro_calculateInitialPaymentRevenue() function. This function is deprecated, but still used by some custom code.
29
+ * BUG FIX: Fixed issue where default templates would fail to load if a custom template was specified.
30
+ * BUG FIX: Fixed fatal errors that could happen when using the PMPro REST API endpoints.
31
+ * BUG FIX: Fixed bug where the invoices page would sometimes show data for the current (admin) users instead of the user the invoice was for.
32
+ * BUG FIX: Fixed bug where the membership stats graphs would sometimes show up blank.
33
+ * BUG FIX: Now falling back to using readfile() if fpassthru() doesn't existing.
34
+ * BUG FIX: Fixed issue where the from name and email were not set properly if the Only Filter PMPro Emails setting was checked. (Thanks, mjulian87 on GitHub)
35
+ * BUG FIX: Fixed several error handling issues with the Cybersource gateway integration.
36
+ * REFACTOR: Moved JavaScript out of pages/checkout.php and other places into files in the /js/ folder. This will avoid issues where other JS at checkout breaks PMPro checkout and will improve compatibility with tools that optimize JS.
37
+ * REFACTOR: Added unit testing and a started on coverage of some functions in includes/functions.php. (Thanks, Mike Auteri)
38
+ * REFACTOR: The JS function askfirst is now prefixed as pmpro_askfirst.
39
+
40
+ = 2.0.7 - 2019-05-30 =
41
+ * BUG FIX: Fixed issue where the profile start date would sometimes be set incorrectly on the Stripe subscription.
42
+ * BUG FIX: Fixed issue where the membership shortcode would not work properly if more than one level name was given.
43
+ * BUG FIX: Fixed issue where an incorrect email address was sometimes set in the confirm email field on the update billing page. (Thanks, Jessica Thomas)
44
+ * BUG FIX/ENHANCEMENT: Fixed placement of the hr tag above the user fields at checkout for consistency.
45
+ * ENHANCEMENT: Set the priority on the Require Membership meta box to "high" so it appears higher in the right sidebar.
46
+
47
+ = 2.0.6 - 2019-05-30 =
48
+ * SECURITY: Now using wp_safe_redirect when possible, especially in includes/login.php where the user-provided redirect_to URL parameter is used. (Thanks PluginVulnerabilities.com)
49
+
50
+ = 2.0.5 - 2019-04-25 =
51
+ * BUG FIX: Fixed fatal error on return from 2Checkout.
52
+ * BUG FIX: Removed error when installing PMPro via WP-CLI.
53
+ * BUG FIX: Fix database upgrade error on localhost environment. (Thanks, codezz on GitHub)
54
+ * BUG FIX: Fixed issue where the credit card expiring email didn't include user info because the user ID wasn't passed in properly. (Thanks, David Cervantes Caballero)
55
+ * BUG FIX: Fixed typo on edit level page. (Thanks, Theuns Coetzee)
56
+ * BUG FIX: Fixed bug with daily revenue reports not showing up in some cases.
57
+ * BUG FIX: Now checking before cancelling a Stripe subscription at the gateway to see if it has already been cancelled.
58
+ * BUG FIX/ENHANCEMENT: Now caching the query results in pmpro_getMembershipLevelsForUser(). This improves performance, especially when there are many posts on one page to check membership for. (Thanks, Seagyn Davis)
59
+ * BUG FIX/ENHANCEMENT: Now sending display_name to the $data array passed to PMPro email filters. (Thanks, David Cervantes Caballero)
60
+ * BUG FIX/ENHANCEMENT: Now searching for the last order with "success" or "pending" status on the Billing page.
61
+ * BUG FIX/ENHANCEMENT: Added pmpro_checkout_preheader_before_get_level_at_checkout and pmpro_checkout_preheader_after_get_level_at_checkout action hooks. Using pmpro_checkout_preheader_before_get_level_at_checkout to start the session earlier now.
62
+ * BUG FIX/ENHANCEMENT: Removed the "membership_code_id" and "membership_code" as field options for the member shortcode. These weren't working and it's unclear what would be meant to ask for a user's discount code since a user could have several orders with or without discount codes. Added "membership_description" and "membership_confirmation" instead.
63
+ * BUG FIX/ENHANCEMENT: Filtering the password reset message to make sure the link still works in all cases when we convert emails to HTML.
64
+ * BUG FIX/ENHANCEMENT: Added reCAPTCHA v3 and invisible reCAPTCHA support. It is recommended sites using Stripe or Braintree update to the reCAPTCHA v3 option. Read more here: https://www.paidmembershipspro.com/pmpro-update-2-0-5/
65
+ * REFACTOR: Now running the pmpro_billing_preheader hook after the jquery.creditCardValidator script is enqueued in preheader/billing.php to match how we do it in preheader/checkout.php. (Thanks, Rafe Colton)
66
+
67
+ = 2.0.4 - 2019-01-14 =
68
  * BUG FIX: Fixed warning in code added in 2.0.3 that could cause issues at checkout.
69
  * BUG FIX: Setting priority of pmpro_check_admin_capabilities to 5 to ensure it runs before dashboard redirect.
70
  * BUG FIX: Removed duplicate id attribute on the Membership Account page "cancel" action link.
167
  * ENHANCEMENT: Showing the Stripe version we use on the Payment Settings page.
168
  * ENHANCEMENT: Updated Copyright date and GPLv2 link in license.txt.
169
 
 
170
  = 1.9.5.3 - 2018-06-26 =
171
  * BUG FIX: The pmpro_ipnhandler_extend_memberships function actually needed use $user_id instead of $current_user.
172
 
adminpages/admin_header.php CHANGED
@@ -25,7 +25,7 @@
25
  $msgt .= " <a href=\"" . admin_url('admin.php?page=pmpro-membershiplevels&edit=-1') . "\">" . __("Add a membership level to get started.", 'paid-memberships-pro' ) . "</a>";
26
  elseif($pmpro_level_ready && !$pmpro_pages_ready && $view != "pmpro-pagesettings")
27
  $msgt .= " <strong>" . __( 'Next step:', 'paid-memberships-pro' ) . "</strong> <a href=\"" . admin_url('admin.php?page=pmpro-pagesettings') . "\">" . __("Set up the membership pages", 'paid-memberships-pro' ) . "</a>.";
28
- elseif($pmpro_level_ready && $pmpro_pages_ready && !$pmpro_gateway_ready && $view != "pmpro-paymentsettings")
29
  $msgt .= " <strong>" . __( 'Next step:', 'paid-memberships-pro' ) . "</strong> <a href=\"" . admin_url('admin.php?page=pmpro-paymentsettings') . "\">" . __("Set up your SSL certificate and payment gateway", 'paid-memberships-pro' ) . "</a>.";
30
 
31
  if(empty($msgt))
25
  $msgt .= " <a href=\"" . admin_url('admin.php?page=pmpro-membershiplevels&edit=-1') . "\">" . __("Add a membership level to get started.", 'paid-memberships-pro' ) . "</a>";
26
  elseif($pmpro_level_ready && !$pmpro_pages_ready && $view != "pmpro-pagesettings")
27
  $msgt .= " <strong>" . __( 'Next step:', 'paid-memberships-pro' ) . "</strong> <a href=\"" . admin_url('admin.php?page=pmpro-pagesettings') . "\">" . __("Set up the membership pages", 'paid-memberships-pro' ) . "</a>.";
28
+ elseif($pmpro_level_ready && $pmpro_pages_ready && !$pmpro_gateway_ready && $view != "pmpro-paymentsettings" && ! pmpro_onlyFreeLevels())
29
  $msgt .= " <strong>" . __( 'Next step:', 'paid-memberships-pro' ) . "</strong> <a href=\"" . admin_url('admin.php?page=pmpro-paymentsettings') . "\">" . __("Set up your SSL certificate and payment gateway", 'paid-memberships-pro' ) . "</a>.";
30
 
31
  if(empty($msgt))
adminpages/discountcodes.php CHANGED
@@ -585,7 +585,7 @@
585
 
586
  <tr>
587
  <th scope="row" valign="top"><label><?php _e('Recurring Subscription', 'paid-memberships-pro' );?>:</label></th>
588
- <td><input class="recurring_checkbox" id="recurring_<?php echo $level->id;?>" name="recurring[]" type="checkbox" value="<?php echo $level->id?>" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) { jQuery(this).parent().parent().siblings('.recurring_info').show(); if(!jQuery('#custom_trial_<?php echo $level->id?>').is(':checked')) jQuery(this).parent().parent().siblings('.trial_info').hide();} else jQuery(this).parent().parent().siblings('.recurring_info').hide();" /> <label for="recurring_<?php echo $level->id;?>"><?php _e('Check if this level has a recurring subscription payment.', 'paid-memberships-pro' );?></label></td>
589
  </tr>
590
 
591
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
@@ -626,7 +626,7 @@
626
 
627
  <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
628
  <th scope="row" valign="top"><label><?php _e('Custom Trial', 'paid-memberships-pro' );?>:</label></th>
629
- <td><input id="custom_trial_<?php echo $level->id?>" id="custom_trial_<?php echo $level->id;?>" name="custom_trial[]" type="checkbox" value="<?php echo $level->id?>" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) jQuery(this).parent().parent().siblings('.trial_info').show(); else jQuery(this).parent().parent().siblings('.trial_info').hide();" /> <label for="custom_trial_<?php echo $level->id;?>"><?php _e('Check to add a custom trial period.', 'paid-memberships-pro' );?></label></td>
630
  </tr>
631
 
632
  <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
@@ -750,7 +750,6 @@
750
  <th><?php _e('Uses', 'paid-memberships-pro' );?></th>
751
  <th><?php _e('Levels', 'paid-memberships-pro' );?></th>
752
  <?php do_action("pmpro_discountcodes_extra_cols_header", $codes);?>
753
- <th></th>
754
  </tr>
755
  </thead>
756
  <tbody>
@@ -759,8 +758,24 @@
759
  foreach($codes as $code) { ?>
760
  <tr<?php if($count++ % 2 == 1) { ?> class="alternate"<?php } ?>>
761
  <td><?php echo $code->id?></td>
762
- <td>
763
- <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>"><?php echo $code->code?></a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
764
  </td>
765
  <td>
766
  <?php echo date_i18n(get_option('date_format'), $code->starts)?>
@@ -790,25 +805,17 @@
790
  $levels = $wpdb->get_results($sqlQuery);
791
 
792
  $level_names = array();
793
- foreach($levels as $level)
794
- $level_names[] = "<a target=\"_blank\" href=\"" . pmpro_url("checkout", "?level=" . $level->id . "&discount_code=" . $code->code) . "\">" . $level->name . "</a>";
795
- if($level_names)
796
- echo implode(", ", $level_names);
797
- else
798
- echo "None";
 
 
799
  ?>
800
  </td>
801
  <?php do_action("pmpro_discountcodes_extra_cols_body", $code);?>
802
- <td>
803
- <a title="<?php _e('edit', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => $code->id ), admin_url('admin.php' ) ); ?>" class="button-primary"><?php _e( 'edit', 'paid-memberships-pro' ); ?></a>
804
- <a title="<?php _e('copy', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => -1, 'copy' => $code->id ), admin_url('admin.php' ) ); ?>" class="button-secondary"><?php _e( 'copy', 'paid-memberships-pro' ); ?></a>
805
- <a title="<?php _e('delete', 'paid-memberships-pro' ); ?>" href="javascript:askfirst('<?php echo str_replace("'", "\'", sprintf(__('Are you sure you want to delete the %s discount code? The subscriptions for existing users will not change, but new users will not be able to use this code anymore.', 'paid-memberships-pro' ), $code->code));?>', '<?php echo wp_nonce_url(add_query_arg( array( 'page' => 'pmpro-discountcodes', 'delete' => $code->id), admin_url( 'admin.php' ) ), 'delete', 'pmpro_discountcodes_nonce'); ?>'); void(0);" class="button-secondary"><?php _e('delete', 'paid-memberships-pro' ); ?></a>
806
- <?php if ( (int)$uses > 0 ) { ?>
807
- <a title="<?php _e('view orders', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-orders', 'discount_code' => $code->id, 'filter' => 'with-discount-code' ), admin_url('admin.php' ) ); ?>" class="button-secondary"><?php _e( 'orders', 'paid-memberships-pro' ); ?></a>
808
- <?php } else { ?>
809
- <a title="<?php _e('no orders', 'paid-memberships-pro' ); ?>" href="#" class="button-secondary button-disabled"><?php _e( 'orders', 'paid-memberships-pro' ); ?></a>
810
- <?php } ?>
811
- </td>
812
  </tr>
813
  <?php
814
  }
585
 
586
  <tr>
587
  <th scope="row" valign="top"><label><?php _e('Recurring Subscription', 'paid-memberships-pro' );?>:</label></th>
588
+ <td><input class="recurring_checkbox" id="recurring_<?php echo $level->id;?>" name="recurring[]" type="checkbox" value="<?php echo $level->id?>" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).prop('checked')) { jQuery(this).parent().parent().siblings('.recurring_info').show(); if(!jQuery('#custom_trial_<?php echo $level->id?>').is(':checked')) jQuery(this).parent().parent().siblings('.trial_info').hide();} else jQuery(this).parent().parent().siblings('.recurring_info').hide();" /> <label for="recurring_<?php echo $level->id;?>"><?php _e('Check if this level has a recurring subscription payment.', 'paid-memberships-pro' );?></label></td>
589
  </tr>
590
 
591
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
626
 
627
  <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
628
  <th scope="row" valign="top"><label><?php _e('Custom Trial', 'paid-memberships-pro' );?>:</label></th>
629
+ <td><input id="custom_trial_<?php echo $level->id?>" id="custom_trial_<?php echo $level->id;?>" name="custom_trial[]" type="checkbox" value="<?php echo $level->id?>" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).prop('checked')) jQuery(this).parent().parent().siblings('.trial_info').show(); else jQuery(this).parent().parent().siblings('.trial_info').hide();" /> <label for="custom_trial_<?php echo $level->id;?>"><?php _e('Check to add a custom trial period.', 'paid-memberships-pro' );?></label></td>
630
  </tr>
631
 
632
  <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
750
  <th><?php _e('Uses', 'paid-memberships-pro' );?></th>
751
  <th><?php _e('Levels', 'paid-memberships-pro' );?></th>
752
  <?php do_action("pmpro_discountcodes_extra_cols_header", $codes);?>
 
753
  </tr>
754
  </thead>
755
  <tbody>
758
  foreach($codes as $code) { ?>
759
  <tr<?php if($count++ % 2 == 1) { ?> class="alternate"<?php } ?>>
760
  <td><?php echo $code->id?></td>
761
+ <td class="has-row-actions">
762
+ <a title="<?php echo sprintf( 'Edit Code: %s', $code->code ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => $code->id ), admin_url('admin.php' ) ); ?>"><?php echo $code->code?></a>
763
+ <div class="row-actions">
764
+ <span class="edit">
765
+ <a title="<?php _e( 'Edit', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => $code->id ), admin_url('admin.php' ) ); ?>"><?php _e( 'Edit', 'paid-memberships-pro' ); ?></a>
766
+ </span> |
767
+ <span class="copy">
768
+ <a title="<?php _e( 'Copy', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => -1, 'copy' => $code->id ), admin_url('admin.php' ) ); ?>"><?php _e( 'Copy', 'paid-memberships-pro' ); ?></a>
769
+ </span> |
770
+ <span class="delete">
771
+ <a title="<?php _e( 'Delete', 'paid-memberships-pro' ); ?>" href="javascript:pmpro_askfirst('<?php echo str_replace("'", "\'", sprintf(__('Are you sure you want to delete the %s discount code? The subscriptions for existing users will not change, but new users will not be able to use this code anymore.', 'paid-memberships-pro' ), $code->code));?>', '<?php echo wp_nonce_url(add_query_arg( array( 'page' => 'pmpro-discountcodes', 'delete' => $code->id), admin_url( 'admin.php' ) ), 'delete', 'pmpro_discountcodes_nonce'); ?>'); void(0);"><?php _e('Delete', 'paid-memberships-pro' ); ?></a>
772
+ </span>
773
+ <?php if ( (int)$uses > 0 ) { ?>
774
+ | <span class="orders">
775
+ <a title="<?php _e(' View Orders', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-orders', 'discount_code' => $code->id, 'filter' => 'with-discount-code' ), admin_url('admin.php' ) ); ?>"><?php _e( 'Orders', 'paid-memberships-pro' ); ?></a>
776
+ </span>
777
+ <?php } ?>
778
+ </div>
779
  </td>
780
  <td>
781
  <?php echo date_i18n(get_option('date_format'), $code->starts)?>
805
  $levels = $wpdb->get_results($sqlQuery);
806
 
807
  $level_names = array();
808
+ foreach( $levels as $level ) {
809
+ $level_names[] = '<a title="' . pmpro_url( 'checkout', '?level=' . $level->id . '&discount_code=' . $code->code) . '" target="_blank" href="' . pmpro_url( 'checkout', '?level=' . $level->id . '&discount_code=' . $code->code) . '">' . $level->name . '</a>';
810
+ }
811
+ if( $level_names ) {
812
+ echo implode( ', ', $level_names );
813
+ } else {
814
+ echo 'None';
815
+ }
816
  ?>
817
  </td>
818
  <?php do_action("pmpro_discountcodes_extra_cols_body", $code);?>
 
 
 
 
 
 
 
 
 
 
819
  </tr>
820
  <?php
821
  }
adminpages/functions.php CHANGED
@@ -242,3 +242,69 @@ function pmpro_getClassesForPaymentSettingsField($field, $force = false)
242
  //return space separated string
243
  return implode(" ", $rgateways);
244
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
  //return space separated string
243
  return implode(" ", $rgateways);
244
  }
245
+
246
+
247
+ /**
248
+ * Code to handle emailing billable invoices.
249
+ *
250
+ * @since 1.8.6
251
+ */
252
+
253
+ /**
254
+ * Get the gateway-related classes for fields on the payment settings page.
255
+ *
256
+ * @param string $field The name of the field to check.
257
+ * @param bool $force If true, it will rebuild the cached results.
258
+ *
259
+ * @since 1.8
260
+ */
261
+ function pmpro_add_email_order_modal() {
262
+
263
+ // emailing?
264
+ if ( ! empty( $_REQUEST['email'] ) && ! empty( $_REQUEST['order'] ) ) {
265
+ $email = new PMProEmail();
266
+ $user = get_user_by( 'email', sanitize_email( $_REQUEST['email'] ) );
267
+ $order = new MemberOrder( $_REQUEST['order'] );
268
+ if ( $email->sendBillableInvoiceEmail( $user, $order ) ) { ?>
269
+ <div class="notice notice-success is-dismissible">
270
+ <p><?php _e( 'Invoice emailed successfully.', 'paid-memberships-pro' ); ?></p>
271
+ </div>
272
+ <?php } else { ?>
273
+ <div class="notice notice-error is-dismissible">
274
+ <p><?php _e( 'Error emailing invoice.', 'paid-memberships-pro' ); ?></p>
275
+ </div>
276
+ <?php }
277
+ }
278
+
279
+ ?>
280
+ <script>
281
+ // Update fields in email modal.
282
+ jQuery(document).ready(function ($) {
283
+ var order, order_id;
284
+ $('.email_link').click(function () {
285
+ order_id = $(this).data('order');
286
+ $('input[name=order]').val(order_id);
287
+ // Get email address from order ID
288
+ data = {
289
+ action: 'pmpro_get_order_json',
290
+ order_id: order_id
291
+ };
292
+ $.post(ajaxurl, data, function (response) {
293
+ order = JSON.parse(response);
294
+ $('input[name=email]').val(order.Email);
295
+ });
296
+ });
297
+ });
298
+ </script>
299
+ <?php add_thickbox(); ?>
300
+ <div id="email_invoice" style="display:none;">
301
+ <h3><?php _e( 'Email Invoice', 'paid-memberships-pro' ); ?></h3>
302
+ <form method="post" action="">
303
+ <input type="hidden" name="order" value=""/>
304
+ <?php _e( 'Send an invoice for this order to: ', 'paid-memberships-pro' ); ?>
305
+ <input type="text" value="" name="email"/>
306
+ <button class="button button-primary alignright"><?php _e( 'Send Email', 'paid-memberships-pro' ); ?></button>
307
+ </form>
308
+ </div>
309
+ <?php
310
+ }
adminpages/membershiplevels.php CHANGED
@@ -452,7 +452,7 @@
452
  $has_bt_plan = PMProGateway_braintree::checkLevelForPlan( $level->id );
453
  ?>
454
  <p class="pmpro_message <?php if ( ! $has_bt_plan ) {?>pmpro_error<?php } ?>">
455
- <strong><?php _e('Note', 'paid-memberships-pro' );?>:</strong> <?php printf( __('You will need to create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to %s.', 'paid-memberships-pro' ), 'pmpro_' . $level->id ); ?></p>
456
  <?php } ?>
457
  </td>
458
  </tr>
@@ -570,6 +570,32 @@
570
  <?php do_action("pmpro_membership_level_after_other_settings"); ?>
571
 
572
  <h3 class="topborder"><?php _e('Content Settings', 'paid-memberships-pro' );?></h3>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
573
  <table class="form-table">
574
  <tbody>
575
  <tr class="membership_categories">
@@ -717,7 +743,7 @@
717
  <th><?php _e('Billing Details', 'paid-memberships-pro' );?></th>
718
  <th><?php _e('Expiration', 'paid-memberships-pro' );?></th>
719
  <th><?php _e('Allow Signups', 'paid-memberships-pro' );?></th>
720
- <th></th>
721
  </tr>
722
  </thead>
723
  <tbody>
@@ -728,7 +754,14 @@
728
  ?>
729
  <tr class="<?php if($count++ % 2 == 1) { ?>alternate<?php } ?> <?php if(!$level->allow_signups) { ?>pmpro_gray<?php } ?> <?php if(!pmpro_checkLevelForStripeCompatibility($level) || !pmpro_checkLevelForBraintreeCompatibility($level) || !pmpro_checkLevelForPayflowCompatibility($level) || !pmpro_checkLevelForTwoCheckoutCompatibility($level)) { ?>pmpro_error<?php } ?>">
730
  <td><?php echo $level->id?></td>
731
- <td class="level_name"><a href="<?php echo add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => $level->id ), admin_url( 'admin.php' ) ); ?>"><?php esc_attr_e( $level->name ); ?></a></td>
 
 
 
 
 
 
 
732
  <td>
733
  <?php if(pmpro_isLevelFree($level)) { ?>
734
  <?php _e('FREE', 'paid-memberships-pro' );?>
@@ -743,9 +776,8 @@
743
  <?php _e('After', 'paid-memberships-pro' );?> <?php echo $level->expiration_number?> <?php echo sornot($level->expiration_period,$level->expiration_number)?>
744
  <?php } ?>
745
  </td>
746
- <td><?php if($level->allow_signups) { ?><a href="<?php echo add_query_arg( 'level', $level->id, pmpro_url("checkout") );?>"><?php _e('Yes', 'paid-memberships-pro' );?></a><?php } else { ?><?php _e('No', 'paid-memberships-pro' );?><?php } ?></td>
747
-
748
- <td><a title="<?php _e('edit', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => $level->id ), admin_url('admin.php' ) ); ?>" class="button-primary"><?php _e('edit', 'paid-memberships-pro' ); ?></a>&nbsp;<a title="<?php _e('copy', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => -1, 'copy' => $level->id ), admin_url( 'admin.php' ) ); ?>" class="button-secondary"><?php _e('copy', 'paid-memberships-pro' ); ?></a>&nbsp;<a title="<?php _e('delete', 'paid-memberships-pro' ); ?>" href="javascript:askfirst('<?php echo str_replace("'", "\'", sprintf(__("Are you sure you want to delete membership level %s? All subscriptions will be cancelled.", 'paid-memberships-pro' ), $level->name));?>', '<?php echo wp_nonce_url(add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'action' => 'delete_membership_level', 'deleteid' => $level->id ), admin_url( 'admin.php' ) ), 'delete_membership_level', 'pmpro_membershiplevels_nonce'); ?>'); void(0);" class="button-secondary"><?php _e('delete', 'paid-memberships-pro' ); ?></a></td>
749
  </tr>
750
  <?php
751
  }
452
  $has_bt_plan = PMProGateway_braintree::checkLevelForPlan( $level->id );
453
  ?>
454
  <p class="pmpro_message <?php if ( ! $has_bt_plan ) {?>pmpro_error<?php } ?>">
455
+ <strong><?php _e('Note', 'paid-memberships-pro' );?>:</strong> <?php printf( __('You will need to create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to %s.', 'paid-memberships-pro' ), PMProGateway_braintree::get_plan_id( $level->id ) ); ?></p>
456
  <?php } ?>
457
  </td>
458
  </tr>
570
  <?php do_action("pmpro_membership_level_after_other_settings"); ?>
571
 
572
  <h3 class="topborder"><?php _e('Content Settings', 'paid-memberships-pro' );?></h3>
573
+ <?php
574
+ // Get the Advanced Settings for filtering queries and showing excerpts.
575
+ $filterqueries = pmpro_getOption('filterqueries');
576
+ $showexcerpts = pmpro_getOption("showexcerpts");
577
+
578
+ $allowed_html = array (
579
+ 'a' => array (
580
+ 'href' => array(),
581
+ 'target' => array(),
582
+ 'title' => array(),
583
+ ),
584
+ );
585
+
586
+ if ( $filterqueries == 1 ) {
587
+ // Show a message that posts in these categories are hidden.
588
+ echo '<p>' . sprintf( wp_kses( __( 'Non-members will not see posts in these categories. You can <a href="%s" title="Advanced Settings" target="_blank">update this setting here</a>.', 'paid-memberships-pro' ), $allowed_html ), admin_url( 'admin.php?page=pmpro-advancedsettings' ) ) . '</p>';
589
+ } else {
590
+ if ( $showexcerpts == 1 ) {
591
+ // Show a message that posts in these categories will show title and excerpt.
592
+ echo '<p>' . sprintf( wp_kses( __( 'Non-members will see the title and excerpt for posts in these categories. You can <a href="%s" title="Advanced Settings" target="_blank">update this setting here</a>.', 'paid-memberships-pro' ), $allowed_html ), admin_url( 'admin.php?page=pmpro-advancedsettings' ) ) . '</p>';
593
+ } else {
594
+ // Show a message that posts in these categories will show only the title.
595
+ echo '<p>' . sprintf( wp_kses( __( 'Non-members will see the title only for posts in these categories. You can <a href="%s" title="Advanced Settings" target="_blank">update this setting here</a>.', 'paid-memberships-pro' ), $allowed_html ), admin_url( 'admin.php?page=pmpro-advancedsettings' ) ) . '</p>';
596
+ }
597
+ }
598
+ ?>
599
  <table class="form-table">
600
  <tbody>
601
  <tr class="membership_categories">
743
  <th><?php _e('Billing Details', 'paid-memberships-pro' );?></th>
744
  <th><?php _e('Expiration', 'paid-memberships-pro' );?></th>
745
  <th><?php _e('Allow Signups', 'paid-memberships-pro' );?></th>
746
+ <?php do_action( 'pmpro_membership_levels_table_extra_cols_header', $reordered_levels ); ?>
747
  </tr>
748
  </thead>
749
  <tbody>
754
  ?>
755
  <tr class="<?php if($count++ % 2 == 1) { ?>alternate<?php } ?> <?php if(!$level->allow_signups) { ?>pmpro_gray<?php } ?> <?php if(!pmpro_checkLevelForStripeCompatibility($level) || !pmpro_checkLevelForBraintreeCompatibility($level) || !pmpro_checkLevelForPayflowCompatibility($level) || !pmpro_checkLevelForTwoCheckoutCompatibility($level)) { ?>pmpro_error<?php } ?>">
756
  <td><?php echo $level->id?></td>
757
+ <td class="level_name has-row-actions">
758
+ <span class="level-name"><a href="<?php echo add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => $level->id ), admin_url( 'admin.php' ) ); ?>"><?php esc_attr_e( $level->name ); ?></a></span>
759
+ <div class="row-actions">
760
+ <span class="edit"><a title="<?php _e('Edit', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => $level->id ), admin_url('admin.php' ) ); ?>"><?php _e('Edit', 'paid-memberships-pro' ); ?></a></span> |
761
+ <span class="copy"><a title="<?php _e('Copy', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => -1, 'copy' => $level->id ), admin_url( 'admin.php' ) ); ?>"><?php _e('Copy', 'paid-memberships-pro' ); ?></a></span> |
762
+ <span class="delete"><a title="<?php _e('Delete', 'paid-memberships-pro' ); ?>" href="javascript:pmpro_askfirst('<?php echo str_replace("'", "\'", sprintf(__("Are you sure you want to delete membership level %s? All subscriptions will be cancelled.", 'paid-memberships-pro' ), $level->name));?>', '<?php echo wp_nonce_url(add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'action' => 'delete_membership_level', 'deleteid' => $level->id ), admin_url( 'admin.php' ) ), 'delete_membership_level', 'pmpro_membershiplevels_nonce'); ?>'); void(0);"><?php _e('Delete', 'paid-memberships-pro' ); ?></a></span>
763
+ </div>
764
+ </td>
765
  <td>
766
  <?php if(pmpro_isLevelFree($level)) { ?>
767
  <?php _e('FREE', 'paid-memberships-pro' );?>
776
  <?php _e('After', 'paid-memberships-pro' );?> <?php echo $level->expiration_number?> <?php echo sornot($level->expiration_period,$level->expiration_number)?>
777
  <?php } ?>
778
  </td>
779
+ <td><?php if($level->allow_signups) { ?><a target="_blank" href="<?php echo add_query_arg( 'level', $level->id, pmpro_url("checkout") );?>"><?php _e('Yes', 'paid-memberships-pro' );?></a><?php } else { ?><?php _e('No', 'paid-memberships-pro' );?><?php } ?></td>
780
+ <?php do_action( 'pmpro_membership_levels_table_extra_cols_body', $level ); ?>
 
781
  </tr>
782
  <?php
783
  }
adminpages/memberslist-csv.php CHANGED
@@ -296,10 +296,7 @@
296
  $last_uid = $theusers[($users_found - 1)];
297
 
298
  //increment starting position
299
- if(0 < $iterations)
300
- {
301
- $i_start += $max_users_per_loop;
302
- }
303
 
304
  //escape the % for LIKE comparison with $wpdb
305
  if(!empty($search))
@@ -553,10 +550,18 @@
553
  ini_set('zlib.output_compression', 'Off');
554
  }
555
 
556
- // open and send the file contents to the remote location
557
- $fh = fopen( $filename, 'rb' );
558
- fpassthru($fh);
559
- fclose($fh);
 
 
 
 
 
 
 
 
560
 
561
  // remove the temp file
562
  unlink($filename);
296
  $last_uid = $theusers[($users_found - 1)];
297
 
298
  //increment starting position
299
+ $i_start += $max_users_per_loop;
 
 
 
300
 
301
  //escape the % for LIKE comparison with $wpdb
302
  if(!empty($search))
550
  ini_set('zlib.output_compression', 'Off');
551
  }
552
 
553
+ if( function_exists('fpassthru') )
554
+ {
555
+ // open and send the file contents to the remote location
556
+ $fh = fopen( $filename, 'rb' );
557
+ fpassthru($fh);
558
+ fclose($fh);
559
+ }
560
+ else
561
+ {
562
+ // use readfile() if fpassthru() is disabled (like on Flywheel Hosted)
563
+ readfile($fh);
564
+ }
565
 
566
  // remove the temp file
567
  unlink($filename);
adminpages/orders-csv.php CHANGED
@@ -428,11 +428,11 @@ for ( $ic = 1; $ic <= $iterations; $ic ++ ) {
428
  }
429
 
430
  //increment starting position
431
- if ( $iterations > 1 ) {
432
  $i_start += $max_orders_per_loop;
433
  }
434
  // get the order list we should process
435
- $order_list = array_slice( $order_ids, $i_start, ( $i_start + ( $max_orders_per_loop - 1 ) ) );
436
 
437
  if (PMPRO_BENCHMARK)
438
  {
@@ -441,7 +441,6 @@ for ( $ic = 1; $ic <= $iterations; $ic ++ ) {
441
  }
442
 
443
  foreach ( $order_list as $order_id ) {
444
-
445
  $csvoutput = array();
446
 
447
  $order = new MemberOrder();
@@ -537,11 +536,9 @@ for ( $ic = 1; $ic <= $iterations; $ic ++ ) {
537
  error_log("PMPRO_BENCHMARK - Time processing data: {$sec}.{$usec} seconds");
538
  error_log("PMPRO_BENCHMARK - Peak memory usage: " . number_format($memory_processing_data, false, '.', ',') . " bytes");
539
  }
540
-
541
  $order_list = null;
542
  wp_cache_flush();
543
  }
544
-
545
  pmpro_transmit_order_content( $csv_fh, $filename, $headers );
546
 
547
  function pmpro_enclose( $s ) {
@@ -588,10 +585,18 @@ function pmpro_transmit_order_content( $csv_fh, $filename, $headers = array() )
588
  ini_set( 'zlib.output_compression', 'Off' );
589
  }
590
 
591
- // open and send the file contents to the remote location
592
- $fh = fopen( $filename, 'rb' );
593
- fpassthru( $fh );
594
- fclose( $fh );
 
 
 
 
 
 
 
 
595
 
596
  // remove the temp file
597
  unlink( $filename );
428
  }
429
 
430
  //increment starting position
431
+ if ( $ic > 1 ) {
432
  $i_start += $max_orders_per_loop;
433
  }
434
  // get the order list we should process
435
+ $order_list = array_slice( $order_ids, $i_start, $max_orders_per_loop );
436
 
437
  if (PMPRO_BENCHMARK)
438
  {
441
  }
442
 
443
  foreach ( $order_list as $order_id ) {
 
444
  $csvoutput = array();
445
 
446
  $order = new MemberOrder();
536
  error_log("PMPRO_BENCHMARK - Time processing data: {$sec}.{$usec} seconds");
537
  error_log("PMPRO_BENCHMARK - Peak memory usage: " . number_format($memory_processing_data, false, '.', ',') . " bytes");
538
  }
 
539
  $order_list = null;
540
  wp_cache_flush();
541
  }
 
542
  pmpro_transmit_order_content( $csv_fh, $filename, $headers );
543
 
544
  function pmpro_enclose( $s ) {
585
  ini_set( 'zlib.output_compression', 'Off' );
586
  }
587
 
588
+ if( function_exists('fpassthru') )
589
+ {
590
+ // open and send the file contents to the remote location
591
+ $fh = fopen( $filename, 'rb' );
592
+ fpassthru($fh);
593
+ fclose($fh);
594
+ }
595
+ else
596
+ {
597
+ // use readfile() if fpassthru() is disabled (like on Flywheel Hosted)
598
+ readfile($fh);
599
+ }
600
 
601
  // remove the temp file
602
  unlink( $filename );
adminpages/orders.php CHANGED
@@ -149,24 +149,6 @@ if ( empty( $filter ) || $filter === 'all' ) {
149
  $condition = "o.total = 0";
150
  }
151
 
152
- // emailing?
153
- if ( ! empty( $_REQUEST['email'] ) && ! empty( $_REQUEST['order'] ) ) {
154
- $email = new PMProEmail();
155
- $user = get_user_by( 'email', sanitize_email( $_REQUEST['email'] ) );
156
- $order = new MemberOrder( $_REQUEST['order'] );
157
- if ( $email->sendBillableInvoiceEmail( $user, $order ) ) {
158
- $pmpro_msg = __( 'Invoice emailed successfully.', 'paid-memberships-pro' );
159
- $pmpro_msgt = 'success';
160
- } else {
161
- $pmpro_msg = __( 'Error emailing invoice.', 'paid-memberships-pro' );
162
- $pmpro_msgt = 'error';
163
- }
164
-
165
- // clean up so we stay on the orders list view
166
- unset( $_REQUEST['order'] );
167
- $order = null;
168
- }
169
-
170
  // deleting?
171
  if ( ! empty( $_REQUEST['delete'] ) ) {
172
  $dorder = new MemberOrder( intval( $_REQUEST['delete'] ) );
@@ -373,6 +355,12 @@ if ( ! empty( $_REQUEST['save'] ) ) {
373
  }
374
 
375
  require_once( dirname( __FILE__ ) . '/admin_header.php' );
 
 
 
 
 
 
376
  ?>
377
 
378
  <?php if ( ! empty( $order ) ) { ?>
@@ -380,6 +368,8 @@ require_once( dirname( __FILE__ ) . '/admin_header.php' );
380
  <h2>
381
  <?php if ( ! empty( $order->id ) ) { ?>
382
  <?php _e( 'Order', 'paid-memberships-pro' ); ?> #<?php echo $order->id; ?>: <?php echo $order->code; ?>
 
 
383
  <?php } else { ?>
384
  <?php _e( 'New Order', 'paid-memberships-pro' ); ?>
385
  <?php } ?>
@@ -953,42 +943,7 @@ selected="selected"<?php } ?>><?php echo date_i18n( 'M', strtotime( $i . '/1/' .
953
  </form>
954
 
955
  <?php } else { ?>
956
- <?php
957
- /**
958
- * Code to handle emailing billable invoices.
959
- *
960
- * @since 1.8.6
961
- */
962
- ?>
963
- <script>
964
- // Update fields in email modal.
965
- jQuery(document).ready(function ($) {
966
- var order, order_id;
967
- $('.email_link').click(function () {
968
- order_id = $(this).data('order');
969
- $('input[name=order]').val(order_id);
970
- // Get email address from order ID
971
- data = {
972
- action: 'pmpro_get_order_json',
973
- order_id: order_id
974
- };
975
- $.post(ajaxurl, data, function (response) {
976
- order = JSON.parse(response);
977
- $('input[name=email]').val(order.Email);
978
- });
979
- });
980
- });
981
- </script>
982
- <?php add_thickbox(); ?>
983
- <div id="email_invoice" style="display:none;">
984
- <h3><?php _e( 'Email Invoice', 'paid-memberships-pro' ); ?></h3>
985
- <form method="post" action="">
986
- <input type="hidden" name="order" value=""/>
987
- <?php _e( 'Send an invoice for this order to: ', 'paid-memberships-pro' ); ?>
988
- <input type="text" value="" name="email"/>
989
- <button class="button button-primary alignright"><?php _e( 'Send Email', 'paid-memberships-pro' ); ?></button>
990
- </form>
991
- </div>
992
  <form id="posts-filter" method="get" action="">
993
  <h2>
994
  <?php _e( 'Orders', 'paid-memberships-pro' ); ?>
@@ -1361,11 +1316,6 @@ selected="selected"<?php } ?>><?php echo date_i18n( 'M', strtotime( $i . '/1/' .
1361
  <th><?php _e( 'Status', 'paid-memberships-pro' ); ?></th>
1362
  <th><?php _e( 'Date', 'paid-memberships-pro' ); ?></th>
1363
  <th><?php _e( 'Discount Code', 'paid-memberships-pro' );?></th>
1364
- <th></th>
1365
- <th></th>
1366
- <th></th>
1367
- <th></th>
1368
- <th></th>
1369
  </tr>
1370
  </thead>
1371
  <tbody id="orders" class="list:order orders-list">
@@ -1387,7 +1337,7 @@ class="alternate"<?php } ?>>
1387
  <td>
1388
  <a href="admin.php?page=pmpro-orders&order=<?php echo $order->id; ?>"><?php echo $order->code; ?></a>
1389
  </td>
1390
- <td class="username column-username">
1391
  <?php $order->getUser(); ?>
1392
  <?php if ( ! empty( $order->user ) ) { ?>
1393
  <a href="user-edit.php?user_id=<?php echo $order->user->ID; ?>"><?php echo $order->user->user_login; ?></a>
@@ -1396,23 +1346,40 @@ class="alternate"<?php } ?>>
1396
  <?php } else { ?>
1397
  [<?php _e( 'none', 'paid-memberships-pro' ); ?>]
1398
  <?php } ?>
1399
- <br/>
1400
- <?php
1401
- // Set up the hover actions for this user
1402
- $actions = apply_filters( 'pmpro_orders_user_row_actions', array(), $order->user, $order );
1403
- $action_count = count( $actions );
1404
- $i = 0;
1405
- if ( $action_count ) {
1406
- $out = '<div class="row-actions">';
1407
- foreach ( $actions as $action => $link ) {
1408
- ++ $i;
1409
- ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
1410
- $out .= "<span class='$action'>$link$sep</span>";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1411
  }
1412
- $out .= '</div>';
1413
- echo $out;
1414
- }
1415
- ?>
1416
  </td>
1417
  <?php do_action( 'pmpro_orders_extra_cols_body', $order ); ?>
1418
  <td><?php echo $order->membership_id; ?></td>
@@ -1485,23 +1452,6 @@ class="alternate"<?php } ?>>
1485
  </a>
1486
  <?php } ?>
1487
  </td>
1488
- <td align="center">
1489
- <a href="admin.php?page=pmpro-orders&order=<?php echo $order->id; ?>"><?php _e( 'edit', 'paid-memberships-pro' ); ?></a>
1490
- </td>
1491
- <td align="center">
1492
- <a href="admin.php?page=pmpro-orders&order=-1&copy=<?php echo $order->id; ?>"><?php _e( 'copy', 'paid-memberships-pro' ); ?></a>
1493
- </td>
1494
- <td align="center">
1495
- <a href="javascript:askfirst('<?php echo str_replace( "'", "\'", sprintf( __( 'Deleting orders is permanent and can affect active users. Are you sure you want to delete order %s?', 'paid-memberships-pro' ), str_replace( "'", '', $order->code ) ) ); ?>', 'admin.php?page=pmpro-orders&delete=<?php echo $order->id; ?>'); void(0);"><?php _e( 'delete', 'paid-memberships-pro' ); ?></a>
1496
- </td>
1497
- <td align="center">
1498
- <a href="admin-ajax.php?action=pmpro_orders_print_view&order=<?php echo $order->id; ?>"
1499
- target="_blank"><?php _e( 'print', 'paid-memberships-pro' ); ?></a>
1500
- </td>
1501
- <td align="center">
1502
- <a href="#TB_inline?width=600&height=200&inlineId=email_invoice" class="thickbox email_link"
1503
- data-order="<?php echo $order->id; ?>"><?php _e( 'email', 'paid-memberships-pro' ); ?></a>
1504
- </td>
1505
  </tr>
1506
  <?php
1507
  }
149
  $condition = "o.total = 0";
150
  }
151
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  // deleting?
153
  if ( ! empty( $_REQUEST['delete'] ) ) {
154
  $dorder = new MemberOrder( intval( $_REQUEST['delete'] ) );
355
  }
356
 
357
  require_once( dirname( __FILE__ ) . '/admin_header.php' );
358
+
359
+ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
360
+ // Load the email order modal.
361
+ pmpro_add_email_order_modal();
362
+ }
363
+
364
  ?>
365
 
366
  <?php if ( ! empty( $order ) ) { ?>
368
  <h2>
369
  <?php if ( ! empty( $order->id ) ) { ?>
370
  <?php _e( 'Order', 'paid-memberships-pro' ); ?> #<?php echo $order->id; ?>: <?php echo $order->code; ?>
371
+ <a title="<?php _e( 'Print', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'action' => 'pmpro_orders_print_view', 'order' => $order->id ), admin_url('admin-ajax.php' ) ); ?>" class="add-new-h2" target="_blank" ><?php _e( 'Print', 'paid-memberships-pro' ); ?></a>
372
+ <a title="<?php _e( 'Email', 'paid-memberships-pro' ); ?>" href="#TB_inline?width=600&height=200&inlineId=email_invoice" class="thickbox email_link add-new-h2" data-order="<?php echo $order->id; ?>"><?php _e( 'Email', 'paid-memberships-pro' ); ?></a>
373
  <?php } else { ?>
374
  <?php _e( 'New Order', 'paid-memberships-pro' ); ?>
375
  <?php } ?>
943
  </form>
944
 
945
  <?php } else { ?>
946
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
947
  <form id="posts-filter" method="get" action="">
948
  <h2>
949
  <?php _e( 'Orders', 'paid-memberships-pro' ); ?>
1316
  <th><?php _e( 'Status', 'paid-memberships-pro' ); ?></th>
1317
  <th><?php _e( 'Date', 'paid-memberships-pro' ); ?></th>
1318
  <th><?php _e( 'Discount Code', 'paid-memberships-pro' );?></th>
 
 
 
 
 
1319
  </tr>
1320
  </thead>
1321
  <tbody id="orders" class="list:order orders-list">
1337
  <td>
1338
  <a href="admin.php?page=pmpro-orders&order=<?php echo $order->id; ?>"><?php echo $order->code; ?></a>
1339
  </td>
1340
+ <td class="username column-username has-row-actions">
1341
  <?php $order->getUser(); ?>
1342
  <?php if ( ! empty( $order->user ) ) { ?>
1343
  <a href="user-edit.php?user_id=<?php echo $order->user->ID; ?>"><?php echo $order->user->user_login; ?></a>
1346
  <?php } else { ?>
1347
  [<?php _e( 'none', 'paid-memberships-pro' ); ?>]
1348
  <?php } ?>
1349
+ <br />
1350
+ <div class="row-actions">
1351
+ <span class="edit">
1352
+ <a title="<?php _e( 'Edit', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-orders', 'order' => $order->id ), admin_url('admin.php' ) ); ?>"><?php _e( 'Edit', 'paid-memberships-pro' ); ?></a>
1353
+ </span> |
1354
+ <span class="copy">
1355
+ <a title="<?php _e( 'Copy', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-orders', 'order' => '-1', 'copy' => $order->id ), admin_url('admin.php' ) ); ?>"><?php _e( 'Copy', 'paid-memberships-pro' ); ?></a>
1356
+ </span> |
1357
+ <span class="delete">
1358
+ <a href="javascript:pmpro_askfirst('<?php echo str_replace( "'", "\'", sprintf( __( 'Deleting orders is permanent and can affect active users. Are you sure you want to delete order %s?', 'paid-memberships-pro' ), str_replace( "'", '', $order->code ) ) ); ?>', 'admin.php?page=pmpro-orders&delete=<?php echo $order->id; ?>'); void(0);"><?php _e( 'Delete', 'paid-memberships-pro' ); ?></a>
1359
+ </span> |
1360
+ <span class="print">
1361
+ <a target="_blank" title="<?php _e( 'Print', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'action' => 'pmpro_orders_print_view', 'order' => $order->id ), admin_url('admin-ajax.php' ) ); ?>"><?php _e( 'Print', 'paid-memberships-pro' ); ?></a>
1362
+ </span> |
1363
+ <span class="email">
1364
+ <a href="#TB_inline?width=600&height=200&inlineId=email_invoice" class="thickbox email_link"
1365
+ data-order="<?php echo $order->id; ?>"><?php _e( 'Email', 'paid-memberships-pro' ); ?></a>
1366
+ </span>
1367
+ <?php
1368
+ // Set up the hover actions for this user
1369
+ $actions = apply_filters( 'pmpro_orders_user_row_actions', array(), $order->user, $order );
1370
+ $action_count = count( $actions );
1371
+ $i = 0;
1372
+ if ( $action_count ) {
1373
+ $out = ' | ';
1374
+ foreach ( $actions as $action => $link ) {
1375
+ ++ $i;
1376
+ ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
1377
+ $out .= "<span class='$action'>$link$sep</span>";
1378
+ }
1379
+ echo $out;
1380
  }
1381
+ ?>
1382
+ </div>
 
 
1383
  </td>
1384
  <?php do_action( 'pmpro_orders_extra_cols_body', $order ); ?>
1385
  <td><?php echo $order->membership_id; ?></td>
1452
  </a>
1453
  <?php } ?>
1454
  </td>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1455
  </tr>
1456
  <?php
1457
  }
adminpages/paymentsettings.php CHANGED
@@ -134,6 +134,9 @@
134
  }
135
  ?>
136
  </select>
 
 
 
137
  </td>
138
  </tr>
139
  <tr>
@@ -151,6 +154,20 @@
151
  //hide all gateway options
152
  jQuery('tr.gateway').hide();
153
  jQuery('tr.gateway_'+gateway).show();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  }
155
  pmpro_changeGateway(jQuery('#gateway').val());
156
  </script>
134
  }
135
  ?>
136
  </select>
137
+ <?php if( pmpro_onlyFreeLevels() ) { ?>
138
+ <div id='pmpro-default-gateway-message' style="display:none;"><small><?php echo __( 'This gateway is for membership sites with Free levels or for sites that accept payment offline.', 'paid-memberships-pro' ) . '<br/>' . __( 'It is not connected to a live gateway environment and cannot accept payments.', 'paid-memberships-pro' ); ?></small></div>
139
+ <?php } ?>
140
  </td>
141
  </tr>
142
  <tr>
154
  //hide all gateway options
155
  jQuery('tr.gateway').hide();
156
  jQuery('tr.gateway_'+gateway).show();
157
+
158
+ //hide sub settings and toggle them on based on triggers
159
+ jQuery('tr.pmpro_toggle_target').hide();
160
+ jQuery( 'input[pmpro_toggle_trigger_for]' ).each( function() {
161
+ if ( jQuery( this ).is( ':visible' ) ) {
162
+ pmpro_toggle_elements_by_selector( jQuery( this ).attr( 'pmpro_toggle_trigger_for' ), jQuery( this ).prop( 'checked' ) );
163
+ }
164
+ });
165
+
166
+ if ( jQuery('#gateway').val() === '' ) {
167
+ jQuery('#pmpro-default-gateway-message').show();
168
+ } else {
169
+ jQuery('#pmpro-default-gateway-message').hide();
170
+ }
171
  }
172
  pmpro_changeGateway(jQuery('#gateway').val());
173
  </script>
adminpages/reports/memberships.php CHANGED
@@ -186,7 +186,7 @@ function pmpro_report_memberships_page()
186
  if($period == "daily")
187
  {
188
  $startdate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-01';
189
- $enddate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-32';
190
  $date_function = 'DAY';
191
  }
192
  elseif($period == "monthly")
@@ -221,7 +221,7 @@ function pmpro_report_memberships_page()
221
  $sqlQuery .= "WHERE mu.startdate >= '" . esc_sql( $startdate ) . "' ";
222
 
223
  if ( ! empty( $enddate ) ) {
224
- $sqlQuery .= "AND mu.startdate < '" . esc_sql( $enddate ) . "' ";
225
  }
226
  }
227
 
186
  if($period == "daily")
187
  {
188
  $startdate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-01';
189
+ $enddate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-31';
190
  $date_function = 'DAY';
191
  }
192
  elseif($period == "monthly")
221
  $sqlQuery .= "WHERE mu.startdate >= '" . esc_sql( $startdate ) . "' ";
222
 
223
  if ( ! empty( $enddate ) ) {
224
+ $sqlQuery .= "AND mu.startdate <= '" . esc_sql( $enddate ) . "' ";
225
  }
226
  }
227
 
adminpages/templates/orders-print.php CHANGED
@@ -51,7 +51,7 @@
51
  </tr>
52
  <tr>
53
  <td>
54
- <?php echo __( 'Date:', 'paid-memberships-pro' ) . '&nbsp;' . date_i18n( 'Y-m-d', $order->timestamp ) ?>
55
  </td>
56
  </tr>
57
  </table>
51
  </tr>
52
  <tr>
53
  <td>
54
+ <?php echo __( 'Date:', 'paid-memberships-pro' ) . '&nbsp;' . date_i18n( get_option( 'date_format' ), $order->timestamp ); ?>
55
  </td>
56
  </tr>
57
  </table>
bin/install-wp-tests.sh ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+
3
+ if [ $# -lt 3 ]; then
4
+ echo "usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version] [skip-database-creation]"
5
+ exit 1
6
+ fi
7
+
8
+ DB_NAME=$1
9
+ DB_USER=$2
10
+ DB_PASS=$3
11
+ DB_HOST=${4-localhost}
12
+ WP_VERSION=${5-latest}
13
+ SKIP_DB_CREATE=${6-false}
14
+
15
+ TMPDIR=${TMPDIR-/tmp}
16
+ TMPDIR=$(echo $TMPDIR | sed -e "s/\/$//")
17
+ WP_TESTS_DIR=${WP_TESTS_DIR-$TMPDIR/wordpress-tests-lib}
18
+ WP_CORE_DIR=${WP_CORE_DIR-$TMPDIR/wordpress/}
19
+
20
+ download() {
21
+ if [ `which curl` ]; then
22
+ curl -s "$1" > "$2";
23
+ elif [ `which wget` ]; then
24
+ wget -nv -O "$2" "$1"
25
+ fi
26
+ }
27
+
28
+ if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then
29
+ WP_TESTS_TAG="branches/$WP_VERSION"
30
+ elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
31
+ if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
32
+ # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
33
+ WP_TESTS_TAG="tags/${WP_VERSION%??}"
34
+ else
35
+ WP_TESTS_TAG="tags/$WP_VERSION"
36
+ fi
37
+ elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
38
+ WP_TESTS_TAG="trunk"
39
+ else
40
+ # http serves a single offer, whereas https serves multiple. we only want one
41
+ download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json
42
+ grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json
43
+ LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//')
44
+ if [[ -z "$LATEST_VERSION" ]]; then
45
+ echo "Latest WordPress version could not be found"
46
+ exit 1
47
+ fi
48
+ WP_TESTS_TAG="tags/$LATEST_VERSION"
49
+ fi
50
+
51
+ set -ex
52
+
53
+ install_wp() {
54
+
55
+ if [ -d $WP_CORE_DIR ]; then
56
+ return;
57
+ fi
58
+
59
+ mkdir -p $WP_CORE_DIR
60
+
61
+ if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
62
+ mkdir -p $TMPDIR/wordpress-nightly
63
+ download https://wordpress.org/nightly-builds/wordpress-latest.zip $TMPDIR/wordpress-nightly/wordpress-nightly.zip
64
+ unzip -q $TMPDIR/wordpress-nightly/wordpress-nightly.zip -d $TMPDIR/wordpress-nightly/
65
+ mv $TMPDIR/wordpress-nightly/wordpress/* $WP_CORE_DIR
66
+ else
67
+ if [ $WP_VERSION == 'latest' ]; then
68
+ local ARCHIVE_NAME='latest'
69
+ elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then
70
+ # https serves multiple offers, whereas http serves single.
71
+ download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json
72
+ if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
73
+ # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
74
+ LATEST_VERSION=${WP_VERSION%??}
75
+ else
76
+ # otherwise, scan the releases and get the most up to date minor version of the major release
77
+ local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'`
78
+ LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//' | head -1)
79
+ fi
80
+ if [[ -z "$LATEST_VERSION" ]]; then
81
+ local ARCHIVE_NAME="wordpress-$WP_VERSION"
82
+ else
83
+ local ARCHIVE_NAME="wordpress-$LATEST_VERSION"
84
+ fi
85
+ else
86
+ local ARCHIVE_NAME="wordpress-$WP_VERSION"
87
+ fi
88
+ download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $TMPDIR/wordpress.tar.gz
89
+ tar --strip-components=1 -zxmf $TMPDIR/wordpress.tar.gz -C $WP_CORE_DIR
90
+ fi
91
+
92
+ download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php
93
+ }
94
+
95
+ install_test_suite() {
96
+ # portable in-place argument for both GNU sed and Mac OSX sed
97
+ if [[ $(uname -s) == 'Darwin' ]]; then
98
+ local ioption='-i .bak'
99
+ else
100
+ local ioption='-i'
101
+ fi
102
+
103
+ # set up testing suite if it doesn't yet exist
104
+ if [ ! -d $WP_TESTS_DIR ]; then
105
+ # set up testing suite
106
+ mkdir -p $WP_TESTS_DIR
107
+ svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes
108
+ svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data
109
+ fi
110
+
111
+ if [ ! -f wp-tests-config.php ]; then
112
+ download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
113
+ # remove all forward slashes in the end
114
+ WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::")
115
+ sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
116
+ sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php
117
+ sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php
118
+ sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php
119
+ sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php
120
+ fi
121
+
122
+ }
123
+
124
+ install_db() {
125
+
126
+ if [ ${SKIP_DB_CREATE} = "true" ]; then
127
+ return 0
128
+ fi
129
+
130
+ # parse DB_HOST for port or socket references
131
+ local PARTS=(${DB_HOST//\:/ })
132
+ local DB_HOSTNAME=${PARTS[0]};
133
+ local DB_SOCK_OR_PORT=${PARTS[1]};
134
+ local EXTRA=""
135
+
136
+ if ! [ -z $DB_HOSTNAME ] ; then
137
+ if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then
138
+ EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
139
+ elif ! [ -z $DB_SOCK_OR_PORT ] ; then
140
+ EXTRA=" --socket=$DB_SOCK_OR_PORT"
141
+ elif ! [ -z $DB_HOSTNAME ] ; then
142
+ EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
143
+ fi
144
+ fi
145
+
146
+ # create database
147
+ mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA
148
+ }
149
+
150
+ install_wp
151
+ install_test_suite
152
+ install_db
classes/class.pmproemail.php CHANGED
@@ -114,6 +114,7 @@
114
  $this->email = apply_filters("pmpro_email_recipient", $temail->email, $this);
115
  $this->from = apply_filters("pmpro_email_sender", $temail->from, $this);
116
  $this->fromname = apply_filters("pmpro_email_sender_name", $temail->fromname, $this);
 
117
  $this->subject = apply_filters("pmpro_email_subject", $temail->subject, $this);
118
  $this->template = apply_filters("pmpro_email_template", $temail->template, $this);
119
  $this->body = apply_filters("pmpro_email_body", $temail->body, $this);
@@ -130,6 +131,33 @@
130
  }
131
  }
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  function sendCancelEmail($user = NULL, $old_level_id = NULL)
134
  {
135
  global $wpdb, $current_user;
@@ -953,6 +981,82 @@
953
 
954
  return $this->sendEmail();
955
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
956
 
957
  /**
958
  * Load the text for each default email template.
114
  $this->email = apply_filters("pmpro_email_recipient", $temail->email, $this);
115
  $this->from = apply_filters("pmpro_email_sender", $temail->from, $this);
116
  $this->fromname = apply_filters("pmpro_email_sender_name", $temail->fromname, $this);
117
+ $this->add_from_to_headers();
118
  $this->subject = apply_filters("pmpro_email_subject", $temail->subject, $this);
119
  $this->template = apply_filters("pmpro_email_template", $temail->template, $this);
120
  $this->body = apply_filters("pmpro_email_body", $temail->body, $this);
131
  }
132
  }
133
 
134
+ /**
135
+ * Add the From Name and Email to the headers.
136
+ * @since 2.1
137
+ */
138
+ function add_from_to_headers() {
139
+ // Make sure we have a headers array
140
+ if ( empty( $this->headers ) ) {
141
+ $this->headers = array();
142
+ } elseif ( ! is_array( $this->headers ) ) {
143
+ $this->headers = array( $this->headers );
144
+ }
145
+
146
+ // Remove any previous from header
147
+ foreach( $this->headers as $key => $header ) {
148
+ if( strtolower( substr( $header, 0, 5 ) ) == 'from:' ) {
149
+ unset( $this->headers[$key] );
150
+ }
151
+ }
152
+
153
+ // Add From Email and Name or Just Email
154
+ if( !empty( $this->from ) && !empty( $this->fromname ) ) {
155
+ $this->headers[] = 'From:' . $this->fromname . ' <' . $this->from . '>';
156
+ } elseif( !empty( $this->from ) ) {
157
+ $this->headers[] = 'From:' . $this->from;
158
+ }
159
+ }
160
+
161
  function sendCancelEmail($user = NULL, $old_level_id = NULL)
162
  {
163
  global $wpdb, $current_user;
981
 
982
  return $this->sendEmail();
983
  }
984
+
985
+ function sendPaymentActionRequiredEmail($user = NULL, $order = NULL, $invoice_url = NULL)
986
+ {
987
+ global $wpdb, $current_user;
988
+ if(!$user)
989
+ $user = $current_user;
990
+
991
+ if(!$user || !$order)
992
+ return false;
993
+
994
+ // if an invoice URL wasn't passed in, grab it from the order
995
+ if(empty($invoice_url) && isset($order->invoice_url))
996
+ $invoice_url = $order->invoice_url;
997
+
998
+ // still no invoice URL? bail
999
+ if(empty($invoice_url))
1000
+ return false;
1001
+
1002
+ $this->email = $user->user_email;
1003
+ $this->subject = sprintf(__("Payment action required for your %s membership", 'paid-memberships-pro' ), get_option("blogname"));
1004
+
1005
+ $this->template = "payment_action";
1006
+
1007
+ $this->template = apply_filters("pmpro_email_template", $this->template, $this);
1008
+
1009
+ $this->data = array(
1010
+ "subject" => $this->subject,
1011
+ "name" => $user->display_name,
1012
+ "display_name" => $user->display_name,
1013
+ "user_login" => $user->user_login,
1014
+ "sitename" => get_option("blogname"),
1015
+ "siteemail" => pmpro_getOption("from_email"),
1016
+ "invoice_url" => $invoice_url,
1017
+ );
1018
+
1019
+ return $this->sendEmail();
1020
+ }
1021
+
1022
+ function sendPaymentActionRequiredAdminEmail($user = NULL, $order = NULL, $invoice_url = NULL)
1023
+ {
1024
+ global $wpdb, $current_user;
1025
+ if(!$user)
1026
+ $user = $current_user;
1027
+
1028
+ if(!$user || !$order)
1029
+ return false;
1030
+
1031
+ // if an invoice URL wasn't passed in, grab it from the order
1032
+ if(empty($invoice_url) && isset($order->invoice_url))
1033
+ $invoice_url = $order->invoice_url;
1034
+
1035
+ // still no invoice URL? bail
1036
+ if(empty($invoice_url))
1037
+ return false;
1038
+
1039
+ $this->email = get_bloginfo("admin_email");
1040
+ $this->subject = sprintf(__("Payment action required: membership for %s at %s", 'paid-memberships-pro' ), $user->user_login, get_option("blogname"));
1041
+
1042
+ $this->template = "payment_action_admin";
1043
+
1044
+ $this->template = apply_filters("pmpro_email_template", $this->template, $this);
1045
+
1046
+ $this->data = array(
1047
+ "subject" => $this->subject,
1048
+ "name" => $user->display_name,
1049
+ "display_name" => $user->display_name,
1050
+ "user_login" => $user->user_login,
1051
+ "sitename" => get_option("blogname"),
1052
+ "siteemail" => pmpro_getOption("from_email"),
1053
+ "user_email" => $user->user_email,
1054
+ "invoice_url" => $invoice_url,
1055
+ );
1056
+
1057
+ return $this->sendEmail();
1058
+ }
1059
+
1060
 
1061
  /**
1062
  * Load the text for each default email template.
classes/gateways/class.pmprogateway_authorizenet.php CHANGED
@@ -58,7 +58,7 @@
58
  'use_ssl',
59
  'tax_state',
60
  'tax_rate',
61
- 'accepted_credit_cards'
62
  );
63
 
64
  return $options;
58
  'use_ssl',
59
  'tax_state',
60
  'tax_rate',
61
+ 'accepted_credit_cards',
62
  );
63
 
64
  return $options;
classes/gateways/class.pmprogateway_braintree.php CHANGED
@@ -200,7 +200,9 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
200
  */
201
  static function checkLevelForPlan($level_id) {
202
  $Gateway = new PMProGateway_braintree();
203
- $plan = $Gateway->getPlanByID('pmpro_' . $level_id);
 
 
204
  if(!empty($plan))
205
  return true;
206
  else
@@ -226,7 +228,8 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
226
  $current_gateway = pmpro_getGateway();
227
  if( ( $default_gateway == "braintree" || $current_gateway == "braintree" && empty($_REQUEST['review']))) //$_REQUEST['review'] means the PayPal Express review page
228
  {
229
- add_action( 'pmpro_save_membership_level', array( 'PMProGateway_braintree', 'pmpro_save_level_action') );
 
230
  add_action('pmpro_checkout_before_submit_button', array('PMProGateway_braintree', 'pmpro_checkout_before_submit_button'));
231
  add_action('pmpro_billing_before_submit_button', array('PMProGateway_braintree', 'pmpro_checkout_before_submit_button'));
232
  add_filter('pmpro_checkout_order', array('PMProGateway_braintree', 'pmpro_checkout_order'));
@@ -268,7 +271,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
268
  'use_ssl',
269
  'tax_state',
270
  'tax_rate',
271
- 'accepted_credit_cards'
272
  );
273
 
274
  return $options;
@@ -351,6 +354,29 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
351
  </tr>
352
  <?php
353
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
354
 
355
  /**
356
  * Filtering orders at checkout.
@@ -403,39 +429,6 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
403
  ?>
404
  <input type='hidden' data-encrypted-name='expiration_date' id='credit_card_exp' />
405
  <input type='hidden' name='AccountNumber' id='BraintreeAccountNumber' />
406
- <script type="text/javascript" src="https://js.braintreegateway.com/v1/braintree.js"></script>
407
- <script type="text/javascript">
408
- <!--
409
- /**
410
- * @since 1.9.5 - BUG FIX: substr() on undefined error
411
- */
412
- jQuery(document).ready(function() {
413
- //set up braintree encryption
414
- var braintree = Braintree.create('<?php echo pmpro_getOption("braintree_encryptionkey"); ?>');
415
- braintree.onSubmitEncryptForm('pmpro_form');
416
-
417
- //pass expiration dates in original format
418
- function pmpro_updateBraintreeCardExp()
419
- {
420
- jQuery('#credit_card_exp').val(jQuery('#ExpirationMonth').val() + "/" + jQuery('#ExpirationYear').val());
421
- }
422
- jQuery('#ExpirationMonth, #ExpirationYear').change(function() {
423
- pmpro_updateBraintreeCardExp();
424
- });
425
- pmpro_updateBraintreeCardExp();
426
-
427
- //pass last 4 of credit card
428
- function pmpro_updateBraintreeAccountNumber()
429
- {
430
- jQuery('#BraintreeAccountNumber').val('XXXXXXXXXXXXX' + jQuery('#AccountNumber').val().substr(jQuery('#AccountNumber').val().length - 4));
431
- }
432
- jQuery('#AccountNumber').change(function() {
433
- pmpro_updateBraintreeAccountNumber();
434
- });
435
- pmpro_updateBraintreeAccountNumber();
436
- });
437
- -->
438
- </script>
439
  <?php
440
  }
441
 
@@ -917,9 +910,10 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
917
  //subscribe to the plan
918
  try
919
  {
 
920
  $details = array(
921
  'paymentMethodToken' => $this->customer->creditCards[0]->token,
922
- 'planId' => 'pmpro_' . $order->membership_id,
923
  'price' => $amount
924
  );
925
 
@@ -1058,4 +1052,23 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
1058
  update_user_meta($user_id, 'pmpro_braintree_customerid', $pmpro_braintree_customerid);
1059
  }
1060
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1061
  }
 
200
  */
201
  static function checkLevelForPlan($level_id) {
202
  $Gateway = new PMProGateway_braintree();
203
+
204
+ $plan = $Gateway->getPlanByID( $Gateway->get_plan_id( $level_id ) );
205
+
206
  if(!empty($plan))
207
  return true;
208
  else
228
  $current_gateway = pmpro_getGateway();
229
  if( ( $default_gateway == "braintree" || $current_gateway == "braintree" && empty($_REQUEST['review']))) //$_REQUEST['review'] means the PayPal Express review page
230
  {
231
+ add_action('pmpro_checkout_preheader', array('PMProGateway_braintree', 'pmpro_checkout_preheader'));
232
+ add_action( 'pmpro_save_membership_level', array( 'PMProGateway_braintree', 'pmpro_save_level_action') );
233
  add_action('pmpro_checkout_before_submit_button', array('PMProGateway_braintree', 'pmpro_checkout_before_submit_button'));
234
  add_action('pmpro_billing_before_submit_button', array('PMProGateway_braintree', 'pmpro_checkout_before_submit_button'));
235
  add_filter('pmpro_checkout_order', array('PMProGateway_braintree', 'pmpro_checkout_order'));
271
  'use_ssl',
272
  'tax_state',
273
  'tax_rate',
274
+ 'accepted_credit_cards',
275
  );
276
 
277
  return $options;
354
  </tr>
355
  <?php
356
  }
357
+
358
+ /**
359
+ * Code added to checkout preheader.
360
+ *
361
+ * @since 2.1
362
+ */
363
+ static function pmpro_checkout_preheader() {
364
+ global $gateway, $pmpro_level;
365
+
366
+ $default_gateway = pmpro_getOption("gateway");
367
+
368
+ if(($gateway == "braintree" || $default_gateway == "braintree") && !pmpro_isLevelFree($pmpro_level)) {
369
+ wp_enqueue_script("stripe", "https://js.braintreegateway.com/v1/braintree.js", array(), NULL);
370
+ wp_register_script( 'pmpro_braintree',
371
+ plugins_url( 'js/pmpro-braintree.js', PMPRO_BASE_FILE ),
372
+ array( 'jquery' ),
373
+ PMPRO_VERSION );
374
+ wp_localize_script( 'pmpro_braintree', 'pmpro_braintree', array(
375
+ 'encryptionkey' => pmpro_getOption( 'braintree_encryptionkey' )
376
+ ));
377
+ wp_enqueue_script( 'pmpro_braintree' );
378
+ }
379
+ }
380
 
381
  /**
382
  * Filtering orders at checkout.
429
  ?>
430
  <input type='hidden' data-encrypted-name='expiration_date' id='credit_card_exp' />
431
  <input type='hidden' name='AccountNumber' id='BraintreeAccountNumber' />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  <?php
433
  }
434
 
910
  //subscribe to the plan
911
  try
912
  {
913
+
914
  $details = array(
915
  'paymentMethodToken' => $this->customer->creditCards[0]->token,
916
+ 'planId' => $this->get_plan_id( $order->membership_id ),
917
  'price' => $amount
918
  );
919
 
1052
  update_user_meta($user_id, 'pmpro_braintree_customerid', $pmpro_braintree_customerid);
1053
  }
1054
  }
1055
+
1056
+ /**
1057
+ * Gets the Braintree plan ID for a given level ID
1058
+ * @param int $level_id level to get plan ID for
1059
+ * @return string Braintree plan ID
1060
+ */
1061
+ static function get_plan_id( $level_id ) {
1062
+ /**
1063
+ * Filter pmpro_braintree_plan_id
1064
+ *
1065
+ * Used to change the Braintree plan ID for a given level
1066
+ *
1067
+ * @since 2.1.0
1068
+ *
1069
+ * @param string $plan_id for the given level
1070
+ * @param int $level_id the level id to make a plan id for
1071
+ */
1072
+ return apply_filters( 'pmpro_braintree_plan_id', 'pmpro_' . $level_id, $level_id );
1073
  }
1074
+ }
classes/gateways/class.pmprogateway_cybersource.php CHANGED
@@ -1,21 +1,17 @@
1
  <?php
2
  //include pmprogateway
3
  require_once(dirname(__FILE__) . "/class.pmprogateway.php");
4
-
5
  //load classes init method
6
  add_action('init', array('PMProGateway_cybersource', 'init'));
7
-
8
  class PMProGateway_cybersource extends PMProGateway
9
  {
10
  function __construct($gateway = NULL)
11
  {
12
  if(!class_exists("CyberSourceSoapClient"))
13
  require_once(dirname(__FILE__) . "/../../includes/lib/CyberSource/cyber_source_soap_client.php");
14
-
15
  $this->gateway = $gateway;
16
  return $this->gateway;
17
  }
18
-
19
  /**
20
  * Run on WP init
21
  *
@@ -25,12 +21,10 @@
25
  {
26
  //make sure CyberSource is a gateway option
27
  add_filter('pmpro_gateways', array('PMProGateway_cybersource', 'pmpro_gateways'));
28
-
29
  //add fields to payment settings
30
  add_filter('pmpro_payment_options', array('PMProGateway_cybersource', 'pmpro_payment_options'));
31
  add_filter('pmpro_payment_option_fields', array('PMProGateway_cybersource', 'pmpro_payment_option_fields'), 10, 2);
32
  }
33
-
34
  /**
35
  * Make sure this gateway is in the gateways list
36
  *
@@ -40,10 +34,8 @@
40
  {
41
  if(empty($gateways['cybersource']))
42
  $gateways['cybersource'] = __('CyberSource', 'paid-memberships-pro' );
43
-
44
  return $gateways;
45
  }
46
-
47
  /**
48
  * Get a list of payment options that the this gateway needs/supports.
49
  *
@@ -61,12 +53,10 @@
61
  'use_ssl',
62
  'tax_state',
63
  'tax_rate',
64
- 'accepted_credit_cards'
65
  );
66
-
67
  return $options;
68
  }
69
-
70
  /**
71
  * Set payment options for payment settings page.
72
  *
@@ -76,13 +66,10 @@
76
  {
77
  //get stripe options
78
  $cybersource_options = PMProGateway_cybersource::getGatewayOptions();
79
-
80
  //merge with others.
81
  $options = array_merge($cybersource_options, $options);
82
-
83
  return $options;
84
  }
85
-
86
  /**
87
  * Display fields for this gateway's options.
88
  *
@@ -119,7 +106,6 @@
119
  </tr>
120
  <?php
121
  }
122
-
123
  /**
124
  * Process checkout.
125
  *
@@ -141,7 +127,6 @@
141
  $order->TrialBillingFrequency = $order->BillingFrequency;
142
  $order->TrialBillingCycles = 1;
143
  $order->TrialAmount = 0;
144
-
145
  //add a billing cycle to make up for the trial, if applicable
146
  if(!empty($order->TotalBillingCycles))
147
  $order->TotalBillingCycles++;
@@ -151,7 +136,6 @@
151
  //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
152
  $order->ProfileStartDate = date_i18n("Y-m-d") . "T0:0:0";
153
  $order->TrialBillingCycles++;
154
-
155
  //add a billing cycle to make up for the trial, if applicable
156
  if($order->TotalBillingCycles)
157
  $order->TotalBillingCycles++;
@@ -161,7 +145,6 @@
161
  //add a period to the start date to account for the initial payment
162
  $order->ProfileStartDate = date_i18n("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
163
  }
164
-
165
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
166
  return $this->subscribe($order);
167
  }
@@ -188,7 +171,6 @@
188
  $order->TrialBillingFrequency = $order->BillingFrequency;
189
  $order->TrialBillingCycles = 1;
190
  $order->TrialAmount = 0;
191
-
192
  //add a billing cycle to make up for the trial, if applicable
193
  if(!empty($order->TotalBillingCycles))
194
  $order->TotalBillingCycles++;
@@ -198,7 +180,6 @@
198
  //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
199
  $order->ProfileStartDate = date_i18n("Y-m-d") . "T0:0:0";
200
  $order->TrialBillingCycles++;
201
-
202
  //add a billing cycle to make up for the trial, if applicable
203
  if(!empty($order->TotalBillingCycles))
204
  $order->TotalBillingCycles++;
@@ -208,7 +189,6 @@
208
  //add a period to the start date to account for the initial payment
209
  $order->ProfileStartDate = date_i18n("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
210
  }
211
-
212
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
213
  if($this->subscribe($order))
214
  {
@@ -225,10 +205,8 @@
225
  {
226
  if(!$order->error)
227
  $order->error = __("Unknown error: Payment failed.", 'paid-memberships-pro' );
228
-
229
  $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", 'paid-memberships-pro' );
230
  }
231
-
232
  return false;
233
  }
234
  }
@@ -243,12 +221,10 @@
243
  {
244
  if(empty($order->error))
245
  $order->error = __("Unknown error: Payment failed.", 'paid-memberships-pro' );
246
-
247
  return false;
248
  }
249
  }
250
  }
251
-
252
  function getCardType($name)
253
  {
254
  $card_types = array(
@@ -263,13 +239,11 @@
263
  'Carte Blanche' => '006',
264
  'JCB' => '007'
265
  );
266
-
267
  if(isset($card_types[$name]))
268
  return $card_types[$name];
269
  else
270
  return false;
271
  }
272
-
273
  function getWSDL($order)
274
  {
275
  //which gateway environment?
@@ -277,61 +251,45 @@
277
  $gateway_environment = pmpro_getOption("gateway_environment");
278
  else
279
  $gateway_environment = $order->gateway_environment;
280
-
281
  //which host?
282
  if($gateway_environment == "live")
283
  $host = "ics2ws.ic3.com";
284
  else
285
  $host = "ics2wstest.ic3.com";
286
-
287
  //path
288
- $path = "/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.90.wsdl";
289
-
290
  //build url
291
  $wsdl_url = "https://" . $host . $path;
292
-
293
  //filter
294
  $wsdl_url = apply_filters("pmpro_cybersource_wsdl_url", $wsdl_url, $gateway_environment);
295
-
296
  return $wsdl_url;
297
  }
298
-
299
  function authorize(&$order)
300
  {
301
  global $pmpro_currency;
302
-
303
  if(empty($order->code))
304
  $order->code = $order->getRandomCode();
305
-
306
  $wsdl_url = $this->getWSDL($order);
307
-
308
  //what amount to authorize? just $1 to test
309
  $amount = "1.00";
310
-
311
  //combine address
312
  $address = $order->Address1;
313
  if(!empty($order->Address2))
314
  $address .= "\n" . $order->Address2;
315
-
316
  //customer stuff
317
  $customer_email = $order->Email;
318
  $customer_phone = $order->billing->phone;
319
-
320
  if(!isset($order->membership_level->name))
321
  $order->membership_level->name = "";
322
-
323
  //to store our request
324
  $request = new stdClass();
325
-
326
  //which service?
327
  $ccAuthService = new stdClass();
328
  $ccAuthService->run = "true";
329
  $request->ccAuthService = $ccAuthService;
330
-
331
  //merchant id and order code
332
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
333
  $request->merchantReferenceCode = $order->code;
334
-
335
  //bill to
336
  $billTo = new stdClass();
337
  $billTo->firstName = $order->FirstName;
@@ -344,7 +302,6 @@
344
  $billTo->email = $order->Email;
345
  $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
346
  $request->billTo = $billTo;
347
-
348
  //card
349
  $card = new stdClass();
350
  $card->cardType = $this->getCardType($order->cardtype);
@@ -354,6 +311,13 @@
354
  $card->cvNumber = $order->CVV2;
355
  $request->card = $card;
356
 
 
 
 
 
 
 
 
357
  //currency
358
  $purchaseTotals = new stdClass();
359
  $purchaseTotals->currency = $pmpro_currency;
@@ -368,8 +332,24 @@
368
  $item0->id = $order->membership_id;
369
  $request->item = array($item0);
370
 
371
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
372
- $reply = $soapClient->runTransaction($request);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
 
374
  if($reply->reasonCode == "100")
375
  {
@@ -382,36 +362,46 @@
382
  {
383
  //error
384
  $order->errorcode = $reply->reasonCode;
385
- $order->error = $this->getErrorFromCode($reply->reasonCode);
386
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
387
  return false;
388
  }
389
  }
390
-
391
  function void(&$order)
392
  {
393
  //need a transaction id
394
  if(empty($order->payment_transaction_id))
395
  return false;
396
-
397
  //get wsdl
398
  $wsdl_url = $this->getWSDL($order);
399
-
400
  //to store our request
401
  $request = new stdClass();
402
-
403
  //which service?
404
  $voidService = new stdClass();
405
  $voidService->run = "true";
406
  $voidService->voidRequestID = $order->payment_transaction_id;
407
  $request->voidService = $voidService;
408
-
409
  //merchant id and order code
410
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
411
  $request->merchantReferenceCode = $order->code;
412
 
413
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
414
- $reply = $soapClient->runTransaction($request);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
415
 
416
  if($reply->reasonCode == "100")
417
  {
@@ -424,59 +414,46 @@
424
  {
425
  //error
426
  $order->errorcode = $reply->reasonCode;
427
- $order->error = $this->getErrorFromCode($reply->reasonCode);
428
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
429
  return false;
430
  }
431
  }
432
-
433
  function charge(&$order)
434
  {
435
  global $pmpro_currency;
436
-
437
  //get a code
438
  if(empty($order->code))
439
  $order->code = $order->getRandomCode();
440
-
441
  //get wsdl
442
  $wsdl_url = $this->getWSDL($order);
443
-
444
  //what amount to charge?
445
  $amount = $order->InitialPayment;
446
-
447
  //tax
448
  $order->subtotal = $amount;
449
  $tax = $order->getTax(true);
450
  $amount = pmpro_round_price((float)$order->subtotal + (float)$tax);
451
-
452
  //combine address
453
  $address = $order->Address1;
454
  if(!empty($order->Address2))
455
  $address .= "\n" . $order->Address2;
456
-
457
  //customer stuff
458
  $customer_email = $order->Email;
459
  $customer_phone = $order->billing->phone;
460
-
461
  if(!isset($order->membership_level->name))
462
  $order->membership_level->name = "";
463
-
464
  //to store our request
465
  $request = new stdClass();
466
-
467
  //authorize and capture
468
  $ccAuthService = new stdClass();
469
  $ccAuthService->run = "true";
470
  $request->ccAuthService = $ccAuthService;
471
-
472
  $ccCaptureService = new stdClass();
473
  $ccCaptureService->run = "true";
474
  $request->ccCaptureService = $ccCaptureService;
475
-
476
  //merchant id and order code
477
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
478
  $request->merchantReferenceCode = $order->code;
479
-
480
  //bill to
481
  $billTo = new stdClass();
482
  $billTo->firstName = $order->FirstName;
@@ -489,7 +466,6 @@
489
  $billTo->email = $order->Email;
490
  $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
491
  $request->billTo = $billTo;
492
-
493
  //card
494
  $card = new stdClass();
495
  $card->cardType = $this->getCardType($order->cardtype);
@@ -499,11 +475,17 @@
499
  $card->cvNumber = $order->CVV2;
500
  $request->card = $card;
501
 
 
 
 
 
 
 
 
502
  //currency
503
  $purchaseTotals = new stdClass();
504
  $purchaseTotals->currency = $pmpro_currency;
505
  $request->purchaseTotals = $purchaseTotals;
506
-
507
  //item/price
508
  $item0 = new stdClass();
509
  $item0->unitPrice = $amount;
@@ -513,8 +495,23 @@
513
  $item0->id = $order->membership_id;
514
  $request->item = array($item0);
515
 
516
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
517
- $reply = $soapClient->runTransaction($request);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
518
 
519
  if($reply->reasonCode == "100")
520
  {
@@ -527,39 +524,31 @@
527
  {
528
  //error
529
  $order->errorcode = $reply->reasonCode;
530
- $order->error = $this->getErrorFromCode($reply->reasonCode);
531
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
532
  return false;
533
  }
534
  }
535
-
536
  function subscribe(&$order)
537
  {
538
  global $pmpro_currency;
539
-
540
  //create a code for the order
541
  if(empty($order->code))
542
  $order->code = $order->getRandomCode();
543
-
544
  //filter order before subscription. use with care.
545
  $order = apply_filters("pmpro_subscribe_order", $order, $this);
546
-
547
  //get wsdl
548
  $wsdl_url = $this->getWSDL($order);
549
-
550
  //to store our request
551
  $request = new stdClass();
552
-
553
  //set service type
554
  $paySubscriptionCreateService = new stdClass();
555
  $paySubscriptionCreateService->run = 'true';
556
  $paySubscriptionCreateService->disableAutoAuth = 'true'; //we do our own auth check
557
  $request->paySubscriptionCreateService = $paySubscriptionCreateService;
558
-
559
  //merchant id and order code
560
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
561
  $request->merchantReferenceCode = $order->code;
562
-
563
  /*
564
  set up billing amount/etc
565
  */
@@ -567,7 +556,6 @@
567
  $amount = $order->PaymentAmount;
568
  $amount_tax = $order->getTaxForPrice($amount);
569
  $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
570
-
571
  /*
572
  There are two parts to the trial. Part 1 is simply the delay until the first payment
573
  since we are doing the first payment as a separate transaction.
@@ -582,16 +570,12 @@
582
  $trial_period_days = $order->BillingFrequency * 7; //weekly
583
  else
584
  $trial_period_days = $order->BillingFrequency * 30; //assume monthly
585
-
586
  //convert to a profile start date
587
  $order->ProfileStartDate = date_i18n("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
588
-
589
  //filter the start date
590
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
591
-
592
  //convert back to days
593
  $trial_period_days = ceil(abs(strtotime(date_i18n("Y-m-d"), current_time('timestamp')) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
594
-
595
  //now add the actual trial set by the site
596
  if(!empty($order->TrialBillingCycles))
597
  {
@@ -605,10 +589,8 @@
605
  else
606
  $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
607
  }
608
-
609
  //convert back into a date
610
  $profile_start_date = date_i18n("Ymd", strtotime("+ " . $trial_period_days . " Days"));
611
-
612
  //figure out the frequency
613
  if($order->BillingPeriod == "Year")
614
  {
@@ -641,7 +623,7 @@
641
  elseif($order->BillingFrequency == 183)
642
  $frequency = "semi annually";
643
  elseif($order->BillingFrequency == 90)
644
- $frequency = "quaterly";
645
  elseif($order->BillingFrequency == 30)
646
  $frequency = "monthly";
647
  elseif($order->BillingFrequency == 15)
@@ -653,13 +635,11 @@
653
  elseif($order->BillingFrequency == 7)
654
  $frequency = "weekly";
655
  }
656
-
657
  //set subscription info for API
658
  $subscription = new stdClass();
659
  $subscription->title = $order->membership_level->name;
660
  $subscription->paymentMethod = "credit card";
661
  $request->subscription = $subscription;
662
-
663
  //recurring info
664
  $recurringSubscriptionInfo = new stdClass();
665
  $recurringSubscriptionInfo->amount = number_format($amount, 2);
@@ -668,12 +648,10 @@
668
  if(!empty($order->TotalBillingCycles))
669
  $recurringSubscriptionInfo->numberOfPayments = $order->TotalBillingCycles;
670
  $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
671
-
672
  //combine address
673
  $address = $order->Address1;
674
  if(!empty($order->Address2))
675
  $address .= "\n" . $order->Address2;
676
-
677
  //bill to
678
  $billTo = new stdClass();
679
  $billTo->firstName = $order->FirstName;
@@ -686,7 +664,6 @@
686
  $billTo->email = $order->Email;
687
  $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
688
  $request->billTo = $billTo;
689
-
690
  //card
691
  $card = new stdClass();
692
  $card->cardType = $this->getCardType($order->cardtype);
@@ -696,13 +673,35 @@
696
  $card->cvNumber = $order->CVV2;
697
  $request->card = $card;
698
 
 
 
 
 
 
 
 
699
  //currency
700
  $purchaseTotals = new stdClass();
701
  $purchaseTotals->currency = $pmpro_currency;
702
  $request->purchaseTotals = $purchaseTotals;
703
 
704
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
705
- $reply = $soapClient->runTransaction($request);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
706
 
707
  if($reply->reasonCode == "100")
708
  {
@@ -716,39 +715,32 @@
716
  //error
717
  $order->status = "error";
718
  $order->errorcode = $reply->reasonCode;
719
- $order->error = $this->getErrorFromCode($reply->reasonCode);
720
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
721
  return false;
722
  }
723
  }
724
-
725
  function update(&$order)
726
  {
727
  //get wsdl
728
  $wsdl_url = $this->getWSDL($order);
729
-
730
  //to store our request
731
  $request = new stdClass();
732
-
733
  //set service type
734
  $paySubscriptionUpdateService = new stdClass();
735
  $paySubscriptionUpdateService ->run = "true";
736
  $request->paySubscriptionUpdateService = $paySubscriptionUpdateService ;
737
-
738
  //merchant id and order code
739
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
740
  $request->merchantReferenceCode = $order->code;
741
-
742
  //set subscription info for API
743
  $recurringSubscriptionInfo = new stdClass();
744
  $recurringSubscriptionInfo->subscriptionID = $order->subscription_transaction_id;
745
  $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
746
-
747
  //combine address
748
  $address = $order->Address1;
749
  if(!empty($order->Address2))
750
  $address .= "\n" . $order->Address2;
751
-
752
  //bill to
753
  $billTo = new stdClass();
754
  $billTo->firstName = $order->FirstName;
@@ -761,7 +753,6 @@
761
  $billTo->email = $order->Email;
762
  $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
763
  $request->billTo = $billTo;
764
-
765
  //card
766
  $card = new stdClass();
767
  $card->cardType = $this->getCardType($order->cardtype);
@@ -771,8 +762,30 @@
771
  $card->cvNumber = $order->CVV2;
772
  $request->card = $card;
773
 
774
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
775
- $reply = $soapClient->runTransaction($request);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
776
 
777
  if($reply->reasonCode == "100")
778
  {
@@ -783,8 +796,8 @@
783
  {
784
  //error
785
  $order->errorcode = $reply->reasonCode;
786
- $order->error = $this->getErrorFromCode($reply->reasonCode);
787
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
788
  return false;
789
  }
790
  }
@@ -794,29 +807,39 @@
794
  //require a subscription id
795
  if(empty($order->subscription_transaction_id))
796
  return false;
797
-
798
  //get wsdl
799
  $wsdl_url = $this->getWSDL($order);
800
-
801
  //to store our request
802
  $request = new stdClass();
803
-
804
  //which service?
805
  $paySubscriptionDeleteService = new stdClass();
806
  $paySubscriptionDeleteService ->run = "true";
807
  $request->paySubscriptionDeleteService = $paySubscriptionDeleteService ;
808
-
809
  //which order
810
  $recurringSubscriptionInfo = new stdClass();
811
  $recurringSubscriptionInfo->subscriptionID = $order->subscription_transaction_id;
812
  $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
813
-
814
  //merchant id and order code
815
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
816
  $request->merchantReferenceCode = $order->code;
817
 
818
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
819
- $reply = $soapClient->runTransaction($request);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
820
 
821
  if($reply->reasonCode == "100")
822
  {
@@ -828,58 +851,85 @@
828
  {
829
  //error
830
  $order->errorcode = $reply->reasonCode;
831
- $order->error = $this->getErrorFromCode($reply->reasonCode);
832
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
833
  return false;
834
  }
835
  }
836
 
837
- function getErrorFromCode($code)
838
  {
839
  $error_messages = array(
840
- "100" => "Successful transaction.",
841
- "101" => "The request is missing one or more required fields.",
842
- "102" => "One or more fields in the request contains invalid data. Check that your billing address is valid.",
843
- "104" => "Duplicate order detected.",
844
- "110" => "Only partial amount was approved.",
845
- "150" => "Error: General system failure.",
846
- "151" => "Error: The request was received but there was a server timeout.",
847
- "152" => "Error: The request was received, but a service did not finish running in time. ",
848
- "200" => "Address Verification Service (AVS) failure.",
849
- "201" => "Authorization failed.",
850
- "202" => "Expired card or invalid expiration date.",
851
- "203" => "The card was declined.",
852
- "204" => "Insufficient funds in the account.",
853
- "205" => "Stolen or lost card.",
854
- "207" => "Issuing bank unavailable.",
855
- "208" => "Inactive card or card not authorized for card-not-present transactions.",
856
- "209" => "American Express Card Identification Digits (CID) did not match.",
857
- "210" => "The card has reached the credit limit. ",
858
- "211" => "Invalid card verification number.",
859
- "221" => "The customer matched an entry on the processors negative file. ",
860
- "230" => "Card verification (CV) check failed.",
861
- "231" => "Invalid account number.",
862
- "232" => "The card type is not accepted by the payment processor.",
863
- "233" => "General decline by the processor.",
864
- "234" => "There is a problem with your CyberSource merchant configuration.",
865
- "235" => "The requested amount exceeds the originally authorized amount.",
866
- "236" => "Processor failure.",
867
- "237" => "The authorization has already been reversed.",
868
- "238" => "The authorization has already been captured.",
869
- "239" => "The requested transaction amount must match the previous transaction amount.",
870
- "240" => "The card type sent is invalid or does not correlate with the credit card number.",
871
- "241" => "The referenced request id is invalid for all follow-on transactions.",
872
- "242" => "The request ID is invalid.",
873
- "243" => "The transaction has already been settled or reversed.",
874
- "246" => "The capture or credit is not voidable because the capture or credit information has already been submitted to your processor. Or, you requested a void for a type of transaction that cannot be voided.",
875
- "247" => "You requested a credit for a capture that was previously voided.",
876
- "250" => "Error: The request was received, but there was a timeout at the payment processor.",
877
- "520" => "Smart Authorization failed."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
878
  );
879
 
880
- if(isset($error_messages[$code]))
881
- return $error_messages[$code];
882
  else
883
- return "Unknown error.";
 
 
 
 
 
 
 
 
 
 
 
 
884
  }
885
  }
1
  <?php
2
  //include pmprogateway
3
  require_once(dirname(__FILE__) . "/class.pmprogateway.php");
 
4
  //load classes init method
5
  add_action('init', array('PMProGateway_cybersource', 'init'));
 
6
  class PMProGateway_cybersource extends PMProGateway
7
  {
8
  function __construct($gateway = NULL)
9
  {
10
  if(!class_exists("CyberSourceSoapClient"))
11
  require_once(dirname(__FILE__) . "/../../includes/lib/CyberSource/cyber_source_soap_client.php");
 
12
  $this->gateway = $gateway;
13
  return $this->gateway;
14
  }
 
15
  /**
16
  * Run on WP init
17
  *
21
  {
22
  //make sure CyberSource is a gateway option
23
  add_filter('pmpro_gateways', array('PMProGateway_cybersource', 'pmpro_gateways'));
 
24
  //add fields to payment settings
25
  add_filter('pmpro_payment_options', array('PMProGateway_cybersource', 'pmpro_payment_options'));
26
  add_filter('pmpro_payment_option_fields', array('PMProGateway_cybersource', 'pmpro_payment_option_fields'), 10, 2);
27
  }
 
28
  /**
29
  * Make sure this gateway is in the gateways list
30
  *
34
  {
35
  if(empty($gateways['cybersource']))
36
  $gateways['cybersource'] = __('CyberSource', 'paid-memberships-pro' );
 
37
  return $gateways;
38
  }
 
39
  /**
40
  * Get a list of payment options that the this gateway needs/supports.
41
  *
53
  'use_ssl',
54
  'tax_state',
55
  'tax_rate',
56
+ 'accepted_credit_cards',
57
  );
 
58
  return $options;
59
  }
 
60
  /**
61
  * Set payment options for payment settings page.
62
  *
66
  {
67
  //get stripe options
68
  $cybersource_options = PMProGateway_cybersource::getGatewayOptions();
 
69
  //merge with others.
70
  $options = array_merge($cybersource_options, $options);
 
71
  return $options;
72
  }
 
73
  /**
74
  * Display fields for this gateway's options.
75
  *
106
  </tr>
107
  <?php
108
  }
 
109
  /**
110
  * Process checkout.
111
  *
127
  $order->TrialBillingFrequency = $order->BillingFrequency;
128
  $order->TrialBillingCycles = 1;
129
  $order->TrialAmount = 0;
 
130
  //add a billing cycle to make up for the trial, if applicable
131
  if(!empty($order->TotalBillingCycles))
132
  $order->TotalBillingCycles++;
136
  //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
137
  $order->ProfileStartDate = date_i18n("Y-m-d") . "T0:0:0";
138
  $order->TrialBillingCycles++;
 
139
  //add a billing cycle to make up for the trial, if applicable
140
  if($order->TotalBillingCycles)
141
  $order->TotalBillingCycles++;
145
  //add a period to the start date to account for the initial payment
146
  $order->ProfileStartDate = date_i18n("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
147
  }
 
148
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
149
  return $this->subscribe($order);
150
  }
171
  $order->TrialBillingFrequency = $order->BillingFrequency;
172
  $order->TrialBillingCycles = 1;
173
  $order->TrialAmount = 0;
 
174
  //add a billing cycle to make up for the trial, if applicable
175
  if(!empty($order->TotalBillingCycles))
176
  $order->TotalBillingCycles++;
180
  //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
181
  $order->ProfileStartDate = date_i18n("Y-m-d") . "T0:0:0";
182
  $order->TrialBillingCycles++;
 
183
  //add a billing cycle to make up for the trial, if applicable
184
  if(!empty($order->TotalBillingCycles))
185
  $order->TotalBillingCycles++;
189
  //add a period to the start date to account for the initial payment
190
  $order->ProfileStartDate = date_i18n("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
191
  }
 
192
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
193
  if($this->subscribe($order))
194
  {
205
  {
206
  if(!$order->error)
207
  $order->error = __("Unknown error: Payment failed.", 'paid-memberships-pro' );
 
208
  $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", 'paid-memberships-pro' );
209
  }
 
210
  return false;
211
  }
212
  }
221
  {
222
  if(empty($order->error))
223
  $order->error = __("Unknown error: Payment failed.", 'paid-memberships-pro' );
 
224
  return false;
225
  }
226
  }
227
  }
 
228
  function getCardType($name)
229
  {
230
  $card_types = array(
239
  'Carte Blanche' => '006',
240
  'JCB' => '007'
241
  );
 
242
  if(isset($card_types[$name]))
243
  return $card_types[$name];
244
  else
245
  return false;
246
  }
 
247
  function getWSDL($order)
248
  {
249
  //which gateway environment?
251
  $gateway_environment = pmpro_getOption("gateway_environment");
252
  else
253
  $gateway_environment = $order->gateway_environment;
 
254
  //which host?
255
  if($gateway_environment == "live")
256
  $host = "ics2ws.ic3.com";
257
  else
258
  $host = "ics2wstest.ic3.com";
 
259
  //path
260
+ $path = "/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.159.wsdl";
 
261
  //build url
262
  $wsdl_url = "https://" . $host . $path;
 
263
  //filter
264
  $wsdl_url = apply_filters("pmpro_cybersource_wsdl_url", $wsdl_url, $gateway_environment);
 
265
  return $wsdl_url;
266
  }
 
267
  function authorize(&$order)
268
  {
269
  global $pmpro_currency;
 
270
  if(empty($order->code))
271
  $order->code = $order->getRandomCode();
 
272
  $wsdl_url = $this->getWSDL($order);
 
273
  //what amount to authorize? just $1 to test
274
  $amount = "1.00";
 
275
  //combine address
276
  $address = $order->Address1;
277
  if(!empty($order->Address2))
278
  $address .= "\n" . $order->Address2;
 
279
  //customer stuff
280
  $customer_email = $order->Email;
281
  $customer_phone = $order->billing->phone;
 
282
  if(!isset($order->membership_level->name))
283
  $order->membership_level->name = "";
 
284
  //to store our request
285
  $request = new stdClass();
 
286
  //which service?
287
  $ccAuthService = new stdClass();
288
  $ccAuthService->run = "true";
289
  $request->ccAuthService = $ccAuthService;
 
290
  //merchant id and order code
291
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
292
  $request->merchantReferenceCode = $order->code;
 
293
  //bill to
294
  $billTo = new stdClass();
295
  $billTo->firstName = $order->FirstName;
302
  $billTo->email = $order->Email;
303
  $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
304
  $request->billTo = $billTo;
 
305
  //card
306
  $card = new stdClass();
307
  $card->cardType = $this->getCardType($order->cardtype);
311
  $card->cvNumber = $order->CVV2;
312
  $request->card = $card;
313
 
314
+ if( empty($request->card->cardType) )
315
+ {
316
+ $order->error = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro" );
317
+ $order->shorterror = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro" );
318
+ return false;
319
+ }
320
+
321
  //currency
322
  $purchaseTotals = new stdClass();
323
  $purchaseTotals->currency = $pmpro_currency;
332
  $item0->id = $order->membership_id;
333
  $request->item = array($item0);
334
 
335
+
336
+ try
337
+ {
338
+ $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>$request->merchantID, "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
339
+ $reply = $soapClient->runTransaction($request);
340
+ }
341
+ catch(Throwable $t)
342
+ {
343
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
344
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
345
+ return false;
346
+ }
347
+ catch(Exception $e)
348
+ {
349
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $e->getMessage() );
350
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
351
+ return false;
352
+ }
353
 
354
  if($reply->reasonCode == "100")
355
  {
362
  {
363
  //error
364
  $order->errorcode = $reply->reasonCode;
365
+ $order->error = $this->getErrorFromCode($reply);
366
+ $order->shorterror = $this->getErrorFromCode($reply);
367
  return false;
368
  }
369
  }
 
370
  function void(&$order)
371
  {
372
  //need a transaction id
373
  if(empty($order->payment_transaction_id))
374
  return false;
 
375
  //get wsdl
376
  $wsdl_url = $this->getWSDL($order);
 
377
  //to store our request
378
  $request = new stdClass();
 
379
  //which service?
380
  $voidService = new stdClass();
381
  $voidService->run = "true";
382
  $voidService->voidRequestID = $order->payment_transaction_id;
383
  $request->voidService = $voidService;
 
384
  //merchant id and order code
385
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
386
  $request->merchantReferenceCode = $order->code;
387
 
388
+ try
389
+ {
390
+ $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>$request->merchantID, "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
391
+ $reply = $soapClient->runTransaction($request);
392
+ }
393
+ catch(Throwable $t)
394
+ {
395
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
396
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
397
+ return false;
398
+ }
399
+ catch(Exception $e)
400
+ {
401
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $e->getMessage() );
402
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
403
+ return false;
404
+ }
405
 
406
  if($reply->reasonCode == "100")
407
  {
414
  {
415
  //error
416
  $order->errorcode = $reply->reasonCode;
417
+ $order->error = $this->getErrorFromCode($reply);
418
+ $order->shorterror = $this->getErrorFromCode($reply);
419
  return false;
420
  }
421
  }
 
422
  function charge(&$order)
423
  {
424
  global $pmpro_currency;
 
425
  //get a code
426
  if(empty($order->code))
427
  $order->code = $order->getRandomCode();
 
428
  //get wsdl
429
  $wsdl_url = $this->getWSDL($order);
 
430
  //what amount to charge?
431
  $amount = $order->InitialPayment;
 
432
  //tax
433
  $order->subtotal = $amount;
434
  $tax = $order->getTax(true);
435
  $amount = pmpro_round_price((float)$order->subtotal + (float)$tax);
 
436
  //combine address
437
  $address = $order->Address1;
438
  if(!empty($order->Address2))
439
  $address .= "\n" . $order->Address2;
 
440
  //customer stuff
441
  $customer_email = $order->Email;
442
  $customer_phone = $order->billing->phone;
 
443
  if(!isset($order->membership_level->name))
444
  $order->membership_level->name = "";
 
445
  //to store our request
446
  $request = new stdClass();
 
447
  //authorize and capture
448
  $ccAuthService = new stdClass();
449
  $ccAuthService->run = "true";
450
  $request->ccAuthService = $ccAuthService;
 
451
  $ccCaptureService = new stdClass();
452
  $ccCaptureService->run = "true";
453
  $request->ccCaptureService = $ccCaptureService;
 
454
  //merchant id and order code
455
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
456
  $request->merchantReferenceCode = $order->code;
 
457
  //bill to
458
  $billTo = new stdClass();
459
  $billTo->firstName = $order->FirstName;
466
  $billTo->email = $order->Email;
467
  $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
468
  $request->billTo = $billTo;
 
469
  //card
470
  $card = new stdClass();
471
  $card->cardType = $this->getCardType($order->cardtype);
475
  $card->cvNumber = $order->CVV2;
476
  $request->card = $card;
477
 
478
+ if( empty($request->card->cardType) )
479
+ {
480
+ $order->error = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro" );
481
+ $order->shorterror = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro" );
482
+ return false;
483
+ }
484
+
485
  //currency
486
  $purchaseTotals = new stdClass();
487
  $purchaseTotals->currency = $pmpro_currency;
488
  $request->purchaseTotals = $purchaseTotals;
 
489
  //item/price
490
  $item0 = new stdClass();
491
  $item0->unitPrice = $amount;
495
  $item0->id = $order->membership_id;
496
  $request->item = array($item0);
497
 
498
+ try
499
+ {
500
+ $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>$request->merchantID, "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
501
+ $reply = $soapClient->runTransaction($request);
502
+ }
503
+ catch(Throwable $t)
504
+ {
505
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
506
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
507
+ return false;
508
+ }
509
+ catch(Exception $e)
510
+ {
511
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $e->getMessage() );
512
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
513
+ return false;
514
+ }
515
 
516
  if($reply->reasonCode == "100")
517
  {
524
  {
525
  //error
526
  $order->errorcode = $reply->reasonCode;
527
+ $order->error = $this->getErrorFromCode($reply);
528
+ $order->shorterror = $this->getErrorFromCode($reply);
529
  return false;
530
  }
531
  }
 
532
  function subscribe(&$order)
533
  {
534
  global $pmpro_currency;
 
535
  //create a code for the order
536
  if(empty($order->code))
537
  $order->code = $order->getRandomCode();
 
538
  //filter order before subscription. use with care.
539
  $order = apply_filters("pmpro_subscribe_order", $order, $this);
 
540
  //get wsdl
541
  $wsdl_url = $this->getWSDL($order);
 
542
  //to store our request
543
  $request = new stdClass();
 
544
  //set service type
545
  $paySubscriptionCreateService = new stdClass();
546
  $paySubscriptionCreateService->run = 'true';
547
  $paySubscriptionCreateService->disableAutoAuth = 'true'; //we do our own auth check
548
  $request->paySubscriptionCreateService = $paySubscriptionCreateService;
 
549
  //merchant id and order code
550
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
551
  $request->merchantReferenceCode = $order->code;
 
552
  /*
553
  set up billing amount/etc
554
  */
556
  $amount = $order->PaymentAmount;
557
  $amount_tax = $order->getTaxForPrice($amount);
558
  $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
 
559
  /*
560
  There are two parts to the trial. Part 1 is simply the delay until the first payment
561
  since we are doing the first payment as a separate transaction.
570
  $trial_period_days = $order->BillingFrequency * 7; //weekly
571
  else
572
  $trial_period_days = $order->BillingFrequency * 30; //assume monthly
 
573
  //convert to a profile start date
574
  $order->ProfileStartDate = date_i18n("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
 
575
  //filter the start date
576
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
 
577
  //convert back to days
578
  $trial_period_days = ceil(abs(strtotime(date_i18n("Y-m-d"), current_time('timestamp')) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
 
579
  //now add the actual trial set by the site
580
  if(!empty($order->TrialBillingCycles))
581
  {
589
  else
590
  $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
591
  }
 
592
  //convert back into a date
593
  $profile_start_date = date_i18n("Ymd", strtotime("+ " . $trial_period_days . " Days"));
 
594
  //figure out the frequency
595
  if($order->BillingPeriod == "Year")
596
  {
623
  elseif($order->BillingFrequency == 183)
624
  $frequency = "semi annually";
625
  elseif($order->BillingFrequency == 90)
626
+ $frequency = "quarterly";
627
  elseif($order->BillingFrequency == 30)
628
  $frequency = "monthly";
629
  elseif($order->BillingFrequency == 15)
635
  elseif($order->BillingFrequency == 7)
636
  $frequency = "weekly";
637
  }
 
638
  //set subscription info for API
639
  $subscription = new stdClass();
640
  $subscription->title = $order->membership_level->name;
641
  $subscription->paymentMethod = "credit card";
642
  $request->subscription = $subscription;
 
643
  //recurring info
644
  $recurringSubscriptionInfo = new stdClass();
645
  $recurringSubscriptionInfo->amount = number_format($amount, 2);
648
  if(!empty($order->TotalBillingCycles))
649
  $recurringSubscriptionInfo->numberOfPayments = $order->TotalBillingCycles;
650
  $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
 
651
  //combine address
652
  $address = $order->Address1;
653
  if(!empty($order->Address2))
654
  $address .= "\n" . $order->Address2;
 
655
  //bill to
656
  $billTo = new stdClass();
657
  $billTo->firstName = $order->FirstName;
664
  $billTo->email = $order->Email;
665
  $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
666
  $request->billTo = $billTo;
 
667
  //card
668
  $card = new stdClass();
669
  $card->cardType = $this->getCardType($order->cardtype);
673
  $card->cvNumber = $order->CVV2;
674
  $request->card = $card;
675
 
676
+ if( empty($request->card->cardType) )
677
+ {
678
+ $order->error = __( "The payment gateway doesn't support this credit/debit card type.", "paid-memberships-pro" );
679
+ $order->updateStatus("error");
680
+ return false;
681
+ }
682
+
683
  //currency
684
  $purchaseTotals = new stdClass();
685
  $purchaseTotals->currency = $pmpro_currency;
686
  $request->purchaseTotals = $purchaseTotals;
687
 
688
+ try
689
+ {
690
+ $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>$request->merchantID, "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
691
+ $reply = $soapClient->runTransaction($request);
692
+ }
693
+ catch(Throwable $t)
694
+ {
695
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
696
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
697
+ return false;
698
+ }
699
+ catch(Exception $e)
700
+ {
701
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $e->getMessage() );
702
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
703
+ return false;
704
+ }
705
 
706
  if($reply->reasonCode == "100")
707
  {
715
  //error
716
  $order->status = "error";
717
  $order->errorcode = $reply->reasonCode;
718
+ $order->error = $this->getErrorFromCode($reply);
719
+ $order->shorterror = $this->getErrorFromCode($reply);
720
  return false;
721
  }
722
  }
 
723
  function update(&$order)
724
  {
725
  //get wsdl
726
  $wsdl_url = $this->getWSDL($order);
 
727
  //to store our request
728
  $request = new stdClass();
 
729
  //set service type
730
  $paySubscriptionUpdateService = new stdClass();
731
  $paySubscriptionUpdateService ->run = "true";
732
  $request->paySubscriptionUpdateService = $paySubscriptionUpdateService ;
 
733
  //merchant id and order code
734
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
735
  $request->merchantReferenceCode = $order->code;
 
736
  //set subscription info for API
737
  $recurringSubscriptionInfo = new stdClass();
738
  $recurringSubscriptionInfo->subscriptionID = $order->subscription_transaction_id;
739
  $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
 
740
  //combine address
741
  $address = $order->Address1;
742
  if(!empty($order->Address2))
743
  $address .= "\n" . $order->Address2;
 
744
  //bill to
745
  $billTo = new stdClass();
746
  $billTo->firstName = $order->FirstName;
753
  $billTo->email = $order->Email;
754
  $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
755
  $request->billTo = $billTo;
 
756
  //card
757
  $card = new stdClass();
758
  $card->cardType = $this->getCardType($order->cardtype);
762
  $card->cvNumber = $order->CVV2;
763
  $request->card = $card;
764
 
765
+ if( empty($request->card->cardType) )
766
+ {
767
+ $order->error = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro", "paid-memberships-pro" );
768
+ $order->shorterror = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro", "paid-memberships-pro" );
769
+ return false;
770
+ }
771
+
772
+ try
773
+ {
774
+ $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>$request->merchantID, "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
775
+ $reply = $soapClient->runTransaction($request);
776
+ }
777
+ catch(Throwable $t)
778
+ {
779
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
780
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
781
+ return false;
782
+ }
783
+ catch(Exception $e)
784
+ {
785
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $e->getMessage() );
786
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
787
+ return false;
788
+ }
789
 
790
  if($reply->reasonCode == "100")
791
  {
796
  {
797
  //error
798
  $order->errorcode = $reply->reasonCode;
799
+ $order->error = $this->getErrorFromCode($reply);
800
+ $order->shorterror = $this->getErrorFromCode($reply);
801
  return false;
802
  }
803
  }
807
  //require a subscription id
808
  if(empty($order->subscription_transaction_id))
809
  return false;
 
810
  //get wsdl
811
  $wsdl_url = $this->getWSDL($order);
 
812
  //to store our request
813
  $request = new stdClass();
 
814
  //which service?
815
  $paySubscriptionDeleteService = new stdClass();
816
  $paySubscriptionDeleteService ->run = "true";
817
  $request->paySubscriptionDeleteService = $paySubscriptionDeleteService ;
 
818
  //which order
819
  $recurringSubscriptionInfo = new stdClass();
820
  $recurringSubscriptionInfo->subscriptionID = $order->subscription_transaction_id;
821
  $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
 
822
  //merchant id and order code
823
  $request->merchantID = pmpro_getOption("cybersource_merchantid");
824
  $request->merchantReferenceCode = $order->code;
825
 
826
+ try
827
+ {
828
+ $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>$request->merchantID, "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
829
+ $reply = $soapClient->runTransaction($request);
830
+ }
831
+ catch(Throwable $t)
832
+ {
833
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
834
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
835
+ return false;
836
+ }
837
+ catch(Exception $e)
838
+ {
839
+ $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $e->getMessage() );
840
+ $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
841
+ return false;
842
+ }
843
 
844
  if($reply->reasonCode == "100")
845
  {
851
  {
852
  //error
853
  $order->errorcode = $reply->reasonCode;
854
+ $order->error = $this->getErrorFromCode($reply);
855
+ $order->shorterror = $this->getErrorFromCode($reply);
856
  return false;
857
  }
858
  }
859
 
860
+ function getErrorFromCode($reply)
861
  {
862
  $error_messages = array(
863
+ "100" => __( "Successful transaction.", "paid-memberships-pro" ),
864
+ "101" => __( "The request is missing one or more required fields.", "paid-memberships-pro" ),
865
+ "102" => __( "One or more fields in the request contains invalid data. Check that your billing address is valid.", "paid-memberships-pro" ),
866
+ "104" => __( "Duplicate order detected.", "paid-memberships-pro" ),
867
+ "110" => __( "Only partial amount was approved.", "paid-memberships-pro" ),
868
+ "150" => __( "Error: General system failure.", "paid-memberships-pro" ),
869
+ "151" => __( "Error: The request was received but there was a server timeout.", "paid-memberships-pro" ),
870
+ "152" => __( "Error: The request was received, but a service did not finish running in time. ", "paid-memberships-pro" ),
871
+ "200" => __( "Address Verification Service (AVS) failure.", "paid-memberships-pro" ),
872
+ "201" => __( "Authorization failed.", "paid-memberships-pro" ),
873
+ "202" => __( "Expired card or invalid expiration date.", "paid-memberships-pro" ),
874
+ "203" => __( "The card was declined.", "paid-memberships-pro" ),
875
+ "204" => __( "Insufficient funds in the account.", "paid-memberships-pro" ),
876
+ "205" => __( "Stolen or lost card.", "paid-memberships-pro" ),
877
+ "207" => __( "Issuing bank unavailable.", "paid-memberships-pro" ),
878
+ "208" => __( "Inactive card or card not authorized for card-not-present transactions.", "paid-memberships-pro" ),
879
+ "209" => __( "American Express Card Identification Digits (CID) did not match.", "paid-memberships-pro" ),
880
+ "210" => __( "The card has reached the credit limit. ", "paid-memberships-pro" ),
881
+ "211" => __( "Invalid card verification number.", "paid-memberships-pro" ),
882
+ "221" => __( "The customer matched an entry on the processors negative file. ", "paid-memberships-pro" ),
883
+ "230" => __( "Card verification (CV) check failed.", "paid-memberships-pro" ),
884
+ "231" => __( "Invalid account number.", "paid-memberships-pro" ),
885
+ "232" => __( "The card type is not accepted by the payment processor.", "paid-memberships-pro" ),
886
+ "233" => __( "General decline by the processor.", "paid-memberships-pro" ),
887
+ "234" => __( "There is a problem with your CyberSource merchant configuration.", "paid-memberships-pro" ),
888
+ "235" => __( "The requested amount exceeds the originally authorized amount.", "paid-memberships-pro" ),
889
+ "236" => __( "Processor failure.", "paid-memberships-pro" ),
890
+ "237" => __( "The authorization has already been reversed.", "paid-memberships-pro" ),
891
+ "238" => __( "The authorization has already been captured.", "paid-memberships-pro" ),
892
+ "239" => __( "The requested transaction amount must match the previous transaction amount.", "paid-memberships-pro" ),
893
+ "240" => __( "The card type sent is invalid or does not correlate with the credit card number.", "paid-memberships-pro" ),
894
+ "241" => __( "The referenced request id is invalid for all follow-on transactions.", "paid-memberships-pro" ),
895
+ "242" => __( "The request ID is invalid.", "paid-memberships-pro" ),
896
+ "243" => __( "The transaction has already been settled or reversed.", "paid-memberships-pro" ),
897
+ "246" => __( "The capture or credit is not voidable because the capture or credit information has already been submitted to your processor. Or, you requested a void for a type of transaction that cannot be voided.", "paid-memberships-pro" ),
898
+ "247" => __( "You requested a credit for a capture that was previously voided.", "paid-memberships-pro" ),
899
+ "250" => __( "Error: The request was received, but there was a timeout at the payment processor.", "paid-memberships-pro" ),
900
+ "254" => __( "Stand-alone credits are not allowed with this processor.", "paid-memberships-pro" ),
901
+ "450" => __( "Apartment number missing or not found. Check that your billing address is valid.", "paid-memberships-pro" ),
902
+ "451" => __( "Insufficient address information. Check that your billing address is valid.", "paid-memberships-pro" ),
903
+ "452" => __( "House/Box number not found on street. Check that your billing address is valid.", "paid-memberships-pro" ),
904
+ "453" => __( "Multiple address matches were found. Check that your billing address is valid.", "paid-memberships-pro" ),
905
+ "454" => __( "P.O. Box identifier not found or out of range.. Check that your billing address is valid.", "paid-memberships-pro" ),
906
+ "455" => __( "Route service identifier not found or out of range. Check that your billing address is valid.", "paid-memberships-pro" ),
907
+ "456" => __( "Street name not found in Postal code. Check that your billing address is valid.", "paid-memberships-pro" ),
908
+ "457" => __( "Postal code not found in database. Check that your billing address is valid.", "paid-memberships-pro" ),
909
+ "458" => __( "Unable to verify or correct address. Check that your billing address is valid.", "paid-memberships-pro" ),
910
+ "459" => __( "Multiple address matches were found (international). Check that your billing address is valid.", "paid-memberships-pro" ),
911
+ "460" => __( "Address match not found. Check that your billing address is valid.", "paid-memberships-pro" ),
912
+ "461" => __( "Unsupported character set. Verify the character set that you are using to process transactions.", "paid-memberships-pro" ),
913
+ "481" => __( "Order has been rejected by Decision Manager.", "paid-memberships-pro" ),
914
+ "520" => __( "Smart Authorization failed.", "paid-memberships-pro" ),
915
+ "700" => __( "Your order has been refused.", "paid-memberships-pro" ),
916
  );
917
 
918
+ if(isset($error_messages[$reply->reasonCode]))
919
+ $error = $error_messages[$reply->reasonCode];
920
  else
921
+ return __( "Unknown error.", "paid-memberships-pro" );
922
+
923
+ // list invalid fields from reply
924
+ if( isset($reply->invalidField) && !empty($reply->invalidField) )
925
+ {
926
+ $error .= __( " Invalid fields:", "paid-memberships-pro" );
927
+ $invalidFields = $reply->invalidField;
928
+ $invalidFields = str_replace("/", ",", $invalidFields);
929
+ $invalidFields = str_replace("c:", " ", $invalidFields);
930
+ $error .= $invalidFields;
931
+ }
932
+
933
+ return $error;
934
  }
935
  }
classes/gateways/class.pmprogateway_payflowpro.php CHANGED
@@ -60,7 +60,7 @@
60
  'use_ssl',
61
  'tax_state',
62
  'tax_rate',
63
- 'accepted_credit_cards'
64
  );
65
 
66
  return $options;
@@ -218,7 +218,7 @@
218
 
219
  $nvpStr .="&AMT=1.00";
220
  /* PayFlow Pro doesn't use IPN so this is a little confusing */
221
- // $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
222
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
223
 
224
  $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
@@ -313,7 +313,7 @@
313
  $nvpStr = "";
314
  $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCY=" . $pmpro_currency;
315
  /* PayFlow Pro doesn't use IPN so this is a little confusing */
316
- // $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
317
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
318
 
319
  $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
@@ -383,7 +383,7 @@
383
  $nvpStr = "&ACTION=A";
384
  $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCY=" . $pmpro_currency;
385
  /* PayFlow Pro doesn't use IPN so this is a little confusing */
386
- // $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
387
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
388
 
389
  $nvpStr .= "&PROFILENAME=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
@@ -489,7 +489,7 @@
489
  //paypal profile stuff
490
  $nvpStr = "&ORIGPROFILEID=" . $order->subscription_transaction_id . "&ACTION=M";
491
  /* PayFlow Pro doesn't use IPN so this is a little confusing */
492
- // $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
493
 
494
  $nvpStr .= "&PROFILENAME=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
495
 
60
  'use_ssl',
61
  'tax_state',
62
  'tax_rate',
63
+ 'accepted_credit_cards',
64
  );
65
 
66
  return $options;
218
 
219
  $nvpStr .="&AMT=1.00";
220
  /* PayFlow Pro doesn't use IPN so this is a little confusing */
221
+ // $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
222
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
223
 
224
  $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
313
  $nvpStr = "";
314
  $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCY=" . $pmpro_currency;
315
  /* PayFlow Pro doesn't use IPN so this is a little confusing */
316
+ // $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
317
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
318
 
319
  $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
383
  $nvpStr = "&ACTION=A";
384
  $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCY=" . $pmpro_currency;
385
  /* PayFlow Pro doesn't use IPN so this is a little confusing */
386
+ // $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
387
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
388
 
389
  $nvpStr .= "&PROFILENAME=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
489
  //paypal profile stuff
490
  $nvpStr = "&ORIGPROFILEID=" . $order->subscription_transaction_id . "&ACTION=M";
491
  /* PayFlow Pro doesn't use IPN so this is a little confusing */
492
+ // $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
493
 
494
  $nvpStr .= "&PROFILENAME=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
495
 
classes/gateways/class.pmprogateway_paypal.php CHANGED
@@ -41,8 +41,8 @@
41
  $gateway = pmpro_getGateway();
42
  if($gateway == "paypal")
43
  {
 
44
  add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypal', 'pmpro_checkout_default_submit_button'));
45
- add_action('pmpro_checkout_after_form', array('PMProGateway_paypal', 'pmpro_checkout_after_form'));
46
  add_action('http_api_curl', array('PMProGateway_paypal', 'http_api_curl'), 10, 3);
47
  }
48
  }
@@ -90,7 +90,13 @@
90
  'tax_state',
91
  'tax_rate',
92
  'accepted_credit_cards',
93
- 'paypalexpress_skip_confirmation'
 
 
 
 
 
 
94
  );
95
 
96
  return $options;
@@ -103,7 +109,7 @@
103
  */
104
  static function pmpro_payment_options($options)
105
  {
106
- //get stripe options
107
  $paypal_options = PMProGateway_paypal::getGatewayOptions();
108
 
109
  //merge with others.
@@ -178,12 +184,73 @@
178
  <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
179
  </th>
180
  <td>
181
- <p><?php _e('This URL is passed to PayPal for all new charges and subscriptions. You SHOULD NOT set this in your PayPal account settings.', 'paid-memberships-pro' );?><pre><?php echo admin_url("admin-ajax.php") . "?action=ipnhandler";?></pre></p>
182
  </td>
183
  </tr>
184
  <?php
185
  }
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  /**
188
  * Swap in our submit buttons.
189
  *
@@ -212,43 +279,6 @@
212
  return false;
213
  }
214
 
215
- /**
216
- * Scripts for checkout page.
217
- *
218
- * @since 1.8
219
- */
220
- static function pmpro_checkout_after_form()
221
- {
222
- ?>
223
- <script>
224
- <!--
225
- //choosing payment method
226
- jQuery('input[name=gateway]').click(function() {
227
- if(jQuery(this).val() == 'paypal')
228
- {
229
- jQuery('#pmpro_paypalexpress_checkout').hide();
230
- jQuery('#pmpro_billing_address_fields').show();
231
- jQuery('#pmpro_payment_information_fields').show();
232
- jQuery('#pmpro_submit_span').show();
233
- }
234
- else
235
- {
236
- jQuery('#pmpro_billing_address_fields').hide();
237
- jQuery('#pmpro_payment_information_fields').hide();
238
- jQuery('#pmpro_submit_span').hide();
239
- jQuery('#pmpro_paypalexpress_checkout').show();
240
- }
241
- });
242
-
243
- //select the radio button if the label is clicked on
244
- jQuery('a.pmpro_radio').click(function() {
245
- jQuery(this).prev().click();
246
- });
247
- -->
248
- </script>
249
- <?php
250
- }
251
-
252
  /**
253
  * Process checkout.
254
  *
@@ -326,7 +356,7 @@
326
  if(!empty($order->Token))
327
  $nvpStr .= "&TOKEN=" . $order->Token;
328
  $nvpStr .="&AMT=1.00&CURRENCYCODE=" . pmpro_getOption("currency");
329
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
330
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
331
 
332
  $nvpStr .= "&PAYMENTACTION=Authorization&IPADDRESS=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
@@ -344,10 +374,15 @@
344
  if(!empty($order->StartDate))
345
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
346
 
 
 
 
 
 
347
  //billing address, etc
348
  if(!empty($order->Address1))
349
  {
350
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
351
 
352
  if($order->Address2)
353
  $nvpStr .= "&STREET2=" . $order->Address2;
@@ -433,7 +468,7 @@
433
  if(!empty($order->Token))
434
  $nvpStr .= "&TOKEN=" . $order->Token;
435
  $nvpStr .="&AMT=" . $amount . "&ITEMAMT=" . $order->InitialPayment . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency;
436
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
437
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
438
 
439
  $nvpStr .= "&PAYMENTACTION=Sale&IPADDRESS=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
@@ -451,10 +486,15 @@
451
  if(!empty($order->StartDate))
452
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
453
 
 
 
 
 
 
454
  //billing address, etc
455
  if($order->Address1)
456
  {
457
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
458
 
459
  if($order->Address2)
460
  $nvpStr .= "&STREET2=" . $order->Address2;
@@ -500,7 +540,7 @@
500
  $nvpStr .="&AMT=" . $order->PaymentAmount . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
501
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
502
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
503
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
504
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
505
 
506
  //if billing cycles are defined
@@ -532,10 +572,15 @@
532
  if(!empty($order->StartDate))
533
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
534
 
 
 
 
 
 
535
  //billing address, etc
536
  if($order->Address1)
537
  {
538
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
539
 
540
  if($order->Address2)
541
  $nvpStr .= "&STREET2=" . $order->Address2;
@@ -583,16 +628,21 @@
583
  if($order->StartDate)
584
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
585
 
586
- //billing address, etc
587
- if($order->Address1)
588
- {
589
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
590
 
591
- if($order->Address2)
592
- $nvpStr .= "&STREET2=" . $order->Address2;
 
 
593
 
594
- $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&COUNTRYCODE=" . $order->billing->country . "&ZIP=" . $order->billing->zip;
595
- }
 
 
 
596
 
597
  $this->httpParsedResponseAr = $this->PPHttpPost('UpdateRecurringPaymentsProfile', $nvpStr);
598
 
41
  $gateway = pmpro_getGateway();
42
  if($gateway == "paypal")
43
  {
44
+ add_action('pmpro_checkout_preheader', array('PMProGateway_paypal', 'pmpro_checkout_preheader'));
45
  add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypal', 'pmpro_checkout_default_submit_button'));
 
46
  add_action('http_api_curl', array('PMProGateway_paypal', 'http_api_curl'), 10, 3);
47
  }
48
  }
90
  'tax_state',
91
  'tax_rate',
92
  'accepted_credit_cards',
93
+ 'paypalexpress_skip_confirmation',
94
+ ///'paypal_enable_3dsecure',
95
+ //'paypal_cardinal_apikey',
96
+ //'paypal_cardinal_apiidentifier',
97
+ //'paypal_cardinal_orgunitid',
98
+ //'paypal_cardinal_merchantid',
99
+ //'paypal_cardinal_processorid'
100
  );
101
 
102
  return $options;
109
  */
110
  static function pmpro_payment_options($options)
111
  {
112
+ //get options
113
  $paypal_options = PMProGateway_paypal::getGatewayOptions();
114
 
115
  //merge with others.
184
  <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
185
  </th>
186
  <td>
187
+ <p><?php _e('This URL is passed to PayPal for all new charges and subscriptions. You SHOULD NOT set this in your PayPal account settings.', 'paid-memberships-pro' );?><pre><?php echo add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') );?></pre></p>
188
  </td>
189
  </tr>
190
  <?php
191
  }
192
 
193
+ /**
194
+ * Code added to checkout preheader.
195
+ *
196
+ * @since 2.1
197
+ */
198
+ static function pmpro_checkout_preheader() {
199
+ global $gateway, $gateway_environment, $pmpro_level;
200
+ $default_gateway = pmpro_getOption("gateway");
201
+
202
+ if(($gateway == "paypal" || $default_gateway == "paypal") && !pmpro_isLevelFree($pmpro_level)) {
203
+ $dependencies = array( 'jquery' );
204
+ $paypal_enable_3dsecure = pmpro_getOption( 'paypal_enable_3dsecure' );
205
+ $data = array();
206
+
207
+ // Setup 3DSecure if enabled.
208
+ if( pmpro_was_checkout_form_submitted() && $paypal_enable_3dsecure ) {
209
+ if( 'sandbox' === $gateway_environment || 'beta-sandbox' === $gateway_environment ) {
210
+ $songbird_url = 'https://songbirdstag.cardinalcommerce.com/cardinalcruise/v1/songbird.js';
211
+ } else {
212
+ $songbird_url = 'https://songbird.cardinalcommerce.com/edge/v1/songbird.js';
213
+ }
214
+ wp_enqueue_script( 'pmpro_songbird', $songbird_url );
215
+ $dependencies[] = 'pmpro_songbird';
216
+ $data['enable_3dsecure'] = $paypal_enable_3dsecure;
217
+ $data['cardinal_jwt'] = PMProGateway_paypal::get_cardinal_jwt();
218
+ if ( WP_DEBUG ) {
219
+ $data['cardinal_debug'] = 'verbose';
220
+ $data['cardinal_logging'] = 'On';
221
+ } else {
222
+ $data['cardinal_debug'] = '';
223
+ $data['cardinal_logging'] = 'Off';
224
+ }
225
+ }
226
+
227
+ wp_register_script( 'pmpro_paypal',
228
+ plugins_url( 'js/pmpro-paypal.js', PMPRO_BASE_FILE ),
229
+ $dependencies,
230
+ PMPRO_VERSION );
231
+ wp_localize_script( 'pmpro_paypal', 'pmpro_paypal', $data );
232
+ wp_enqueue_script( 'pmpro_paypal' );
233
+ }
234
+ }
235
+
236
+ static function get_cardinal_jwt() {
237
+ require_once( PMPRO_DIR . '/includes/lib/php-jwt/JWT.php' );
238
+
239
+ $key = pmpro_getOption( 'paypal_cardinal_apikey' );
240
+ $now = current_time( 'timestamp' );
241
+ $token = array(
242
+ 'jti' => 'JWT' . pmpro_getDiscountCode(),
243
+ 'iat' => $now,
244
+ 'exp' => $now + 7200,
245
+ 'iss' => pmpro_getOption( 'paypal_cardinal_apiidentifier' ),
246
+ 'OrgUnitId' => pmpro_getOption( 'paypal_cardinal_orgunitid' ),
247
+
248
+ );
249
+ $jwt = \PMPro\Firebase\JWT\JWT::encode($token, $key);
250
+
251
+ return $jwt;
252
+ }
253
+
254
  /**
255
  * Swap in our submit buttons.
256
  *
279
  return false;
280
  }
281
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
  /**
283
  * Process checkout.
284
  *
356
  if(!empty($order->Token))
357
  $nvpStr .= "&TOKEN=" . $order->Token;
358
  $nvpStr .="&AMT=1.00&CURRENCYCODE=" . pmpro_getOption("currency");
359
+ $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
360
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
361
 
362
  $nvpStr .= "&PAYMENTACTION=Authorization&IPADDRESS=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
374
  if(!empty($order->StartDate))
375
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
376
 
377
+ // Name and email info
378
+ if ( ! empty( $order->FirstName ) && ! empty( $order->LastName ) && ! empty( $order->Email ) ) {
379
+ $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName;
380
+ }
381
+
382
  //billing address, etc
383
  if(!empty($order->Address1))
384
  {
385
+ $nvpStr .= "&STREET=" . $order->Address1;
386
 
387
  if($order->Address2)
388
  $nvpStr .= "&STREET2=" . $order->Address2;
468
  if(!empty($order->Token))
469
  $nvpStr .= "&TOKEN=" . $order->Token;
470
  $nvpStr .="&AMT=" . $amount . "&ITEMAMT=" . $order->InitialPayment . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency;
471
+ $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
472
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
473
 
474
  $nvpStr .= "&PAYMENTACTION=Sale&IPADDRESS=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
486
  if(!empty($order->StartDate))
487
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
488
 
489
+ // Name and email info
490
+ if ( $order->FirstName && $order->LastName && $order->Email ) {
491
+ $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName;
492
+ }
493
+
494
  //billing address, etc
495
  if($order->Address1)
496
  {
497
+ $nvpStr .= "&STREET=" . $order->Address1;
498
 
499
  if($order->Address2)
500
  $nvpStr .= "&STREET2=" . $order->Address2;
540
  $nvpStr .="&AMT=" . $order->PaymentAmount . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
541
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
542
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
543
+ $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
544
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
545
 
546
  //if billing cycles are defined
572
  if(!empty($order->StartDate))
573
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
574
 
575
+ // Name and email info
576
+ if ( $order->FirstName && $order->LastName && $order->Email ) {
577
+ $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName;
578
+ }
579
+
580
  //billing address, etc
581
  if($order->Address1)
582
  {
583
+ $nvpStr .= "&STREET=" . $order->Address1;
584
 
585
  if($order->Address2)
586
  $nvpStr .= "&STREET2=" . $order->Address2;
628
  if($order->StartDate)
629
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
630
 
631
+ // Name and email info
632
+ if ( $order->FirstName && $order->LastName && $order->Email ) {
633
+ $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName;
634
+ }
635
 
636
+ //billing address, etc
637
+ if($order->Address1)
638
+ {
639
+ $nvpStr .= "&STREET=" . $order->Address1;
640
 
641
+ if($order->Address2)
642
+ $nvpStr .= "&STREET2=" . $order->Address2;
643
+
644
+ $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&COUNTRYCODE=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&SHIPTOPHONENUM=" . $order->billing->phone;
645
+ }
646
 
647
  $this->httpParsedResponseAr = $this->PPHttpPost('UpdateRecurringPaymentsProfile', $nvpStr);
648
 
classes/gateways/class.pmprogateway_paypalexpress.php CHANGED
@@ -46,11 +46,12 @@
46
  add_filter('pmpro_payment_option_fields', array('PMProGateway_paypalexpress', 'pmpro_payment_option_fields'), 10, 2);
47
  $pmpro_payment_option_fields_for_paypal = true;
48
  }
49
-
50
  //code to add at checkout
51
  $gateway = pmpro_getGateway();
52
  if($gateway == "paypalexpress")
53
  {
 
54
  add_filter('pmpro_include_billing_address_fields', '__return_false');
55
  add_filter('pmpro_include_payment_information_fields', '__return_false');
56
  add_filter('pmpro_required_billing_fields', array('PMProGateway_paypalexpress', 'pmpro_required_billing_fields'));
@@ -58,7 +59,6 @@
58
  add_filter('pmpro_checkout_confirmed', array('PMProGateway_paypalexpress', 'pmpro_checkout_confirmed'));
59
  add_action('pmpro_checkout_before_processing', array('PMProGateway_paypalexpress', 'pmpro_checkout_before_processing'));
60
  add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypalexpress', 'pmpro_checkout_default_submit_button'));
61
- add_action('pmpro_checkout_after_form', array('PMProGateway_paypalexpress', 'pmpro_checkout_after_form'));
62
  add_action('http_api_curl', array('PMProGateway_paypalexpress', 'http_api_curl'), 10, 3);
63
  }
64
  }
@@ -105,7 +105,7 @@
105
  'use_ssl',
106
  'tax_state',
107
  'tax_rate',
108
- 'paypalexpress_skip_confirmation'
109
  );
110
 
111
  return $options;
@@ -118,7 +118,7 @@
118
  */
119
  static function pmpro_payment_options($options)
120
  {
121
- //get stripe options
122
  $paypal_options = PMProGateway_paypalexpress::getGatewayOptions();
123
 
124
  //merge with others.
@@ -193,7 +193,7 @@
193
  <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
194
  </th>
195
  <td>
196
- <p><?php _e('To fully integrate with PayPal, be sure to set your IPN Handler URL to ', 'paid-memberships-pro' );?> <pre><?php echo admin_url("admin-ajax.php") . "?action=ipnhandler";?></pre></p>
197
  </td>
198
  </tr>
199
  <?php
@@ -223,6 +223,26 @@
223
 
224
  return $fields;
225
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
 
227
  /**
228
  * Save session vars before processing
@@ -453,43 +473,6 @@
453
  return false;
454
  }
455
 
456
- /**
457
- * Scripts for checkout page.
458
- *
459
- * @since 1.8
460
- */
461
- static function pmpro_checkout_after_form()
462
- {
463
- ?>
464
- <script>
465
- <!--
466
- //choosing payment method
467
- jQuery('input[name=gateway]').click(function() {
468
- if(jQuery(this).val() == 'paypal')
469
- {
470
- jQuery('#pmpro_paypalexpress_checkout').hide();
471
- jQuery('#pmpro_billing_address_fields').show();
472
- jQuery('#pmpro_payment_information_fields').show();
473
- jQuery('#pmpro_submit_span').show();
474
- }
475
- else
476
- {
477
- jQuery('#pmpro_billing_address_fields').hide();
478
- jQuery('#pmpro_payment_information_fields').hide();
479
- jQuery('#pmpro_submit_span').hide();
480
- jQuery('#pmpro_paypalexpress_checkout').show();
481
- }
482
- });
483
-
484
- //select the radio button if the label is clicked on
485
- jQuery('a.pmpro_radio').click(function() {
486
- jQuery(this).prev().click();
487
- });
488
- -->
489
- </script>
490
- <?php
491
- }
492
-
493
  //PayPal Express, this is run first to authorize from PayPal
494
  function setExpressCheckout(&$order)
495
  {
@@ -521,7 +504,7 @@
521
  if(!empty($order->BillingFrequency))
522
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling&L_BILLINGTYPE0=RecurringPayments";
523
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
524
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
525
  $nvpStr .= "&NOSHIPPING=1&L_BILLINGAGREEMENTDESCRIPTION0=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127)) . "&L_PAYMENTTYPE0=Any";
526
 
527
  //if billing cycles are defined
@@ -656,7 +639,7 @@
656
  if(!empty($order->BillingFrequency))
657
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
658
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
659
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
660
  $nvpStr .= "&NOSHIPPING=1";
661
 
662
  $nvpStr .= "&PAYERID=" . $_SESSION['payer_id'] . "&PAYMENTACTION=sale";
@@ -713,7 +696,7 @@
713
  if(!empty($amount_tax))
714
  $nvpStr .= "&TAXAMT=" . $amount_tax;
715
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
716
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
717
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
718
 
719
  //if billing cycles are defined
46
  add_filter('pmpro_payment_option_fields', array('PMProGateway_paypalexpress', 'pmpro_payment_option_fields'), 10, 2);
47
  $pmpro_payment_option_fields_for_paypal = true;
48
  }
49
+
50
  //code to add at checkout
51
  $gateway = pmpro_getGateway();
52
  if($gateway == "paypalexpress")
53
  {
54
+ add_action('pmpro_checkout_preheader', array('PMProGateway_paypalexpress', 'pmpro_checkout_preheader'));
55
  add_filter('pmpro_include_billing_address_fields', '__return_false');
56
  add_filter('pmpro_include_payment_information_fields', '__return_false');
57
  add_filter('pmpro_required_billing_fields', array('PMProGateway_paypalexpress', 'pmpro_required_billing_fields'));
59
  add_filter('pmpro_checkout_confirmed', array('PMProGateway_paypalexpress', 'pmpro_checkout_confirmed'));
60
  add_action('pmpro_checkout_before_processing', array('PMProGateway_paypalexpress', 'pmpro_checkout_before_processing'));
61
  add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypalexpress', 'pmpro_checkout_default_submit_button'));
 
62
  add_action('http_api_curl', array('PMProGateway_paypalexpress', 'http_api_curl'), 10, 3);
63
  }
64
  }
105
  'use_ssl',
106
  'tax_state',
107
  'tax_rate',
108
+ 'paypalexpress_skip_confirmation',
109
  );
110
 
111
  return $options;
118
  */
119
  static function pmpro_payment_options($options)
120
  {
121
+ //get options
122
  $paypal_options = PMProGateway_paypalexpress::getGatewayOptions();
123
 
124
  //merge with others.
193
  <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
194
  </th>
195
  <td>
196
+ <p><?php _e('To fully integrate with PayPal, be sure to set your IPN Handler URL to ', 'paid-memberships-pro' );?> <pre><?php echo add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') );?></pre></p>
197
  </td>
198
  </tr>
199
  <?php
223
 
224
  return $fields;
225
  }
226
+
227
+ /**
228
+ * Code added to checkout preheader.
229
+ *
230
+ * @since 2.1
231
+ */
232
+ static function pmpro_checkout_preheader() {
233
+ global $gateway, $pmpro_level;
234
+
235
+ $default_gateway = pmpro_getOption("gateway");
236
+
237
+ if(($gateway == "paypal" || $default_gateway == "paypal") && !pmpro_isLevelFree($pmpro_level)) {
238
+ wp_register_script( 'pmpro_paypal',
239
+ plugins_url( 'js/pmpro-paypal.js', PMPRO_BASE_FILE ),
240
+ array( 'jquery' ),
241
+ PMPRO_VERSION );
242
+ //wp_localize_script( 'pmpro_paypal', 'pmpro_paypal', array());
243
+ wp_enqueue_script( 'pmpro_paypal' );
244
+ }
245
+ }
246
 
247
  /**
248
  * Save session vars before processing
473
  return false;
474
  }
475
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
476
  //PayPal Express, this is run first to authorize from PayPal
477
  function setExpressCheckout(&$order)
478
  {
504
  if(!empty($order->BillingFrequency))
505
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling&L_BILLINGTYPE0=RecurringPayments";
506
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
507
+ $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
508
  $nvpStr .= "&NOSHIPPING=1&L_BILLINGAGREEMENTDESCRIPTION0=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127)) . "&L_PAYMENTTYPE0=Any";
509
 
510
  //if billing cycles are defined
639
  if(!empty($order->BillingFrequency))
640
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
641
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
642
+ $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
643
  $nvpStr .= "&NOSHIPPING=1";
644
 
645
  $nvpStr .= "&PAYERID=" . $_SESSION['payer_id'] . "&PAYMENTACTION=sale";
696
  if(!empty($amount_tax))
697
  $nvpStr .= "&TAXAMT=" . $amount_tax;
698
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
699
+ $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
700
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
701
 
702
  //if billing cycles are defined
classes/gateways/class.pmprogateway_paypalstandard.php CHANGED
@@ -90,7 +90,7 @@
90
  'currency',
91
  'use_ssl',
92
  'tax_state',
93
- 'tax_rate'
94
  );
95
 
96
  return $options;
@@ -174,7 +174,7 @@
174
  <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
175
  </th>
176
  <td>
177
- <p><?php _e('Here is your IPN URL for reference. You SHOULD NOT set this in your PayPal settings.', 'paid-memberships-pro' );?> <pre><?php echo admin_url("admin-ajax.php") . "?action=ipnhandler";?></pre></p>
178
  </td>
179
  </tr>
180
  <?php
90
  'currency',
91
  'use_ssl',
92
  'tax_state',
93
+ 'tax_rate',
94
  );
95
 
96
  return $options;
174
  <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
175
  </th>
176
  <td>
177
+ <p><?php _e('Here is your IPN URL for reference. You SHOULD NOT set this in your PayPal settings.', 'paid-memberships-pro' );?> <pre><?php echo add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') );?></pre></p>
178
  </td>
179
  </tr>
180
  <?php
classes/gateways/class.pmprogateway_stripe.php CHANGED
@@ -4,18 +4,23 @@ use Stripe\Customer as Stripe_Customer;
4
  use Stripe\Invoice as Stripe_Invoice;
5
  use Stripe\Plan as Stripe_Plan;
6
  use Stripe\Charge as Stripe_Charge;
 
 
 
 
 
7
 
8
- define( "PMPRO_STRIPE_API_VERSION", "2017-08-15" );
9
 
10
  //include pmprogateway
11
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
12
 
13
  //load classes init method
14
- add_action('init', array('PMProGateway_stripe', 'init'));
15
 
16
  // loading plugin activation actions
17
- add_action('activate_paid-memberships-pro', array('PMProGateway_stripe', 'pmpro_activation'));
18
- add_action('deactivate_paid-memberships-pro', array('PMProGateway_stripe', 'pmpro_deactivation'));
19
 
20
  /**
21
  * PMProGateway_stripe Class
@@ -24,24 +29,24 @@ add_action('deactivate_paid-memberships-pro', array('PMProGateway_stripe', 'pmpr
24
  *
25
  * @since 1.4
26
  */
27
- class PMProGateway_stripe extends PMProGateway
28
- {
29
  /**
30
  * @var bool Is the Stripe/PHP Library loaded
31
  */
32
  private static $is_loaded = false;
 
33
  /**
34
  * Stripe Class Constructor
35
  *
36
  * @since 1.4
37
  */
38
- function __construct($gateway = NULL) {
39
- $this->gateway = $gateway;
40
- $this->gateway_environment = pmpro_getOption("gateway_environment");
41
 
42
- if( true === $this->dependencies() ) {
43
  $this->loadStripeLibrary();
44
- Stripe\Stripe::setApiKey(pmpro_getOption("stripe_secretkey"));
45
  Stripe\Stripe::setAPIVersion( PMPRO_STRIPE_API_VERSION );
46
  self::$is_loaded = true;
47
  }
@@ -59,13 +64,13 @@ class PMProGateway_stripe extends PMProGateway
59
  public static function dependencies() {
60
  global $msg, $msgt, $pmpro_stripe_error;
61
 
62
- if ( version_compare( PHP_VERSION, '5.3.29', '<' )) {
63
 
64
  $pmpro_stripe_error = true;
65
- $msg = -1;
66
- $msgt = sprintf(__("The Stripe Gateway requires PHP 5.3.29 or greater. We recommend upgrading to PHP %s or greater. Ask your host to upgrade.", "paid-memberships-pro" ), PMPRO_PHP_MIN_VERSION );
67
 
68
- if ( !is_admin() ) {
69
  pmpro_setMessage( $msgt, "pmpro_error" );
70
  }
71
 
@@ -74,21 +79,23 @@ class PMProGateway_stripe extends PMProGateway
74
 
75
  $modules = array( 'curl', 'mbstring', 'json' );
76
 
77
- foreach($modules as $module){
78
- if(!extension_loaded($module)){
79
  $pmpro_stripe_error = true;
80
- $msg = -1;
81
- $msgt = sprintf(__("The %s gateway depends on the %s PHP extension. Please enable it, or ask your hosting provider to enable it.", 'paid-memberships-pro' ), 'Stripe', $module);
82
 
83
  //throw error on checkout page
84
- if(!is_admin())
85
- pmpro_setMessage($msgt, 'pmpro_error');
 
86
 
87
  return false;
88
  }
89
  }
90
 
91
  self::$is_loaded = true;
 
92
  return true;
93
  }
94
 
@@ -100,7 +107,7 @@ class PMProGateway_stripe extends PMProGateway
100
  */
101
  function loadStripeLibrary() {
102
  //load Stripe library if it hasn't been loaded already (usually by another plugin using Stripe)
103
- if(!class_exists("Stripe\Stripe")) {
104
  require_once( PMPRO_DIR . "/includes/lib/Stripe/init.php" );
105
  }
106
  }
@@ -112,50 +119,74 @@ class PMProGateway_stripe extends PMProGateway
112
  */
113
  static function init() {
114
  //make sure Stripe is a gateway option
115
- add_filter('pmpro_gateways', array('PMProGateway_stripe', 'pmpro_gateways'));
116
 
117
  //add fields to payment settings
118
- add_filter('pmpro_payment_options', array('PMProGateway_stripe', 'pmpro_payment_options'));
119
- add_filter('pmpro_payment_option_fields', array('PMProGateway_stripe', 'pmpro_payment_option_fields'), 10, 2);
 
 
 
120
 
121
  //add some fields to edit user page (Updates)
122
- add_action('pmpro_after_membership_level_profile_fields', array('PMProGateway_stripe', 'user_profile_fields'));
123
- add_action('profile_update', array('PMProGateway_stripe', 'user_profile_fields_save'));
 
 
 
124
 
125
  //old global RE showing billing address or not
126
  global $pmpro_stripe_lite;
127
- $pmpro_stripe_lite = apply_filters("pmpro_stripe_lite", !pmpro_getOption("stripe_billingaddress")); //default is oposite of the stripe_billingaddress setting
128
- add_filter('pmpro_required_billing_fields', array('PMProGateway_stripe', 'pmpro_required_billing_fields'));
129
 
130
  //updates cron
131
- add_action('pmpro_cron_stripe_subscription_updates', array('PMProGateway_stripe', 'pmpro_cron_stripe_subscription_updates'));
 
 
 
132
 
133
  /*
134
- Filter pmpro_next_payment to get actual value
135
- via the Stripe API. This is disabled by default
136
- for performance reasons, but you can enable it
137
- by copying this line into a custom plugin or
138
- your active theme's functions.php and uncommenting
139
- it there.
140
- */
141
  //add_filter('pmpro_next_payment', array('PMProGateway_stripe', 'pmpro_next_payment'), 10, 3);
142
 
143
  //code to add at checkout if Stripe is the current gateway
144
- $default_gateway = pmpro_getOption('gateway');
145
  $current_gateway = pmpro_getGateway();
146
 
147
- if( ($default_gateway == "stripe" || $current_gateway == "stripe") && empty($_REQUEST['review'] ) ) //$_REQUEST['review'] means the PayPal Express review page
148
  {
149
- add_action('pmpro_checkout_preheader', array('PMProGateway_stripe', 'pmpro_checkout_preheader'));
150
- add_action('pmpro_billing_preheader', array('PMProGateway_stripe', 'pmpro_checkout_preheader'));
151
- add_filter('pmpro_checkout_order', array('PMProGateway_stripe', 'pmpro_checkout_order'));
152
- add_filter('pmpro_billing_order', array('PMProGateway_stripe', 'pmpro_checkout_order'));
153
- add_filter('pmpro_include_billing_address_fields', array('PMProGateway_stripe', 'pmpro_include_billing_address_fields'));
154
- add_filter('pmpro_include_cardtype_field', array('PMProGateway_stripe', 'pmpro_include_billing_address_fields'));
155
- add_filter('pmpro_include_payment_information_fields', array('PMProGateway_stripe', 'pmpro_include_payment_information_fields'));
156
-
 
 
 
 
 
 
 
 
 
 
 
 
157
  //make sure we clean up subs we will be cancelling after checkout before processing
158
- add_action('pmpro_checkout_before_processing', array('PMProGateway_stripe', 'pmpro_checkout_before_processing'));
 
 
 
159
  }
160
 
161
  add_action( 'init', array( 'PMProGateway_stripe', 'pmpro_clear_saved_subscriptions' ) );
@@ -174,7 +205,7 @@ class PMProGateway_stripe extends PMProGateway
174
  $preserve = get_user_meta( $current_user->ID, 'pmpro_stripe_dont_cancel', true );
175
 
176
  // Clean up the subscription timeout values (if applicable)
177
- if ( !empty( $preserve ) ) {
178
 
179
  foreach ( $preserve as $sub_id => $timestamp ) {
180
 
@@ -193,9 +224,10 @@ class PMProGateway_stripe extends PMProGateway
193
  *
194
  * @since 1.8
195
  */
196
- static function pmpro_gateways($gateways) {
197
- if(empty($gateways['stripe']))
198
- $gateways['stripe'] = __('Stripe', 'paid-memberships-pro' );
 
199
 
200
  return $gateways;
201
  }
@@ -228,12 +260,12 @@ class PMProGateway_stripe extends PMProGateway
228
  *
229
  * @since 1.8
230
  */
231
- static function pmpro_payment_options($options) {
232
  //get stripe options
233
  $stripe_options = self::getGatewayOptions();
234
 
235
  //merge with others.
236
- $options = array_merge($stripe_options, $options);
237
 
238
  return $options;
239
  }
@@ -243,63 +275,72 @@ class PMProGateway_stripe extends PMProGateway
243
  *
244
  * @since 1.8
245
  */
246
- static function pmpro_payment_option_fields($values, $gateway) {
247
- ?>
248
- <tr class="pmpro_settings_divider gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
249
- <td colspan="2">
250
- <?php _e('Stripe Settings', 'paid-memberships-pro' ); ?>
251
- </td>
252
- </tr>
253
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
254
- <th scope="row" valign="top">
255
- <label for="stripe_publishablekey"><?php _e('Publishable Key', 'paid-memberships-pro' );?>:</label>
256
- </th>
257
- <td>
258
- <input type="text" id="stripe_publishablekey" name="stripe_publishablekey" size="60" value="<?php echo esc_attr($values['stripe_publishablekey'])?>" />
259
- <?php
260
- $public_key_prefix = substr($values['stripe_publishablekey'] , 0, 3);
261
- if(!empty($values['stripe_publishablekey']) && $public_key_prefix != 'pk_') {
262
- ?>
263
- <br /><small class="pmpro_message pmpro_error"><?php _e('Your Publishable Key appears incorrect.', 'paid-memberships-pro');?></small>
264
  <?php
 
 
 
 
 
 
265
  }
266
- ?>
267
- </td>
268
- </tr>
269
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
270
- <th scope="row" valign="top">
271
- <label for="stripe_secretkey"><?php _e('Secret Key', 'paid-memberships-pro' );?>:</label>
272
- </th>
273
- <td>
274
- <input type="text" id="stripe_secretkey" name="stripe_secretkey" size="60" value="<?php echo esc_attr($values['stripe_secretkey'])?>" />
275
- </td>
276
- </tr>
277
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
278
- <th scope="row" valign="top">
279
- <label for="stripe_billingaddress"><?php _e('Show Billing Address Fields', 'paid-memberships-pro' );?>:</label>
280
- </th>
281
- <td>
282
- <select id="stripe_billingaddress" name="stripe_billingaddress">
283
- <option value="0" <?php if(empty($values['stripe_billingaddress'])) { ?>selected="selected"<?php } ?>><?php _e('No', 'paid-memberships-pro' );?></option>
284
- <option value="1" <?php if(!empty($values['stripe_billingaddress'])) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'paid-memberships-pro' );?></option>
285
- </select>
286
- <small><?php _e("Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page.<br /><strong>If No, make sure you disable address verification in the Stripe dashboard settings.</strong>", 'paid-memberships-pro' );?></small>
287
- </td>
288
- </tr>
289
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
290
- <th scope="row" valign="top">
291
- <label><?php _e('Web Hook URL', 'paid-memberships-pro' );?>:</label>
292
- </th>
293
- <td>
294
- <p><?php _e('To fully integrate with Stripe, be sure to set your Web Hook URL to', 'paid-memberships-pro' );?> <pre><?php echo admin_url("admin-ajax.php") . "?action=stripe_webhook";?></pre></p>
295
- </td>
296
- </tr>
297
-
298
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
299
- <th><?php _e( 'Stripe API Version', 'paid-memberships-pro' ); ?>:</th>
300
- <td><?php echo PMPRO_STRIPE_API_VERSION; ?></td>
301
- </tr>
302
- <?php
 
 
 
 
 
 
303
  }
304
 
305
  /**
@@ -307,127 +348,42 @@ class PMProGateway_stripe extends PMProGateway
307
  *
308
  * @since 1.8
309
  */
310
- static function pmpro_checkout_preheader() {
311
- global $gateway, $pmpro_level;
312
 
313
- $default_gateway = pmpro_getOption("gateway");
314
 
315
- if(($gateway == "stripe" || $default_gateway == "stripe") && !pmpro_isLevelFree($pmpro_level))
316
- {
317
- //stripe js library
318
- wp_enqueue_script("stripe", "https://js.stripe.com/v2/", array(), NULL);
319
 
320
- if ( ! function_exists( 'pmpro_stripe_javascript' ) ) {
321
-
322
- //stripe js code for checkout
323
- function pmpro_stripe_javascript()
324
- {
325
- global $pmpro_gateway, $pmpro_level, $pmpro_stripe_lite;
326
- ?>
327
- <script type="text/javascript">
328
- <!--
329
- // this identifies your website in the createToken call below
330
- Stripe.setPublishableKey('<?php echo pmpro_getOption("stripe_publishablekey"); ?>');
331
-
332
- pmpro_require_billing = true;
333
-
334
- var tokenNum = 0;
335
-
336
- jQuery(document).ready(function() {
337
- jQuery(".pmpro_form").submit(function(event) {
338
-
339
- // prevent the form from submitting with the default action
340
- event.preventDefault();
341
-
342
- //double check in case a discount code made the level free
343
- if(pmpro_require_billing) {
344
- //build array for creating token
345
- var args = {
346
- number: jQuery('#AccountNumber').val(),
347
- exp_month: jQuery('#ExpirationMonth').val(),
348
- exp_year: jQuery('#ExpirationYear').val()
349
- <?php
350
- $pmpro_stripe_verify_address = apply_filters("pmpro_stripe_verify_address", pmpro_getOption('stripe_billingaddress'));
351
- if(!empty($pmpro_stripe_verify_address))
352
- {
353
- ?>
354
- ,address_line1: jQuery('#baddress1').val(),
355
- address_line2: jQuery('#baddress2').val(),
356
- address_city: jQuery('#bcity').val(),
357
- address_state: jQuery('#bstate').val(),
358
- address_zip: jQuery('#bzipcode').val(),
359
- address_country: jQuery('#bcountry').val()
360
- <?php
361
- }
362
- ?>
363
- };
364
-
365
- //add CVC if not blank
366
- if(jQuery('#CVV').val().length)
367
- args['cvc'] = jQuery('#CVV').val();
368
-
369
- //add first and last name if not blank
370
- if (jQuery('#bfirstname').length && jQuery('#blastname').length)
371
- args['name'] = jQuery.trim(jQuery('#bfirstname').val() + ' ' + jQuery('#blastname').val());
372
-
373
- //create token(s)
374
- if (jQuery('#level').length) {
375
- var levelnums = jQuery("#level").val().split(",");
376
- for(var cnt = 0, len = levelnums.length; cnt < len; cnt++) {
377
- Stripe.createToken(args, stripeResponseHandler);
378
- }
379
- } else {
380
- Stripe.createToken(args, stripeResponseHandler);
381
- }
382
 
383
- // prevent the form from submitting with the default action
384
- return false;
385
- } else {
386
- this.submit();
387
- return true; //not using Stripe anymore
388
- }
389
- });
390
- });
391
 
392
- function stripeResponseHandler(status, response) {
393
- if (response.error) {
394
- // re-enable the submit button
395
- jQuery('.pmpro_btn-submit-checkout,.pmpro_btn-submit').removeAttr("disabled");
396
 
397
- //hide processing message
398
- jQuery('#pmpro_processing_message').css('visibility', 'hidden');
 
 
 
 
399
 
400
- // show the errors on the form
401
- alert(response.error.message);
402
- jQuery(".payment-errors").text(response.error.message);
403
- } else {
404
- var form$ = jQuery("#pmpro_form, .pmpro_form");
405
- // token contains id, last4, and card type
406
- var token = response['id'];
407
- // insert the token into the form so it gets submitted to the server
408
- form$.append("<input type='hidden' name='stripeToken" + tokenNum + "' value='" + token + "'/>");
409
- tokenNum++;
410
-
411
- //console.log(response);
412
-
413
- //insert fields for other card fields
414
- if(jQuery('#CardType[name=CardType]').length)
415
- jQuery('#CardType').val(response['card']['brand']);
416
- else
417
- form$.append("<input type='hidden' name='CardType' value='" + response['card']['brand'] + "'/>");
418
- form$.append("<input type='hidden' name='AccountNumber' value='XXXXXXXXXXXX" + response['card']['last4'] + "'/>");
419
- form$.append("<input type='hidden' name='ExpirationMonth' value='" + ("0" + response['card']['exp_month']).slice(-2) + "'/>");
420
- form$.append("<input type='hidden' name='ExpirationYear' value='" + response['card']['exp_year'] + "'/>");
421
-
422
- // and submit
423
- form$.get(0).submit();
424
- }
425
  }
426
- -->
427
- </script>
428
- <?php
429
  }
430
- add_action("wp_head", "pmpro_stripe_javascript");
 
 
 
 
 
 
431
  }
432
  }
433
  }
@@ -436,25 +392,36 @@ class PMProGateway_stripe extends PMProGateway
436
  * Don't require the CVV.
437
  * Don't require address fields if they are set to hide.
438
  */
439
- static function pmpro_required_billing_fields($fields) {
440
  global $pmpro_stripe_lite, $current_user, $bemail, $bconfirmemail;
441
 
442
  //CVV is not required if set that way at Stripe. The Stripe JS will require it if it is required.
443
- unset($fields['CVV']);
444
 
445
  //if using stripe lite, remove some fields from the required array
446
- if ($pmpro_stripe_lite) {
447
  //some fields to remove
448
- $remove = array('bfirstname', 'blastname', 'baddress1', 'bcity', 'bstate', 'bzipcode', 'bphone', 'bcountry', 'CardType');
 
 
 
 
 
 
 
 
 
 
449
  //if a user is logged in, don't require bemail either
450
- if (!empty($current_user->user_email)) {
451
- $remove[] = 'bemail';
452
- $bemail = $current_user->user_email;
453
  $bconfirmemail = $bemail;
454
  }
455
  //remove the fields
456
- foreach ($remove as $field)
457
- unset($fields[$field]);
 
458
  }
459
 
460
  return $fields;
@@ -465,34 +432,55 @@ class PMProGateway_stripe extends PMProGateway
465
  *
466
  * @since 1.8
467
  */
468
- static function pmpro_checkout_order($morder) {
469
- //load up token values
470
- if(isset($_REQUEST['stripeToken0']))
471
- {
472
- // find the highest one still around, and use it - then remove it from $_REQUEST.
473
- $thetoken = "";
474
- $tokennum = -1;
475
- foreach($_REQUEST as $key => $param) {
476
- if(preg_match('/stripeToken(\d+)/', $key, $matches)) {
477
- if(intval($matches[1])>$tokennum) {
478
- $thetoken = sanitize_text_field($param);
479
- $tokennum = intval($matches[1]);
480
- }
481
- }
482
- }
483
- $morder->stripeToken = $thetoken;
484
- unset($_REQUEST['stripeToken'.$tokennum]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485
  }
486
 
487
  //stripe lite code to get name from other sources if available
488
  global $pmpro_stripe_lite, $current_user;
489
- if(!empty($pmpro_stripe_lite) && empty($morder->FirstName) && empty($morder->LastName)) {
490
- if(!empty($current_user->ID)) {
491
- $morder->FirstName = get_user_meta($current_user->ID, "first_name", true);
492
- $morder->LastName = get_user_meta($current_user->ID, "last_name", true);
493
- } elseif(!empty($_REQUEST['first_name']) && !empty($_REQUEST['last_name'])) {
494
- $morder->FirstName = sanitize_text_field($_REQUEST['first_name']);
495
- $morder->LastName = sanitize_text_field($_REQUEST['last_name']);
496
  }
497
  }
498
 
@@ -504,12 +492,12 @@ class PMProGateway_stripe extends PMProGateway
504
  *
505
  * @since 1.8
506
  */
507
- static function pmpro_after_checkout($user_id, $morder) {
508
  global $gateway;
509
 
510
- if($gateway == "stripe") {
511
- if(self::$is_loaded && !empty($morder) && !empty($morder->Gateway) && !empty($morder->Gateway->customer) && !empty($morder->Gateway->customer->id)) {
512
- update_user_meta($user_id, "pmpro_stripe_customerid", $morder->Gateway->customer->id);
513
  }
514
  }
515
  }
@@ -518,10 +506,11 @@ class PMProGateway_stripe extends PMProGateway
518
  * Check settings if billing address should be shown.
519
  * @since 1.8
520
  */
521
- static function pmpro_include_billing_address_fields($include) {
522
  //check settings RE showing billing address
523
- if(!pmpro_getOption("stripe_billingaddress"))
524
  $include = false;
 
525
 
526
  return $include;
527
  }
@@ -530,114 +519,77 @@ class PMProGateway_stripe extends PMProGateway
530
  * Use our own payment fields at checkout. (Remove the name attributes.)
531
  * @since 1.8
532
  */
533
- static function pmpro_include_payment_information_fields($include) {
534
  //global vars
535
  global $pmpro_requirebilling, $pmpro_show_discount_code, $discount_code, $CardType, $AccountNumber, $ExpirationMonth, $ExpirationYear;
536
 
537
  //get accepted credit cards
538
- $pmpro_accepted_credit_cards = pmpro_getOption("accepted_credit_cards");
539
- $pmpro_accepted_credit_cards = explode(",", $pmpro_accepted_credit_cards);
540
- $pmpro_accepted_credit_cards_string = pmpro_implodeToEnglish($pmpro_accepted_credit_cards);
541
 
542
  //include ours
543
  ?>
544
- <div id="pmpro_payment_information_fields" class="pmpro_checkout" <?php if(!$pmpro_requirebilling || apply_filters("pmpro_hide_payment_information_fields", false) ) { ?>style="display: none;"<?php } ?>>
545
- <h3>
546
- <span class="pmpro_checkout-h3-name"><?php _e('Payment Information', 'paid-memberships-pro' );?></span>
547
- <span class="pmpro_checkout-h3-msg"><?php printf(__('We Accept %s', 'paid-memberships-pro' ), $pmpro_accepted_credit_cards_string);?></span>
548
- </h3>
549
- <?php $sslseal = pmpro_getOption("sslseal"); ?>
550
- <?php if(!empty($sslseal)) { ?>
551
- <div class="pmpro_checkout-fields-display-seal">
552
- <?php } ?>
553
- <div class="pmpro_checkout-fields<?php if(!empty($sslseal)) { ?> pmpro_checkout-fields-leftcol<?php } ?>">
554
- <?php
555
- $pmpro_include_cardtype_field = apply_filters('pmpro_include_cardtype_field', false);
556
- if($pmpro_include_cardtype_field) { ?>
557
- <div class="pmpro_checkout-field pmpro_payment-card-type">
558
- <label for="CardType"><?php _e('Card Type', 'paid-memberships-pro' );?></label>
559
- <select id="CardType" class=" <?php echo pmpro_getClassForField("CardType");?>">
560
- <?php foreach($pmpro_accepted_credit_cards as $cc) { ?>
561
- <option value="<?php echo $cc?>" <?php if($CardType == $cc) { ?>selected="selected"<?php } ?>><?php echo $cc?></option>
562
- <?php } ?>
563
- </select>
564
- </div>
565
- <?php } else { ?>
566
- <input type="hidden" id="CardType" name="CardType" value="<?php echo esc_attr($CardType);?>" />
567
- <script>
568
- <!--
569
- jQuery(document).ready(function() {
570
- jQuery('#AccountNumber').validateCreditCard(function(result) {
571
- var cardtypenames = {
572
- "amex":"American Express",
573
- "diners_club_carte_blanche":"Diners Club Carte Blanche",
574
- "diners_club_international":"Diners Club International",
575
- "discover":"Discover",
576
- "jcb":"JCB",
577
- "laser":"Laser",
578
- "maestro":"Maestro",
579
- "mastercard":"Mastercard",
580
- "visa":"Visa",
581
- "visa_electron":"Visa Electron"
582
- }
583
-
584
- if(result.card_type)
585
- jQuery('#CardType').val(cardtypenames[result.card_type.name]);
586
- else
587
- jQuery('#CardType').val('Unknown Card Type');
588
- });
589
- });
590
- -->
591
- </script>
592
- <?php } ?>
593
- <div class="pmpro_checkout-field pmpro_payment-account-number">
594
- <label for="AccountNumber"><?php _e('Card Number', 'paid-memberships-pro' );?></label>
595
- <input id="AccountNumber" class="input <?php echo pmpro_getClassForField("AccountNumber");?>" type="text" size="25" value="<?php echo esc_attr($AccountNumber)?>" autocomplete="off" />
596
- </div>
597
- <div class="pmpro_checkout-field pmpro_payment-expiration">
598
- <label for="ExpirationMonth"><?php _e('Expiration Date', 'paid-memberships-pro' );?></label>
599
- <select id="ExpirationMonth" class=" <?php echo pmpro_getClassForField("ExpirationMonth");?>">
600
- <option value="01" <?php if($ExpirationMonth == "01") { ?>selected="selected"<?php } ?>>01</option>
601
- <option value="02" <?php if($ExpirationMonth == "02") { ?>selected="selected"<?php } ?>>02</option>
602
- <option value="03" <?php if($ExpirationMonth == "03") { ?>selected="selected"<?php } ?>>03</option>
603
- <option value="04" <?php if($ExpirationMonth == "04") { ?>selected="selected"<?php } ?>>04</option>
604
- <option value="05" <?php if($ExpirationMonth == "05") { ?>selected="selected"<?php } ?>>05</option>
605
- <option value="06" <?php if($ExpirationMonth == "06") { ?>selected="selected"<?php } ?>>06</option>
606
- <option value="07" <?php if($ExpirationMonth == "07") { ?>selected="selected"<?php } ?>>07</option>
607
- <option value="08" <?php if($ExpirationMonth == "08") { ?>selected="selected"<?php } ?>>08</option>
608
- <option value="09" <?php if($ExpirationMonth == "09") { ?>selected="selected"<?php } ?>>09</option>
609
- <option value="10" <?php if($ExpirationMonth == "10") { ?>selected="selected"<?php } ?>>10</option>
610
- <option value="11" <?php if($ExpirationMonth == "11") { ?>selected="selected"<?php } ?>>11</option>
611
- <option value="12" <?php if($ExpirationMonth == "12") { ?>selected="selected"<?php } ?>>12</option>
612
- </select>/<select id="ExpirationYear" class=" <?php echo pmpro_getClassForField("ExpirationYear");?>">
613
- <?php
614
- for($i = date_i18n("Y"); $i < date_i18n("Y") + 10; $i++) { ?>
615
- <option value="<?php echo $i?>" <?php if($ExpirationYear == $i) { ?>selected="selected"<?php } ?>><?php echo $i?></option>
616
- <?php } ?>
617
- </select>
618
- </div>
619
- <?php
620
- $pmpro_show_cvv = apply_filters("pmpro_show_cvv", true);
621
- if($pmpro_show_cvv) { ?>
622
- <div class="pmpro_checkout-field pmpro_payment-cvv">
623
- <label for="CVV"><?php _e('Security Code (CVC)', 'paid-memberships-pro' );?></label>
624
- <input id="CVV" type="text" size="4" value="<?php if(!empty($_REQUEST['CVV'])) { echo esc_attr(sanitize_text_field($_REQUEST['CVV'])); }?>" class="input <?php echo pmpro_getClassForField("CVV");?>" /> <small>(<a href="javascript:void(0);" onclick="javascript:window.open('<?php echo pmpro_https_filter(PMPRO_URL)?>/pages/popup-cvv.html','cvv','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=600, height=475');"><?php _e("what's this?", 'paid-memberships-pro' );?></a>)</small>
625
- </div>
626
  <?php } ?>
627
- <?php if($pmpro_show_discount_code) { ?>
628
- <div class="pmpro_checkout-field pmpro_payment-discount-code">
629
- <label for="discount_code"><?php _e('Discount Code', 'paid-memberships-pro' );?></label>
630
- <input class="input <?php echo pmpro_getClassForField("discount_code");?>" id="discount_code" name="discount_code" type="text" size="10" value="<?php echo esc_attr($discount_code)?>" />
631
- <input type="button" id="discount_code_button" name="discount_code_button" value="<?php _e('Apply', 'paid-memberships-pro' );?>" />
632
- <p id="discount_code_message" class="pmpro_message" style="display: none;"></p>
633
- </div>
634
- <?php } ?>
635
- </div> <!-- end pmpro_checkout-fields -->
636
- <?php if(!empty($sslseal)) { ?>
637
- <div class="pmpro_checkout-fields-rightcol pmpro_sslseal"><?php echo stripslashes($sslseal); ?></div>
638
- </div> <!-- end pmpro_checkout-fields-display-seal -->
639
- <?php } ?>
640
- </div> <!-- end pmpro_payment_information_fields -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
641
  <?php
642
 
643
  //don't include the default
@@ -649,184 +601,228 @@ class PMProGateway_stripe extends PMProGateway
649
  *
650
  * @since 1.8
651
  */
652
- static function user_profile_fields($user) {
653
  global $wpdb, $current_user, $pmpro_currency_symbol;
654
 
655
- $cycles = array( __('Day(s)', 'paid-memberships-pro' ) => 'Day', __('Week(s)', 'paid-memberships-pro' ) => 'Week', __('Month(s)', 'paid-memberships-pro' ) => 'Month', __('Year(s)', 'paid-memberships-pro' ) => 'Year' );
656
- $current_year = date_i18n("Y");
657
- $current_month = date_i18n("m");
 
 
 
 
 
658
 
659
  //make sure the current user has privileges
660
- $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
661
- if(!current_user_can($membership_level_capability))
662
  return false;
 
663
 
664
  //more privelges they should have
665
- $show_membership_level = apply_filters("pmpro_profile_show_membership_level", true, $user);
666
- if(!$show_membership_level)
667
  return false;
 
668
 
669
  //check that user has a current subscription at Stripe
670
  $last_order = new MemberOrder();
671
- $last_order->getLastMemberOrder($user->ID);
672
 
673
  //assume no sub to start
674
  $sub = false;
675
 
676
  //check that gateway is Stripe
677
- if($last_order->gateway == "stripe" && self::$is_loaded )
678
- {
679
  //is there a customer?
680
- $sub = $last_order->Gateway->getSubscription($last_order);
681
  }
682
 
683
  $customer_id = $user->pmpro_stripe_customerid;
684
 
685
- if(empty($sub)) {
686
  //make sure we delete stripe updates
687
- update_user_meta($user->ID, "pmpro_stripe_updates", array());
688
 
689
  //if the last order has a sub id, let the admin know there is no sub at Stripe
690
- if(!empty($last_order) && $last_order->gateway == "stripe" && !empty($last_order->subscription_transaction_id) && strpos($last_order->subscription_transaction_id, "sub_") !== false)
691
- {
692
- ?>
693
- <p><?php printf( __('%1$sNote:%2$s Subscription %3$s%4$s%5$s could not be found at Stripe. It may have been deleted.', 'paid-memberships-pro'), '<strong>', '</strong>', '<strong>', esc_attr($last_order->subscription_transaction_id), '</strong>' ); ?></p>
694
- <?php
695
  }
696
  } elseif ( true === self::$is_loaded ) {
697
- ?>
698
- <h3><?php _e("Subscription Updates", 'paid-memberships-pro' ); ?></h3>
699
- <p>
700
- <?php
701
- if(empty($_REQUEST['user_id']))
702
- _e("Subscription updates, allow you to change the member's subscription values at predefined times. Be sure to click Update Profile after making changes.", 'paid-memberships-pro' );
703
- else
704
- _e("Subscription updates, allow you to change the member's subscription values at predefined times. Be sure to click Update User after making changes.", 'paid-memberships-pro' );
705
  ?>
706
- </p>
707
- <table class="form-table">
708
- <tr>
709
- <th><label for="membership_level"><?php _e("Update", 'paid-memberships-pro' ); ?></label></th>
710
- <td id="updates_td">
711
- <?php
 
 
 
 
 
 
 
 
 
712
  $old_updates = $user->pmpro_stripe_updates;
713
- if(is_array($old_updates))
714
- {
715
  $updates = array_merge(
716
- array(array('template'=>true, 'when'=>'now', 'date_month'=>'', 'date_day'=>'', 'date_year'=>'', 'billing_amount'=>'', 'cycle_number'=>'', 'cycle_period'=>'Month')),
 
 
 
 
 
 
 
 
 
 
 
717
  $old_updates
718
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
719
  }
720
- else
721
- $updates = array(array('template'=>true, 'when'=>'now', 'date_month'=>'', 'date_day'=>'', 'date_year'=>'', 'billing_amount'=>'', 'cycle_number'=>'', 'cycle_period'=>'Month'));
722
 
723
- foreach($updates as $update)
724
- {
725
- ?>
726
- <div class="updates_update" <?php if(!empty($update['template'])) { ?>style="display: none;"<?php } ?>>
727
- <select class="updates_when" name="updates_when[]">
728
- <option value="now" <?php selected($update['when'], "now");?>>Now</option>
729
- <option value="payment" <?php selected($update['when'], "payment");?>>After Next Payment</option>
730
- <option value="date" <?php selected($update['when'], "date");?>>On Date</option>
731
- </select>
732
- <span class="updates_date" <?php if($update['when'] != "date") { ?>style="display: none;"<?php } ?>>
 
 
 
 
733
  <select name="updates_date_month[]">
734
  <?php
735
- for($i = 1; $i < 13; $i++)
736
- {
737
  ?>
738
- <option value="<?php echo str_pad($i, 2, "0", STR_PAD_LEFT);?>" <?php if(!empty($update['date_month']) && $update['date_month'] == $i) { ?>selected="selected"<?php } ?>>
739
- <?php echo date_i18n("M", strtotime($i . "/1/" . $current_year));?>
 
740
  </option>
741
  <?php
742
- }
743
  ?>
744
  </select>
745
- <input name="updates_date_day[]" type="text" size="2" value="<?php if(!empty($update['date_day'])) echo esc_attr($update['date_day']);?>" />
746
- <input name="updates_date_year[]" type="text" size="4" value="<?php if(!empty($update['date_year'])) echo esc_attr($update['date_year']);?>" />
 
 
 
 
 
 
747
  </span>
748
- <span class="updates_billing" <?php if($update['when'] == "now") { ?>style="display: none;"<?php } ?>>
749
- <?php echo $pmpro_currency_symbol?><input name="updates_billing_amount[]" type="text" size="10" value="<?php echo esc_attr($update['billing_amount']);?>" />
750
- <small><?php _e('per', 'paid-memberships-pro' );?></small>
751
- <input name="updates_cycle_number[]" type="text" size="5" value="<?php echo esc_attr($update['cycle_number']);?>" />
 
 
 
 
752
  <select name="updates_cycle_period[]">
753
  <?php
754
- foreach ( $cycles as $name => $value ) {
755
  echo "<option value='$value'";
756
- if(!empty($update['cycle_period']) && $update['cycle_period'] == $value) echo " selected='selected'";
 
 
757
  echo ">$name</option>";
758
- }
759
  ?>
760
  </select>
761
  </span>
762
- <span>
763
  <a class="updates_remove" href="javascript:void(0);">Remove</a>
764
  </span>
765
- </div>
766
- <?php
767
  }
768
  ?>
769
- <p><a id="updates_new_update" href="javascript:void(0);">+ New Update</a></p>
770
- </td>
771
- </tr>
772
- </table>
773
- <script>
774
- <!--
775
- jQuery(document).ready(function() {
776
- //function to update dropdowns/etc based on when field
777
- function updateSubscriptionUpdateFields(when)
778
- {
779
- if(jQuery(when).val() == 'date')
780
- jQuery(when).parent().children('.updates_date').show();
781
- else
782
- jQuery(when).parent().children('.updates_date').hide();
783
-
784
- if(jQuery(when).val() == 'no')
785
- jQuery(when).parent().children('.updates_billing').hide();
786
- else
787
- jQuery(when).parent().children('.updates_billing').show();
788
- }
789
-
790
- //and update on page load
791
- jQuery('.updates_when').each(function() { if(jQuery(this).parent().css('display') != 'none') updateSubscriptionUpdateFields(this); });
792
-
793
- //add a new update when clicking to
794
- var num_updates_divs = <?php echo count($updates);?>;
795
- jQuery('#updates_new_update').click(function() {
796
- //get updates
797
- updates = jQuery('.updates_update').toArray();
798
-
799
- //clone the first one
800
- new_div = jQuery(updates[0]).clone();
801
-
802
- //append
803
- new_div.insertBefore('#updates_new_update');
804
-
805
- //update events
806
- addUpdateEvents()
807
-
808
- //unhide it
809
- new_div.show();
810
- updateSubscriptionUpdateFields(new_div.children('.updates_when'));
811
- });
812
-
813
- function addUpdateEvents()
814
- {
815
- //update when when changes
816
- jQuery('.updates_when').change(function() {
817
- updateSubscriptionUpdateFields(this);
818
- });
819
-
820
- //remove updates when clicking
821
- jQuery('.updates_remove').click(function() {
822
- jQuery(this).parent().parent().remove();
823
- });
824
- }
825
- addUpdateEvents();
826
- });
827
- -->
828
- </script>
829
- <?php
 
830
  }
831
  }
832
 
@@ -835,58 +831,61 @@ class PMProGateway_stripe extends PMProGateway
835
  *
836
  * @since 1.8
837
  */
838
- static function user_profile_fields_save($user_id) {
839
  global $wpdb;
840
 
841
  //check capabilities
842
- $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
843
- if(!current_user_can($membership_level_capability))
844
  return false;
 
845
 
846
  //make sure some value was passed
847
- if(!isset($_POST['updates_when']) || !is_array($_POST['updates_when']))
848
  return;
 
849
 
850
  //vars
851
- $updates = array();
852
  $next_on_date_update = "";
853
 
854
  //build array of updates (we skip the first because it's the template field for the JavaScript
855
- for($i = 1; $i < count($_POST['updates_when']); $i++)
856
- {
857
  $update = array();
858
 
859
  //all updates have these values
860
- $update['when'] = pmpro_sanitize_with_safelist($_POST['updates_when'][$i], array('now', 'payment', 'date'));
861
- $update['billing_amount'] = sanitize_text_field($_POST['updates_billing_amount'][$i]);
862
- $update['cycle_number'] = intval($_POST['updates_cycle_number'][$i]);
863
- $update['cycle_period'] = sanitize_text_field($_POST['updates_cycle_period'][$i]);
 
 
 
 
864
 
865
  //these values only for on date updates
866
- if($_POST['updates_when'][$i] == "date")
867
- {
868
- $update['date_month'] = str_pad(intval($_POST['updates_date_month'][$i]), 2, "0", STR_PAD_LEFT);
869
- $update['date_day'] = str_pad(intval($_POST['updates_date_day'][$i]), 2, "0", STR_PAD_LEFT);
870
- $update['date_year'] = intval($_POST['updates_date_year'][$i]);
871
  }
872
 
873
  //make sure the update is valid
874
- if(empty($update['cycle_number']))
875
  continue;
 
876
 
877
  //if when is now, update the subscription
878
- if($update['when'] == "now")
879
- {
880
- PMProGateway_stripe::updateSubscription($update, $user_id);
881
 
882
  continue;
883
- }
884
- elseif($update['when'] == 'date')
885
- {
886
- if(!empty($next_on_date_update))
887
- $next_on_date_update = min($next_on_date_update, $update['date_year'] . "-" . $update['date_month'] . "-" . $update['date_day']);
888
- else
889
  $next_on_date_update = $update['date_year'] . "-" . $update['date_month'] . "-" . $update['date_day'];
 
890
  }
891
 
892
  //add to array
@@ -894,10 +893,10 @@ class PMProGateway_stripe extends PMProGateway
894
  }
895
 
896
  //save in user meta
897
- update_user_meta($user_id, "pmpro_stripe_updates", $updates);
898
 
899
  //save date of next on-date update to make it easier to query for these in cron job
900
- update_user_meta($user_id, "pmpro_stripe_next_on_date_update", $next_on_date_update);
901
  }
902
 
903
  /**
@@ -906,7 +905,7 @@ class PMProGateway_stripe extends PMProGateway
906
  * @since 1.8
907
  */
908
  static function pmpro_activation() {
909
- pmpro_maybe_schedule_event(time(), 'daily', 'pmpro_cron_stripe_subscription_updates');
910
  }
911
 
912
  /**
@@ -915,7 +914,7 @@ class PMProGateway_stripe extends PMProGateway
915
  * @since 1.8
916
  */
917
  static function pmpro_deactivation() {
918
- wp_clear_scheduled_hook('pmpro_cron_stripe_subscription_updates');
919
  }
920
 
921
  /**
@@ -932,53 +931,54 @@ class PMProGateway_stripe extends PMProGateway
932
  WHERE meta_key = 'pmpro_stripe_next_on_date_update'
933
  AND meta_value IS NOT NULL
934
  AND meta_value <> ''
935
- AND meta_value < '" . date_i18n("Y-m-d", strtotime("+1 day", current_time('timestamp'))) . "'";
936
- $updates = $wpdb->get_results($sqlQuery);
937
 
938
- if(!empty($updates)) {
939
  //loop through
940
- foreach($updates as $update) {
941
  //pull values from update
942
  $user_id = $update->user_id;
943
 
944
- $user = get_userdata($user_id);
945
 
946
  //if user is missing, delete the update info and continue
947
- if(empty($user) || empty($user->ID)) {
948
- delete_user_meta($user_id, "pmpro_stripe_updates");
949
- delete_user_meta($user_id, "pmpro_stripe_next_on_date_update");
950
 
951
  continue;
952
  }
953
 
954
- $user_updates = $user->pmpro_stripe_updates;
955
  $next_on_date_update = "";
956
 
957
  //loop through updates looking for updates happening today or earlier
958
- if(!empty($user_updates)) {
959
- foreach($user_updates as $key => $ud) {
960
- if($ud['when'] == 'date' &&
961
- $ud['date_year'] . "-" . $ud['date_month'] . "-" . $ud['date_day'] <= date_i18n("Y-m-d", current_time('timestamp') )
962
  ) {
963
- PMProGateway_stripe::updateSubscription($ud, $user_id);
964
 
965
  //remove update from list
966
- unset($user_updates[$key]);
967
- } elseif($ud['when'] == 'date') {
968
  //this is an on date update for the future, update the next on date update
969
- if(!empty($next_on_date_update))
970
- $next_on_date_update = min($next_on_date_update, $ud['date_year'] . "-" . $ud['date_month'] . "-" . $ud['date_day']);
971
- else
972
  $next_on_date_update = $ud['date_year'] . "-" . $ud['date_month'] . "-" . $ud['date_day'];
 
973
  }
974
  }
975
  }
976
 
977
  //save updates in case we removed some
978
- update_user_meta($user_id, "pmpro_stripe_updates", $user_updates);
979
 
980
  //save date of next on-date update to make it easier to query for these in cron job
981
- update_user_meta($user_id, "pmpro_stripe_next_on_date_update", $next_on_date_update);
982
  }
983
  }
984
  }
@@ -993,7 +993,7 @@ class PMProGateway_stripe extends PMProGateway
993
  global $wpdb, $current_user;
994
 
995
  // we're only worried about cases where the user is logged in
996
- if( ! is_user_logged_in() ) {
997
  return;
998
  }
999
 
@@ -1006,51 +1006,57 @@ class PMProGateway_stripe extends PMProGateway
1006
  //check the $pmpro_cancel_previous_subscriptions filter
1007
  //this is used in add ons like Gift Memberships to stop PMPro from cancelling old memberships
1008
  $pmpro_cancel_previous_subscriptions = true;
1009
- $pmpro_cancel_previous_subscriptions = apply_filters( 'pmpro_cancel_previous_subscriptions', $pmpro_cancel_previous_subscriptions );
1010
- if( ! $pmpro_cancel_previous_subscriptions ) {
1011
  return;
1012
  }
1013
 
1014
  //get user and membership level
1015
- $membership_level = pmpro_getMembershipLevelForUser($current_user->ID);
1016
 
1017
  //no level, then probably no subscription at Stripe anymore
1018
- if(empty($membership_level))
1019
  return;
 
1020
 
1021
  /**
1022
  * Filter which levels to cancel at the gateway.
1023
  * MMPU will set this to all levels that are going to be cancelled during this checkout.
1024
  * Others may want to display this by add_filter('pmpro_stripe_levels_to_cancel_before_checkout', __return_false);
1025
  */
1026
- $levels_to_cancel = apply_filters('pmpro_stripe_levels_to_cancel_before_checkout', array($membership_level->id), $current_user);
1027
 
1028
- foreach($levels_to_cancel as $level_to_cancel) {
1029
  //get the last order for this user/level
1030
  $last_order = new MemberOrder();
1031
- $last_order->getLastMemberOrder($current_user->ID, 'success', $level_to_cancel, 'stripe');
1032
 
1033
  //so let's cancel the user's susbcription
1034
- if(!empty($last_order) && !empty($last_order->subscription_transaction_id)) {
1035
- $subscription = $last_order->Gateway->getSubscription($last_order);
1036
- if(!empty($subscription)) {
1037
- $last_order->Gateway->cancelSubscriptionAtGateway($subscription, true);
1038
 
1039
  //Stripe was probably going to cancel this subscription 7 days past the payment failure (maybe just one hour, use a filter for sure)
1040
- $memberships_users_row = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $current_user->ID . "' AND membership_id = '" . $level_to_cancel . "' AND status = 'active' LIMIT 1");
1041
 
1042
- if(!empty($memberships_users_row) && (empty($memberships_users_row->enddate) || $memberships_users_row->enddate == '0000-00-00 00:00:00')) {
1043
  /**
1044
  * Filter graced period days when canceling existing subscriptions at checkout.
1045
  *
1046
- * @since 1.9.4
1047
- *
1048
  * @param int $days Grace period defaults to 3 days
1049
  * @param object $membership Membership row from pmpro_memberships_users including membership_id, user_id, and enddate
 
 
 
1050
  */
1051
- $days_grace = apply_filters('pmpro_stripe_days_grace_when_canceling_existing_subscriptions_at_checkout', 3, $memberships_users_row);
1052
- $new_enddate = date('Y-m-d H:i:s', current_time('timestamp')+3600*24*$days_grace);
1053
- $wpdb->update( $wpdb->pmpro_memberships_users, array('enddate'=>$new_enddate), array('user_id'=>$current_user->ID, 'membership_id'=>$level_to_cancel, 'status'=>'active'), array('%s'), array('%d', '%d', '%s') );
 
 
 
 
1054
  }
1055
  }
1056
  }
@@ -1059,45 +1065,32 @@ class PMProGateway_stripe extends PMProGateway
1059
 
1060
  /**
1061
  * Process checkout and decide if a charge and or subscribe is needed
1062
- *
1063
  * @since 1.4
1064
  */
1065
- function process(&$order) {
1066
- //check for initial payment
1067
- if(floatval($order->InitialPayment) == 0) {
1068
- //just subscribe
1069
- return $this->subscribe($order);
1070
- } else {
1071
- //charge then subscribe
1072
- if($this->charge($order)) {
1073
- if(pmpro_isLevelRecurring($order->membership_level)) {
1074
- if($this->subscribe($order)) {
1075
- //yay!
1076
- return true;
1077
- } else {
1078
- //try to refund initial charge
1079
- return false;
1080
- }
1081
- } else {
1082
- //only a one time charge
1083
- $order->status = "success"; //saved on checkout page
1084
- return true;
1085
- }
1086
- } else {
1087
- if(empty($order->error)) {
1088
- if ( ! self::$is_loaded ) {
1089
-
1090
- $order->error = __( "Payment error: Please contact the webmaster (stripe-load-error)", 'paid-memberships-pro' );
1091
-
1092
- } else {
1093
-
1094
- $order->error = __( "Unknown error: Initial payment failed.", 'paid-memberships-pro' );
1095
- }
1096
- }
1097
 
 
 
 
 
 
1098
  return false;
1099
  }
1100
  }
 
 
 
 
 
 
1101
  }
1102
 
1103
  /**
@@ -1105,64 +1098,70 @@ class PMProGateway_stripe extends PMProGateway
1105
  *
1106
  * @since 1.4
1107
  */
1108
- function charge(&$order) {
1109
  global $pmpro_currency, $pmpro_currencies;
1110
  $currency_unit_multiplier = 100; //ie 100 cents per USD
1111
 
1112
  //account for zero-decimal currencies like the Japanese Yen
1113
- if(is_array($pmpro_currencies[$pmpro_currency]) && isset($pmpro_currencies[$pmpro_currency]['decimals']) && $pmpro_currencies[$pmpro_currency]['decimals'] == 0) {
1114
  $currency_unit_multiplier = 1;
1115
- }
1116
 
1117
  //create a code for the order
1118
- if(empty($order->code)) {
1119
- $order->code = $order->getRandomCode();
1120
- }
 
1121
 
1122
  //what amount to charge?
1123
  $amount = $order->InitialPayment;
1124
 
1125
  //tax
1126
  $order->subtotal = $amount;
1127
- $tax = $order->getTax(true);
1128
- $amount = pmpro_round_price((float)$order->subtotal + (float)$tax);
 
1129
 
1130
  //create a customer
1131
- $result = $this->getCustomer($order);
1132
 
1133
- if(empty($result)) {
1134
  //failed to create customer
1135
  return false;
1136
  }
1137
 
 
1138
  //charge
1139
  try {
1140
- $response = Stripe_Charge::create(array(
1141
- "amount" => $amount * $currency_unit_multiplier, # amount in cents, again
1142
- "currency" => strtolower($pmpro_currency),
1143
- "customer" => $this->customer->id,
1144
- "description" => apply_filters('pmpro_stripe_order_description', "Order #" . $order->code . ", " . trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")", $order)
1145
- )
1146
  );
1147
- } catch (Exception $e) {
1148
  //$order->status = "error";
1149
- $order->errorcode = true;
1150
- $order->error = "Error: " . $e->getMessage();
1151
  $order->shorterror = $order->error;
 
1152
  return false;
1153
  }
1154
 
1155
- if(empty($response["failure_message"])) {
1156
  //successful charge
1157
  $order->payment_transaction_id = $response["id"];
1158
- $order->updateStatus("success");
1159
  $order->saveOrder();
 
1160
  return true;
1161
  } else {
1162
  //$order->status = "error";
1163
- $order->errorcode = true;
1164
- $order->error = $response['failure_message'];
1165
  $order->shorterror = $response['failure_message'];
 
1166
  return false;
1167
  }
1168
  }
@@ -1177,170 +1176,200 @@ class PMProGateway_stripe extends PMProGateway
1177
  * If a customer is found and there is a stripeToken on the order passed, it will update the customer.
1178
  * If no customer is found and there is a stripeToken on the order passed, it will create a customer.
1179
  *
1180
- * @since 1.4
1181
  * @return Stripe_Customer|false
 
1182
  */
1183
- function getCustomer(&$order = false, $force = false) {
1184
  global $current_user;
1185
 
1186
  //already have it?
1187
- if(!empty($this->customer) && !$force) {
1188
  return $this->customer;
1189
- }
 
 
 
 
 
1190
 
1191
  //figure out user_id and user
1192
- if(!empty($order->user_id)) {
1193
- $user_id = $order->user_id;
1194
- }
1195
 
1196
  //if no id passed, check the current user
1197
- if(empty($user_id) && !empty($current_user->ID)) {
1198
- $user_id = $current_user->ID;
1199
- }
1200
 
1201
- if(!empty($user_id)) {
1202
- $user = get_userdata($user_id);
1203
  } else {
1204
- $user = NULL;
1205
- }
1206
 
1207
  //transaction id?
1208
- if(!empty($order->subscription_transaction_id) && strpos($order->subscription_transaction_id, "cus_") !== false) {
1209
  $customer_id = $order->subscription_transaction_id;
1210
  } else {
1211
  //try based on user id
1212
- if(!empty($user_id)) {
1213
- $customer_id = get_user_meta($user_id, "pmpro_stripe_customerid", true);
1214
  }
1215
 
1216
  //look up by transaction id
1217
- if(empty($customer_id) && !empty($user_id)) {
1218
- //user id from this order or the user's last stripe order
1219
- if(!empty($order->payment_transaction_id)) {
1220
  $payment_transaction_id = $order->payment_transaction_id;
1221
  } else {
1222
  //find the user's last stripe order
1223
  $last_order = new MemberOrder();
1224
- $last_order->getLastMemberOrder($user_id, array('success', 'cancelled'), NULL, 'stripe', $order->Gateway->gateway_environment);
1225
- if(!empty($last_order->payment_transaction_id))
 
 
 
1226
  $payment_transaction_id = $last_order->payment_transaction_id;
 
1227
  }
1228
 
1229
  //we have a transaction id to look up
1230
- if(!empty($payment_transaction_id)) {
1231
- if(strpos($payment_transaction_id, "ch_") !== false) {
1232
  //charge, look it up
1233
  try {
1234
- $charge = Stripe_Charge::retrieve($payment_transaction_id);
1235
- } catch( \Exception $exception ) {
1236
  $order->error = sprintf( __( 'Error: %s', 'paid-memberships-pro' ), $exception->getMessage() );
 
1237
  return false;
1238
  }
1239
 
1240
- if(!empty($charge) && !empty($charge->customer))
1241
  $customer_id = $charge->customer;
1242
- } else if(strpos($payment_transaction_id, "in_") !== false) {
 
1243
  //invoice look it up
1244
  try {
1245
- $invoice = Stripe_Invoice::retrieve($payment_transaction_id);
1246
- } catch( \Exception $exception ) {
1247
  $order->error = sprintf( __( 'Error: %s', 'paid-memberships-pro' ), $exception->getMessage() );
 
1248
  return false;
1249
  }
1250
 
1251
- if(!empty($invoice) && !empty($invoice->customer))
1252
  $customer_id = $invoice->customer;
 
1253
  }
1254
  }
1255
 
1256
  //if we found it, save to user meta for future reference
1257
- if(!empty($customer_id)) {
1258
- update_user_meta($user_id, "pmpro_stripe_customerid", $customer_id);
1259
- }
1260
  }
1261
  }
1262
 
1263
  //get name and email values from order in case we update
1264
- if(!empty($order->FirstName) && !empty($order->LastName)) {
1265
- $name = trim($order->FirstName . " " . $order->LastName);
1266
- } elseif(!empty($order->FirstName)) {
1267
  $name = $order->FirstName;
1268
- } elseif(!empty($order->LastName)) {
1269
  $name = $order->LastName;
1270
  }
1271
-
1272
- if(empty($name) && !empty($user->ID)) {
1273
- $name = trim($user->first_name . " " . $user->last_name);
1274
 
1275
  //still empty?
1276
- if(empty($name))
1277
  $name = $user->user_login;
1278
- } elseif(empty($name)) {
 
1279
  $name = "No Name";
1280
  }
1281
-
1282
- if(!empty($order->Email)) {
1283
  $email = $order->Email;
1284
  } else {
1285
  $email = "";
1286
  }
1287
-
1288
- if(empty($email) && !empty($user->ID) && !empty($user->user_email)) {
1289
  $email = $user->user_email;
1290
- } elseif(empty($email)) {
1291
  $email = "No Email";
1292
- }
1293
 
1294
  //check for an existing stripe customer
1295
- if(!empty($customer_id)) {
1296
  try {
1297
- $this->customer = Stripe_Customer::retrieve($customer_id);
1298
-
1299
- //update the customer description and card
1300
- if(!empty($order->stripeToken)) {
1301
  $this->customer->description = $name . " (" . $email . ")";
1302
- $this->customer->email = $email;
1303
- $this->customer->card = $order->stripeToken;
1304
  $this->customer->save();
1305
  }
1306
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1307
  return $this->customer;
1308
- } catch (Exception $e) {
 
1309
  //assume no customer found
1310
  }
1311
  }
1312
 
1313
  //no customer id, create one
1314
- if(!empty($order->stripeToken)) {
1315
  try {
1316
- $this->customer = Stripe_Customer::create(array(
1317
- "description" => $name . " (" . $email . ")",
1318
- "email" => $order->Email,
1319
- "card" => $order->stripeToken
1320
- ));
1321
- } catch (Exception $e) {
1322
- $order->error = __("Error creating customer record with Stripe:", 'paid-memberships-pro' ) . " " . $e->getMessage();
1323
  $order->shorterror = $order->error;
 
1324
  return false;
1325
  }
1326
 
1327
- if(!empty($user_id)) {
1328
  //user logged in/etc
1329
- update_user_meta($user_id, "pmpro_stripe_customerid", $this->customer->id);
1330
  } else {
1331
  //user not registered yet, queue it up
1332
  global $pmpro_stripe_customer_id;
1333
  $pmpro_stripe_customer_id = $this->customer->id;
1334
- if(! function_exists('pmpro_user_register_stripe_customerid')) {
1335
- function pmpro_user_register_stripe_customerid($user_id) {
1336
  global $pmpro_stripe_customer_id;
1337
- update_user_meta($user_id, "pmpro_stripe_customerid", $pmpro_stripe_customer_id);
1338
  }
1339
- add_action("user_register", "pmpro_user_register_stripe_customerid");
 
1340
  }
1341
  }
1342
 
1343
- return apply_filters('pmpro_stripe_create_customer', $this->customer);
1344
  }
1345
 
1346
  return false;
@@ -1351,53 +1380,54 @@ class PMProGateway_stripe extends PMProGateway
1351
  *
1352
  * @since 1.8
1353
  */
1354
- function getSubscription(&$order) {
1355
  global $wpdb;
1356
 
1357
  //no order?
1358
- if(empty($order) || empty($order->code)) {
1359
  return false;
1360
  }
1361
 
1362
- $result = $this->getCustomer($order, true); //force so we don't get a cached sub for someone else
1363
 
1364
  //no customer?
1365
- if(empty($result)) {
 
 
 
 
 
1366
  return false;
1367
- }
1368
 
1369
  //is there a subscription transaction id pointing to a sub?
1370
- if(!empty($order->subscription_transaction_id) && strpos($order->subscription_transaction_id, "sub_") !== false) {
1371
  try {
1372
- $sub = $this->customer->subscriptions->retrieve($order->subscription_transaction_id);
1373
- } catch (Exception $e) {
1374
- $order->error = __("Error getting subscription with Stripe:", 'paid-memberships-pro' ) . $e->getMessage();
1375
  $order->shorterror = $order->error;
 
1376
  return false;
1377
  }
1378
 
1379
  return $sub;
1380
  }
1381
 
1382
- //no subscriptions object in customer
1383
- if(empty($this->customer->subscriptions)) {
1384
- return false;
1385
- }
1386
-
1387
  //find subscription based on customer id and order/plan id
1388
  $subscriptions = $this->customer->subscriptions->all();
1389
 
1390
  //no subscriptions
1391
- if(empty($subscriptions) || empty($subscriptions->data)) {
1392
  return false;
1393
  }
1394
 
1395
  //we really want to test against the order codes of all orders with the same subscription_transaction_id (customer id)
1396
- $codes = $wpdb->get_col("SELECT code FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $order->user_id . "' AND subscription_transaction_id = '" . $order->subscription_transaction_id . "' AND status NOT IN('refunded', 'review', 'token', 'error')");
1397
 
1398
  //find the one for this order
1399
- foreach($subscriptions->data as $sub) {
1400
- if(in_array($sub->plan->id, $codes)) {
1401
  return $sub;
1402
  }
1403
  }
@@ -1411,24 +1441,26 @@ class PMProGateway_stripe extends PMProGateway
1411
  *
1412
  * @since 1.4
1413
  */
1414
- function subscribe(&$order, $checkout = true) {
1415
  global $pmpro_currency, $pmpro_currencies;
1416
 
1417
  $currency_unit_multiplier = 100; //ie 100 cents per USD
1418
 
1419
  //account for zero-decimal currencies like the Japanese Yen
1420
- if(is_array($pmpro_currencies[$pmpro_currency]) && isset($pmpro_currencies[$pmpro_currency]['decimals']) && $pmpro_currencies[$pmpro_currency]['decimals'] == 0)
1421
  $currency_unit_multiplier = 1;
 
1422
 
1423
  //create a code for the order
1424
- if(empty($order->code))
1425
  $order->code = $order->getRandomCode();
 
1426
 
1427
  //filter order before subscription. use with care.
1428
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
1429
 
1430
  //figure out the user
1431
- if(!empty($order->user_id)) {
1432
  $user_id = $order->user_id;
1433
  } else {
1434
  global $current_user;
@@ -1436,157 +1468,163 @@ class PMProGateway_stripe extends PMProGateway
1436
  }
1437
 
1438
  //set up customer
1439
- $result = $this->getCustomer($order);
1440
- if(empty($result)) {
1441
- return false; //error retrieving customer
 
1442
  }
1443
 
1444
- //set subscription id to custom id
1445
- $order->subscription_transaction_id = $this->customer['id']; //transaction id is the customer id, we save it in user meta later too
 
1446
 
1447
  //figure out the amounts
1448
- $amount = $order->PaymentAmount;
1449
- $amount_tax = $order->getTaxForPrice($amount);
1450
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
1451
 
1452
  /*
1453
- There are two parts to the trial. Part 1 is simply the delay until the first payment
1454
- since we are doing the first payment as a separate transaction.
1455
- The second part is the actual "trial" set by the admin.
1456
 
1457
- Stripe only supports Year or Month for billing periods, but we account for Days and Weeks just in case.
1458
- */
1459
  //figure out the trial length (first payment handled by initial charge)
1460
- if($order->BillingPeriod == "Year") {
1461
- $trial_period_days = $order->BillingFrequency * 365; //annual
1462
- } elseif($order->BillingPeriod == "Day") {
1463
- $trial_period_days = $order->BillingFrequency * 1; //daily
1464
- } elseif($order->BillingPeriod == "Week") {
1465
- $trial_period_days = $order->BillingFrequency * 7; //weekly
1466
  } else {
1467
- $trial_period_days = $order->BillingFrequency * 30; //assume monthly
1468
- }
1469
 
1470
  //convert to a profile start date
1471
- $order->ProfileStartDate = date_i18n("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
1472
 
1473
  //filter the start date
1474
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
1475
 
1476
  //convert back to days
1477
- $trial_period_days = ceil(abs(strtotime(date_i18n("Y-m-d"), current_time("timestamp")) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
1478
 
1479
  //for free trials, just push the start date of the subscription back
1480
- if(!empty($order->TrialBillingCycles) && $order->TrialAmount == 0) {
1481
- $trialOccurrences = (int)$order->TrialBillingCycles;
1482
- if($order->BillingPeriod == "Year") {
1483
- $trial_period_days = $trial_period_days + (365 * $order->BillingFrequency * $trialOccurrences); //annual
1484
- } elseif($order->BillingPeriod == "Day") {
1485
- $trial_period_days = $trial_period_days + (1 * $order->BillingFrequency * $trialOccurrences); //daily
1486
- } elseif($order->BillingPeriod == "Week") {
1487
- $trial_period_days = $trial_period_days + (7 * $order->BillingFrequency * $trialOccurrences); //weekly
1488
  } else {
1489
- $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
1490
  }
1491
- } elseif(!empty($order->TrialBillingCycles)) {
1492
  /*
1493
- Let's set the subscription to the trial and give the user an "update" to change the sub later to full price (since v2.0)
1494
 
1495
- This will force TrialBillingCycles > 1 to act as if they were 1
1496
- */
1497
- $new_user_updates = array();
1498
  $new_user_updates[] = array(
1499
- 'when' => 'payment',
1500
  'billing_amount' => $order->PaymentAmount,
1501
- 'cycle_period' => $order->BillingPeriod,
1502
- 'cycle_number' => $order->BillingFrequency
1503
  );
1504
 
1505
  //now amount to equal the trial #s
1506
- $amount = $order->TrialAmount;
1507
- $amount_tax = $order->getTaxForPrice($amount);
1508
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
1509
  }
1510
 
1511
  //create a plan
1512
  try {
1513
  $plan = array(
1514
- "amount" => $amount * $currency_unit_multiplier,
1515
- "interval_count" => $order->BillingFrequency,
1516
- "interval" => strtolower($order->BillingPeriod),
1517
  "trial_period_days" => $trial_period_days,
1518
- "name" => $order->membership_name . " for order " . $order->code,
1519
- "currency" => strtolower($pmpro_currency),
1520
- "id" => $order->code
1521
  );
1522
 
1523
- $plan = Stripe_Plan::create(apply_filters('pmpro_stripe_create_plan_array', $plan));
1524
- } catch (Exception $e) {
1525
- $order->error = __("Error creating plan with Stripe:", 'paid-memberships-pro' ) . $e->getMessage();
1526
  $order->shorterror = $order->error;
 
1527
  return false;
1528
  }
1529
 
1530
- //before subscribing, let's clear out the updates so we don't trigger any during sub
1531
- if(!empty($user_id)) {
1532
- $old_user_updates = get_user_meta($user_id, "pmpro_stripe_updates", true);
1533
- update_user_meta($user_id, "pmpro_stripe_updates", array());
1534
  }
1535
 
1536
- if(empty($order->subscription_transaction_id) && !empty($this->customer['id'])) {
 
1537
  $order->subscription_transaction_id = $this->customer['id'];
1538
  }
1539
 
1540
- //subscribe to the plan
1541
  try {
1542
- $subscription = array("plan" => $order->code);
1543
- $result = $this->customer->subscriptions->create(apply_filters('pmpro_stripe_create_subscription_array', $subscription));
1544
- } catch (Exception $e) {
1545
  //try to delete the plan
1546
  $plan->delete();
1547
 
1548
  //give the user any old updates back
1549
- if(!empty($user_id)) {
1550
- update_user_meta($user_id, "pmpro_stripe_updates", $old_user_updates);
1551
  }
1552
 
1553
  //return error
1554
- $order->error = __("Error subscribing customer to plan with Stripe:", 'paid-memberships-pro' ) . $e->getMessage();
1555
  $order->shorterror = $order->error;
 
1556
  return false;
1557
  }
1558
 
1559
- //delete the plan
1560
- $plan = Stripe_Plan::retrieve($order->code);
1561
  $plan->delete();
1562
 
1563
  //if we got this far, we're all good
1564
- $order->status = "success";
1565
  $order->subscription_transaction_id = $result['id'];
1566
 
1567
  //save new updates if this is at checkout
1568
- if($checkout) {
1569
  //empty out updates unless set above
1570
- if(empty($new_user_updates)) {
1571
  $new_user_updates = array();
1572
  }
1573
 
1574
  //update user meta
1575
- if(!empty($user_id)) {
1576
- update_user_meta($user_id, "pmpro_stripe_updates", $new_user_updates);
1577
  } else {
1578
  //need to remember the user updates to save later
1579
  global $pmpro_stripe_updates;
1580
  $pmpro_stripe_updates = $new_user_updates;
1581
- function pmpro_user_register_stripe_updates($user_id) {
1582
  global $pmpro_stripe_updates;
1583
- update_user_meta($user_id, "pmpro_stripe_updates", $pmpro_stripe_updates);
1584
  }
1585
- add_action("user_register", "pmpro_user_register_stripe_updates");
 
1586
  }
1587
  } else {
1588
  //give them their old updates back
1589
- update_user_meta($user_id, "pmpro_stripe_updates", $old_user_updates);
1590
  }
1591
 
1592
  return true;
@@ -1595,8 +1633,8 @@ class PMProGateway_stripe extends PMProGateway
1595
  /**
1596
  * Helper method to save the subscription ID to make sure the membership doesn't get cancelled by the webhook
1597
  */
1598
- static function ignoreCancelWebhookForThisSubscription($subscription_id, $user_id = NULL) {
1599
- if(empty($user_id)) {
1600
  global $current_user;
1601
  $user_id = $current_user->ID;
1602
  }
@@ -1609,7 +1647,7 @@ class PMProGateway_stripe extends PMProGateway
1609
  }
1610
 
1611
  // Store or update the subscription ID timestamp (for cleanup)
1612
- $preserve[$subscription_id] = current_time( 'timestamp' );
1613
 
1614
  update_user_meta( $user_id, 'pmpro_stripe_dont_cancel', $preserve );
1615
  }
@@ -1617,27 +1655,27 @@ class PMProGateway_stripe extends PMProGateway
1617
  /**
1618
  * Helper method to process a Stripe subscription update
1619
  */
1620
- static function updateSubscription($update, $user_id) {
1621
  global $wpdb;
1622
 
1623
  //get level for user
1624
- $user_level = pmpro_getMembershipLevelForUser($user_id);
1625
 
1626
  //get current plan at Stripe to get payment date
1627
  $last_order = new MemberOrder();
1628
- $last_order->getLastMemberOrder($user_id);
1629
- $last_order->setGateway('stripe');
1630
- $last_order->Gateway->getCustomer($last_order);
1631
 
1632
- $subscription = $last_order->Gateway->getSubscription($last_order);
1633
 
1634
- if(!empty($subscription)) {
1635
  $end_timestamp = $subscription->current_period_end;
1636
 
1637
  //cancel the old subscription
1638
- if(!$last_order->Gateway->cancelSubscriptionAtGateway($subscription, true)) {
1639
  //throw error and halt save
1640
- if ( !function_exists( 'pmpro_stripe_user_profile_fields_save_error' )) {
1641
  //throw error and halt save
1642
  function pmpro_stripe_user_profile_fields_save_error( $errors, $update, $user ) {
1643
  $errors->add( 'pmpro_stripe_updates', __( 'Could not cancel the old subscription. Updates have not been processed.', 'paid-memberships-pro' ) );
@@ -1652,44 +1690,44 @@ class PMProGateway_stripe extends PMProGateway
1652
  }
1653
 
1654
  //if we didn't get an end date, let's set one one cycle out
1655
- if(empty($end_timestamp)) {
1656
- $end_timestamp = strtotime("+" . $update['cycle_number'] . " " . $update['cycle_period'], current_time('timestamp'));
1657
  }
1658
 
1659
  //build order object
1660
  $update_order = new MemberOrder();
1661
- $update_order->setGateway('stripe');
1662
- $update_order->user_id = $user_id;
1663
- $update_order->membership_id = $user_level->id;
1664
- $update_order->membership_name = $user_level->name;
1665
- $update_order->InitialPayment = 0;
1666
- $update_order->PaymentAmount = $update['billing_amount'];
1667
- $update_order->ProfileStartDate = date_i18n("Y-m-d", $end_timestamp);
1668
- $update_order->BillingPeriod = $update['cycle_period'];
1669
  $update_order->BillingFrequency = $update['cycle_number'];
1670
-
1671
  //need filter to reset ProfileStartDate
1672
  $profile_start_date = $update_order->ProfileStartDate;
1673
- add_filter('pmpro_profile_start_date', function( $startdate, $order ) use ( $profile_start_date ) {
1674
  return "{$profile_start_date}T0:0:0";
1675
- }, 10, 2);
1676
 
1677
  //update subscription
1678
- $update_order->Gateway->subscribe($update_order, false);
1679
 
1680
  //update membership
1681
  $sqlQuery = "UPDATE $wpdb->pmpro_memberships_users
1682
- SET billing_amount = '" . esc_sql($update['billing_amount']) . "',
1683
- cycle_number = '" . esc_sql($update['cycle_number']) . "',
1684
- cycle_period = '" . esc_sql($update['cycle_period']) . "',
1685
  trial_amount = '',
1686
  trial_limit = ''
1687
- WHERE user_id = '" . esc_sql($user_id) . "'
1688
- AND membership_id = '" . esc_sql($last_order->membership_id) . "'
1689
  AND status = 'active'
1690
  LIMIT 1";
1691
 
1692
- $wpdb->query($sqlQuery);
1693
 
1694
  //save order so we know which plan to look for at stripe (order code = plan id)
1695
  $update_order->status = "success";
@@ -1701,15 +1739,25 @@ class PMProGateway_stripe extends PMProGateway
1701
  *
1702
  * @since 1.4
1703
  */
1704
- function update(&$order) {
1705
- //we just have to run getCustomer which will look for the customer and update it with the new token
1706
- $result = $this->getCustomer($order);
1707
 
1708
- if(!empty($result)) {
1709
- return true;
1710
- } else {
1711
- return false; //couldn't find the customer
 
 
 
 
 
 
 
 
 
1712
  }
 
 
 
1713
  }
1714
 
1715
  /**
@@ -1717,32 +1765,32 @@ class PMProGateway_stripe extends PMProGateway
1717
  *
1718
  * @since 1.4
1719
  */
1720
- function cancel(&$order, $update_status = true) {
1721
  global $pmpro_stripe_event;
1722
 
1723
  //no matter what happens below, we're going to cancel the order in our system
1724
- if($update_status) {
1725
- $order->updateStatus("cancelled");
1726
  }
1727
 
1728
  //require a subscription id
1729
- if(empty($order->subscription_transaction_id)) {
1730
  return false;
1731
- }
1732
 
1733
  //find the customer
1734
- $result = $this->getCustomer($order);
1735
 
1736
- if(!empty($result)) {
1737
  //find subscription with this order code
1738
- $subscription = $this->getSubscription($order);
1739
 
1740
- if(!empty($subscription)
1741
- && ( empty( $pmpro_stripe_event ) || empty( $pmpro_stripe_event->type ) || $pmpro_stripe_event->type != 'customer.subscription.deleted' ) ) {
1742
- if($this->cancelSubscriptionAtGateway($subscription)) {
1743
  //we're okay, going to return true later
1744
  } else {
1745
- $order->error = __("Could not cancel old subscription.", 'paid-memberships-pro' );
1746
  $order->shorterror = $order->error;
1747
 
1748
  return false;
@@ -1750,17 +1798,18 @@ class PMProGateway_stripe extends PMProGateway
1750
  }
1751
 
1752
  /*
1753
- Clear updates for this user. (But not if checking out, we would have already done that.)
1754
- */
1755
- if(empty($_REQUEST['submit-checkout'])) {
1756
- update_user_meta($order->user_id, "pmpro_stripe_updates", array());
1757
  }
1758
 
1759
  return true;
1760
  } else {
1761
- $order->error = __("Could not find the customer.", 'paid-memberships-pro' );
1762
  $order->shorterror = $order->error;
1763
- return false; //no customer found
 
1764
  }
1765
  }
1766
 
@@ -1769,23 +1818,23 @@ class PMProGateway_stripe extends PMProGateway
1769
  *
1770
  * @since 1.8
1771
  */
1772
- function cancelSubscriptionAtGateway($subscription, $preserve_local_membership = false) {
1773
  // Check if a valid sub.
1774
- if( empty( $subscription) || empty( $subscription->id ) ) {
1775
  return false;
1776
  }
1777
 
1778
  // If this is already cancelled, return true.
1779
- if( !empty( $subscription->canceled_at ) ) {
1780
  return true;
1781
  }
1782
 
1783
  // Make sure we get the customer for this subscription.
1784
  $order = new MemberOrder();
1785
- $order->getLastMemberOrderBySubscriptionTransactionID($subscription->id);
1786
 
1787
  // No order?
1788
- if(empty($order)) {
1789
  //lets cancel anyway, but this is suspicious
1790
  $r = $subscription->cancel();
1791
 
@@ -1793,7 +1842,7 @@ class PMProGateway_stripe extends PMProGateway
1793
  }
1794
 
1795
  // Okay have an order, so get customer so we can cancel invoices too
1796
- $this->getCustomer($order);
1797
 
1798
  // Get open invoices.
1799
  $invoices = $this->customer->invoices();
@@ -1802,25 +1851,24 @@ class PMProGateway_stripe extends PMProGateway
1802
  // Found it, cancel it.
1803
  try {
1804
  // Find any open invoices for this subscription and forgive them.
1805
- if(!empty($invoices)) {
1806
- foreach($invoices->data as $invoice) {
1807
- if(!$invoice->closed && $invoice->subscription == $subscription->id) {
1808
- $invoice->closed = true;
1809
- $invoice->save();
1810
  }
1811
  }
1812
  }
1813
 
1814
  // Sometimes we don't want to cancel the local membership when Stripe sends its webhook.
1815
- if($preserve_local_membership) {
1816
- PMProGateway_stripe::ignoreCancelWebhookForThisSubscription($subscription->id, $order->user_id);
1817
  }
1818
 
1819
  // Cancel
1820
  $r = $subscription->cancel();
1821
 
1822
  return true;
1823
- } catch(Exception $e) {
1824
  return false;
1825
  }
1826
  }
@@ -1829,22 +1877,22 @@ class PMProGateway_stripe extends PMProGateway
1829
  * Filter pmpro_next_payment to get date via API if possible
1830
  *
1831
  * @since 1.8.6
1832
- */
1833
- static function pmpro_next_payment($timestamp, $user_id, $order_status) {
1834
  //find the last order for this user
1835
- if(!empty($user_id)) {
1836
  //get last order
1837
  $order = new MemberOrder();
1838
- $order->getLastMemberOrder($user_id, $order_status);
1839
 
1840
  //check if this is a Stripe order with a subscription transaction id
1841
- if(!empty($order->id) && !empty($order->subscription_transaction_id) && $order->gateway == "stripe") {
1842
  //get the subscription and return the current_period end or false
1843
- $subscription = $order->Gateway->getSubscription($order);
1844
 
1845
- if( !empty( $subscription ) ) {
1846
  $customer = $order->Gateway->getCustomer();
1847
- if( ! $customer->delinquent && ! empty ( $subscription->current_period_end ) ) {
1848
  return $subscription->current_period_end;
1849
  } elseif ( $customer->delinquent && ! empty( $subscription->current_period_start ) ) {
1850
  return $subscription->current_period_start;
@@ -1860,53 +1908,57 @@ class PMProGateway_stripe extends PMProGateway
1860
 
1861
  /**
1862
  * Refund a payment or invoice
1863
- * @param object &$order Related PMPro order object.
1864
- * @param string $transaction_id Payment or Invoice id to void.
 
 
1865
  * @return bool True or false if the void worked
1866
  */
1867
- function void(&$order, $transaction_id = null) {
1868
  //stripe doesn't differentiate between voids and refunds, so let's just pass on to the refund function
1869
- return $this->refund($order, $transaction_id);
1870
  }
1871
 
1872
  /**
1873
  * Refund a payment or invoice
1874
- * @param object &$order Related PMPro order object.
1875
- * @param string $transaction_id Payment or invoice id to void.
 
 
1876
  * @return bool True or false if the refund worked.
1877
  */
1878
- function refund(&$order, $transaction_id = NULL) {
1879
  //default to using the payment id from the order
1880
- if(empty($transaction_id) && !empty($order->payment_transaction_id)) {
1881
  $transaction_id = $order->payment_transaction_id;
1882
  }
1883
 
1884
  //need a transaction id
1885
- if(empty($transaction_id)) {
1886
  return false;
1887
  }
1888
 
1889
  //if an invoice ID is passed, get the charge/payment id
1890
- if(strpos($transaction_id, "in_") !== false) {
1891
- $invoice = Stripe_Invoice::retrieve($transaction_id);
1892
 
1893
- if(!empty($invoice) && !empty($invoice->charge)) {
1894
  $transaction_id = $invoice->charge;
1895
  }
1896
  }
1897
 
1898
  //get the charge
1899
  try {
1900
- $charge = Stripe_Charge::retrieve($transaction_id);
1901
- } catch (Exception $e) {
1902
  $charge = false;
1903
  }
1904
 
1905
  //can't find the charge?
1906
- if(empty($charge)) {
1907
- $order->status = "error";
1908
- $order->errorcode = "";
1909
- $order->error = "";
1910
  $order->shorterror = "";
1911
 
1912
  return false;
@@ -1915,26 +1967,506 @@ class PMProGateway_stripe extends PMProGateway
1915
  //attempt refund
1916
  try {
1917
  $refund = $charge->refund();
1918
- } catch (Exception $e) {
1919
  //$order->status = "error";
1920
- $order->errorcode = true;
1921
- $order->error = __("Error: ", 'paid-memberships-pro' ) . $e->getMessage();
1922
  $order->shorterror = $order->error;
 
1923
  return false;
1924
  }
1925
 
1926
- if($refund->status == "succeeded") {
1927
  $order->status = "refunded";
1928
  $order->saveOrder();
1929
 
1930
  return true;
1931
- } else {
1932
- $order->status = "error";
1933
- $order->errorcode = true;
1934
- $order->error = sprintf(__("Error: Unkown error while refunding charge #%s", 'paid-memberships-pro' ), $transaction_id);
1935
  $order->shorterror = $order->error;
1936
 
1937
  return false;
1938
  }
1939
  }
1940
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  use Stripe\Invoice as Stripe_Invoice;
5
  use Stripe\Plan as Stripe_Plan;
6
  use Stripe\Charge as Stripe_Charge;
7
+ use Stripe\PaymentIntent as Stripe_PaymentIntent;
8
+ use Stripe\SetupIntent as Stripe_SetupIntent;
9
+ use Stripe\Source as Stripe_Source;
10
+ use Stripe\PaymentMethod as Stripe_PaymentMethod;
11
+ use Stripe\Subscription as Stripe_Subscription;
12
 
13
+ define( "PMPRO_STRIPE_API_VERSION", "2019-05-16" );
14
 
15
  //include pmprogateway
16
+ require_once( dirname( __FILE__ ) . "/class.pmprogateway.php" );
17
 
18
  //load classes init method
19
+ add_action( 'init', array( 'PMProGateway_stripe', 'init' ) );
20
 
21
  // loading plugin activation actions
22
+ add_action( 'activate_paid-memberships-pro', array( 'PMProGateway_stripe', 'pmpro_activation' ) );
23
+ add_action( 'deactivate_paid-memberships-pro', array( 'PMProGateway_stripe', 'pmpro_deactivation' ) );
24
 
25
  /**
26
  * PMProGateway_stripe Class
29
  *
30
  * @since 1.4
31
  */
32
+ class PMProGateway_stripe extends PMProGateway {
 
33
  /**
34
  * @var bool Is the Stripe/PHP Library loaded
35
  */
36
  private static $is_loaded = false;
37
+
38
  /**
39
  * Stripe Class Constructor
40
  *
41
  * @since 1.4
42
  */
43
+ function __construct( $gateway = null ) {
44
+ $this->gateway = $gateway;
45
+ $this->gateway_environment = pmpro_getOption( "gateway_environment" );
46
 
47
+ if ( true === $this->dependencies() ) {
48
  $this->loadStripeLibrary();
49
+ Stripe\Stripe::setApiKey( pmpro_getOption( "stripe_secretkey" ) );
50
  Stripe\Stripe::setAPIVersion( PMPRO_STRIPE_API_VERSION );
51
  self::$is_loaded = true;
52
  }
64
  public static function dependencies() {
65
  global $msg, $msgt, $pmpro_stripe_error;
66
 
67
+ if ( version_compare( PHP_VERSION, '5.3.29', '<' ) ) {
68
 
69
  $pmpro_stripe_error = true;
70
+ $msg = - 1;
71
+ $msgt = sprintf( __( "The Stripe Gateway requires PHP 5.3.29 or greater. We recommend upgrading to PHP %s or greater. Ask your host to upgrade.", "paid-memberships-pro" ), PMPRO_PHP_MIN_VERSION );
72
 
73
+ if ( ! is_admin() ) {
74
  pmpro_setMessage( $msgt, "pmpro_error" );
75
  }
76
 
79
 
80
  $modules = array( 'curl', 'mbstring', 'json' );
81
 
82
+ foreach ( $modules as $module ) {
83
+ if ( ! extension_loaded( $module ) ) {
84
  $pmpro_stripe_error = true;
85
+ $msg = - 1;
86
+ $msgt = sprintf( __( "The %s gateway depends on the %s PHP extension. Please enable it, or ask your hosting provider to enable it.", 'paid-memberships-pro' ), 'Stripe', $module );
87
 
88
  //throw error on checkout page
89
+ if ( ! is_admin() ) {
90
+ pmpro_setMessage( $msgt, 'pmpro_error' );
91
+ }
92
 
93
  return false;
94
  }
95
  }
96
 
97
  self::$is_loaded = true;
98
+
99
  return true;
100
  }
101
 
107
  */
108
  function loadStripeLibrary() {
109
  //load Stripe library if it hasn't been loaded already (usually by another plugin using Stripe)
110
+ if ( ! class_exists( "Stripe\Stripe" ) ) {
111
  require_once( PMPRO_DIR . "/includes/lib/Stripe/init.php" );
112
  }
113
  }
119
  */
120
  static function init() {
121
  //make sure Stripe is a gateway option
122
+ add_filter( 'pmpro_gateways', array( 'PMProGateway_stripe', 'pmpro_gateways' ) );
123
 
124
  //add fields to payment settings
125
+ add_filter( 'pmpro_payment_options', array( 'PMProGateway_stripe', 'pmpro_payment_options' ) );
126
+ add_filter( 'pmpro_payment_option_fields', array(
127
+ 'PMProGateway_stripe',
128
+ 'pmpro_payment_option_fields'
129
+ ), 10, 2 );
130
 
131
  //add some fields to edit user page (Updates)
132
+ add_action( 'pmpro_after_membership_level_profile_fields', array(
133
+ 'PMProGateway_stripe',
134
+ 'user_profile_fields'
135
+ ) );
136
+ add_action( 'profile_update', array( 'PMProGateway_stripe', 'user_profile_fields_save' ) );
137
 
138
  //old global RE showing billing address or not
139
  global $pmpro_stripe_lite;
140
+ $pmpro_stripe_lite = apply_filters( "pmpro_stripe_lite", ! pmpro_getOption( "stripe_billingaddress" ) ); //default is oposite of the stripe_billingaddress setting
141
+ add_filter( 'pmpro_required_billing_fields', array( 'PMProGateway_stripe', 'pmpro_required_billing_fields' ) );
142
 
143
  //updates cron
144
+ add_action( 'pmpro_cron_stripe_subscription_updates', array(
145
+ 'PMProGateway_stripe',
146
+ 'pmpro_cron_stripe_subscription_updates'
147
+ ) );
148
 
149
  /*
150
+ Filter pmpro_next_payment to get actual value
151
+ via the Stripe API. This is disabled by default
152
+ for performance reasons, but you can enable it
153
+ by copying this line into a custom plugin or
154
+ your active theme's functions.php and uncommenting
155
+ it there.
156
+ */
157
  //add_filter('pmpro_next_payment', array('PMProGateway_stripe', 'pmpro_next_payment'), 10, 3);
158
 
159
  //code to add at checkout if Stripe is the current gateway
160
+ $default_gateway = pmpro_getOption( 'gateway' );
161
  $current_gateway = pmpro_getGateway();
162
 
163
+ if ( ( $default_gateway == "stripe" || $current_gateway == "stripe" ) && empty( $_REQUEST['review'] ) ) //$_REQUEST['review'] means the PayPal Express review page
164
  {
165
+ add_action( 'pmpro_after_checkout_preheader', array(
166
+ 'PMProGateway_stripe',
167
+ 'pmpro_checkout_after_preheader'
168
+ ) );
169
+ add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ) );
170
+ add_filter( 'pmpro_checkout_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) );
171
+ add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) );
172
+ add_filter( 'pmpro_include_billing_address_fields', array(
173
+ 'PMProGateway_stripe',
174
+ 'pmpro_include_billing_address_fields'
175
+ ) );
176
+ add_filter( 'pmpro_include_cardtype_field', array(
177
+ 'PMProGateway_stripe',
178
+ 'pmpro_include_billing_address_fields'
179
+ ) );
180
+ add_filter( 'pmpro_include_payment_information_fields', array(
181
+ 'PMProGateway_stripe',
182
+ 'pmpro_include_payment_information_fields'
183
+ ) );
184
+
185
  //make sure we clean up subs we will be cancelling after checkout before processing
186
+ add_action( 'pmpro_checkout_before_processing', array(
187
+ 'PMProGateway_stripe',
188
+ 'pmpro_checkout_before_processing'
189
+ ) );
190
  }
191
 
192
  add_action( 'init', array( 'PMProGateway_stripe', 'pmpro_clear_saved_subscriptions' ) );
205
  $preserve = get_user_meta( $current_user->ID, 'pmpro_stripe_dont_cancel', true );
206
 
207
  // Clean up the subscription timeout values (if applicable)
208
+ if ( ! empty( $preserve ) ) {
209
 
210
  foreach ( $preserve as $sub_id => $timestamp ) {
211
 
224
  *
225
  * @since 1.8
226
  */
227
+ static function pmpro_gateways( $gateways ) {
228
+ if ( empty( $gateways['stripe'] ) ) {
229
+ $gateways['stripe'] = __( 'Stripe', 'paid-memberships-pro' );
230
+ }
231
 
232
  return $gateways;
233
  }
260
  *
261
  * @since 1.8
262
  */
263
+ static function pmpro_payment_options( $options ) {
264
  //get stripe options
265
  $stripe_options = self::getGatewayOptions();
266
 
267
  //merge with others.
268
+ $options = array_merge( $stripe_options, $options );
269
 
270
  return $options;
271
  }
275
  *
276
  * @since 1.8
277
  */
278
+ static function pmpro_payment_option_fields( $values, $gateway ) {
279
+ ?>
280
+ <tr class="pmpro_settings_divider gateway gateway_stripe"
281
+ <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
282
+ <td colspan="2">
283
+ <?php _e( 'Stripe Settings', 'paid-memberships-pro' ); ?>
284
+ </td>
285
+ </tr>
286
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
287
+ <th scope="row" valign="top">
288
+ <label for="stripe_publishablekey"><?php _e( 'Publishable Key', 'paid-memberships-pro' ); ?>:</label>
289
+ </th>
290
+ <td>
291
+ <input type="text" id="stripe_publishablekey" name="stripe_publishablekey" size="60"
292
+ value="<?php echo esc_attr( $values['stripe_publishablekey'] ) ?>"/>
 
 
 
293
  <?php
294
+ $public_key_prefix = substr( $values['stripe_publishablekey'], 0, 3 );
295
+ if ( ! empty( $values['stripe_publishablekey'] ) && $public_key_prefix != 'pk_' ) {
296
+ ?>
297
+ <br/><small
298
+ class="pmpro_message pmpro_error"><?php _e( 'Your Publishable Key appears incorrect.', 'paid-memberships-pro' ); ?></small>
299
+ <?php
300
  }
301
+ ?>
302
+ </td>
303
+ </tr>
304
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
305
+ <th scope="row" valign="top">
306
+ <label for="stripe_secretkey"><?php _e( 'Secret Key', 'paid-memberships-pro' ); ?>:</label>
307
+ </th>
308
+ <td>
309
+ <input type="text" id="stripe_secretkey" name="stripe_secretkey" size="60"
310
+ value="<?php echo esc_attr( $values['stripe_secretkey'] ) ?>"/>
311
+ </td>
312
+ </tr>
313
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
314
+ <th scope="row" valign="top">
315
+ <label for="stripe_billingaddress"><?php _e( 'Show Billing Address Fields', 'paid-memberships-pro' ); ?>
316
+ :</label>
317
+ </th>
318
+ <td>
319
+ <select id="stripe_billingaddress" name="stripe_billingaddress">
320
+ <option value="0"
321
+ <?php if ( empty( $values['stripe_billingaddress'] ) ) { ?>selected="selected"<?php } ?>><?php _e( 'No', 'paid-memberships-pro' ); ?></option>
322
+ <option value="1"
323
+ <?php if ( ! empty( $values['stripe_billingaddress'] ) ) { ?>selected="selected"<?php } ?>><?php _e( 'Yes', 'paid-memberships-pro' ); ?></option>
324
+ </select>
325
+ <small><?php _e( "Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page.<br /><strong>If No, make sure you disable address verification in the Stripe dashboard settings.</strong>", 'paid-memberships-pro' ); ?></small>
326
+ </td>
327
+ </tr>
328
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
329
+ <th scope="row" valign="top">
330
+ <label><?php _e( 'Web Hook URL', 'paid-memberships-pro' ); ?>:</label>
331
+ </th>
332
+ <td>
333
+ <p><?php _e( 'To fully integrate with Stripe, be sure to set your Web Hook URL to', 'paid-memberships-pro' ); ?>
334
+ <pre><?php echo admin_url( "admin-ajax.php" ) . "?action=stripe_webhook"; ?></pre>
335
+ </p>
336
+ </td>
337
+ </tr>
338
+
339
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
340
+ <th><?php _e( 'Stripe API Version', 'paid-memberships-pro' ); ?>:</th>
341
+ <td><?php echo PMPRO_STRIPE_API_VERSION; ?></td>
342
+ </tr>
343
+ <?php
344
  }
345
 
346
  /**
348
  *
349
  * @since 1.8
350
  */
351
+ static function pmpro_checkout_after_preheader( $order ) {
 
352
 
353
+ global $gateway, $pmpro_level, $current_user;
354
 
355
+ $default_gateway = pmpro_getOption( "gateway" );
 
 
 
356
 
357
+ if ( ( $gateway == "stripe" || $default_gateway == "stripe" ) && ! pmpro_isLevelFree( $pmpro_level ) ) {
358
+ //stripe js library
359
+ wp_enqueue_script( "stripe", "https://js.stripe.com/v3/", array(), null );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
 
 
 
 
 
 
 
 
 
361
 
362
+ if ( ! function_exists( 'pmpro_stripe_javascript' ) ) {
 
 
 
363
 
364
+ $localize_vars = array(
365
+ 'publishableKey' => pmpro_getOption( 'stripe_publishablekey' ),
366
+ 'verifyAddress' => apply_filters( 'pmpro_stripe_verify_address', pmpro_getOption( 'stripe_billingaddress' ) ),
367
+ 'ajaxUrl' => admin_url( "admin-ajax.php" ),
368
+ 'msgAuthenticationValidated' => __( 'Verification steps confirmed. Your payment is processing.', 'paid-memberships-pro' ),
369
+ );
370
 
371
+ if ( ! empty( $order ) ) {
372
+ if ( ! empty( $order->Gateway->payment_intent ) ) {
373
+ $localize_vars['paymentIntent'] = $order->Gateway->payment_intent;
374
+ }
375
+ if ( ! empty( $order->Gateway->setup_intent ) ) {
376
+ $localize_vars['setupIntent'] = $order->Gateway->setup_intent;
377
+ $localize_vars['subscription'] = $order->Gateway->subscription;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
378
  }
 
 
 
379
  }
380
+
381
+ wp_register_script( 'pmpro_stripe',
382
+ plugins_url( 'js/pmpro-stripe.js', PMPRO_BASE_FILE ),
383
+ array( 'jquery' ),
384
+ PMPRO_VERSION );
385
+ wp_localize_script( 'pmpro_stripe', 'pmproStripe', $localize_vars );
386
+ wp_enqueue_script( 'pmpro_stripe' );
387
  }
388
  }
389
  }
392
  * Don't require the CVV.
393
  * Don't require address fields if they are set to hide.
394
  */
395
+ static function pmpro_required_billing_fields( $fields ) {
396
  global $pmpro_stripe_lite, $current_user, $bemail, $bconfirmemail;
397
 
398
  //CVV is not required if set that way at Stripe. The Stripe JS will require it if it is required.
399
+ unset( $fields['CVV'] );
400
 
401
  //if using stripe lite, remove some fields from the required array
402
+ if ( $pmpro_stripe_lite ) {
403
  //some fields to remove
404
+ $remove = array(
405
+ 'bfirstname',
406
+ 'blastname',
407
+ 'baddress1',
408
+ 'bcity',
409
+ 'bstate',
410
+ 'bzipcode',
411
+ 'bphone',
412
+ 'bcountry',
413
+ 'CardType'
414
+ );
415
  //if a user is logged in, don't require bemail either
416
+ if ( ! empty( $current_user->user_email ) ) {
417
+ $remove[] = 'bemail';
418
+ $bemail = $current_user->user_email;
419
  $bconfirmemail = $bemail;
420
  }
421
  //remove the fields
422
+ foreach ( $remove as $field ) {
423
+ unset( $fields[ $field ] );
424
+ }
425
  }
426
 
427
  return $fields;
432
  *
433
  * @since 1.8
434
  */
435
+ static function pmpro_checkout_order( $morder ) {
436
+
437
+ // Create a code for the order.
438
+ if ( empty( $morder->code ) ) {
439
+ $morder->code = $morder->getRandomCode();
440
+ }
441
+
442
+ // Add the PaymentIntent ID to the order.
443
+ if ( ! empty ( $_REQUEST['payment_intent_id'] ) ) {
444
+ $morder->payment_intent_id = sanitize_text_field( $_REQUEST['payment_intent_id'] );
445
+ }
446
+
447
+ // Add the SetupIntent ID to the order.
448
+ if ( ! empty ( $_REQUEST['setup_intent_id'] ) ) {
449
+ $morder->setup_intent_id = sanitize_text_field( $_REQUEST['setup_intent_id'] );
450
+ }
451
+
452
+ // Add the Subscription ID to the order.
453
+ if ( ! empty ( $_REQUEST['subscription_id'] ) ) {
454
+ $morder->subscription_transaction_id = sanitize_text_field( $_REQUEST['subscription_id'] );
455
+ }
456
+
457
+ // Add the Source ID to the order.
458
+ if ( ! empty ( $_REQUEST['source_id'] ) ) {
459
+ $morder->source_id = sanitize_text_field( $_REQUEST['source_id'] );
460
+ }
461
+
462
+ // Add the PaymentMethod ID to the order.
463
+ if ( ! empty ( $_REQUEST['payment_method_id'] ) ) {
464
+ $morder->payment_method_id = sanitize_text_field( $_REQUEST['payment_method_id'] );
465
+ }
466
+
467
+ // Add the Customer ID to the order.
468
+ if ( empty( $morder->customer_id ) ) {
469
+
470
+ }
471
+ if ( ! empty ( $_REQUEST['customer_id'] ) ) {
472
+ $morder->customer_id = sanitize_text_field( $_REQUEST['customer_id'] );
473
  }
474
 
475
  //stripe lite code to get name from other sources if available
476
  global $pmpro_stripe_lite, $current_user;
477
+ if ( ! empty( $pmpro_stripe_lite ) && empty( $morder->FirstName ) && empty( $morder->LastName ) ) {
478
+ if ( ! empty( $current_user->ID ) ) {
479
+ $morder->FirstName = get_user_meta( $current_user->ID, "first_name", true );
480
+ $morder->LastName = get_user_meta( $current_user->ID, "last_name", true );
481
+ } elseif ( ! empty( $_REQUEST['first_name'] ) && ! empty( $_REQUEST['last_name'] ) ) {
482
+ $morder->FirstName = sanitize_text_field( $_REQUEST['first_name'] );
483
+ $morder->LastName = sanitize_text_field( $_REQUEST['last_name'] );
484
  }
485
  }
486
 
492
  *
493
  * @since 1.8
494
  */
495
+ static function pmpro_after_checkout( $user_id, $morder ) {
496
  global $gateway;
497
 
498
+ if ( $gateway == "stripe" ) {
499
+ if ( self::$is_loaded && ! empty( $morder ) && ! empty( $morder->Gateway ) && ! empty( $morder->Gateway->customer ) && ! empty( $morder->Gateway->customer->id ) ) {
500
+ update_user_meta( $user_id, "pmpro_stripe_customerid", $morder->Gateway->customer->id );
501
  }
502
  }
503
  }
506
  * Check settings if billing address should be shown.
507
  * @since 1.8
508
  */
509
+ static function pmpro_include_billing_address_fields( $include ) {
510
  //check settings RE showing billing address
511
+ if ( ! pmpro_getOption( "stripe_billingaddress" ) ) {
512
  $include = false;
513
+ }
514
 
515
  return $include;
516
  }
519
  * Use our own payment fields at checkout. (Remove the name attributes.)
520
  * @since 1.8
521
  */
522
+ static function pmpro_include_payment_information_fields( $include ) {
523
  //global vars
524
  global $pmpro_requirebilling, $pmpro_show_discount_code, $discount_code, $CardType, $AccountNumber, $ExpirationMonth, $ExpirationYear;
525
 
526
  //get accepted credit cards
527
+ $pmpro_accepted_credit_cards = pmpro_getOption( "accepted_credit_cards" );
528
+ $pmpro_accepted_credit_cards = explode( ",", $pmpro_accepted_credit_cards );
529
+ $pmpro_accepted_credit_cards_string = pmpro_implodeToEnglish( $pmpro_accepted_credit_cards );
530
 
531
  //include ours
532
  ?>
533
+ <div id="pmpro_payment_information_fields" class="pmpro_checkout"
534
+ <?php if ( ! $pmpro_requirebilling || apply_filters( "pmpro_hide_payment_information_fields", false ) ) { ?>style="display: none;"<?php } ?>>
535
+ <h3>
536
+ <span class="pmpro_checkout-h3-name"><?php _e( 'Payment Information', 'paid-memberships-pro' ); ?></span>
537
+ <span class="pmpro_checkout-h3-msg"><?php printf( __( 'We Accept %s', 'paid-memberships-pro' ), $pmpro_accepted_credit_cards_string ); ?></span>
538
+ </h3>
539
+ <?php $sslseal = pmpro_getOption( "sslseal" ); ?>
540
+ <?php if ( ! empty( $sslseal ) ) { ?>
541
+ <div class="pmpro_checkout-fields-display-seal">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
542
  <?php } ?>
543
+ <div class="pmpro_checkout-fields<?php if ( ! empty( $sslseal ) ) { ?> pmpro_checkout-fields-leftcol<?php } ?>">
544
+ <?php
545
+ $pmpro_include_cardtype_field = apply_filters( 'pmpro_include_cardtype_field', false );
546
+ if ( $pmpro_include_cardtype_field ) { ?>
547
+ <div class="pmpro_checkout-field pmpro_payment-card-type">
548
+ <label for="CardType"><?php _e( 'Card Type', 'paid-memberships-pro' ); ?></label>
549
+ <select id="CardType" class=" <?php echo pmpro_getClassForField( "CardType" ); ?>">
550
+ <?php foreach ( $pmpro_accepted_credit_cards as $cc ) { ?>
551
+ <option value="<?php echo $cc ?>"
552
+ <?php if ( $CardType == $cc ) { ?>selected="selected"<?php } ?>><?php echo $cc ?></option>
553
+ <?php } ?>
554
+ </select>
555
+ </div>
556
+ <?php } else { ?>
557
+ <input type="hidden" id="CardType" name="CardType"
558
+ value="<?php echo esc_attr( $CardType ); ?>"/>
559
+ <?php } ?>
560
+ <div class="pmpro_checkout-field pmpro_payment-account-number">
561
+ <label for="AccountNumber"><?php _e( 'Card Number', 'paid-memberships-pro' ); ?></label>
562
+ <div id="AccountNumber"></div>
563
+ </div>
564
+ <div class="pmpro_checkout-field pmpro_payment-expiration">
565
+ <label for="Expiry"><?php _e( 'Expiration Date', 'paid-memberships-pro' ); ?></label>
566
+ <div id="Expiry"></div>
567
+ </div>
568
+ <?php
569
+ $pmpro_show_cvv = apply_filters( "pmpro_show_cvv", true );
570
+ if ( $pmpro_show_cvv ) { ?>
571
+ <div class="pmpro_checkout-field pmpro_payment-cvv">
572
+ <label for="CVV"><?php _e( 'CVC', 'paid-memberships-pro' ); ?></label>
573
+ <div id="CVV"></div>
574
+ </div>
575
+ <?php } ?>
576
+ <?php if ( $pmpro_show_discount_code ) { ?>
577
+ <div class="pmpro_checkout-field pmpro_payment-discount-code">
578
+ <label for="discount_code"><?php _e( 'Discount Code', 'paid-memberships-pro' ); ?></label>
579
+ <input class="input <?php echo pmpro_getClassForField( "discount_code" ); ?>"
580
+ id="discount_code" name="discount_code" type="text" size="10"
581
+ value="<?php echo esc_attr( $discount_code ) ?>"/>
582
+ <input type="button" id="discount_code_button" name="discount_code_button"
583
+ value="<?php _e( 'Apply', 'paid-memberships-pro' ); ?>"/>
584
+ <p id="discount_code_message" class="pmpro_message" style="display: none;"></p>
585
+ </div>
586
+ <?php } ?>
587
+ </div> <!-- end pmpro_checkout-fields -->
588
+ <?php if ( ! empty( $sslseal ) ) { ?>
589
+ <div class="pmpro_checkout-fields-rightcol pmpro_sslseal"><?php echo stripslashes( $sslseal ); ?></div>
590
+ </div> <!-- end pmpro_checkout-fields-display-seal -->
591
+ <?php } ?>
592
+ </div> <!-- end pmpro_payment_information_fields -->
593
  <?php
594
 
595
  //don't include the default
601
  *
602
  * @since 1.8
603
  */
604
+ static function user_profile_fields( $user ) {
605
  global $wpdb, $current_user, $pmpro_currency_symbol;
606
 
607
+ $cycles = array(
608
+ __( 'Day(s)', 'paid-memberships-pro' ) => 'Day',
609
+ __( 'Week(s)', 'paid-memberships-pro' ) => 'Week',
610
+ __( 'Month(s)', 'paid-memberships-pro' ) => 'Month',
611
+ __( 'Year(s)', 'paid-memberships-pro' ) => 'Year'
612
+ );
613
+ $current_year = date_i18n( "Y" );
614
+ $current_month = date_i18n( "m" );
615
 
616
  //make sure the current user has privileges
617
+ $membership_level_capability = apply_filters( "pmpro_edit_member_capability", "manage_options" );
618
+ if ( ! current_user_can( $membership_level_capability ) ) {
619
  return false;
620
+ }
621
 
622
  //more privelges they should have
623
+ $show_membership_level = apply_filters( "pmpro_profile_show_membership_level", true, $user );
624
+ if ( ! $show_membership_level ) {
625
  return false;
626
+ }
627
 
628
  //check that user has a current subscription at Stripe
629
  $last_order = new MemberOrder();
630
+ $last_order->getLastMemberOrder( $user->ID );
631
 
632
  //assume no sub to start
633
  $sub = false;
634
 
635
  //check that gateway is Stripe
636
+ if ( $last_order->gateway == "stripe" && self::$is_loaded ) {
 
637
  //is there a customer?
638
+ $sub = $last_order->Gateway->getSubscription( $last_order );
639
  }
640
 
641
  $customer_id = $user->pmpro_stripe_customerid;
642
 
643
+ if ( empty( $sub ) ) {
644
  //make sure we delete stripe updates
645
+ update_user_meta( $user->ID, "pmpro_stripe_updates", array() );
646
 
647
  //if the last order has a sub id, let the admin know there is no sub at Stripe
648
+ if ( ! empty( $last_order ) && $last_order->gateway == "stripe" && ! empty( $last_order->subscription_transaction_id ) && strpos( $last_order->subscription_transaction_id, "sub_" ) !== false ) {
649
+ ?>
650
+ <p><?php printf( __( '%1$sNote:%2$s Subscription %3$s%4$s%5$s could not be found at Stripe. It may have been deleted.', 'paid-memberships-pro' ), '<strong>', '</strong>', '<strong>', esc_attr( $last_order->subscription_transaction_id ), '</strong>' ); ?></p>
651
+ <?php
 
652
  }
653
  } elseif ( true === self::$is_loaded ) {
 
 
 
 
 
 
 
 
654
  ?>
655
+ <h3><?php _e( "Subscription Updates", 'paid-memberships-pro' ); ?></h3>
656
+ <p>
657
+ <?php
658
+ if ( empty( $_REQUEST['user_id'] ) ) {
659
+ _e( "Subscription updates, allow you to change the member's subscription values at predefined times. Be sure to click Update Profile after making changes.", 'paid-memberships-pro' );
660
+ } else {
661
+ _e( "Subscription updates, allow you to change the member's subscription values at predefined times. Be sure to click Update User after making changes.", 'paid-memberships-pro' );
662
+ }
663
+ ?>
664
+ </p>
665
+ <table class="form-table">
666
+ <tr>
667
+ <th><label for="membership_level"><?php _e( "Update", 'paid-memberships-pro' ); ?></label></th>
668
+ <td id="updates_td">
669
+ <?php
670
  $old_updates = $user->pmpro_stripe_updates;
671
+ if ( is_array( $old_updates ) ) {
 
672
  $updates = array_merge(
673
+ array(
674
+ array(
675
+ 'template' => true,
676
+ 'when' => 'now',
677
+ 'date_month' => '',
678
+ 'date_day' => '',
679
+ 'date_year' => '',
680
+ 'billing_amount' => '',
681
+ 'cycle_number' => '',
682
+ 'cycle_period' => 'Month'
683
+ )
684
+ ),
685
  $old_updates
686
  );
687
+ } else {
688
+ $updates = array(
689
+ array(
690
+ 'template' => true,
691
+ 'when' => 'now',
692
+ 'date_month' => '',
693
+ 'date_day' => '',
694
+ 'date_year' => '',
695
+ 'billing_amount' => '',
696
+ 'cycle_number' => '',
697
+ 'cycle_period' => 'Month'
698
+ )
699
+ );
700
  }
 
 
701
 
702
+ foreach ( $updates as $update ) {
703
+ ?>
704
+ <div class="updates_update"
705
+ <?php if ( ! empty( $update['template'] ) ) { ?>style="display: none;"<?php } ?>>
706
+ <select class="updates_when" name="updates_when[]">
707
+ <option value="now" <?php selected( $update['when'], "now" ); ?>>Now</option>
708
+ <option value="payment" <?php selected( $update['when'], "payment" ); ?>>After
709
+ Next Payment
710
+ </option>
711
+ <option value="date" <?php selected( $update['when'], "date" ); ?>>On Date
712
+ </option>
713
+ </select>
714
+ <span class="updates_date"
715
+ <?php if ( $update['when'] != "date" ) { ?>style="display: none;"<?php } ?>>
716
  <select name="updates_date_month[]">
717
  <?php
718
+ for ( $i = 1; $i < 13; $i ++ ) {
 
719
  ?>
720
+ <option value="<?php echo str_pad( $i, 2, "0", STR_PAD_LEFT ); ?>"
721
+ <?php if ( ! empty( $update['date_month'] ) && $update['date_month'] == $i ) { ?>selected="selected"<?php } ?>>
722
+ <?php echo date_i18n( "M", strtotime( $i . "/1/" . $current_year ) ); ?>
723
  </option>
724
  <?php
725
+ }
726
  ?>
727
  </select>
728
+ <input name="updates_date_day[]" type="text" size="2"
729
+ value="<?php if ( ! empty( $update['date_day'] ) ) {
730
+ echo esc_attr( $update['date_day'] );
731
+ } ?>"/>
732
+ <input name="updates_date_year[]" type="text" size="4"
733
+ value="<?php if ( ! empty( $update['date_year'] ) ) {
734
+ echo esc_attr( $update['date_year'] );
735
+ } ?>"/>
736
  </span>
737
+ <span class="updates_billing"
738
+ <?php if ( $update['when'] == "now" ) { ?>style="display: none;"<?php } ?>>
739
+ <?php echo $pmpro_currency_symbol ?><input name="updates_billing_amount[]" type="text"
740
+ size="10"
741
+ value="<?php echo esc_attr( $update['billing_amount'] ); ?>"/>
742
+ <small><?php _e( 'per', 'paid-memberships-pro' ); ?></small>
743
+ <input name="updates_cycle_number[]" type="text" size="5"
744
+ value="<?php echo esc_attr( $update['cycle_number'] ); ?>"/>
745
  <select name="updates_cycle_period[]">
746
  <?php
747
+ foreach ( $cycles as $name => $value ) {
748
  echo "<option value='$value'";
749
+ if ( ! empty( $update['cycle_period'] ) && $update['cycle_period'] == $value ) {
750
+ echo " selected='selected'";
751
+ }
752
  echo ">$name</option>";
753
+ }
754
  ?>
755
  </select>
756
  </span>
757
+ <span>
758
  <a class="updates_remove" href="javascript:void(0);">Remove</a>
759
  </span>
760
+ </div>
761
+ <?php
762
  }
763
  ?>
764
+ <p><a id="updates_new_update" href="javascript:void(0);">+ New Update</a></p>
765
+ </td>
766
+ </tr>
767
+ </table>
768
+ <script>
769
+ <!--
770
+ jQuery(document).ready(function () {
771
+ //function to update dropdowns/etc based on when field
772
+ function updateSubscriptionUpdateFields(when) {
773
+ if (jQuery(when).val() == 'date')
774
+ jQuery(when).parent().children('.updates_date').show();
775
+ else
776
+ jQuery(when).parent().children('.updates_date').hide();
777
+
778
+ if (jQuery(when).val() == 'no')
779
+ jQuery(when).parent().children('.updates_billing').hide();
780
+ else
781
+ jQuery(when).parent().children('.updates_billing').show();
782
+ }
783
+
784
+ //and update on page load
785
+ jQuery('.updates_when').each(function () {
786
+ if (jQuery(this).parent().css('display') != 'none') updateSubscriptionUpdateFields(this);
787
+ });
788
+
789
+ //add a new update when clicking to
790
+ var num_updates_divs = <?php echo count( $updates );?>;
791
+ jQuery('#updates_new_update').click(function () {
792
+ //get updates
793
+ updates = jQuery('.updates_update').toArray();
794
+
795
+ //clone the first one
796
+ new_div = jQuery(updates[0]).clone();
797
+
798
+ //append
799
+ new_div.insertBefore('#updates_new_update');
800
+
801
+ //update events
802
+ addUpdateEvents()
803
+
804
+ //unhide it
805
+ new_div.show();
806
+ updateSubscriptionUpdateFields(new_div.children('.updates_when'));
807
+ });
808
+
809
+ function addUpdateEvents() {
810
+ //update when when changes
811
+ jQuery('.updates_when').change(function () {
812
+ updateSubscriptionUpdateFields(this);
813
+ });
814
+
815
+ //remove updates when clicking
816
+ jQuery('.updates_remove').click(function () {
817
+ jQuery(this).parent().parent().remove();
818
+ });
819
+ }
820
+
821
+ addUpdateEvents();
822
+ });
823
+ -->
824
+ </script>
825
+ <?php
826
  }
827
  }
828
 
831
  *
832
  * @since 1.8
833
  */
834
+ static function user_profile_fields_save( $user_id ) {
835
  global $wpdb;
836
 
837
  //check capabilities
838
+ $membership_level_capability = apply_filters( "pmpro_edit_member_capability", "manage_options" );
839
+ if ( ! current_user_can( $membership_level_capability ) ) {
840
  return false;
841
+ }
842
 
843
  //make sure some value was passed
844
+ if ( ! isset( $_POST['updates_when'] ) || ! is_array( $_POST['updates_when'] ) ) {
845
  return;
846
+ }
847
 
848
  //vars
849
+ $updates = array();
850
  $next_on_date_update = "";
851
 
852
  //build array of updates (we skip the first because it's the template field for the JavaScript
853
+ for ( $i = 1; $i < count( $_POST['updates_when'] ); $i ++ ) {
 
854
  $update = array();
855
 
856
  //all updates have these values
857
+ $update['when'] = pmpro_sanitize_with_safelist( $_POST['updates_when'][ $i ], array(
858
+ 'now',
859
+ 'payment',
860
+ 'date'
861
+ ) );
862
+ $update['billing_amount'] = sanitize_text_field( $_POST['updates_billing_amount'][ $i ] );
863
+ $update['cycle_number'] = intval( $_POST['updates_cycle_number'][ $i ] );
864
+ $update['cycle_period'] = sanitize_text_field( $_POST['updates_cycle_period'][ $i ] );
865
 
866
  //these values only for on date updates
867
+ if ( $_POST['updates_when'][ $i ] == "date" ) {
868
+ $update['date_month'] = str_pad( intval( $_POST['updates_date_month'][ $i ] ), 2, "0", STR_PAD_LEFT );
869
+ $update['date_day'] = str_pad( intval( $_POST['updates_date_day'][ $i ] ), 2, "0", STR_PAD_LEFT );
870
+ $update['date_year'] = intval( $_POST['updates_date_year'][ $i ] );
 
871
  }
872
 
873
  //make sure the update is valid
874
+ if ( empty( $update['cycle_number'] ) ) {
875
  continue;
876
+ }
877
 
878
  //if when is now, update the subscription
879
+ if ( $update['when'] == "now" ) {
880
+ PMProGateway_stripe::updateSubscription( $update, $user_id );
 
881
 
882
  continue;
883
+ } elseif ( $update['when'] == 'date' ) {
884
+ if ( ! empty( $next_on_date_update ) ) {
885
+ $next_on_date_update = min( $next_on_date_update, $update['date_year'] . "-" . $update['date_month'] . "-" . $update['date_day'] );
886
+ } else {
 
 
887
  $next_on_date_update = $update['date_year'] . "-" . $update['date_month'] . "-" . $update['date_day'];
888
+ }
889
  }
890
 
891
  //add to array
893
  }
894
 
895
  //save in user meta
896
+ update_user_meta( $user_id, "pmpro_stripe_updates", $updates );
897
 
898
  //save date of next on-date update to make it easier to query for these in cron job
899
+ update_user_meta( $user_id, "pmpro_stripe_next_on_date_update", $next_on_date_update );
900
  }
901
 
902
  /**
905
  * @since 1.8
906
  */
907
  static function pmpro_activation() {
908
+ pmpro_maybe_schedule_event( time(), 'daily', 'pmpro_cron_stripe_subscription_updates' );
909
  }
910
 
911
  /**
914
  * @since 1.8
915
  */
916
  static function pmpro_deactivation() {
917
+ wp_clear_scheduled_hook( 'pmpro_cron_stripe_subscription_updates' );
918
  }
919
 
920
  /**
931
  WHERE meta_key = 'pmpro_stripe_next_on_date_update'
932
  AND meta_value IS NOT NULL
933
  AND meta_value <> ''
934
+ AND meta_value < '" . date_i18n( "Y-m-d", strtotime( "+1 day", current_time( 'timestamp' ) ) ) . "'";
935
+ $updates = $wpdb->get_results( $sqlQuery );
936
 
937
+ if ( ! empty( $updates ) ) {
938
  //loop through
939
+ foreach ( $updates as $update ) {
940
  //pull values from update
941
  $user_id = $update->user_id;
942
 
943
+ $user = get_userdata( $user_id );
944
 
945
  //if user is missing, delete the update info and continue
946
+ if ( empty( $user ) || empty( $user->ID ) ) {
947
+ delete_user_meta( $user_id, "pmpro_stripe_updates" );
948
+ delete_user_meta( $user_id, "pmpro_stripe_next_on_date_update" );
949
 
950
  continue;
951
  }
952
 
953
+ $user_updates = $user->pmpro_stripe_updates;
954
  $next_on_date_update = "";
955
 
956
  //loop through updates looking for updates happening today or earlier
957
+ if ( ! empty( $user_updates ) ) {
958
+ foreach ( $user_updates as $key => $ud ) {
959
+ if ( $ud['when'] == 'date' &&
960
+ $ud['date_year'] . "-" . $ud['date_month'] . "-" . $ud['date_day'] <= date_i18n( "Y-m-d", current_time( 'timestamp' ) )
961
  ) {
962
+ PMProGateway_stripe::updateSubscription( $ud, $user_id );
963
 
964
  //remove update from list
965
+ unset( $user_updates[ $key ] );
966
+ } elseif ( $ud['when'] == 'date' ) {
967
  //this is an on date update for the future, update the next on date update
968
+ if ( ! empty( $next_on_date_update ) ) {
969
+ $next_on_date_update = min( $next_on_date_update, $ud['date_year'] . "-" . $ud['date_month'] . "-" . $ud['date_day'] );
970
+ } else {
971
  $next_on_date_update = $ud['date_year'] . "-" . $ud['date_month'] . "-" . $ud['date_day'];
972
+ }
973
  }
974
  }
975
  }
976
 
977
  //save updates in case we removed some
978
+ update_user_meta( $user_id, "pmpro_stripe_updates", $user_updates );
979
 
980
  //save date of next on-date update to make it easier to query for these in cron job
981
+ update_user_meta( $user_id, "pmpro_stripe_next_on_date_update", $next_on_date_update );
982
  }
983
  }
984
  }
993
  global $wpdb, $current_user;
994
 
995
  // we're only worried about cases where the user is logged in
996
+ if ( ! is_user_logged_in() ) {
997
  return;
998
  }
999
 
1006
  //check the $pmpro_cancel_previous_subscriptions filter
1007
  //this is used in add ons like Gift Memberships to stop PMPro from cancelling old memberships
1008
  $pmpro_cancel_previous_subscriptions = true;
1009
+ $pmpro_cancel_previous_subscriptions = apply_filters( 'pmpro_cancel_previous_subscriptions', $pmpro_cancel_previous_subscriptions );
1010
+ if ( ! $pmpro_cancel_previous_subscriptions ) {
1011
  return;
1012
  }
1013
 
1014
  //get user and membership level
1015
+ $membership_level = pmpro_getMembershipLevelForUser( $current_user->ID );
1016
 
1017
  //no level, then probably no subscription at Stripe anymore
1018
+ if ( empty( $membership_level ) ) {
1019
  return;
1020
+ }
1021
 
1022
  /**
1023
  * Filter which levels to cancel at the gateway.
1024
  * MMPU will set this to all levels that are going to be cancelled during this checkout.
1025
  * Others may want to display this by add_filter('pmpro_stripe_levels_to_cancel_before_checkout', __return_false);
1026
  */
1027
+ $levels_to_cancel = apply_filters( 'pmpro_stripe_levels_to_cancel_before_checkout', array( $membership_level->id ), $current_user );
1028
 
1029
+ foreach ( $levels_to_cancel as $level_to_cancel ) {
1030
  //get the last order for this user/level
1031
  $last_order = new MemberOrder();
1032
+ $last_order->getLastMemberOrder( $current_user->ID, 'success', $level_to_cancel, 'stripe' );
1033
 
1034
  //so let's cancel the user's susbcription
1035
+ if ( ! empty( $last_order ) && ! empty( $last_order->subscription_transaction_id ) ) {
1036
+ $subscription = $last_order->Gateway->getSubscription( $last_order );
1037
+ if ( ! empty( $subscription ) ) {
1038
+ $last_order->Gateway->cancelSubscriptionAtGateway( $subscription, true );
1039
 
1040
  //Stripe was probably going to cancel this subscription 7 days past the payment failure (maybe just one hour, use a filter for sure)
1041
+ $memberships_users_row = $wpdb->get_row( "SELECT * FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $current_user->ID . "' AND membership_id = '" . $level_to_cancel . "' AND status = 'active' LIMIT 1" );
1042
 
1043
+ if ( ! empty( $memberships_users_row ) && ( empty( $memberships_users_row->enddate ) || $memberships_users_row->enddate == '0000-00-00 00:00:00' ) ) {
1044
  /**
1045
  * Filter graced period days when canceling existing subscriptions at checkout.
1046
  *
 
 
1047
  * @param int $days Grace period defaults to 3 days
1048
  * @param object $membership Membership row from pmpro_memberships_users including membership_id, user_id, and enddate
1049
+ *
1050
+ * @since 1.9.4
1051
+ *
1052
  */
1053
+ $days_grace = apply_filters( 'pmpro_stripe_days_grace_when_canceling_existing_subscriptions_at_checkout', 3, $memberships_users_row );
1054
+ $new_enddate = date( 'Y-m-d H:i:s', current_time( 'timestamp' ) + 3600 * 24 * $days_grace );
1055
+ $wpdb->update( $wpdb->pmpro_memberships_users, array( 'enddate' => $new_enddate ), array(
1056
+ 'user_id' => $current_user->ID,
1057
+ 'membership_id' => $level_to_cancel,
1058
+ 'status' => 'active'
1059
+ ), array( '%s' ), array( '%d', '%d', '%s' ) );
1060
  }
1061
  }
1062
  }
1065
 
1066
  /**
1067
  * Process checkout and decide if a charge and or subscribe is needed
1068
+ * Updated in v2.1 to work with Stripe v3 payment intents.
1069
  * @since 1.4
1070
  */
1071
+ function process( &$order ) {
1072
+ $steps = array(
1073
+ 'set_customer',
1074
+ 'set_source',
1075
+ 'attach_source_to_customer',
1076
+ 'process_charges',
1077
+ 'process_subscriptions',
1078
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1079
 
1080
+ foreach ( $steps as $key => $step ) {
1081
+ do_action( "pmpro_process_order_before_{$step}", $order );
1082
+ $this->$step( $order );
1083
+ do_action( "pmpro_process_order_after_{$step}", $order );
1084
+ if ( ! empty( $order->error ) ) {
1085
  return false;
1086
  }
1087
  }
1088
+
1089
+ $this->clean_up( $order );
1090
+ $order->status = 'success';
1091
+ $order->saveOrder();
1092
+
1093
+ return true;
1094
  }
1095
 
1096
  /**
1098
  *
1099
  * @since 1.4
1100
  */
1101
+ function charge( &$order ) {
1102
  global $pmpro_currency, $pmpro_currencies;
1103
  $currency_unit_multiplier = 100; //ie 100 cents per USD
1104
 
1105
  //account for zero-decimal currencies like the Japanese Yen
1106
+ if ( is_array( $pmpro_currencies[ $pmpro_currency ] ) && isset( $pmpro_currencies[ $pmpro_currency ]['decimals'] ) && $pmpro_currencies[ $pmpro_currency ]['decimals'] == 0 ) {
1107
  $currency_unit_multiplier = 1;
1108
+ }
1109
 
1110
  //create a code for the order
1111
+ if ( empty( $order->code ) ) {
1112
+ $order->code = $order->getRandomCode();
1113
+ }
1114
+
1115
 
1116
  //what amount to charge?
1117
  $amount = $order->InitialPayment;
1118
 
1119
  //tax
1120
  $order->subtotal = $amount;
1121
+ $tax = $order->getTax( true );
1122
+ $amount = pmpro_round_price( (float) $order->subtotal + (float) $tax );
1123
+
1124
 
1125
  //create a customer
1126
+ $result = $this->getCustomer( $order );
1127
 
1128
+ if ( empty( $result ) ) {
1129
  //failed to create customer
1130
  return false;
1131
  }
1132
 
1133
+
1134
  //charge
1135
  try {
1136
+ $response = Stripe_Charge::create( array(
1137
+ "amount" => $amount * $currency_unit_multiplier, # amount in cents, again
1138
+ "currency" => strtolower( $pmpro_currency ),
1139
+ "customer" => $this->customer->id,
1140
+ "description" => apply_filters( 'pmpro_stripe_order_description', "Order #" . $order->code . ", " . trim( $order->FirstName . " " . $order->LastName ) . " (" . $order->Email . ")", $order )
1141
+ )
1142
  );
1143
+ } catch ( Exception $e ) {
1144
  //$order->status = "error";
1145
+ $order->errorcode = true;
1146
+ $order->error = "Error: " . $e->getMessage();
1147
  $order->shorterror = $order->error;
1148
+
1149
  return false;
1150
  }
1151
 
1152
+ if ( empty( $response["failure_message"] ) ) {
1153
  //successful charge
1154
  $order->payment_transaction_id = $response["id"];
1155
+ $order->updateStatus( "success" );
1156
  $order->saveOrder();
1157
+
1158
  return true;
1159
  } else {
1160
  //$order->status = "error";
1161
+ $order->errorcode = true;
1162
+ $order->error = $response['failure_message'];
1163
  $order->shorterror = $response['failure_message'];
1164
+
1165
  return false;
1166
  }
1167
  }
1176
  * If a customer is found and there is a stripeToken on the order passed, it will update the customer.
1177
  * If no customer is found and there is a stripeToken on the order passed, it will create a customer.
1178
  *
 
1179
  * @return Stripe_Customer|false
1180
+ * @since 1.4
1181
  */
1182
+ function getCustomer( &$order = false, $force = false ) {
1183
  global $current_user;
1184
 
1185
  //already have it?
1186
+ if ( ! empty( $this->customer ) && ! $force ) {
1187
  return $this->customer;
1188
+ }
1189
+
1190
+ // Is it already on the order?
1191
+ if ( ! empty( $order->customer_id ) ) {
1192
+ $customer_id = $order->customer_id;
1193
+ }
1194
 
1195
  //figure out user_id and user
1196
+ if ( ! empty( $order->user_id ) ) {
1197
+ $user_id = $order->user_id;
1198
+ }
1199
 
1200
  //if no id passed, check the current user
1201
+ if ( empty( $user_id ) && ! empty( $current_user->ID ) ) {
1202
+ $user_id = $current_user->ID;
1203
+ }
1204
 
1205
+ if ( ! empty( $user_id ) ) {
1206
+ $user = get_userdata( $user_id );
1207
  } else {
1208
+ $user = null;
1209
+ }
1210
 
1211
  //transaction id?
1212
+ if ( ! empty( $order->subscription_transaction_id ) && strpos( $order->subscription_transaction_id, "cus_" ) !== false ) {
1213
  $customer_id = $order->subscription_transaction_id;
1214
  } else {
1215
  //try based on user id
1216
+ if ( ! empty( $user_id ) ) {
1217
+ $customer_id = get_user_meta( $user_id, "pmpro_stripe_customerid", true );
1218
  }
1219
 
1220
  //look up by transaction id
1221
+ if ( empty( $customer_id ) && ! empty( $user_id ) ) {//user id from this order or the user's last stripe order
1222
+ if ( ! empty( $order->payment_transaction_id ) ) {
 
1223
  $payment_transaction_id = $order->payment_transaction_id;
1224
  } else {
1225
  //find the user's last stripe order
1226
  $last_order = new MemberOrder();
1227
+ $last_order->getLastMemberOrder( $user_id, array(
1228
+ 'success',
1229
+ 'cancelled'
1230
+ ), null, 'stripe', $order->Gateway->gateway_environment );
1231
+ if ( ! empty( $last_order->payment_transaction_id ) ) {
1232
  $payment_transaction_id = $last_order->payment_transaction_id;
1233
+ }
1234
  }
1235
 
1236
  //we have a transaction id to look up
1237
+ if ( ! empty( $payment_transaction_id ) ) {
1238
+ if ( strpos( $payment_transaction_id, "ch_" ) !== false ) {
1239
  //charge, look it up
1240
  try {
1241
+ $charge = Stripe_Charge::retrieve( $payment_transaction_id );
1242
+ } catch ( \Exception $exception ) {
1243
  $order->error = sprintf( __( 'Error: %s', 'paid-memberships-pro' ), $exception->getMessage() );
1244
+
1245
  return false;
1246
  }
1247
 
1248
+ if ( ! empty( $charge ) && ! empty( $charge->customer ) ) {
1249
  $customer_id = $charge->customer;
1250
+ }
1251
+ } else if ( strpos( $payment_transaction_id, "in_" ) !== false ) {
1252
  //invoice look it up
1253
  try {
1254
+ $invoice = Stripe_Invoice::retrieve( $payment_transaction_id );
1255
+ } catch ( \Exception $exception ) {
1256
  $order->error = sprintf( __( 'Error: %s', 'paid-memberships-pro' ), $exception->getMessage() );
1257
+
1258
  return false;
1259
  }
1260
 
1261
+ if ( ! empty( $invoice ) && ! empty( $invoice->customer ) ) {
1262
  $customer_id = $invoice->customer;
1263
+ }
1264
  }
1265
  }
1266
 
1267
  //if we found it, save to user meta for future reference
1268
+ if ( ! empty( $customer_id ) ) {
1269
+ update_user_meta( $user_id, "pmpro_stripe_customerid", $customer_id );
1270
+ }
1271
  }
1272
  }
1273
 
1274
  //get name and email values from order in case we update
1275
+ if ( ! empty( $order->FirstName ) && ! empty( $order->LastName ) ) {
1276
+ $name = trim( $order->FirstName . " " . $order->LastName );
1277
+ } elseif ( ! empty( $order->FirstName ) ) {
1278
  $name = $order->FirstName;
1279
+ } elseif ( ! empty( $order->LastName ) ) {
1280
  $name = $order->LastName;
1281
  }
1282
+
1283
+ if ( empty( $name ) && ! empty( $user->ID ) ) {
1284
+ $name = trim( $user->first_name . " " . $user->last_name );
1285
 
1286
  //still empty?
1287
+ if ( empty( $name ) ) {
1288
  $name = $user->user_login;
1289
+ }
1290
+ } elseif ( empty( $name ) ) {
1291
  $name = "No Name";
1292
  }
1293
+
1294
+ if ( ! empty( $order->Email ) ) {
1295
  $email = $order->Email;
1296
  } else {
1297
  $email = "";
1298
  }
1299
+
1300
+ if ( empty( $email ) && ! empty( $user->ID ) && ! empty( $user->user_email ) ) {
1301
  $email = $user->user_email;
1302
+ } elseif ( empty( $email ) ) {
1303
  $email = "No Email";
1304
+ }
1305
 
1306
  //check for an existing stripe customer
1307
+ if ( ! empty( $customer_id ) ) {
1308
  try {
1309
+ $this->customer = Stripe_Customer::retrieve( $customer_id );
1310
+ // Update description.
1311
+ if ( ! empty( $order->source_id ) ) {
 
1312
  $this->customer->description = $name . " (" . $email . ")";
1313
+ $this->customer->email = $email;
 
1314
  $this->customer->save();
1315
  }
1316
 
1317
+ if ( ! empty( $user_id ) ) {
1318
+ //user logged in/etc
1319
+ update_user_meta( $user_id, "pmpro_stripe_customerid", $this->customer->id );
1320
+ } else {
1321
+ //user not registered yet, queue it up
1322
+ global $pmpro_stripe_customer_id;
1323
+ $pmpro_stripe_customer_id = $this->customer->id;
1324
+ if ( ! function_exists( 'pmpro_user_register_stripe_customerid' ) ) {
1325
+ function pmpro_user_register_stripe_customerid( $user_id ) {
1326
+ global $pmpro_stripe_customer_id;
1327
+ update_user_meta( $user_id, "pmpro_stripe_customerid", $pmpro_stripe_customer_id );
1328
+ }
1329
+
1330
+ add_action( "user_register", "pmpro_user_register_stripe_customerid" );
1331
+ }
1332
+ }
1333
+
1334
  return $this->customer;
1335
+
1336
+ } catch ( Exception $e ) {
1337
  //assume no customer found
1338
  }
1339
  }
1340
 
1341
  //no customer id, create one
1342
+ if ( ! empty( $order->payment_method_id ) ) {
1343
  try {
1344
+ $this->customer = Stripe_Customer::create( array(
1345
+ "description" => $name . " (" . $email . ")",
1346
+ "email" => $order->Email,
1347
+ ) );
1348
+ } catch ( \Stripe\Error $e ) {
1349
+ $order->error = __( "Error creating customer record with Stripe:", 'paid-memberships-pro' ) . " " . $e->getMessage();
 
1350
  $order->shorterror = $order->error;
1351
+
1352
  return false;
1353
  }
1354
 
1355
+ if ( ! empty( $user_id ) ) {
1356
  //user logged in/etc
1357
+ update_user_meta( $user_id, "pmpro_stripe_customerid", $this->customer->id );
1358
  } else {
1359
  //user not registered yet, queue it up
1360
  global $pmpro_stripe_customer_id;
1361
  $pmpro_stripe_customer_id = $this->customer->id;
1362
+ if ( ! function_exists( 'pmpro_user_register_stripe_customerid' ) ) {
1363
+ function pmpro_user_register_stripe_customerid( $user_id ) {
1364
  global $pmpro_stripe_customer_id;
1365
+ update_user_meta( $user_id, "pmpro_stripe_customerid", $pmpro_stripe_customer_id );
1366
  }
1367
+
1368
+ add_action( "user_register", "pmpro_user_register_stripe_customerid" );
1369
  }
1370
  }
1371
 
1372
+ return apply_filters( 'pmpro_stripe_create_customer', $this->customer );
1373
  }
1374
 
1375
  return false;
1380
  *
1381
  * @since 1.8
1382
  */
1383
+ function getSubscription( &$order ) {
1384
  global $wpdb;
1385
 
1386
  //no order?
1387
+ if ( empty( $order ) || empty( $order->code ) ) {
1388
  return false;
1389
  }
1390
 
1391
+ $result = $this->getCustomer( $order, true ); //force so we don't get a cached sub for someone else
1392
 
1393
  //no customer?
1394
+ if ( empty( $result ) ) {
1395
+ return false;
1396
+ }
1397
+
1398
+ //no subscriptions?
1399
+ if ( empty( $this->customer->subscriptions ) ) {
1400
  return false;
1401
+ }
1402
 
1403
  //is there a subscription transaction id pointing to a sub?
1404
+ if ( ! empty( $order->subscription_transaction_id ) && strpos( $order->subscription_transaction_id, "sub_" ) !== false ) {
1405
  try {
1406
+ $sub = $this->customer->subscriptions->retrieve( $order->subscription_transaction_id );
1407
+ } catch ( Exception $e ) {
1408
+ $order->error = __( "Error getting subscription with Stripe:", 'paid-memberships-pro' ) . $e->getMessage();
1409
  $order->shorterror = $order->error;
1410
+
1411
  return false;
1412
  }
1413
 
1414
  return $sub;
1415
  }
1416
 
 
 
 
 
 
1417
  //find subscription based on customer id and order/plan id
1418
  $subscriptions = $this->customer->subscriptions->all();
1419
 
1420
  //no subscriptions
1421
+ if ( empty( $subscriptions ) || empty( $subscriptions->data ) ) {
1422
  return false;
1423
  }
1424
 
1425
  //we really want to test against the order codes of all orders with the same subscription_transaction_id (customer id)
1426
+ $codes = $wpdb->get_col( "SELECT code FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $order->user_id . "' AND subscription_transaction_id = '" . $order->subscription_transaction_id . "' AND status NOT IN('refunded', 'review', 'token', 'error')" );
1427
 
1428
  //find the one for this order
1429
+ foreach ( $subscriptions->data as $sub ) {
1430
+ if ( in_array( $sub->plan->id, $codes ) ) {
1431
  return $sub;
1432
  }
1433
  }
1441
  *
1442
  * @since 1.4
1443
  */
1444
+ function subscribe( &$order, $checkout = true ) {
1445
  global $pmpro_currency, $pmpro_currencies;
1446
 
1447
  $currency_unit_multiplier = 100; //ie 100 cents per USD
1448
 
1449
  //account for zero-decimal currencies like the Japanese Yen
1450
+ if ( is_array( $pmpro_currencies[ $pmpro_currency ] ) && isset( $pmpro_currencies[ $pmpro_currency ]['decimals'] ) && $pmpro_currencies[ $pmpro_currency ]['decimals'] == 0 ) {
1451
  $currency_unit_multiplier = 1;
1452
+ }
1453
 
1454
  //create a code for the order
1455
+ if ( empty( $order->code ) ) {
1456
  $order->code = $order->getRandomCode();
1457
+ }
1458
 
1459
  //filter order before subscription. use with care.
1460
+ $order = apply_filters( "pmpro_subscribe_order", $order, $this );
1461
 
1462
  //figure out the user
1463
+ if ( ! empty( $order->user_id ) ) {
1464
  $user_id = $order->user_id;
1465
  } else {
1466
  global $current_user;
1468
  }
1469
 
1470
  //set up customer
1471
+
1472
+ $result = $this->getCustomer( $order );
1473
+ if ( empty( $result ) ) {
1474
+ return false; //error retrieving customer
1475
  }
1476
 
1477
+ // set subscription id to custom id
1478
+
1479
+ $order->subscription_transaction_id = $this->customer['id']; //transaction id is the customer id, we save it in user meta later too
1480
 
1481
  //figure out the amounts
1482
+ $amount = $order->PaymentAmount;
1483
+ $amount_tax = $order->getTaxForPrice( $amount );
1484
+ $amount = pmpro_round_price( (float) $amount + (float) $amount_tax );
1485
 
1486
  /*
1487
+ There are two parts to the trial. Part 1 is simply the delay until the first payment
1488
+ since we are doing the first payment as a separate transaction.
1489
+ The second part is the actual "trial" set by the admin.
1490
 
1491
+ Stripe only supports Year or Month for billing periods, but we account for Days and Weeks just in case.
1492
+ */
1493
  //figure out the trial length (first payment handled by initial charge)
1494
+ if ( $order->BillingPeriod == "Year" ) {
1495
+ $trial_period_days = $order->BillingFrequency * 365; //annual
1496
+ } elseif ( $order->BillingPeriod == "Day" ) {
1497
+ $trial_period_days = $order->BillingFrequency * 1; //daily
1498
+ } elseif ( $order->BillingPeriod == "Week" ) {
1499
+ $trial_period_days = $order->BillingFrequency * 7; //weekly
1500
  } else {
1501
+ $trial_period_days = $order->BillingFrequency * 30; //assume monthly
1502
+ }
1503
 
1504
  //convert to a profile start date
1505
+ $order->ProfileStartDate = date_i18n( "Y-m-d", strtotime( "+ " . $trial_period_days . " Day", current_time( "timestamp" ) ) ) . "T0:0:0";
1506
 
1507
  //filter the start date
1508
+ $order->ProfileStartDate = apply_filters( "pmpro_profile_start_date", $order->ProfileStartDate, $order );
1509
 
1510
  //convert back to days
1511
+ $trial_period_days = ceil( abs( strtotime( date_i18n( "Y-m-d" ), current_time( "timestamp" ) ) - strtotime( $order->ProfileStartDate, current_time( "timestamp" ) ) ) / 86400 );
1512
 
1513
  //for free trials, just push the start date of the subscription back
1514
+ if ( ! empty( $order->TrialBillingCycles ) && $order->TrialAmount == 0 ) {
1515
+ $trialOccurrences = (int) $order->TrialBillingCycles;
1516
+ if ( $order->BillingPeriod == "Year" ) {
1517
+ $trial_period_days = $trial_period_days + ( 365 * $order->BillingFrequency * $trialOccurrences ); //annual
1518
+ } elseif ( $order->BillingPeriod == "Day" ) {
1519
+ $trial_period_days = $trial_period_days + ( 1 * $order->BillingFrequency * $trialOccurrences ); //daily
1520
+ } elseif ( $order->BillingPeriod == "Week" ) {
1521
+ $trial_period_days = $trial_period_days + ( 7 * $order->BillingFrequency * $trialOccurrences ); //weekly
1522
  } else {
1523
+ $trial_period_days = $trial_period_days + ( 30 * $order->BillingFrequency * $trialOccurrences ); //assume monthly
1524
  }
1525
+ } elseif ( ! empty( $order->TrialBillingCycles ) ) {
1526
  /*
1527
+ Let's set the subscription to the trial and give the user an "update" to change the sub later to full price (since v2.0)
1528
 
1529
+ This will force TrialBillingCycles > 1 to act as if they were 1
1530
+ */
1531
+ $new_user_updates = array();
1532
  $new_user_updates[] = array(
1533
+ 'when' => 'payment',
1534
  'billing_amount' => $order->PaymentAmount,
1535
+ 'cycle_period' => $order->BillingPeriod,
1536
+ 'cycle_number' => $order->BillingFrequency
1537
  );
1538
 
1539
  //now amount to equal the trial #s
1540
+ $amount = $order->TrialAmount;
1541
+ $amount_tax = $order->getTaxForPrice( $amount );
1542
+ $amount = pmpro_round_price( (float) $amount + (float) $amount_tax );
1543
  }
1544
 
1545
  //create a plan
1546
  try {
1547
  $plan = array(
1548
+ "amount" => $amount * $currency_unit_multiplier,
1549
+ "interval_count" => $order->BillingFrequency,
1550
+ "interval" => strtolower( $order->BillingPeriod ),
1551
  "trial_period_days" => $trial_period_days,
1552
+ 'product' => array( 'name' => $order->membership_name . " for order " . $order->code ),
1553
+ "currency" => strtolower( $pmpro_currency ),
1554
+ "id" => $order->code
1555
  );
1556
 
1557
+ $plan = Stripe_Plan::create( apply_filters( 'pmpro_stripe_create_plan_array', $plan ) );
1558
+ } catch ( Exception $e ) {
1559
+ $order->error = __( "Error creating plan with Stripe:", 'paid-memberships-pro' ) . $e->getMessage();
1560
  $order->shorterror = $order->error;
1561
+
1562
  return false;
1563
  }
1564
 
1565
+ // before subscribing, let's clear out the updates so we don't trigger any during sub
1566
+ if ( ! empty( $user_id ) ) {
1567
+ $old_user_updates = get_user_meta( $user_id, "pmpro_stripe_updates", true );
1568
+ update_user_meta( $user_id, "pmpro_stripe_updates", array() );
1569
  }
1570
 
1571
+
1572
+ if ( empty( $order->subscription_transaction_id ) && ! empty( $this->customer['id'] ) ) {
1573
  $order->subscription_transaction_id = $this->customer['id'];
1574
  }
1575
 
1576
+ // subscribe to the plan
1577
  try {
1578
+ $subscription = array( "plan" => $order->code );
1579
+ $result = $this->customer->subscriptions->create( apply_filters( 'pmpro_stripe_create_subscription_array', $subscription ) );
1580
+ } catch ( Exception $e ) {
1581
  //try to delete the plan
1582
  $plan->delete();
1583
 
1584
  //give the user any old updates back
1585
+ if ( ! empty( $user_id ) ) {
1586
+ update_user_meta( $user_id, "pmpro_stripe_updates", $old_user_updates );
1587
  }
1588
 
1589
  //return error
1590
+ $order->error = __( "Error subscribing customer to plan with Stripe:", 'paid-memberships-pro' ) . $e->getMessage();
1591
  $order->shorterror = $order->error;
1592
+
1593
  return false;
1594
  }
1595
 
1596
+ // delete the plan
1597
+ $plan = Stripe_Plan::retrieve( $order->code );
1598
  $plan->delete();
1599
 
1600
  //if we got this far, we're all good
1601
+ $order->status = "success";
1602
  $order->subscription_transaction_id = $result['id'];
1603
 
1604
  //save new updates if this is at checkout
1605
+ if ( $checkout ) {
1606
  //empty out updates unless set above
1607
+ if ( empty( $new_user_updates ) ) {
1608
  $new_user_updates = array();
1609
  }
1610
 
1611
  //update user meta
1612
+ if ( ! empty( $user_id ) ) {
1613
+ update_user_meta( $user_id, "pmpro_stripe_updates", $new_user_updates );
1614
  } else {
1615
  //need to remember the user updates to save later
1616
  global $pmpro_stripe_updates;
1617
  $pmpro_stripe_updates = $new_user_updates;
1618
+ function pmpro_user_register_stripe_updates( $user_id ) {
1619
  global $pmpro_stripe_updates;
1620
+ update_user_meta( $user_id, "pmpro_stripe_updates", $pmpro_stripe_updates );
1621
  }
1622
+
1623
+ add_action( "user_register", "pmpro_user_register_stripe_updates" );
1624
  }
1625
  } else {
1626
  //give them their old updates back
1627
+ update_user_meta( $user_id, "pmpro_stripe_updates", $old_user_updates );
1628
  }
1629
 
1630
  return true;
1633
  /**
1634
  * Helper method to save the subscription ID to make sure the membership doesn't get cancelled by the webhook
1635
  */
1636
+ static function ignoreCancelWebhookForThisSubscription( $subscription_id, $user_id = null ) {
1637
+ if ( empty( $user_id ) ) {
1638
  global $current_user;
1639
  $user_id = $current_user->ID;
1640
  }
1647
  }
1648
 
1649
  // Store or update the subscription ID timestamp (for cleanup)
1650
+ $preserve[ $subscription_id ] = current_time( 'timestamp' );
1651
 
1652
  update_user_meta( $user_id, 'pmpro_stripe_dont_cancel', $preserve );
1653
  }
1655
  /**
1656
  * Helper method to process a Stripe subscription update
1657
  */
1658
+ static function updateSubscription( $update, $user_id ) {
1659
  global $wpdb;
1660
 
1661
  //get level for user
1662
+ $user_level = pmpro_getMembershipLevelForUser( $user_id );
1663
 
1664
  //get current plan at Stripe to get payment date
1665
  $last_order = new MemberOrder();
1666
+ $last_order->getLastMemberOrder( $user_id );
1667
+ $last_order->setGateway( 'stripe' );
1668
+ $last_order->Gateway->getCustomer( $last_order );
1669
 
1670
+ $subscription = $last_order->Gateway->getSubscription( $last_order );
1671
 
1672
+ if ( ! empty( $subscription ) ) {
1673
  $end_timestamp = $subscription->current_period_end;
1674
 
1675
  //cancel the old subscription
1676
+ if ( ! $last_order->Gateway->cancelSubscriptionAtGateway( $subscription, true ) ) {
1677
  //throw error and halt save
1678
+ if ( ! function_exists( 'pmpro_stripe_user_profile_fields_save_error' ) ) {
1679
  //throw error and halt save
1680
  function pmpro_stripe_user_profile_fields_save_error( $errors, $update, $user ) {
1681
  $errors->add( 'pmpro_stripe_updates', __( 'Could not cancel the old subscription. Updates have not been processed.', 'paid-memberships-pro' ) );
1690
  }
1691
 
1692
  //if we didn't get an end date, let's set one one cycle out
1693
+ if ( empty( $end_timestamp ) ) {
1694
+ $end_timestamp = strtotime( "+" . $update['cycle_number'] . " " . $update['cycle_period'], current_time( 'timestamp' ) );
1695
  }
1696
 
1697
  //build order object
1698
  $update_order = new MemberOrder();
1699
+ $update_order->setGateway( 'stripe' );
1700
+ $update_order->user_id = $user_id;
1701
+ $update_order->membership_id = $user_level->id;
1702
+ $update_order->membership_name = $user_level->name;
1703
+ $update_order->InitialPayment = 0;
1704
+ $update_order->PaymentAmount = $update['billing_amount'];
1705
+ $update_order->ProfileStartDate = date_i18n( "Y-m-d", $end_timestamp );
1706
+ $update_order->BillingPeriod = $update['cycle_period'];
1707
  $update_order->BillingFrequency = $update['cycle_number'];
1708
+
1709
  //need filter to reset ProfileStartDate
1710
  $profile_start_date = $update_order->ProfileStartDate;
1711
+ add_filter( 'pmpro_profile_start_date', function ( $startdate, $order ) use ( $profile_start_date ) {
1712
  return "{$profile_start_date}T0:0:0";
1713
+ }, 10, 2 );
1714
 
1715
  //update subscription
1716
+ $update_order->Gateway->subscribe( $update_order, false );
1717
 
1718
  //update membership
1719
  $sqlQuery = "UPDATE $wpdb->pmpro_memberships_users
1720
+ SET billing_amount = '" . esc_sql( $update['billing_amount'] ) . "',
1721
+ cycle_number = '" . esc_sql( $update['cycle_number'] ) . "',
1722
+ cycle_period = '" . esc_sql( $update['cycle_period'] ) . "',
1723
  trial_amount = '',
1724
  trial_limit = ''
1725
+ WHERE user_id = '" . esc_sql( $user_id ) . "'
1726
+ AND membership_id = '" . esc_sql( $last_order->membership_id ) . "'
1727
  AND status = 'active'
1728
  LIMIT 1";
1729
 
1730
+ $wpdb->query( $sqlQuery );
1731
 
1732
  //save order so we know which plan to look for at stripe (order code = plan id)
1733
  $update_order->status = "success";
1739
  *
1740
  * @since 1.4
1741
  */
1742
+ function update( &$order ) {
 
 
1743
 
1744
+ $steps = array(
1745
+ 'set_customer',
1746
+ 'set_source',
1747
+ 'attach_source_to_customer',
1748
+ );
1749
+
1750
+ foreach ( $steps as $key => $step ) {
1751
+ do_action( "pmpro_update_billing_before_{$step}", $order );
1752
+ $this->$step( $order );
1753
+ do_action( "pmpro_update_billing_after_{$step}", $order );
1754
+ if ( ! empty( $order->error ) ) {
1755
+ return false;
1756
+ }
1757
  }
1758
+
1759
+ return true;
1760
+
1761
  }
1762
 
1763
  /**
1765
  *
1766
  * @since 1.4
1767
  */
1768
+ function cancel( &$order, $update_status = true ) {
1769
  global $pmpro_stripe_event;
1770
 
1771
  //no matter what happens below, we're going to cancel the order in our system
1772
+ if ( $update_status ) {
1773
+ $order->updateStatus( "cancelled" );
1774
  }
1775
 
1776
  //require a subscription id
1777
+ if ( empty( $order->subscription_transaction_id ) ) {
1778
  return false;
1779
+ }
1780
 
1781
  //find the customer
1782
+ $result = $this->getCustomer( $order );
1783
 
1784
+ if ( ! empty( $result ) ) {
1785
  //find subscription with this order code
1786
+ $subscription = $this->getSubscription( $order );
1787
 
1788
+ if ( ! empty( $subscription )
1789
+ && ( empty( $pmpro_stripe_event ) || empty( $pmpro_stripe_event->type ) || $pmpro_stripe_event->type != 'customer.subscription.deleted' ) ) {
1790
+ if ( $this->cancelSubscriptionAtGateway( $subscription ) ) {
1791
  //we're okay, going to return true later
1792
  } else {
1793
+ $order->error = __( "Could not cancel old subscription.", 'paid-memberships-pro' );
1794
  $order->shorterror = $order->error;
1795
 
1796
  return false;
1798
  }
1799
 
1800
  /*
1801
+ Clear updates for this user. (But not if checking out, we would have already done that.)
1802
+ */
1803
+ if ( empty( $_REQUEST['submit-checkout'] ) ) {
1804
+ update_user_meta( $order->user_id, "pmpro_stripe_updates", array() );
1805
  }
1806
 
1807
  return true;
1808
  } else {
1809
+ $order->error = __( "Could not find the customer.", 'paid-memberships-pro' );
1810
  $order->shorterror = $order->error;
1811
+
1812
+ return false; //no customer found
1813
  }
1814
  }
1815
 
1818
  *
1819
  * @since 1.8
1820
  */
1821
+ function cancelSubscriptionAtGateway( $subscription, $preserve_local_membership = false ) {
1822
  // Check if a valid sub.
1823
+ if ( empty( $subscription ) || empty( $subscription->id ) ) {
1824
  return false;
1825
  }
1826
 
1827
  // If this is already cancelled, return true.
1828
+ if ( ! empty( $subscription->canceled_at ) ) {
1829
  return true;
1830
  }
1831
 
1832
  // Make sure we get the customer for this subscription.
1833
  $order = new MemberOrder();
1834
+ $order->getLastMemberOrderBySubscriptionTransactionID( $subscription->id );
1835
 
1836
  // No order?
1837
+ if ( empty( $order ) ) {
1838
  //lets cancel anyway, but this is suspicious
1839
  $r = $subscription->cancel();
1840
 
1842
  }
1843
 
1844
  // Okay have an order, so get customer so we can cancel invoices too
1845
+ $this->getCustomer( $order );
1846
 
1847
  // Get open invoices.
1848
  $invoices = $this->customer->invoices();
1851
  // Found it, cancel it.
1852
  try {
1853
  // Find any open invoices for this subscription and forgive them.
1854
+ if ( ! empty( $invoices ) ) {
1855
+ foreach ( $invoices->data as $invoice ) {
1856
+ if ( 'open' == $invoice->status && $invoice->subscription == $subscription->id ) {
1857
+ $invoice->voidInvoice();
 
1858
  }
1859
  }
1860
  }
1861
 
1862
  // Sometimes we don't want to cancel the local membership when Stripe sends its webhook.
1863
+ if ( $preserve_local_membership ) {
1864
+ PMProGateway_stripe::ignoreCancelWebhookForThisSubscription( $subscription->id, $order->user_id );
1865
  }
1866
 
1867
  // Cancel
1868
  $r = $subscription->cancel();
1869
 
1870
  return true;
1871
+ } catch ( Exception $e ) {
1872
  return false;
1873
  }
1874
  }
1877
  * Filter pmpro_next_payment to get date via API if possible
1878
  *
1879
  * @since 1.8.6
1880
+ */
1881
+ static function pmpro_next_payment( $timestamp, $user_id, $order_status ) {
1882
  //find the last order for this user
1883
+ if ( ! empty( $user_id ) ) {
1884
  //get last order
1885
  $order = new MemberOrder();
1886
+ $order->getLastMemberOrder( $user_id, $order_status );
1887
 
1888
  //check if this is a Stripe order with a subscription transaction id
1889
+ if ( ! empty( $order->id ) && ! empty( $order->subscription_transaction_id ) && $order->gateway == "stripe" ) {
1890
  //get the subscription and return the current_period end or false
1891
+ $subscription = $order->Gateway->getSubscription( $order );
1892
 
1893
+ if ( ! empty( $subscription ) ) {
1894
  $customer = $order->Gateway->getCustomer();
1895
+ if ( ! $customer->delinquent && ! empty ( $subscription->current_period_end ) ) {
1896
  return $subscription->current_period_end;
1897
  } elseif ( $customer->delinquent && ! empty( $subscription->current_period_start ) ) {
1898
  return $subscription->current_period_start;
1908
 
1909
  /**
1910
  * Refund a payment or invoice
1911
+ *
1912
+ * @param object &$order Related PMPro order object.
1913
+ * @param string $transaction_id Payment or Invoice id to void.
1914
+ *
1915
  * @return bool True or false if the void worked
1916
  */
1917
+ function void( &$order, $transaction_id = null ) {
1918
  //stripe doesn't differentiate between voids and refunds, so let's just pass on to the refund function
1919
+ return $this->refund( $order, $transaction_id );
1920
  }
1921
 
1922
  /**
1923
  * Refund a payment or invoice
1924
+ *
1925
+ * @param object &$order Related PMPro order object.
1926
+ * @param string $transaction_id Payment or invoice id to void.
1927
+ *
1928
  * @return bool True or false if the refund worked.
1929
  */
1930
+ function refund( &$order, $transaction_id = null ) {
1931
  //default to using the payment id from the order
1932
+ if ( empty( $transaction_id ) && ! empty( $order->payment_transaction_id ) ) {
1933
  $transaction_id = $order->payment_transaction_id;
1934
  }
1935
 
1936
  //need a transaction id
1937
+ if ( empty( $transaction_id ) ) {
1938
  return false;
1939
  }
1940
 
1941
  //if an invoice ID is passed, get the charge/payment id
1942
+ if ( strpos( $transaction_id, "in_" ) !== false ) {
1943
+ $invoice = Stripe_Invoice::retrieve( $transaction_id );
1944
 
1945
+ if ( ! empty( $invoice ) && ! empty( $invoice->charge ) ) {
1946
  $transaction_id = $invoice->charge;
1947
  }
1948
  }
1949
 
1950
  //get the charge
1951
  try {
1952
+ $charge = Stripe_Charge::retrieve( $transaction_id );
1953
+ } catch ( Exception $e ) {
1954
  $charge = false;
1955
  }
1956
 
1957
  //can't find the charge?
1958
+ if ( empty( $charge ) ) {
1959
+ $order->status = "error";
1960
+ $order->errorcode = "";
1961
+ $order->error = "";
1962
  $order->shorterror = "";
1963
 
1964
  return false;
1967
  //attempt refund
1968
  try {
1969
  $refund = $charge->refund();
1970
+ } catch ( Exception $e ) {
1971
  //$order->status = "error";
1972
+ $order->errorcode = true;
1973
+ $order->error = __( "Error: ", 'paid-memberships-pro' ) . $e->getMessage();
1974
  $order->shorterror = $order->error;
1975
+
1976
  return false;
1977
  }
1978
 
1979
+ if ( $refund->status == "succeeded" ) {
1980
  $order->status = "refunded";
1981
  $order->saveOrder();
1982
 
1983
  return true;
1984
+ } else {
1985
+ $order->status = "error";
1986
+ $order->errorcode = true;
1987
+ $order->error = sprintf( __( "Error: Unkown error while refunding charge #%s", 'paid-memberships-pro' ), $transaction_id );
1988
  $order->shorterror = $order->error;
1989
 
1990
  return false;
1991
  }
1992
  }
1993
+
1994
+ function set_source( &$order, $force = false ) {
1995
+ if ( ! empty( $this->source ) && ! $force ) {
1996
+ return true;
1997
+ }
1998
+
1999
+ $source = $this->get_source( $order );
2000
+
2001
+ if ( empty( $source ) ) {
2002
+ return false;
2003
+ }
2004
+
2005
+ $this->source = $source;
2006
+
2007
+ return true;
2008
+ }
2009
+
2010
+ function get_source( &$order ) {
2011
+
2012
+ if ( ! empty( $order->payment_method_id ) ) {
2013
+ try {
2014
+ $source = Stripe_PaymentMethod::retrieve( $order->payment_method_id );
2015
+ } catch ( Stripe\Error\Base $e ) {
2016
+ $order->error = $e->getMessage();
2017
+ return false;
2018
+ } catch ( Throwable $e ) {
2019
+ $order->error = $e->getMessage();
2020
+ return false;
2021
+ } catch ( Exception $e ) {
2022
+ $order->error = $e->getMessage();
2023
+ return false;
2024
+ }
2025
+ }
2026
+
2027
+ if ( empty( $source ) ) {
2028
+ return false;
2029
+ }
2030
+
2031
+ return $source;
2032
+ }
2033
+
2034
+ function set_customer( &$order, $force = false ) {
2035
+ if ( ! empty( $this->customer ) && ! $force ) {
2036
+ return true;
2037
+ }
2038
+ $this->getCustomer( $order );
2039
+ }
2040
+
2041
+ function attach_source_to_customer( &$order ) {
2042
+
2043
+ if ( ! empty( $this->customer->invoice_settings->default_payment_method ) &&
2044
+ $this->customer->invoice_settings->default_payment_method === $this->source->id ) {
2045
+ return true;
2046
+ }
2047
+
2048
+ try {
2049
+ $this->source->attach( [ 'customer' => $this->customer->id ] );
2050
+ $this->customer->invoice_settings->default_payment_method = $this->source->id;
2051
+ $this->customer->save();
2052
+ } catch ( Stripe\Error\Base $e ) {
2053
+ $order->error = $e->getMessage();
2054
+ return false;
2055
+ } catch ( Throwable $e ) {
2056
+ $order->error = $e->getMessage();
2057
+ return false;
2058
+ } catch ( Exception $e ) {
2059
+ $order->error = $e->getMessage();
2060
+ return false;
2061
+ }
2062
+
2063
+ return true;
2064
+ }
2065
+
2066
+ function process_charges( &$order ) {
2067
+
2068
+ if ( 0 == floatval( $order->InitialPayment ) ) {
2069
+ return true;
2070
+ }
2071
+
2072
+ $this->set_payment_intent( $order );
2073
+ $this->confirm_payment_intent( $order );
2074
+
2075
+ if ( ! empty( $order->error ) ) {
2076
+ $order->error = $order->error;
2077
+
2078
+ return false;
2079
+ }
2080
+
2081
+ return true;
2082
+ }
2083
+
2084
+ function set_payment_intent( &$order, $force = false ) {
2085
+
2086
+ if ( ! empty( $this->payment_intent ) && ! $force ) {
2087
+ return true;
2088
+ }
2089
+
2090
+ $payment_intent = $this->get_payment_intent( $order );
2091
+
2092
+ if ( empty( $payment_intent ) ) {
2093
+ return false;
2094
+ }
2095
+
2096
+ $this->payment_intent = $payment_intent;
2097
+
2098
+ return true;
2099
+ }
2100
+
2101
+ function get_payment_intent( &$order ) {
2102
+
2103
+ if ( ! empty( $order->payment_intent_id ) ) {
2104
+ try {
2105
+ $payment_intent = Stripe_PaymentIntent::retrieve( $order->payment_intent_id );
2106
+ } catch ( Stripe\Error\Base $e ) {
2107
+ $order->error = $e->getMessage();
2108
+ return false;
2109
+ } catch ( Throwable $e ) {
2110
+ $order->error = $e->getMessage();
2111
+ return false;
2112
+ } catch ( Exception $e ) {
2113
+ $order->error = $e->getMessage();
2114
+ return false;
2115
+ }
2116
+ }
2117
+
2118
+ if ( empty( $payment_intent ) ) {
2119
+ $payment_intent = $this->create_payment_intent( $order );
2120
+ }
2121
+
2122
+ if ( empty( $payment_intent ) ) {
2123
+ return false;
2124
+ }
2125
+
2126
+ return $payment_intent;
2127
+ }
2128
+
2129
+ function create_payment_intent( &$order ) {
2130
+
2131
+ global $pmpro_currencies, $pmpro_currency;
2132
+
2133
+ // Account for zero-decimal currencies like the Japanese Yen
2134
+ $currency_unit_multiplier = 100; //ie 100 cents per USD
2135
+ if ( is_array( $pmpro_currencies[ $pmpro_currency ] ) && isset( $pmpro_currencies[ $pmpro_currency ]['decimals'] ) && $pmpro_currencies[ $pmpro_currency ]['decimals'] == 0 ) {
2136
+ $currency_unit_multiplier = 1;
2137
+ }
2138
+
2139
+ $amount = $order->InitialPayment;
2140
+ $order->subtotal = $amount;
2141
+ $tax = $order->getTax( true );
2142
+
2143
+ $amount = pmpro_round_price( (float) $order->subtotal + (float) $tax );
2144
+
2145
+ $params = array(
2146
+ 'customer' => $this->customer->id,
2147
+ 'payment_method' => $this->source->id,
2148
+ 'amount' => $amount * $currency_unit_multiplier,
2149
+ 'currency' => $pmpro_currency,
2150
+ 'confirmation_method' => 'manual',
2151
+ 'description' => apply_filters( 'pmpro_stripe_order_description', "Order #" . $order->code . ", " . trim( $order->FirstName . " " . $order->LastName ) . " (" . $order->Email . ")", $order ),
2152
+ 'setup_future_usage' => 'off_session',
2153
+ );
2154
+
2155
+
2156
+ try {
2157
+ $payment_intent = Stripe_PaymentIntent::create( $params );
2158
+ } catch ( Stripe\Error\Base $e ) {
2159
+ $order->error = $e->getMessage();
2160
+ return false;
2161
+ } catch ( Throwable $e ) {
2162
+ $order->error = $e->getMessage();
2163
+ return false;
2164
+ } catch ( Exception $e ) {
2165
+ $order->error = $e->getMessage();
2166
+ return false;
2167
+ }
2168
+
2169
+ return $payment_intent;
2170
+ }
2171
+
2172
+ function process_subscriptions( &$order ) {
2173
+
2174
+ if ( ! pmpro_isLevelRecurring( $order->membership_level ) ) {
2175
+ return true;
2176
+ }
2177
+
2178
+ //before subscribing, let's clear out the updates so we don't trigger any during sub
2179
+ if ( ! empty( $user_id ) ) {
2180
+ $old_user_updates = get_user_meta( $user_id, "pmpro_stripe_updates", true );
2181
+ update_user_meta( $user_id, "pmpro_stripe_updates", array() );
2182
+ }
2183
+
2184
+ $this->set_setup_intent( $order );
2185
+ $this->confirm_setup_intent( $order );
2186
+
2187
+ if ( ! empty( $order->error ) ) {
2188
+ $order->error = $order->error;
2189
+
2190
+ //give the user any old updates back
2191
+ if ( ! empty( $user_id ) ) {
2192
+ update_user_meta( $user_id, "pmpro_stripe_updates", $old_user_updates );
2193
+ }
2194
+
2195
+ return false;
2196
+ }
2197
+
2198
+ //save new updates if this is at checkout
2199
+ //empty out updates unless set above
2200
+ if ( empty( $new_user_updates ) ) {
2201
+ $new_user_updates = array();
2202
+ }
2203
+
2204
+ //update user meta
2205
+ if ( ! empty( $user_id ) ) {
2206
+ update_user_meta( $user_id, "pmpro_stripe_updates", $new_user_updates );
2207
+ } else {
2208
+ //need to remember the user updates to save later
2209
+ global $pmpro_stripe_updates;
2210
+ $pmpro_stripe_updates = $new_user_updates;
2211
+
2212
+ if( ! function_exists( 'pmpro_user_register_stripe_updates' ) ) {
2213
+ function pmpro_user_register_stripe_updates( $user_id ) {
2214
+ global $pmpro_stripe_updates;
2215
+ update_user_meta( $user_id, 'pmpro_stripe_updates', $pmpro_stripe_updates );
2216
+ }
2217
+ add_action( 'user_register', 'pmpro_user_register_stripe_updates' );
2218
+ }
2219
+ }
2220
+
2221
+ return true;
2222
+ }
2223
+
2224
+ function create_plan( &$order ) {
2225
+
2226
+ global $pmpro_currencies, $pmpro_currency;
2227
+
2228
+ //figure out the amounts
2229
+ $amount = $order->PaymentAmount;
2230
+ $amount_tax = $order->getTaxForPrice( $amount );
2231
+ $amount = pmpro_round_price( (float) $amount + (float) $amount_tax );
2232
+
2233
+ // Account for zero-decimal currencies like the Japanese Yen
2234
+ $currency_unit_multiplier = 100; //ie 100 cents per USD
2235
+ if ( is_array( $pmpro_currencies[ $pmpro_currency ] ) && isset( $pmpro_currencies[ $pmpro_currency ]['decimals'] ) && $pmpro_currencies[ $pmpro_currency ]['decimals'] == 0 ) {
2236
+ $currency_unit_multiplier = 1;
2237
+ }
2238
+
2239
+ /*
2240
+ Figure out the trial length (first payment handled by initial charge)
2241
+
2242
+ There are two parts to the trial. Part 1 is simply the delay until the first payment
2243
+ since we are doing the first payment as a separate transaction.
2244
+ The second part is the actual "trial" set by the admin.
2245
+
2246
+ Stripe only supports Year or Month for billing periods, but we account for Days and Weeks just in case.
2247
+ */
2248
+ if ( $order->BillingPeriod == "Year" ) {
2249
+ $trial_period_days = $order->BillingFrequency * 365; //annual
2250
+ } elseif ( $order->BillingPeriod == "Day" ) {
2251
+ $trial_period_days = $order->BillingFrequency * 1; //daily
2252
+ } elseif ( $order->BillingPeriod == "Week" ) {
2253
+ $trial_period_days = $order->BillingFrequency * 7; //weekly
2254
+ } else {
2255
+ $trial_period_days = $order->BillingFrequency * 30; //assume monthly
2256
+ }
2257
+
2258
+ //convert to a profile start date
2259
+ $order->ProfileStartDate = date_i18n( "Y-m-d", strtotime( "+ " . $trial_period_days . " Day", current_time( "timestamp" ) ) ) . "T0:0:0";
2260
+
2261
+ //filter the start date
2262
+ $order->ProfileStartDate = apply_filters( "pmpro_profile_start_date", $order->ProfileStartDate, $order );
2263
+
2264
+ //convert back to days
2265
+ $trial_period_days = ceil( abs( strtotime( date_i18n( "Y-m-d" ), current_time( "timestamp" ) ) - strtotime( $order->ProfileStartDate, current_time( "timestamp" ) ) ) / 86400 );
2266
+
2267
+ //for free trials, just push the start date of the subscription back
2268
+ if ( ! empty( $order->TrialBillingCycles ) && $order->TrialAmount == 0 ) {
2269
+ $trialOccurrences = (int) $order->TrialBillingCycles;
2270
+ if ( $order->BillingPeriod == "Year" ) {
2271
+ $trial_period_days = $trial_period_days + ( 365 * $order->BillingFrequency * $trialOccurrences ); //annual
2272
+ } elseif ( $order->BillingPeriod == "Day" ) {
2273
+ $trial_period_days = $trial_period_days + ( 1 * $order->BillingFrequency * $trialOccurrences ); //daily
2274
+ } elseif ( $order->BillingPeriod == "Week" ) {
2275
+ $trial_period_days = $trial_period_days + ( 7 * $order->BillingFrequency * $trialOccurrences ); //weekly
2276
+ } else {
2277
+ $trial_period_days = $trial_period_days + ( 30 * $order->BillingFrequency * $trialOccurrences ); //assume monthly
2278
+ }
2279
+ } elseif ( ! empty( $order->TrialBillingCycles ) ) {
2280
+
2281
+ }
2282
+
2283
+ // Save $trial_period_days to order for now too.
2284
+ $order->TrialPeriodDays = $trial_period_days;
2285
+
2286
+ //create a plan
2287
+ try {
2288
+ $plan = array(
2289
+ "amount" => $amount * $currency_unit_multiplier,
2290
+ "interval_count" => $order->BillingFrequency,
2291
+ "interval" => strtolower( $order->BillingPeriod ),
2292
+ "trial_period_days" => $trial_period_days,
2293
+ 'product' => array( 'name' => $order->membership_name . " for order " . $order->code ),
2294
+ "currency" => strtolower( $pmpro_currency ),
2295
+ "id" => $order->code
2296
+ );
2297
+ $order->plan = Stripe_Plan::create( apply_filters( 'pmpro_stripe_create_plan_array', $plan ) );
2298
+ } catch ( Stripe\Error\Base $e ) {
2299
+ $order->error = $e->getMessage();
2300
+
2301
+ return false;
2302
+ } catch ( Exception $e ) {
2303
+ $order->error = $e->getMessage();
2304
+
2305
+ return false;
2306
+ }
2307
+
2308
+ return $order->plan;
2309
+ }
2310
+
2311
+ function create_subscription( &$order ) {
2312
+
2313
+ //subscribe to the plan
2314
+ try {
2315
+ $params = array(
2316
+ 'customer' => $this->customer->id,
2317
+ 'default_payment_method' => $this->source,
2318
+ 'items' => array(
2319
+ array( 'plan' => $order->code ),
2320
+ ),
2321
+ 'trial_period_days' => $order->TrialPeriodDays,
2322
+ 'expand' => array(
2323
+ 'pending_setup_intent.payment_method',
2324
+ ),
2325
+ );
2326
+ $order->subscription = Stripe_Subscription::create( $params );
2327
+ } catch ( Stripe\Error\Base $e ) {
2328
+ $order->error = $e->getMessage();
2329
+ return false;
2330
+ } catch ( Throwable $e ) {
2331
+ $order->error = $e->getMessage();
2332
+ return false;
2333
+ } catch ( Exception $e ) {
2334
+ $order->error = $e->getMessage();
2335
+ return false;
2336
+ }
2337
+
2338
+ return $order->subscription;
2339
+
2340
+ }
2341
+
2342
+ function delete_plan( &$order ) {
2343
+ try {
2344
+ $order->plan->delete();
2345
+ } catch ( Stripe\Error\Base $e ) {
2346
+ $order->error = $e->getMessage();
2347
+
2348
+ return false;
2349
+ } catch ( Exception $e ) {
2350
+ $order->error = $e->getMessage();
2351
+
2352
+ return false;
2353
+ }
2354
+
2355
+ return true;
2356
+ }
2357
+
2358
+ function get_setup_intent( &$order ) {
2359
+
2360
+ if ( ! empty( $order->setup_intent_id ) ) {
2361
+ try {
2362
+ $setup_intent = Stripe_SetupIntent::retrieve( $order->setup_intent_id );
2363
+ } catch ( Stripe\Error\Base $e ) {
2364
+ $order->error = $e->getMessage();
2365
+ return false;
2366
+ } catch ( Throwable $e ) {
2367
+ $order->error = $e->getMessage();
2368
+ return false;
2369
+ } catch ( Exception $e ) {
2370
+ $order->error = $e->getMessage();
2371
+ return false;
2372
+ }
2373
+ }
2374
+
2375
+ if ( empty( $setup_intent ) ) {
2376
+ $setup_intent = $this->create_setup_intent( $order );
2377
+ }
2378
+
2379
+ if ( empty( $setup_intent ) ) {
2380
+ return false;
2381
+ }
2382
+
2383
+ return $setup_intent;
2384
+ }
2385
+
2386
+ function set_setup_intent( &$order, $force = false ) {
2387
+
2388
+ if ( ! empty( $this->setup_intent ) && ! $force ) {
2389
+ return true;
2390
+ }
2391
+
2392
+ $setup_intent = $this->get_setup_intent( $order );
2393
+
2394
+ if ( empty( $setup_intent ) ) {
2395
+ return false;
2396
+ }
2397
+
2398
+ $this->setup_intent = $setup_intent;
2399
+
2400
+ return true;
2401
+ }
2402
+
2403
+ function create_setup_intent( &$order ) {
2404
+
2405
+ $this->create_plan( $order );
2406
+ $this->subscription = $this->create_subscription( $order );
2407
+ $this->delete_plan( $order );
2408
+
2409
+ if ( ! empty( $order->error ) || empty( $this->subscription->pending_setup_intent ) ) {
2410
+ return false;
2411
+ }
2412
+
2413
+ return $this->subscription->pending_setup_intent;
2414
+ }
2415
+
2416
+ function confirm_payment_intent( &$order ) {
2417
+
2418
+ try {
2419
+ $params = array(
2420
+ 'expand' => array(
2421
+ 'payment_method',
2422
+ ),
2423
+ );
2424
+ $this->payment_intent->confirm( $params );
2425
+ } catch ( Stripe\Error\Base $e ) {
2426
+ $order->error = $e->getMessage();
2427
+ return false;
2428
+ } catch ( Throwable $e ) {
2429
+ $order->error = $e->getMessage();
2430
+ return false;
2431
+ } catch ( Exception $e ) {
2432
+ $order->error = $e->getMessage();
2433
+ return false;
2434
+ }
2435
+
2436
+ if ( 'requires_action' == $this->payment_intent->status ) {
2437
+ $order->errorcode = true;
2438
+ $order->error = __( 'Customer authentication is required to complete this transaction. Please complete the verification steps issued by your payment provider.', 'paid-memberships-pro' );
2439
+ $order->error_type = 'pmpro_alert';
2440
+
2441
+ return false;
2442
+ }
2443
+
2444
+ return true;
2445
+ }
2446
+
2447
+ function confirm_setup_intent( &$order ) {
2448
+
2449
+ if ( empty( $this->setup_intent ) ) {
2450
+ return true;
2451
+ }
2452
+
2453
+ if ( 'requires_action' === $this->setup_intent->status ) {
2454
+ $order->errorcode = true;
2455
+ $order->error = __( 'Customer authentication is required to finish setting up your subscription. Please complete the verification steps issued by your payment provider.', 'paid-memberships-pro' );
2456
+
2457
+ return false;
2458
+ }
2459
+
2460
+ }
2461
+
2462
+ function clean_up( &$order ) {
2463
+ if ( ! empty( $this->payment_intent ) && 'succeeded' == $this->payment_intent->status ) {
2464
+ $order->payment_transaction_id = $this->payment_intent->charges->data[0]->id;
2465
+ }
2466
+
2467
+ if ( empty( $order->subscription_transaction_id ) && ! empty( $this->subscription ) ) {
2468
+ $order->subscription_transaction_id = $this->subscription->id;
2469
+ }
2470
+ }
2471
+
2472
+ }
css/admin.css CHANGED
@@ -48,7 +48,7 @@
48
  /* levels */
49
  .memberships_page_pmpro-membershiplevels .pmpro_admin #posts-filter p.search-box { margin: 2em 0 1em 0; }
50
  .memberships_page_pmpro-membershiplevels .pmpro_admin tr.pmpro_gray td {color: #AAA;}
51
- .memberships_page_pmpro-membershiplevels .pmpro_admin tr td.level_name a {font-size: 115%; font-weight: bold; }
52
  .memberships_page_pmpro-membershiplevels .pmpro_admin .membership-levels tr {background: #fff;}
53
  .memberships_page_pmpro-membershiplevels .pmpro_admin .membership-levels tr.alternate {background: #f1f1f1;}
54
  .memberships_page_pmpro-membershiplevels .pmpro_admin .membership-levels tr.ui-sortable-handle {
48
  /* levels */
49
  .memberships_page_pmpro-membershiplevels .pmpro_admin #posts-filter p.search-box { margin: 2em 0 1em 0; }
50
  .memberships_page_pmpro-membershiplevels .pmpro_admin tr.pmpro_gray td {color: #AAA;}
51
+ .memberships_page_pmpro-membershiplevels .pmpro_admin tr td.level_name span.level-name a {font-size: 115%; font-weight: bold; }
52
  .memberships_page_pmpro-membershiplevels .pmpro_admin .membership-levels tr {background: #fff;}
53
  .memberships_page_pmpro-membershiplevels .pmpro_admin .membership-levels tr.alternate {background: #f1f1f1;}
54
  .memberships_page_pmpro-membershiplevels .pmpro_admin .membership-levels tr.ui-sortable-handle {
css/frontend.css CHANGED
@@ -113,6 +113,14 @@ form.pmpro_form label {
113
  margin: 0;
114
  text-align: left;
115
  }
 
 
 
 
 
 
 
 
116
  form.pmpro_form .pmpro_checkout-field-checkbox label {
117
  cursor: pointer;
118
  display: inline-block;
@@ -160,6 +168,47 @@ form.pmpro_form #pmpro_processing_message {
160
  margin: 1em 0 0 0;
161
  text-align: right;
162
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  /*--------------------------------------------------
164
  Messages - Success, Error, Alert
165
  ----------------------------------------------------*/
@@ -175,13 +224,29 @@ form.pmpro_form #pmpro_processing_message {
175
  line-height: 1.5em;
176
  margin: .5em 0;
177
  padding: 10px 15px;
 
178
  }
179
  .pmpro_success {
180
  background-color: #dff0d8;
181
  border-color: #d6e9c6;
182
  color: #3c763d;
183
  }
184
- .pmpro_error {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  background-color: #f2dede;
186
  border-color: #ebccd1;
187
  color: #a94442;
@@ -213,6 +278,10 @@ input.pmpro_error {
213
  select.pmpro_error {
214
  background-image: none;
215
  }
 
 
 
 
216
  /*---------------------------------------
217
  Membership Checkout
218
  ---------------------------------------*/
@@ -233,7 +302,10 @@ select.pmpro_error {
233
  margin-left: 2em;
234
  }
235
  #pmpro_payment_information_fields .pmpro_checkout-fields-display-seal {
 
 
236
  display: grid;
 
237
  grid-template-columns: 3fr 1fr;
238
  grid-gap: 1em;
239
  }
@@ -259,7 +331,9 @@ body.pmpro-invoice .entry-content ul {
259
  margin-left: 1.5em;
260
  }
261
  .pmpro_invoice_details {
 
262
  display: grid;
 
263
  grid-template-columns: 1fr 1fr 1fr;
264
  grid-gap: 1em;
265
  }
@@ -363,19 +437,19 @@ li.pmpro_more {
363
  font-size: .8em;
364
  }
365
  @media (max-width:768px) {
 
 
 
 
 
 
 
366
  form.pmpro_form input[type=text].input, form.pmpro_form input[type=password].input {
367
  width: 90%;
368
  }
369
  form.pmpro_form input[type=text]#other_discount_code, form.pmpro_form input[type=text]#CVV, form.pmpro_form input[type=text]#discount_code {
370
  width: 40%;
371
  }
372
- form.pmpro_form #pmpro_payment_information_fields .pmpro_thead-msg {
373
- float: none;
374
- margin-bottom: 10px;
375
- text-align: left;
376
- text-wrap: normal;
377
- white-space: normal;
378
- }
379
  #pmpro_payment_information_fields .pmpro_checkout-fields-display-seal {
380
  display: block;
381
  }
113
  margin: 0;
114
  text-align: left;
115
  }
116
+ form.pmpro_form #pmpro_payment_information_fields .pmpro_checkout-fields label {
117
+ display: block;
118
+ float: none;
119
+ max-width: initial;
120
+ min-width: initial;
121
+ text-align: left;
122
+ width: auto;
123
+ }
124
  form.pmpro_form .pmpro_checkout-field-checkbox label {
125
  cursor: pointer;
126
  display: inline-block;
168
  margin: 1em 0 0 0;
169
  text-align: right;
170
  }
171
+
172
+ .pmpro_checkout_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_checkout-fields,
173
+ .pmpro_billing_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_checkout-fields {
174
+ display: -ms-grid;
175
+ display: grid;
176
+ -ms-grid-rows: auto 1em auto;
177
+ grid-template-areas:
178
+ "AccountNumber AccountNumber"
179
+ "Expiry CVV";
180
+ grid-gap: 1em;
181
+ -ms-grid-columns: 1fr 1em 1fr;
182
+ grid-template-columns: 1fr 1fr;
183
+ }
184
+ .pmpro_checkout_gateway-stripe form.pmpro_form #pmpro_payment_information_fields div#AccountNumber,
185
+ .pmpro_checkout_gateway-stripe form.pmpro_form #pmpro_payment_information_fields div#Expiry,
186
+ .pmpro_checkout_gateway-stripe form.pmpro_form #pmpro_payment_information_fields div#CVV,
187
+ .pmpro_billing_gateway-stripe form.pmpro_form #pmpro_payment_information_fields div#AccountNumber,
188
+ .pmpro_billing_gateway-stripe form.pmpro_form #pmpro_payment_information_fields div#Expiry,
189
+ .pmpro_billing_gateway-stripe form.pmpro_form #pmpro_payment_information_fields div#CVV {
190
+ color: #666;
191
+ border: 1px solid #ccc;
192
+ border-radius: 3px;
193
+ margin: 0;
194
+ padding: 0.625em 0.4375em;
195
+ }
196
+ .pmpro_checkout_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_checkout-fields div {
197
+
198
+ }
199
+ .pmpro_checkout_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_payment-account-number,
200
+ .pmpro_billing_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_payment-account-number {
201
+ grid-area: AccountNumber;
202
+ }
203
+ .pmpro_checkout_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_payment-expiration,
204
+ .pmpro_billing_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_payment-expiration {
205
+ grid-area: Expiry;
206
+ }
207
+ .pmpro_checkout_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_payment-cvv,
208
+ .pmpro_billing_gateway-stripe form.pmpro_form #pmpro_payment_information_fields .pmpro_payment-cvv {
209
+ grid-area: CVV;
210
+ }
211
+
212
  /*--------------------------------------------------
213
  Messages - Success, Error, Alert
214
  ----------------------------------------------------*/
224
  line-height: 1.5em;
225
  margin: .5em 0;
226
  padding: 10px 15px;
227
+ text-align: left;
228
  }
229
  .pmpro_success {
230
  background-color: #dff0d8;
231
  border-color: #d6e9c6;
232
  color: #3c763d;
233
  }
234
+ .pmpro_error,
235
+ input[type="text"].pmpro_error,
236
+ input[type="email"].pmpro_error,
237
+ input[type="url"].pmpro_error,
238
+ input[type="password"].pmpro_error,
239
+ input[type="number"].pmpro_error,
240
+ input[type="tel"].pmpro_error,
241
+ input[type="range"].pmpro_error,
242
+ input[type="date"].pmpro_error,
243
+ input[type="month"].pmpro_error,
244
+ input[type="week"].pmpro_error,
245
+ input[type="time"].pmpro_error,
246
+ input[type="datetime"].pmpro_error,
247
+ input[type="datetime-local"].pmpro_error,
248
+ input[type="color"].pmpro_error,
249
+ textarea.pmpro_error {
250
  background-color: #f2dede;
251
  border-color: #ebccd1;
252
  color: #a94442;
278
  select.pmpro_error {
279
  background-image: none;
280
  }
281
+
282
+ #pmpro_message_bottom {
283
+ margin-bottom: 1em;
284
+ }
285
  /*---------------------------------------
286
  Membership Checkout
287
  ---------------------------------------*/
302
  margin-left: 2em;
303
  }
304
  #pmpro_payment_information_fields .pmpro_checkout-fields-display-seal {
305
+ clear: both;
306
+ display: -ms-grid;
307
  display: grid;
308
+ -ms-grid-columns: 3fr 1em 1fr;
309
  grid-template-columns: 3fr 1fr;
310
  grid-gap: 1em;
311
  }
331
  margin-left: 1.5em;
332
  }
333
  .pmpro_invoice_details {
334
+ display: -ms-grid;
335
  display: grid;
336
+ -ms-grid-columns: 1fr 1em 1fr 1em 1fr;
337
  grid-template-columns: 1fr 1fr 1fr;
338
  grid-gap: 1em;
339
  }
437
  font-size: .8em;
438
  }
439
  @media (max-width:768px) {
440
+ .pmpro_checkout h3 span.pmpro_checkout-h3-name {
441
+ display: block;
442
+ }
443
+ .pmpro_checkout h3 span.pmpro_checkout-h3-msg {
444
+ display: block;
445
+ margin-bottom: 1em;
446
+ }
447
  form.pmpro_form input[type=text].input, form.pmpro_form input[type=password].input {
448
  width: 90%;
449
  }
450
  form.pmpro_form input[type=text]#other_discount_code, form.pmpro_form input[type=text]#CVV, form.pmpro_form input[type=text]#discount_code {
451
  width: 40%;
452
  }
 
 
 
 
 
 
 
453
  #pmpro_payment_information_fields .pmpro_checkout-fields-display-seal {
454
  display: block;
455
  }
email/payment_action.html ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <p>Customer authentication is required to finish setting up your subscription at !!sitename!!.</p>
2
+
3
+ <p>Please complete the verification steps issued by your payment provider at the following link:</p>
4
+ <p>!!invoice_url!!</p>
email/payment_action_admin.html ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <p>A payment at !!sitename!! for !!user_login!! requires additional authentication customer authentication to complete.</p>
2
+ <p>Below is a copy of the email we sent to !!user_email!! to notify them that they need to complete their payment:</p>
3
+
4
+ <p>Customer authentication is required to finish setting up your subscription at !!sitename!!.</p>
5
+
6
+ <p>Please complete the verification steps issued by your payment provider at the following link:</p>
7
+ <p>!!invoice_url!!</p>
includes/cleanup.php CHANGED
@@ -21,6 +21,36 @@ function pmpro_delete_user($user_id = NULL)
21
  add_action('delete_user', 'pmpro_delete_user');
22
  add_action('wpmu_delete_user', 'pmpro_delete_user');
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  //deleting a category? remove any level associations
25
  function pmpro_delete_category($cat_id = NULL)
26
  {
@@ -33,7 +63,7 @@ add_action('delete_category', 'pmpro_delete_category');
33
  //deleting a post? remove any level associations
34
  function pmpro_delete_post($post_id = NULL)
35
  {
36
- global $wpdb;
37
  $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_pages WHERE page_id = '" . $post_id . "'";
38
  $wpdb->query($sqlQuery);
39
  }
21
  add_action('delete_user', 'pmpro_delete_user');
22
  add_action('wpmu_delete_user', 'pmpro_delete_user');
23
 
24
+ /**
25
+ * Show a notice on the Delete User form so admin knows that membership and subscriptions will be cancelled.
26
+ *
27
+ * @param WP_User $current_user WP_User object for the current user.
28
+ * @param int[] $userids Array of IDs for users being deleted.
29
+ */
30
+ function pmpro_delete_user_form_notice( $current_user, $userids ) {
31
+ // Check if any users for deletion have an an active membership level.
32
+ foreach ( $userids as $user_id ) {
33
+ $userids_have_levels = pmpro_hasMembershipLevel( null, $user_id );
34
+ if ( ! empty( $userids_have_levels ) ) {
35
+ break;
36
+ }
37
+ }
38
+
39
+ // Show a notice if users for deletion have an an active membership level.
40
+ if ( ! empty( $userids_have_levels ) ) { ?>
41
+ <div class="notice notice-error inline">
42
+ <?php if ( count( $userids ) > 1 ) {
43
+ _e( '<p><strong>Warning:</strong> One or more users for deletion have an active membership level. Deleting a user will also cancel their membership and recurring subscription.</p>', 'paid-memberships-pro' );
44
+ } else {
45
+ _e( '<p><strong>Warning:</strong> This user has an active membership level. Deleting a user will also cancel their membership and recurring subscription.</p>', 'paid-memberships-pro' );
46
+ }
47
+ ?>
48
+ </div>
49
+ <?php
50
+ }
51
+ }
52
+ add_action( 'delete_user_form', 'pmpro_delete_user_form_notice', 10, 2 );
53
+
54
  //deleting a category? remove any level associations
55
  function pmpro_delete_category($cat_id = NULL)
56
  {
63
  //deleting a post? remove any level associations
64
  function pmpro_delete_post($post_id = NULL)
65
  {
66
+ global $wpdb;
67
  $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_pages WHERE page_id = '" . $post_id . "'";
68
  $wpdb->query($sqlQuery);
69
  }
includes/currencies.php CHANGED
@@ -61,6 +61,9 @@
61
  'PLN' => __('Polish Zloty', 'paid-memberships-pro' ),
62
  'RUB' => array(
63
  'name' => __('Russian Ruble (&#8381;)', 'paid-memberships-pro'),
 
 
 
64
  'symbol' => '&#8381;',
65
  'position' => 'right'
66
  ),
61
  'PLN' => __('Polish Zloty', 'paid-memberships-pro' ),
62
  'RUB' => array(
63
  'name' => __('Russian Ruble (&#8381;)', 'paid-memberships-pro'),
64
+ 'decimals' => '0',
65
+ 'thousands_separator' => '&nbsp;',
66
+ 'decimal_separator' => ',',
67
  'symbol' => '&#8381;',
68
  'position' => 'right'
69
  ),
includes/filters.php CHANGED
@@ -139,7 +139,7 @@ function pmpro_required_billing_fields_stripe_lite( $fields ) {
139
  }
140
 
141
  // some fields to remove
142
- $remove = array( 'bfirstname', 'blastname', 'baddress1', 'bcity', 'bstate', 'bzipcode', 'bphone', 'bcountry', 'CardType' );
143
 
144
  // if a user is logged in, don't require bemail either
145
  global $current_user;
139
  }
140
 
141
  // some fields to remove
142
+ $remove = array( 'bfirstname', 'blastname', 'baddress1', 'bcity', 'bstate', 'bzipcode', 'bphone', 'bcountry' );
143
 
144
  // if a user is logged in, don't require bemail either
145
  global $current_user;
includes/functions.php CHANGED
@@ -160,6 +160,11 @@ function pmpro_url( $page = null, $querystring = '', $scheme = null ) {
160
  $url = str_replace( 'http:', 'https:', $url );
161
  }
162
  }
 
 
 
 
 
163
 
164
  return $url;
165
  }
@@ -184,6 +189,19 @@ function pmpro_areLevelsFree( $levelarr ) {
184
  return true;
185
  }
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  function pmpro_isLevelRecurring( &$level ) {
188
  if ( ! empty( $level ) && ( $level->billing_amount > 0 || $level->trial_amount > 0 ) ) {
189
  return true;
@@ -291,10 +309,11 @@ function pmpro_loadTemplate( $page_name = null, $where = 'local', $type = 'pages
291
  // Valid types: 'email', 'pages'
292
  $templates = apply_filters( "pmpro_{$type}_custom_template_path", $default_templates, $page_name, $type, $where, $ext );
293
  $user_templates = array_diff( $templates, $default_templates );
 
294
 
295
  // user specified a custom template path, so it has priority.
296
  if ( ! empty( $user_templates ) ) {
297
- $templates = $user_templates;
298
  }
299
 
300
  // last element included in the array is the most first one we try to load
@@ -1412,7 +1431,7 @@ function pmpro_calculateInitialPaymentRevenue( $s = null, $l = null ) {
1412
  if ( $s || $l ) {
1413
  $user_ids_query = "SELECT u.ID FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id WHERE mu.status = 'active' ";
1414
  if ( $s ) {
1415
- $user_ids_query .= "AND (u.user_login LIKE '%" . esc_sql( $s ) . "%' OR u.user_email LIKE '%" . esc_sql( $s ) . "%' OR um.meta_value LIKE '%$" . esc_sql( s ) . "%') ";
1416
  }
1417
  if ( $l ) {
1418
  $user_ids_query .= "AND mu.membership_id = '" . esc_sql( $l ) . "' ";
@@ -1468,54 +1487,74 @@ function pmpro_calculateRecurringRevenue( $s, $l ) {
1468
  return $total;
1469
  }
1470
 
 
 
 
 
 
 
 
 
 
1471
  function pmpro_generateUsername( $firstname = '', $lastname = '', $email = '' ) {
1472
- global $wpdb;
 
 
 
 
 
 
1473
 
1474
- // try first initial + last name, firstname, lastname
1475
- $firstname = preg_replace( '/[^A-Za-z]/', '', $firstname );
1476
- $lastname = preg_replace( '/[^A-Za-z]/', '', $lastname );
1477
- if ( $firstname && $lastname ) {
1478
  $username = substr( $firstname, 0, 1 ) . $lastname;
1479
- } elseif ( $firstname ) {
 
1480
  $username = $firstname;
1481
- } elseif ( $lastname ) {
 
1482
  $username = $lastname;
1483
  }
1484
 
1485
- // is it taken?
1486
- $taken = $wpdb->get_var( "SELECT user_login FROM $wpdb->users WHERE user_login = '" . esc_sql( $username ) . "' LIMIT 1" );
1487
-
1488
- if ( ! $taken ) {
1489
- return $username;
1490
- }
1491
-
1492
- // try the beginning of the email address
1493
- $emailparts = explode( '@', $email );
1494
- if ( is_array( $emailparts ) ) {
1495
- $email = preg_replace( '/[^A-Za-z]/', '', $emailparts[0] );
1496
  }
1497
 
1498
- if ( ! empty( $email ) ) {
1499
- $username = $email;
 
1500
  }
1501
 
1502
- // is this taken? if not, add numbers until it works
1503
  $taken = true;
1504
  $count = 0;
1505
  while ( $taken ) {
1506
- // add a # to the end
1507
  if ( $count ) {
1508
  $username = preg_replace( '/[0-9]/', '', $username ) . $count;
1509
  }
1510
 
1511
- // taken?
1512
- $taken = $wpdb->get_var( "SELECT user_login FROM $wpdb->users WHERE user_login = '" . esc_sql( $username ) . "' LIMIT 1" );
1513
 
1514
- // increment the number
1515
  $count++;
1516
  }
1517
 
1518
- // must have a good username now
 
 
 
1519
  return $username;
1520
  }
1521
 
@@ -2438,31 +2477,92 @@ function pmpro_formatPrice( $price ) {
2438
  // start with the rounded price
2439
  $formatted = pmpro_round_price( $price );
2440
 
 
 
 
 
 
2441
  // settings stored in array?
2442
  if ( ! empty( $pmpro_currencies[ $pmpro_currency ] ) && is_array( $pmpro_currencies[ $pmpro_currency ] ) ) {
2443
  // format number do decimals, with decimal_separator and thousands_separator
2444
  $formatted = number_format(
2445
  $formatted,
2446
- ( isset( $pmpro_currencies[ $pmpro_currency ]['decimals'] ) ? (int) $pmpro_currencies[ $pmpro_currency ]['decimals'] : 2 ),
2447
- ( isset( $pmpro_currencies[ $pmpro_currency ]['decimal_separator'] ) ? $pmpro_currencies[ $pmpro_currency ]['decimal_separator'] : '.' ),
2448
- ( isset( $pmpro_currencies[ $pmpro_currency ]['thousands_separator'] ) ? $pmpro_currencies[ $pmpro_currency ]['thousands_separator'] : ',' )
2449
  );
2450
 
2451
  // which side is the symbol on?
2452
- if ( ! empty( $pmpro_currencies[ $pmpro_currency ]['position'] ) && $pmpro_currencies[ $pmpro_currency ]['position'] == 'left' ) {
2453
  $formatted = $pmpro_currency_symbol . $formatted;
2454
  } else {
2455
  $formatted = $formatted . $pmpro_currency_symbol;
2456
  }
2457
  } else {
2458
  // default to symbol on the left, 2 decimals using . and ,
2459
- $formatted = $pmpro_currency_symbol . number_format( $formatted, 2 );
2460
  }
2461
 
 
 
 
2462
  // filter
2463
  return apply_filters( 'pmpro_format_price', $formatted, $price, $pmpro_currency, $pmpro_currency_symbol );
2464
  }
2465
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2466
  /**
2467
  * Which side does the currency symbol go on?
2468
  *
@@ -2487,7 +2587,7 @@ function pmpro_getCurrencyPosition() {
2487
  */
2488
  function pmpro_round_price( $price, $currency = '' ) {
2489
  global $pmpro_currency, $pmpro_currencies;
2490
- $decimals = 2;
2491
 
2492
  if ( '' === $currency && ! empty( $pmpro_currencies[ $pmpro_currency ] ) ) {
2493
  $currency = $pmpro_currency;
@@ -2510,7 +2610,7 @@ function pmpro_round_price( $price, $currency = '' ) {
2510
  }
2511
 
2512
  /**
2513
- * Cast to floast and pad zeroes after the decimal
2514
  * when editing the price on the edit level page.
2515
  * Only do this for currency with decimals = 2
2516
  * Only do this if using . as the decimal separator.
@@ -2761,7 +2861,7 @@ function pmpro_sanitize_with_safelist( $needle, $safelist ) {
2761
  }
2762
  }
2763
 
2764
- /**
2765
  * Return an array of allowed order statuses
2766
  *
2767
  * @since 1.9.3
@@ -2817,3 +2917,166 @@ function pmpro_cleanup_memberships_users_table() {
2817
  SET status = 'inactive'";
2818
  $wpdb->query( $sqlQuery );
2819
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
  $url = str_replace( 'http:', 'https:', $url );
161
  }
162
  }
163
+
164
+ /**
165
+ * Filter the URL before returning.
166
+ */
167
+ $url = apply_filters( 'pmpro_url', $url, $page, $querystring, $scheme );
168
 
169
  return $url;
170
  }
189
  return true;
190
  }
191
 
192
+ /**
193
+ * Check to see if only free levels are available.
194
+ * @return boolean This will return true if only free levels are available for signup.
195
+ * @internal Creates a filter 'pmpro_only_free_levels'.
196
+ * @since 2.1
197
+ */
198
+ function pmpro_onlyFreeLevels() {
199
+ // Get levels that are available for checkout only.
200
+ $levels = pmpro_getAllLevels( false, true );
201
+
202
+ return apply_filters( 'pmpro_only_free_levels', pmpro_areLevelsFree( $levels ) );
203
+ }
204
+
205
  function pmpro_isLevelRecurring( &$level ) {
206
  if ( ! empty( $level ) && ( $level->billing_amount > 0 || $level->trial_amount > 0 ) ) {
207
  return true;
309
  // Valid types: 'email', 'pages'
310
  $templates = apply_filters( "pmpro_{$type}_custom_template_path", $default_templates, $page_name, $type, $where, $ext );
311
  $user_templates = array_diff( $templates, $default_templates );
312
+ $allowed_default_templates = array_intersect( $templates, $default_templates );
313
 
314
  // user specified a custom template path, so it has priority.
315
  if ( ! empty( $user_templates ) ) {
316
+ array_merge($allowed_default_templates, $user_templates);
317
  }
318
 
319
  // last element included in the array is the most first one we try to load
1431
  if ( $s || $l ) {
1432
  $user_ids_query = "SELECT u.ID FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id WHERE mu.status = 'active' ";
1433
  if ( $s ) {
1434
+ $user_ids_query .= "AND (u.user_login LIKE '%" . esc_sql( $s ) . "%' OR u.user_email LIKE '%" . esc_sql( $s ) . "%' OR um.meta_value LIKE '%$" . esc_sql( $s ) . "%') ";
1435
  }
1436
  if ( $l ) {
1437
  $user_ids_query .= "AND mu.membership_id = '" . esc_sql( $l ) . "' ";
1487
  return $total;
1488
  }
1489
 
1490
+ /**
1491
+ * Generate a Username from the provided first name, last name or email address.
1492
+ *
1493
+ * @param string $firstname User-submitted First Name.
1494
+ * @param string $lastname User-submitted Last Name.
1495
+ * @param string $email User-submitted Email Address.
1496
+ *
1497
+ * @return string $username.
1498
+ */
1499
  function pmpro_generateUsername( $firstname = '', $lastname = '', $email = '' ) {
1500
+ // Strip all non-alpha characters from first and last name.
1501
+ if ( ! empty( $firstname) ) {
1502
+ $firstname = preg_replace( '/[^A-Za-z]/', '', $firstname );
1503
+ }
1504
+ if ( ! empty( $lastname ) ) {
1505
+ $lastname = preg_replace( '/[^A-Za-z]/', '', $lastname );
1506
+ }
1507
 
1508
+ // Try to create username using first and last name.
1509
+ if ( ! empty( $firstname ) && ! empty( $lastname ) ) {
1510
+ // Create username using first initial + last name.
 
1511
  $username = substr( $firstname, 0, 1 ) . $lastname;
1512
+ } elseif ( ! empty( $firstname ) ) {
1513
+ // Create username using only first name.
1514
  $username = $firstname;
1515
+ } elseif ( ! empty( $lastname ) ) {
1516
+ // Create username using only last name.
1517
  $username = $lastname;
1518
  }
1519
 
1520
+ // If no username yet or one based on name exisdts,
1521
+ // try to create username using email address.
1522
+ if ( ( empty( $username ) || username_exists( $username ) )
1523
+ && ! empty( $email ) && is_email( $email ) ) {
1524
+ // Break email into two parts, before and after the @ symbol.
1525
+ $emailparts = explode( '@', $email );
1526
+ if ( ! empty( $emailparts ) ) {
1527
+ // Set username to the string before the email's @ symbol.
1528
+ $email = preg_replace( '/[^A-Za-z0-9]/', '', $emailparts[0] );
1529
+ $username = $email;
1530
+ }
1531
  }
1532
 
1533
+ // No Username yet. Generate a random one.
1534
+ if ( empty( $username ) ) {
1535
+ $username = wp_generate_password( 10, false );
1536
  }
1537
 
1538
+ // Check if username is taken and continue to append an incremented number until it is unique.
1539
  $taken = true;
1540
  $count = 0;
1541
  while ( $taken ) {
1542
+ // Append a number to the end of the username.
1543
  if ( $count ) {
1544
  $username = preg_replace( '/[0-9]/', '', $username ) . $count;
1545
  }
1546
 
1547
+ // Check if the username is taken.
1548
+ $taken = username_exists( $username );
1549
 
1550
+ // Increment the number.
1551
  $count++;
1552
  }
1553
 
1554
+ // Sanitize the username.
1555
+ $username = sanitize_user( $username );
1556
+
1557
+ // We must have a good username now.
1558
  return $username;
1559
  }
1560
 
2477
  // start with the rounded price
2478
  $formatted = pmpro_round_price( $price );
2479
 
2480
+ $decimals = isset( $pmpro_currencies[ $pmpro_currency ]['decimals'] ) ? (int) $pmpro_currencies[ $pmpro_currency ]['decimals'] : pmpro_get_decimal_place();
2481
+ $decimal_separator = isset( $pmpro_currencies[ $pmpro_currency ]['decimal_separator'] ) ? $pmpro_currencies[ $pmpro_currency ]['decimal_separator'] : '.';
2482
+ $thousands_separator = isset( $pmpro_currencies[ $pmpro_currency ]['thousands_separator'] ) ? $pmpro_currencies[ $pmpro_currency ]['thousands_separator'] : ',';
2483
+ $symbol_position = isset( $pmpro_currencies[ $pmpro_currency ]['position'] ) ? $pmpro_currencies[ $pmpro_currency ]['position'] : 'left';
2484
+
2485
  // settings stored in array?
2486
  if ( ! empty( $pmpro_currencies[ $pmpro_currency ] ) && is_array( $pmpro_currencies[ $pmpro_currency ] ) ) {
2487
  // format number do decimals, with decimal_separator and thousands_separator
2488
  $formatted = number_format(
2489
  $formatted,
2490
+ $decimals,
2491
+ $decimal_separator,
2492
+ $thousands_separator
2493
  );
2494
 
2495
  // which side is the symbol on?
2496
+ if ( ! empty( $symbol_position ) && $symbol_position == 'left' ) {
2497
  $formatted = $pmpro_currency_symbol . $formatted;
2498
  } else {
2499
  $formatted = $formatted . $pmpro_currency_symbol;
2500
  }
2501
  } else {
2502
  // default to symbol on the left, 2 decimals using . and ,
2503
+ $formatted = $pmpro_currency_symbol . number_format( $formatted, pmpro_get_decimal_place() );
2504
  }
2505
 
2506
+ // Trim the trailing zero values.
2507
+ $formatted = pmpro_trim_trailing_zeroes( $formatted, $decimals, $decimal_separator, $pmpro_currency_symbol, $symbol_position );
2508
+
2509
  // filter
2510
  return apply_filters( 'pmpro_format_price', $formatted, $price, $pmpro_currency, $pmpro_currency_symbol );
2511
  }
2512
 
2513
+
2514
+ /**
2515
+ * Function to trim trailing zeros from an amount.
2516
+ * @since 2.1
2517
+ * @return float $amount The trimmed amount (removed trailing zeroes).
2518
+ */
2519
+ function pmpro_trim_trailing_zeroes( $amount, $decimals, $decimal_separator, $symbol, $symbol_position = "left" ) {
2520
+
2521
+ if ( $decimals <= 2 ) {
2522
+ return $amount;
2523
+ }
2524
+ //Check to see if decimal places are only 0. if so, then don't trim it.
2525
+ $decimal_value = explode( $decimal_separator, $amount );
2526
+
2527
+ if ( empty( $decimal_value[1] ) ) {
2528
+ return $amount;
2529
+ }
2530
+
2531
+ $is_zero = round( intval( $decimal_value[1] ) );
2532
+ // Store this in a variable for another time.
2533
+ $original_amount = $amount;
2534
+
2535
+ if ( $is_zero > 0 ) {
2536
+ if ( $symbol_position == 'right' ) {
2537
+ $amount = rtrim( $amount, $symbol ); // remove currency symbol.
2538
+ $amount = rtrim( $amount, 0 ); // remove trailing 0's.
2539
+
2540
+ // put the symbol back.
2541
+ $amount .= $symbol;
2542
+ } else {
2543
+ $amount = rtrim( $amount, 0 ); // remove trailing 0's.
2544
+ }
2545
+ }
2546
+
2547
+ $amount = apply_filters( 'pmpro_trim_cost_amount', $amount, $original_amount, $decimal_separator, $symbol, $symbol_position );
2548
+
2549
+ return $amount;
2550
+ }
2551
+
2552
+ /**
2553
+ * Allow users to adjust the allowed decimal places.
2554
+ * @since 2.1
2555
+ */
2556
+ function pmpro_get_decimal_place() {
2557
+ // filter this to support different decimal places.
2558
+ $decimal_place = apply_filters( 'pmpro_decimal_places', 2 );
2559
+
2560
+ if ( intval( $decimal_place ) > 8 ) {
2561
+ $decimal_place = 8;
2562
+ }
2563
+
2564
+ return $decimal_place;
2565
+ }
2566
  /**
2567
  * Which side does the currency symbol go on?
2568
  *
2587
  */
2588
  function pmpro_round_price( $price, $currency = '' ) {
2589
  global $pmpro_currency, $pmpro_currencies;
2590
+ $decimals = pmpro_get_decimal_place();
2591
 
2592
  if ( '' === $currency && ! empty( $pmpro_currencies[ $pmpro_currency ] ) ) {
2593
  $currency = $pmpro_currency;
2610
  }
2611
 
2612
  /**
2613
+ * Cast to floats and pad zeroes after the decimal
2614
  * when editing the price on the edit level page.
2615
  * Only do this for currency with decimals = 2
2616
  * Only do this if using . as the decimal separator.
2861
  }
2862
  }
2863
 
2864
+ /**
2865
  * Return an array of allowed order statuses
2866
  *
2867
  * @since 1.9.3
2917
  SET status = 'inactive'";
2918
  $wpdb->query( $sqlQuery );
2919
  }
2920
+
2921
+ /**
2922
+ * Are we on the PMPro checkout page?
2923
+ * @since 2.1
2924
+ * @return bool True if we are on the checkout page, false otherwise
2925
+ */
2926
+ function pmpro_is_checkout() {
2927
+ global $pmpro_pages;
2928
+
2929
+ // Try is_page first.
2930
+ if ( isset( $pmpro_pages['checkout'] ) ) {
2931
+ $is_checkout = is_page( $pmpro_pages['checkout'] );
2932
+ } else {
2933
+ $is_checkout = false;
2934
+ }
2935
+
2936
+ // Page might not be setup yet or a custom page.
2937
+ $queried_object = get_queried_object();
2938
+
2939
+ if ( ! $is_checkout &&
2940
+ ! empty( $queried_object ) &&
2941
+ ! empty( $queried_object->post_content ) &&
2942
+ ( has_shortcode( $queried_object->post_content, 'pmpro_checkout' ) ||
2943
+ ( function_exists( 'has_block' ) &&
2944
+ has_block( 'pmpro/checkout-page', $queried_object->post_content )
2945
+ )
2946
+ )
2947
+ ) {
2948
+ $is_checkout = true;
2949
+ }
2950
+
2951
+ /**
2952
+ * Filter for pmpro_is_checkout return value.
2953
+ * @since 2.1
2954
+ * @param bool $is_checkout true if we are on the checkout page, false otherwise
2955
+ */
2956
+ $is_checkout = apply_filters( 'pmpro_is_checkout', $is_checkout );
2957
+
2958
+ return $is_checkout;
2959
+ }
2960
+
2961
+ /**
2962
+ * Are we showing discount codes at checkout?
2963
+ */
2964
+ function pmpro_show_discount_code() {
2965
+ global $wpdb;
2966
+ static $show;
2967
+
2968
+ // check DB if we haven't yet
2969
+ if ( !isset( $show ) ) {
2970
+ if ( $wpdb->get_var( "SELECT id FROM $wpdb->pmpro_discount_codes LIMIT 1" ) ) {
2971
+ $show = true;
2972
+ } else {
2973
+ $show = false;
2974
+ }
2975
+ }
2976
+
2977
+ $show = apply_filters( "pmpro_show_discount_code", $show );
2978
+
2979
+ return $show;
2980
+ }
2981
+
2982
+ /**
2983
+ * Check if the checkout form was submitted.
2984
+ * Accounts for image buttons/etc.
2985
+ * @since 2.1
2986
+ * @return bool True if the form was submitted, else false.
2987
+ */
2988
+ function pmpro_was_checkout_form_submitted() {
2989
+ // Default to false.
2990
+ $submit = false;
2991
+
2992
+ // Basic check for a field called submit-checkout.
2993
+ if ( isset( $_REQUEST['submit-checkout'] ) ) {
2994
+ $submit = true;
2995
+ }
2996
+
2997
+ // _x stuff in case they clicked on the image button with their mouse
2998
+ if ( empty( $submit ) && isset( $_REQUEST['submit-checkout_x'] ) ) {
2999
+ $submit = true;
3000
+ }
3001
+
3002
+ return $submit;
3003
+ }
3004
+
3005
+ /**
3006
+ * Build the order object used at checkout.
3007
+ * @since 2.1
3008
+ * @return mixed $order Order object.
3009
+ */
3010
+ function pmpro_build_order_for_checkout() {
3011
+ global $post, $gateway, $wpdb, $besecure, $discount_code, $discount_code_id, $pmpro_level, $pmpro_levels, $pmpro_msg, $pmpro_msgt, $pmpro_review, $skip_account_fields, $pmpro_paypal_token, $pmpro_show_discount_code, $pmpro_error_fields, $pmpro_required_billing_fields, $pmpro_required_user_fields, $wp_version, $current_user, $pmpro_requirebilling, $tospage, $username, $password, $password2, $bfirstname, $blastname, $baddress1, $baddress2, $bcity, $bstate, $bzipcode, $bcountry, $bphone, $bemail, $bconfirmemail, $CardType, $AccountNumber, $ExpirationMonth, $ExpirationYear, $pmpro_states, $recaptcha, $recaptcha_privatekey, $CVV;
3012
+
3013
+ $morder = new MemberOrder();
3014
+ $morder->membership_id = $pmpro_level->id;
3015
+ $morder->membership_name = $pmpro_level->name;
3016
+ $morder->discount_code = $discount_code;
3017
+ $morder->InitialPayment = pmpro_round_price( $pmpro_level->initial_payment );
3018
+ $morder->PaymentAmount = pmpro_round_price( $pmpro_level->billing_amount );
3019
+ $morder->ProfileStartDate = date_i18n( "Y-m-d", current_time( "timestamp" ) ) . "T0:0:0";
3020
+ $morder->BillingPeriod = $pmpro_level->cycle_period;
3021
+ $morder->BillingFrequency = $pmpro_level->cycle_number;
3022
+ if ( $pmpro_level->billing_limit ) {
3023
+ $morder->TotalBillingCycles = $pmpro_level->billing_limit;
3024
+ }
3025
+ if ( pmpro_isLevelTrial( $pmpro_level ) ) {
3026
+ $morder->TrialBillingPeriod = $pmpro_level->cycle_period;
3027
+ $morder->TrialBillingFrequency = $pmpro_level->cycle_number;
3028
+ $morder->TrialBillingCycles = $pmpro_level->trial_limit;
3029
+ $morder->TrialAmount = pmpro_round_price( $pmpro_level->trial_amount );
3030
+ }
3031
+
3032
+ // Credit card values.
3033
+ $morder->cardtype = $CardType;
3034
+ $morder->accountnumber = $AccountNumber;
3035
+ $morder->expirationmonth = $ExpirationMonth;
3036
+ $morder->expirationyear = $ExpirationYear;
3037
+ $morder->ExpirationDate = $ExpirationMonth . $ExpirationYear;
3038
+ $morder->ExpirationDate_YdashM = $ExpirationYear . "-" . $ExpirationMonth;
3039
+ $morder->CVV2 = $CVV;
3040
+
3041
+ // Not saving email in order table, but the sites need it.
3042
+ $morder->Email = $bemail;
3043
+
3044
+ // Save the user ID if logged in.
3045
+ if ( $current_user->ID ) {
3046
+ $morder->user_id = $current_user->ID;
3047
+ }
3048
+
3049
+ // Sometimes we need these split up.
3050
+ $morder->FirstName = $bfirstname;
3051
+ $morder->LastName = $blastname;
3052
+ $morder->Address1 = $baddress1;
3053
+ $morder->Address2 = $baddress2;
3054
+
3055
+ // Set other values.
3056
+ $morder->billing = new stdClass();
3057
+ $morder->billing->name = $bfirstname . " " . $blastname;
3058
+ $morder->billing->street = trim( $baddress1 . " " . $baddress2 );
3059
+ $morder->billing->city = $bcity;
3060
+ $morder->billing->state = $bstate;
3061
+ $morder->billing->country = $bcountry;
3062
+ $morder->billing->zip = $bzipcode;
3063
+ $morder->billing->phone = $bphone;
3064
+ $morder->gateway = $gateway;
3065
+ $morder->setGateway();
3066
+
3067
+ // Set up level var.
3068
+ $morder->getMembershipLevelAtCheckout();
3069
+
3070
+ // Set tax.
3071
+ $initial_tax = $morder->getTaxForPrice( $morder->InitialPayment );
3072
+ $recurring_tax = $morder->getTaxForPrice( $morder->PaymentAmount );
3073
+
3074
+ // Set amounts.
3075
+ $morder->initial_amount = pmpro_round_price((float)$morder->InitialPayment + (float)$initial_tax);
3076
+ $morder->subscription_amount = pmpro_round_price((float)$morder->PaymentAmount + (float)$recurring_tax);
3077
+
3078
+ // Filter for order, since v1.8
3079
+ $morder = apply_filters( 'pmpro_checkout_order', $morder );
3080
+
3081
+ return $morder;
3082
+ }
includes/init.php CHANGED
@@ -8,77 +8,6 @@ function pmpro_init() {
8
  require_once(PMPRO_DIR . '/includes/states.php');
9
  require_once(PMPRO_DIR . '/includes/currencies.php');
10
 
11
- if( is_admin() ) {
12
- // Admin scripts and styles. We could use the admin_enqueue_scripts, but this works too.
13
-
14
- wp_register_script( 'pmpro_admin', plugins_url( 'js/paid-memberships-pro.js', dirname(__FILE__) ), array( 'jquery' ) );
15
- $all_levels = pmpro_getAllLevels( true, true );
16
- $all_level_values_and_labels = array();
17
- foreach( $all_levels as $level ) {
18
- $all_level_values_and_labels[] = array( 'value' => $level->id, 'label' => $level->name );
19
- }
20
- wp_localize_script( 'pmpro_admin', 'pmpro', array(
21
- 'all_levels' => $all_levels,
22
- 'all_level_values_and_labels' => $all_level_values_and_labels
23
- ));
24
- wp_enqueue_script( 'pmpro_admin' );
25
-
26
- $admin_css_rtl = false;
27
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/admin.css")) {
28
- $admin_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/admin.css";
29
- if( is_rtl() && file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/admin-rtl.css") ) {
30
- $admin_css_rtl = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/admin-rtl.css";
31
- }
32
- } elseif(file_exists(get_template_directory() . "/paid-memberships-pro/admin.css")) {
33
- $admin_css = get_template_directory_uri() . "/paid-memberships-pro/admin.css";
34
- if( is_rtl() && file_exists(get_template_directory() . "/paid-memberships-pro/css/admin-rtl.css") ) {
35
- $admin_css_rtl = get_template_directory_uri() . "/paid-memberships-pro/css/admin-rtl.css";
36
- }
37
- } else {
38
- $admin_css = plugins_url('css/admin.css',dirname(__FILE__) );
39
- if( is_rtl() ) {
40
- $admin_css_rtl = plugins_url('css/admin-rtl.css',dirname(__FILE__) );
41
- }
42
- }
43
- wp_enqueue_style('pmpro_admin', $admin_css, array(), PMPRO_VERSION, "screen");
44
- if( $admin_css_rtl ) {
45
- wp_enqueue_style('pmpro_admin_rtl', $admin_css_rtl, array(), PMPRO_VERSION, "screen");
46
- }
47
-
48
- wp_enqueue_script('jquery-ui-sortable');
49
- } else {
50
- // Frontend styles.
51
- $frontend_css_rtl = false;
52
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/frontend.css")) {
53
- $frontend_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/frontend.css";
54
- if( is_rtl() && file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/frontend-rtl.css") ) {
55
- $frontend_css_rtl = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/frontend-rtl.css";
56
- }
57
- } elseif(file_exists(get_template_directory() . "/paid-memberships-pro/frontend.css")) {
58
- $frontend_css = get_template_directory_uri() . "/paid-memberships-pro/frontend.css";
59
- if( is_rtl() && file_exists(get_template_directory() . "/paid-memberships-pro/css/frontend-rtl.css") ) {
60
- $frontend_css_rtl = get_template_directory_uri() . "/paid-memberships-pro/css/frontend-rtl.css";
61
- }
62
- } else {
63
- $frontend_css = plugins_url('css/frontend.css',dirname(__FILE__) );
64
- if( is_rtl() ) {
65
- $frontend_css_rtl = plugins_url('css/frontend-rtl.css',dirname(__FILE__) );
66
- }
67
- }
68
- wp_enqueue_style('pmpro_frontend', $frontend_css, array(), PMPRO_VERSION, "screen");
69
- if( $frontend_css_rtl ) {
70
- wp_enqueue_style('pmpro_frontend_rtl', $frontend_css_rtl, array(), PMPRO_VERSION, "screen");
71
- }
72
-
73
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/print.css"))
74
- $print_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/print.css";
75
- elseif(file_exists(get_template_directory() . "/paid-memberships-pro/print.css"))
76
- $print_css = get_template_directory_uri() . "/paid-memberships-pro/print.css";
77
- else
78
- $print_css = plugins_url('css/print.css',dirname(__FILE__) );
79
- wp_enqueue_style('pmpro_print', $print_css, array(), PMPRO_VERSION, "print");
80
- }
81
-
82
  global $pmpro_pages, $pmpro_core_pages, $pmpro_ready, $pmpro_currencies, $pmpro_currency, $pmpro_currency_symbol;
83
  $pmpro_pages = array();
84
  $pmpro_pages["account"] = pmpro_getOption("account_page_id");
8
  require_once(PMPRO_DIR . '/includes/states.php');
9
  require_once(PMPRO_DIR . '/includes/currencies.php');
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  global $pmpro_pages, $pmpro_core_pages, $pmpro_ready, $pmpro_currencies, $pmpro_currency, $pmpro_currency_symbol;
12
  $pmpro_pages = array();
13
  $pmpro_pages["account"] = pmpro_getOption("account_page_id");
includes/lib/Stripe/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
  The MIT License
2
 
3
- Copyright (c) 2010-2015 Stripe
4
 
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
  of this software and associated documentation files (the "Software"), to deal
1
  The MIT License
2
 
3
+ Copyright (c) 2010-2019 Stripe, Inc. (https://stripe.com)
4
 
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
  of this software and associated documentation files (the "Software"), to deal
includes/lib/Stripe/README.md CHANGED
@@ -6,11 +6,15 @@
6
  [![License](https://poser.pugx.org/stripe/stripe-php/license.svg)](https://packagist.org/packages/stripe/stripe-php)
7
  [![Code Coverage](https://coveralls.io/repos/stripe/stripe-php/badge.svg?branch=master)](https://coveralls.io/r/stripe/stripe-php?branch=master)
8
 
9
- You can sign up for a Stripe account at https://stripe.com.
 
 
 
 
10
 
11
  ## Requirements
12
 
13
- PHP 5.3.3 and later.
14
 
15
  ## Composer
16
 
@@ -20,7 +24,7 @@ You can install the bindings via [Composer](http://getcomposer.org/). Run the fo
20
  composer require stripe/stripe-php
21
  ```
22
 
23
- To use the bindings, use Composer's [autoload](https://getcomposer.org/doc/00-intro.md#autoloading):
24
 
25
  ```php
26
  require_once('vendor/autoload.php');
@@ -36,7 +40,7 @@ require_once('/path/to/stripe-php/init.php');
36
 
37
  ## Dependencies
38
 
39
- The bindings require the following extension in order to work properly:
40
 
41
  - [`curl`](https://secure.php.net/manual/en/book.curl.php), although you can use your own non-cURL client if you prefer
42
  - [`json`](https://secure.php.net/manual/en/book.json.php)
@@ -50,16 +54,22 @@ Simple usage looks like:
50
 
51
  ```php
52
  \Stripe\Stripe::setApiKey('sk_test_BQokikJOvBiI2HlWgH4olfQ2');
53
- $charge = \Stripe\Charge::create(array('amount' => 2000, 'currency' => 'usd', 'source' => 'tok_189fqt2eZvKYlo2CTGBeg6Uq' ));
54
  echo $charge;
55
  ```
56
 
57
  ## Documentation
58
 
59
- Please see https://stripe.com/docs/api for up-to-date documentation.
60
 
61
  ## Legacy Version Support
62
 
 
 
 
 
 
 
63
  If you are using PHP 5.2, you can download v1.18.0 ([zip](https://github.com/stripe/stripe-php/archive/v1.18.0.zip), [tar.gz](https://github.com/stripe/stripe-php/archive/v1.18.0.tar.gz)) from our [releases page](https://github.com/stripe/stripe-php/releases). This version will continue to work with new versions of the Stripe API for all common uses.
64
 
65
  This legacy version may be included via `require_once("/path/to/stripe-php/lib/Stripe.php");`, and used like:
@@ -97,7 +107,7 @@ Need to set a proxy for your requests? Pass in the requisite `CURLOPT_*` array t
97
 
98
  ```php
99
  // set up your tweaked Curl client
100
- $curl = new \Stripe\HttpClient\CurlClient(array(CURLOPT_PROXY => 'proxy.local:80'));
101
  // tell Stripe to use the tweaked client
102
  \Stripe\ApiRequestor::setHttpClient($curl);
103
  ```
@@ -114,6 +124,15 @@ end up there instead of `error_log`:
114
  \Stripe\Stripe::setLogger($logger);
115
  ```
116
 
 
 
 
 
 
 
 
 
 
117
  ### SSL / TLS compatibility issues
118
 
119
  Stripe's API now requires that [all connections use TLS 1.2](https://stripe.com/blog/upgrading-tls). Some systems (most notably some older CentOS and RHEL versions) are capable of using TLS 1.2 but will use TLS 1.0 or 1.1 by default. In this case, you'd get an `invalid_request_error` with the following error message: "Stripe no longer supports API requests made with TLS 1.0. Please initiate HTTPS connections with TLS 1.2 or later. You can learn more about this at [https://stripe.com/blog/upgrading-tls](https://stripe.com/blog/upgrading-tls).".
@@ -121,19 +140,82 @@ Stripe's API now requires that [all connections use TLS 1.2](https://stripe.com/
121
  The recommended course of action is to [upgrade your cURL and OpenSSL packages](https://support.stripe.com/questions/how-do-i-upgrade-my-stripe-integration-from-tls-1-0-to-tls-1-2#php) so that TLS 1.2 is used by default, but if that is not possible, you might be able to solve the issue by setting the `CURLOPT_SSLVERSION` option to either `CURL_SSLVERSION_TLSv1` or `CURL_SSLVERSION_TLSv1_2`:
122
 
123
  ```php
124
- $curl = new \Stripe\HttpClient\CurlClient(array(CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1));
125
  \Stripe\ApiRequestor::setHttpClient($curl);
126
  ```
127
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  ## Development
129
 
 
 
 
 
 
 
130
  Install dependencies:
131
 
132
- ``` bash
133
  composer install
134
  ```
135
 
136
- ## Tests
 
 
 
 
 
 
 
137
 
138
  Install dependencies as mentioned above (which will resolve [PHPUnit](http://packagist.org/packages/phpunit/phpunit)), then you can run the test suite:
139
 
@@ -147,6 +229,12 @@ Or to run an individual test file:
147
  ./vendor/bin/phpunit tests/UtilTest.php
148
  ```
149
 
 
 
 
 
 
 
150
  ## Attention plugin developers
151
 
152
  Are you writing a plugin that integrates Stripe and embeds our library? Then please use the `setAppInfo` function to identify your plugin. For example:
@@ -161,4 +249,9 @@ The method should be called once, before any request is sent to the API. The sec
161
 
162
  See the "SSL / TLS compatibility issues" paragraph above for full context. If you want to ensure that your plugin can be used on all systems, you should add a configuration option to let your users choose between different values for `CURLOPT_SSLVERSION`: none (default), `CURL_SSLVERSION_TLSv1` and `CURL_SSLVERSION_TLSv1_2`.
163
 
 
 
 
164
  [psr3]: http://www.php-fig.org/psr/psr-3/
 
 
6
  [![License](https://poser.pugx.org/stripe/stripe-php/license.svg)](https://packagist.org/packages/stripe/stripe-php)
7
  [![Code Coverage](https://coveralls.io/repos/stripe/stripe-php/badge.svg?branch=master)](https://coveralls.io/r/stripe/stripe-php?branch=master)
8
 
9
+ The Stripe PHP library provides convenient access to the Stripe API from
10
+ applications written in the PHP language. It includes a pre-defined set of
11
+ classes for API resources that initialize themselves dynamically from API
12
+ responses which makes it compatible with a wide range of versions of the Stripe
13
+ API.
14
 
15
  ## Requirements
16
 
17
+ PHP 5.4.0 and later.
18
 
19
  ## Composer
20
 
24
  composer require stripe/stripe-php
25
  ```
26
 
27
+ To use the bindings, use Composer's [autoload](https://getcomposer.org/doc/01-basic-usage.md#autoloading):
28
 
29
  ```php
30
  require_once('vendor/autoload.php');
40
 
41
  ## Dependencies
42
 
43
+ The bindings require the following extensions in order to work properly:
44
 
45
  - [`curl`](https://secure.php.net/manual/en/book.curl.php), although you can use your own non-cURL client if you prefer
46
  - [`json`](https://secure.php.net/manual/en/book.json.php)
54
 
55
  ```php
56
  \Stripe\Stripe::setApiKey('sk_test_BQokikJOvBiI2HlWgH4olfQ2');
57
+ $charge = \Stripe\Charge::create(['amount' => 2000, 'currency' => 'usd', 'source' => 'tok_189fqt2eZvKYlo2CTGBeg6Uq']);
58
  echo $charge;
59
  ```
60
 
61
  ## Documentation
62
 
63
+ See the [PHP API docs](https://stripe.com/docs/api/php#intro).
64
 
65
  ## Legacy Version Support
66
 
67
+ ### PHP 5.3
68
+
69
+ If you are using PHP 5.3, you can download v5.9.2 ([zip](https://github.com/stripe/stripe-php/archive/v5.9.2.zip), [tar.gz](https://github.com/stripe/stripe-php/archive/v5.9.2.tar.gz)) from our [releases page](https://github.com/stripe/stripe-php/releases). This version will continue to work with new versions of the Stripe API for all common uses.
70
+
71
+ ### PHP 5.2
72
+
73
  If you are using PHP 5.2, you can download v1.18.0 ([zip](https://github.com/stripe/stripe-php/archive/v1.18.0.zip), [tar.gz](https://github.com/stripe/stripe-php/archive/v1.18.0.tar.gz)) from our [releases page](https://github.com/stripe/stripe-php/releases). This version will continue to work with new versions of the Stripe API for all common uses.
74
 
75
  This legacy version may be included via `require_once("/path/to/stripe-php/lib/Stripe.php");`, and used like:
107
 
108
  ```php
109
  // set up your tweaked Curl client
110
+ $curl = new \Stripe\HttpClient\CurlClient([CURLOPT_PROXY => 'proxy.local:80']);
111
  // tell Stripe to use the tweaked client
112
  \Stripe\ApiRequestor::setHttpClient($curl);
113
  ```
124
  \Stripe\Stripe::setLogger($logger);
125
  ```
126
 
127
+ ### Accessing response data
128
+
129
+ You can access the data from the last API response on any object via `getLastResponse()`.
130
+
131
+ ```php
132
+ $charge = \Stripe\Charge::create(['amount' => 2000, 'currency' => 'usd', 'source' => 'tok_visa']);
133
+ echo $charge->getLastResponse()->headers['Request-Id'];
134
+ ```
135
+
136
  ### SSL / TLS compatibility issues
137
 
138
  Stripe's API now requires that [all connections use TLS 1.2](https://stripe.com/blog/upgrading-tls). Some systems (most notably some older CentOS and RHEL versions) are capable of using TLS 1.2 but will use TLS 1.0 or 1.1 by default. In this case, you'd get an `invalid_request_error` with the following error message: "Stripe no longer supports API requests made with TLS 1.0. Please initiate HTTPS connections with TLS 1.2 or later. You can learn more about this at [https://stripe.com/blog/upgrading-tls](https://stripe.com/blog/upgrading-tls).".
140
  The recommended course of action is to [upgrade your cURL and OpenSSL packages](https://support.stripe.com/questions/how-do-i-upgrade-my-stripe-integration-from-tls-1-0-to-tls-1-2#php) so that TLS 1.2 is used by default, but if that is not possible, you might be able to solve the issue by setting the `CURLOPT_SSLVERSION` option to either `CURL_SSLVERSION_TLSv1` or `CURL_SSLVERSION_TLSv1_2`:
141
 
142
  ```php
143
+ $curl = new \Stripe\HttpClient\CurlClient([CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1]);
144
  \Stripe\ApiRequestor::setHttpClient($curl);
145
  ```
146
 
147
+ ### Per-request Configuration
148
+
149
+ For apps that need to use multiple keys during the lifetime of a process, like
150
+ one that uses [Stripe Connect][connect], it's also possible to set a
151
+ per-request key and/or account:
152
+
153
+ ```php
154
+ \Stripe\Charge::all([], [
155
+ 'api_key' => 'sk_test_...',
156
+ 'stripe_account' => 'acct_...'
157
+ ]);
158
+
159
+ \Stripe\Charge::retrieve("ch_18atAXCdGbJFKhCuBAa4532Z", [
160
+ 'api_key' => 'sk_test_...',
161
+ 'stripe_account' => 'acct_...'
162
+ ]);
163
+ ```
164
+
165
+ ### Configuring CA Bundles
166
+
167
+ By default, the library will use its own internal bundle of known CA
168
+ certificates, but it's possible to configure your own:
169
+
170
+ ```php
171
+ \Stripe\Stripe::setCABundlePath("path/to/ca/bundle");
172
+ ```
173
+
174
+ ### Configuring Automatic Retries
175
+
176
+ The library can be configured to automatically retry requests that fail due to
177
+ an intermittent network problem:
178
+
179
+ ```php
180
+ \Stripe\Stripe::setMaxNetworkRetries(2);
181
+ ```
182
+
183
+ [Idempotency keys][idempotency-keys] are added to requests to guarantee that
184
+ retries are safe.
185
+
186
+ ### Request latency telemetry
187
+
188
+ By default, the library sends request latency telemetry to Stripe. These
189
+ numbers help Stripe improve the overall latency of its API for all users.
190
+
191
+ You can disable this behavior if you prefer:
192
+
193
+ ```php
194
+ \Stripe\Stripe::setEnableTelemetry(false);
195
+ ```
196
+
197
  ## Development
198
 
199
+ Get [Composer][composer]. For example, on Mac OS:
200
+
201
+ ```bash
202
+ brew install composer
203
+ ```
204
+
205
  Install dependencies:
206
 
207
+ ```bash
208
  composer install
209
  ```
210
 
211
+ The test suite depends on [stripe-mock], so make sure to fetch and run it from a
212
+ background terminal ([stripe-mock's README][stripe-mock] also contains
213
+ instructions for installing via Homebrew and other methods):
214
+
215
+ ```bash
216
+ go get -u github.com/stripe/stripe-mock
217
+ stripe-mock
218
+ ```
219
 
220
  Install dependencies as mentioned above (which will resolve [PHPUnit](http://packagist.org/packages/phpunit/phpunit)), then you can run the test suite:
221
 
229
  ./vendor/bin/phpunit tests/UtilTest.php
230
  ```
231
 
232
+ Update bundled CA certificates from the [Mozilla cURL release][curl]:
233
+
234
+ ```bash
235
+ ./update_certs.php
236
+ ```
237
+
238
  ## Attention plugin developers
239
 
240
  Are you writing a plugin that integrates Stripe and embeds our library? Then please use the `setAppInfo` function to identify your plugin. For example:
249
 
250
  See the "SSL / TLS compatibility issues" paragraph above for full context. If you want to ensure that your plugin can be used on all systems, you should add a configuration option to let your users choose between different values for `CURLOPT_SSLVERSION`: none (default), `CURL_SSLVERSION_TLSv1` and `CURL_SSLVERSION_TLSv1_2`.
251
 
252
+ [composer]: https://getcomposer.org/
253
+ [connect]: https://stripe.com/connect
254
+ [curl]: http://curl.haxx.se/docs/caextract.html
255
  [psr3]: http://www.php-fig.org/psr/psr-3/
256
+ [idempotency-keys]: https://stripe.com/docs/api/php#idempotent_requests
257
+ [stripe-mock]: https://github.com/stripe/stripe-mock
includes/lib/Stripe/VERSION CHANGED
@@ -1 +1 @@
1
- 5.2.2
1
+ 6.40.0
includes/lib/Stripe/data/ca-certificates.crt CHANGED
@@ -1,20 +1,20 @@
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
- ## Certificate data from Mozilla as of: Fri Jan 22 20:39:57 2016
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
8
  ## file (certdata.txt). This file can be found in the mozilla source tree:
9
- ## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
  ##
11
  ## It contains the certificates in PEM format and therefore
12
  ## can be directly used with curl / libcurl / php_curl, or with
13
  ## an Apache+mod_ssl webserver for SSL client authentication.
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
- ## Conversion done with mk-ca-bundle.pl version 1.25.
17
- ## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e
18
  ##
19
 
20
 
@@ -130,30 +130,6 @@ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
130
  RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
131
  -----END CERTIFICATE-----
132
 
133
- AddTrust Low-Value Services Root
134
- ================================
135
- -----BEGIN CERTIFICATE-----
136
- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
137
- QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
138
- cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
139
- CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
140
- ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
141
- AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
142
- 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
143
- oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
144
- Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
145
- GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
146
- HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
147
- AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
148
- RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
149
- HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
150
- ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
151
- iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
152
- eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
153
- mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
154
- ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
155
- -----END CERTIFICATE-----
156
-
157
  AddTrust External Root
158
  ======================
159
  -----BEGIN CERTIFICATE-----
@@ -178,54 +154,6 @@ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
178
  G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
179
  -----END CERTIFICATE-----
180
 
181
- AddTrust Public Services Root
182
- =============================
183
- -----BEGIN CERTIFICATE-----
184
- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
185
- QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
186
- cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
187
- BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
188
- dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
189
- AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
190
- nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
191
- d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
192
- Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
193
- HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
194
- A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
195
- /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
196
- FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
197
- A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
198
- JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
199
- +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
200
- GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
201
- Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
202
- EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
203
- -----END CERTIFICATE-----
204
-
205
- AddTrust Qualified Certificates Root
206
- ====================================
207
- -----BEGIN CERTIFICATE-----
208
- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
209
- QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
210
- cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
211
- CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
212
- IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
213
- 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
214
- 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
215
- KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
216
- L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
217
- wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
218
- MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
219
- BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
220
- BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
221
- azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
222
- ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
223
- GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
224
- dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
225
- RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
226
- iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
227
- -----END CERTIFICATE-----
228
-
229
  Entrust Root Certification Authority
230
  ====================================
231
  -----BEGIN CERTIFICATE-----
@@ -252,27 +180,6 @@ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
252
  tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
253
  -----END CERTIFICATE-----
254
 
255
- RSA Security 2048 v3
256
- ====================
257
- -----BEGIN CERTIFICATE-----
258
- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
259
- ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
260
- MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
261
- BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
262
- AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
263
- Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
264
- WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
265
- KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
266
- +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
267
- MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
268
- FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
269
- v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
270
- 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
271
- VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
272
- nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
273
- pKnXwiJPZ9d37CAFYd4=
274
- -----END CERTIFICATE-----
275
-
276
  GeoTrust Global CA
277
  ==================
278
  -----BEGIN CERTIFICATE-----
@@ -294,27 +201,6 @@ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
294
  Mw==
295
  -----END CERTIFICATE-----
296
 
297
- GeoTrust Global CA 2
298
- ====================
299
- -----BEGIN CERTIFICATE-----
300
- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
301
- R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
302
- MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
303
- LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
304
- ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
305
- NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
306
- LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
307
- Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
308
- HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
309
- MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
310
- K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
311
- srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
312
- ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
313
- OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
314
- x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
315
- H4z1Ir+rzoPz4iIprn2DQKi6bA==
316
- -----END CERTIFICATE-----
317
-
318
  GeoTrust Universal CA
319
  =====================
320
  -----BEGIN CERTIFICATE-----
@@ -440,56 +326,6 @@ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
440
  12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
441
  -----END CERTIFICATE-----
442
 
443
- Comodo Secure Services root
444
- ===========================
445
- -----BEGIN CERTIFICATE-----
446
- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
447
- R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
448
- TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
449
- MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
450
- Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
451
- BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
452
- ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
453
- 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
454
- rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
455
- oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
456
- p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
457
- FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
458
- gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
459
- YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
460
- aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
461
- 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
462
- Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
463
- DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
464
- pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
465
- RR3B7Hzs/Sk=
466
- -----END CERTIFICATE-----
467
-
468
- Comodo Trusted Services root
469
- ============================
470
- -----BEGIN CERTIFICATE-----
471
- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
472
- R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
473
- TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
474
- MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
475
- bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
476
- IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
477
- AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
478
- 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
479
- /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
480
- juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
481
- ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
482
- DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
483
- /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
484
- ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
485
- cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
486
- uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
487
- pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
488
- BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
489
- R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
490
- 9y5Xt5hwXsjEeLBi
491
- -----END CERTIFICATE-----
492
-
493
  QuoVadis Root CA
494
  ================
495
  -----BEGIN CERTIFICATE-----
@@ -629,54 +465,6 @@ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
629
  llpwrN9M
630
  -----END CERTIFICATE-----
631
 
632
- Staat der Nederlanden Root CA
633
- =============================
634
- -----BEGIN CERTIFICATE-----
635
- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
636
- ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
637
- Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
638
- HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
639
- bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
640
- vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
641
- jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
642
- C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
643
- vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
644
- 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
645
- HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
646
- dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
647
- BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
648
- EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
649
- MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
650
- nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
651
- iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
652
- -----END CERTIFICATE-----
653
-
654
- UTN USERFirst Hardware Root CA
655
- ==============================
656
- -----BEGIN CERTIFICATE-----
657
- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
658
- BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
659
- IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
660
- BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
661
- OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
662
- eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
663
- ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
664
- DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
665
- wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
666
- tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
667
- i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
668
- Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
669
- gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
670
- lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
671
- UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
672
- BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
673
- //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
674
- XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
675
- lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
676
- iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
677
- nfhmqA==
678
- -----END CERTIFICATE-----
679
-
680
  Camerfirma Chambers of Commerce Root
681
  ====================================
682
  -----BEGIN CERTIFICATE-----
@@ -731,41 +519,6 @@ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
731
  t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
732
  -----END CERTIFICATE-----
733
 
734
- NetLock Notary (Class A) Root
735
- =============================
736
- -----BEGIN CERTIFICATE-----
737
- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
738
- EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
739
- dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
740
- ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
741
- DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
742
- EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
743
- VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
744
- cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
745
- D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
746
- z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
747
- /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
748
- tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
749
- 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
750
- A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
751
- Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
752
- bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
753
- IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
754
- LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
755
- ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
756
- IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
757
- IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
758
- b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
759
- bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
760
- Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
761
- bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
762
- ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
763
- ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
764
- CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
765
- KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
766
- 8CgHrTwXZoi1/baI
767
- -----END CERTIFICATE-----
768
-
769
  XRamp Global CA Root
770
  ====================
771
  -----BEGIN CERTIFICATE-----
@@ -909,38 +662,6 @@ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
909
  +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
910
  -----END CERTIFICATE-----
911
 
912
- Swisscom Root CA 1
913
- ==================
914
- -----BEGIN CERTIFICATE-----
915
- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
916
- EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
917
- dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
918
- MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
919
- aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
920
- IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
921
- MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
922
- NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
923
- AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
924
- b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
925
- 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
926
- cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
927
- WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
928
- haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
929
- MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
930
- HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
931
- BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
932
- MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
933
- jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
934
- MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
935
- VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
936
- vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
937
- OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
938
- 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
939
- nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
940
- x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
941
- NY6E0F/6MBr1mmz0DlP5OlvRHA==
942
- -----END CERTIFICATE-----
943
-
944
  DigiCert Assured ID Root CA
945
  ===========================
946
  -----BEGIN CERTIFICATE-----
@@ -1298,33 +1019,6 @@ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
1298
  ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1299
  -----END CERTIFICATE-----
1300
 
1301
- WellsSecure Public Root Certificate Authority
1302
- =============================================
1303
- -----BEGIN CERTIFICATE-----
1304
- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
1305
- F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
1306
- NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
1307
- MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
1308
- bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
1309
- VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1310
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
1311
- iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
1312
- i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
1313
- bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
1314
- K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
1315
- AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
1316
- cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
1317
- lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
1318
- i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
1319
- GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
1320
- Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
1321
- K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
1322
- bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
1323
- qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
1324
- E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
1325
- tylv2G0xffX8oRAHh84vWdw+WNs=
1326
- -----END CERTIFICATE-----
1327
-
1328
  COMODO ECC Certification Authority
1329
  ==================================
1330
  -----BEGIN CERTIFICATE-----
@@ -1342,30 +1036,6 @@ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
1342
  U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1343
  -----END CERTIFICATE-----
1344
 
1345
- IGC/A
1346
- =====
1347
- -----BEGIN CERTIFICATE-----
1348
- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
1349
- VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
1350
- Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
1351
- MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
1352
- EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
1353
- STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
1354
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
1355
- TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
1356
- So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
1357
- HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
1358
- frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
1359
- tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
1360
- egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
1361
- iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
1362
- q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
1363
- MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
1364
- Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
1365
- lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
1366
- 0mBWWg==
1367
- -----END CERTIFICATE-----
1368
-
1369
  Security Communication EV RootCA1
1370
  =================================
1371
  -----BEGIN CERTIFICATE-----
@@ -1410,46 +1080,6 @@ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
1410
  okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
1411
  -----END CERTIFICATE-----
1412
 
1413
- Microsec e-Szigno Root CA
1414
- =========================
1415
- -----BEGIN CERTIFICATE-----
1416
- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
1417
- BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
1418
- EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
1419
- MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
1420
- dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
1421
- GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
1422
- AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
1423
- d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
1424
- oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
1425
- QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
1426
- PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
1427
- MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
1428
- IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
1429
- VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
1430
- LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
1431
- dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
1432
- AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
1433
- 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
1434
- AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
1435
- egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
1436
- Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
1437
- PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
1438
- c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
1439
- cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
1440
- IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
1441
- WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
1442
- MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
1443
- MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
1444
- Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
1445
- HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
1446
- nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
1447
- aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
1448
- 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
1449
- yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
1450
- S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
1451
- -----END CERTIFICATE-----
1452
-
1453
  Certigna
1454
  ========
1455
  -----BEGIN CERTIFICATE-----
@@ -1575,58 +1205,6 @@ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
1575
  dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
1576
  -----END CERTIFICATE-----
1577
 
1578
- Buypass Class 2 CA 1
1579
- ====================
1580
- -----BEGIN CERTIFICATE-----
1581
- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
1582
- QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
1583
- MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
1584
- c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
1585
- hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
1586
- cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
1587
- 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
1588
- 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
1589
- uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
1590
- MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
1591
- AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
1592
- 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
1593
- 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
1594
- fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
1595
- wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
1596
- -----END CERTIFICATE-----
1597
-
1598
- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
1599
- ==========================================================================
1600
- -----BEGIN CERTIFICATE-----
1601
- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
1602
- bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
1603
- QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
1604
- Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
1605
- ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
1606
- IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
1607
- SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
1608
- X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
1609
- gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
1610
- eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
1611
- TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
1612
- Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
1613
- uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
1614
- qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
1615
- ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
1616
- Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
1617
- /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
1618
- Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
1619
- FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
1620
- zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
1621
- XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
1622
- bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
1623
- RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
1624
- 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
1625
- 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
1626
- Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
1627
- AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
1628
- -----END CERTIFICATE-----
1629
-
1630
  certSIGN ROOT CA
1631
  ================
1632
  -----BEGIN CERTIFICATE-----
@@ -1647,49 +1225,6 @@ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
1647
  TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
1648
  -----END CERTIFICATE-----
1649
 
1650
- CNNIC ROOT
1651
- ==========
1652
- -----BEGIN CERTIFICATE-----
1653
- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
1654
- ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
1655
- OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
1656
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
1657
- o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
1658
- VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
1659
- VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
1660
- czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
1661
- y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
1662
- wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
1663
- lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
1664
- Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
1665
- O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
1666
- BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
1667
- G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
1668
- mxE=
1669
- -----END CERTIFICATE-----
1670
-
1671
- ApplicationCA - Japanese Government
1672
- ===================================
1673
- -----BEGIN CERTIFICATE-----
1674
- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
1675
- SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
1676
- MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
1677
- cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1678
- CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
1679
- fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
1680
- wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
1681
- jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
1682
- nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
1683
- WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
1684
- BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
1685
- vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
1686
- o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
1687
- /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
1688
- io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
1689
- dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
1690
- rosot4LKGAfmt1t06SAZf7IbiVQ=
1691
- -----END CERTIFICATE-----
1692
-
1693
  GeoTrust Primary Certification Authority - G3
1694
  =============================================
1695
  -----BEGIN CERTIFICATE-----
@@ -1821,7 +1356,7 @@ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1821
  -----END CERTIFICATE-----
1822
 
1823
  NetLock Arany (Class Gold) Főtanúsítvány
1824
- ============================================
1825
  -----BEGIN CERTIFICATE-----
1826
  MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1827
  A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
@@ -1876,58 +1411,6 @@ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
1876
  66+KAQ==
1877
  -----END CERTIFICATE-----
1878
 
1879
- CA Disig
1880
- ========
1881
- -----BEGIN CERTIFICATE-----
1882
- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
1883
- QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
1884
- MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
1885
- bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
1886
- DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
1887
- GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
1888
- Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
1889
- hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
1890
- ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
1891
- gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
1892
- AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
1893
- aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
1894
- ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
1895
- BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
1896
- WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
1897
- mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
1898
- CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
1899
- ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
1900
- 4Z7CRneC9VkGjCFMhwnN5ag=
1901
- -----END CERTIFICATE-----
1902
-
1903
- Juur-SK
1904
- =======
1905
- -----BEGIN CERTIFICATE-----
1906
- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
1907
- c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
1908
- DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
1909
- SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
1910
- aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
1911
- ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
1912
- TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
1913
- +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
1914
- UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
1915
- Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
1916
- MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
1917
- HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
1918
- AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
1919
- cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
1920
- AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
1921
- cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
1922
- FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
1923
- A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
1924
- ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
1925
- abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
1926
- IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
1927
- Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
1928
- yyqcjg==
1929
- -----END CERTIFICATE-----
1930
-
1931
  Hongkong Post Root CA 1
1932
  =======================
1933
  -----BEGIN CERTIFICATE-----
@@ -2361,7 +1844,7 @@ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
2361
  -----END CERTIFICATE-----
2362
 
2363
  Certinomis - Autorité Racine
2364
- =============================
2365
  -----BEGIN CERTIFICATE-----
2366
  MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
2367
  Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
@@ -2391,41 +1874,6 @@ wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
2391
  vgt2Fl43N+bYdJeimUV5
2392
  -----END CERTIFICATE-----
2393
 
2394
- Root CA Generalitat Valenciana
2395
- ==============================
2396
- -----BEGIN CERTIFICATE-----
2397
- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
2398
- ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
2399
- IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
2400
- WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
2401
- CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
2402
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
2403
- F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
2404
- ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
2405
- D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
2406
- JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
2407
- AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
2408
- dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
2409
- ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
2410
- AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
2411
- YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
2412
- AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
2413
- aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
2414
- AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
2415
- YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
2416
- AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
2417
- OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
2418
- dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
2419
- BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
2420
- A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
2421
- b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
2422
- TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
2423
- Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
2424
- NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
2425
- iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
2426
- +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
2427
- -----END CERTIFICATE-----
2428
-
2429
  TWCA Root Certification Authority
2430
  =================================
2431
  -----BEGIN CERTIFICATE-----
@@ -2871,93 +2319,6 @@ poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
2871
  eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
2872
  -----END CERTIFICATE-----
2873
 
2874
- China Internet Network Information Center EV Certificates Root
2875
- ==============================================================
2876
- -----BEGIN CERTIFICATE-----
2877
- MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
2878
- BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
2879
- aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
2880
- Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
2881
- A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
2882
- PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
2883
- cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
2884
- jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
2885
- 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
2886
- klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
2887
- KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
2888
- 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
2889
- HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
2890
- glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
2891
- 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
2892
- 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
2893
- ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
2894
- 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
2895
- -----END CERTIFICATE-----
2896
-
2897
- Swisscom Root CA 2
2898
- ==================
2899
- -----BEGIN CERTIFICATE-----
2900
- MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG
2901
- EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
2902
- dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2
2903
- MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
2904
- aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC
2905
- IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM
2906
- LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo
2907
- ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ
2908
- wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH
2909
- Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a
2910
- SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS
2911
- NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab
2912
- mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY
2913
- Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3
2914
- qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
2915
- HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
2916
- BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu
2917
- MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO
2918
- v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ
2919
- 82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz
2920
- o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs
2921
- a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx
2922
- OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW
2923
- mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o
2924
- +sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC
2925
- rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX
2926
- 5OfNeOI5wSsSnqaeG8XmDtkx2Q==
2927
- -----END CERTIFICATE-----
2928
-
2929
- Swisscom Root EV CA 2
2930
- =====================
2931
- -----BEGIN CERTIFICATE-----
2932
- MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE
2933
- BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl
2934
- cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN
2935
- MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
2936
- HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg
2937
- Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz
2938
- o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy
2939
- Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti
2940
- GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li
2941
- qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH
2942
- Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG
2943
- alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa
2944
- m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox
2945
- bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi
2946
- xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/
2947
- BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
2948
- MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB
2949
- bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL
2950
- j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU
2951
- wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7
2952
- XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH
2953
- 59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/
2954
- 23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq
2955
- J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA
2956
- HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi
2957
- uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW
2958
- l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
2959
- -----END CERTIFICATE-----
2960
-
2961
  CA Disig Root R1
2962
  ================
2963
  -----BEGIN CERTIFICATE-----
@@ -3756,7 +3117,7 @@ ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
3756
  -----END CERTIFICATE-----
3757
 
3758
  TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
3759
- =========================================================
3760
  -----BEGIN CERTIFICATE-----
3761
  MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3762
  BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
@@ -3779,30 +3140,6 @@ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
3779
  B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3780
  -----END CERTIFICATE-----
3781
 
3782
- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
3783
- =========================================================
3784
- -----BEGIN CERTIFICATE-----
3785
- MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
3786
- A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
3787
- acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
3788
- bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
3789
- MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
3790
- BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
3791
- aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
3792
- aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
3793
- AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
3794
- 2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
3795
- wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
3796
- HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
3797
- +DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
3798
- 9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
3799
- 9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
3800
- fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
3801
- o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
3802
- hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
3803
- O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
3804
- -----END CERTIFICATE-----
3805
-
3806
  Certinomis - Root CA
3807
  ====================
3808
  -----BEGIN CERTIFICATE-----
@@ -3892,28 +3229,418 @@ Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3892
  a/GRspBl9JrmkO5K
3893
  -----END CERTIFICATE-----
3894
 
3895
- ================================================================
3896
- C: US
3897
- O: GTE Corporation
3898
- OU: GTE CyberTrust Solutions, Inc.
3899
- CN: GTE CyberTrust Global Root
3900
- --
3901
- Not Before: 1998-08-13
3902
- Not After: 2018-08-13
3903
- Signature: md5WithRSAEncryption
3904
- Key: RSA:1024
3905
- -----BEGIN CERTIFICATE-----
3906
- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
3907
- VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
3908
- bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
3909
- b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
3910
- UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
3911
- cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
3912
- b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
3913
- iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
3914
- r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
3915
- 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
3916
- GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
3917
- 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
3918
- lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3919
  -----END CERTIFICATE-----
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
+ ## Certificate data from Mozilla as of: Wed Sep 20 03:12:05 2017 GMT
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
8
  ## file (certdata.txt). This file can be found in the mozilla source tree:
9
+ ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
  ##
11
  ## It contains the certificates in PEM format and therefore
12
  ## can be directly used with curl / libcurl / php_curl, or with
13
  ## an Apache+mod_ssl webserver for SSL client authentication.
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
+ ## Conversion done with mk-ca-bundle.pl version 1.27.
17
+ ## SHA256: 2b2dbe5244e0047e088c597998883a913f6c5fffd1cb5c0fe5a368c8466cb2ec
18
  ##
19
 
20
 
130
  RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
131
  -----END CERTIFICATE-----
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  AddTrust External Root
134
  ======================
135
  -----BEGIN CERTIFICATE-----
154
  G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
155
  -----END CERTIFICATE-----
156
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  Entrust Root Certification Authority
158
  ====================================
159
  -----BEGIN CERTIFICATE-----
180
  tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
181
  -----END CERTIFICATE-----
182
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  GeoTrust Global CA
184
  ==================
185
  -----BEGIN CERTIFICATE-----
201
  Mw==
202
  -----END CERTIFICATE-----
203
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
  GeoTrust Universal CA
205
  =====================
206
  -----BEGIN CERTIFICATE-----
326
  12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
327
  -----END CERTIFICATE-----
328
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329
  QuoVadis Root CA
330
  ================
331
  -----BEGIN CERTIFICATE-----
465
  llpwrN9M
466
  -----END CERTIFICATE-----
467
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
468
  Camerfirma Chambers of Commerce Root
469
  ====================================
470
  -----BEGIN CERTIFICATE-----
519
  t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
520
  -----END CERTIFICATE-----
521
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
522
  XRamp Global CA Root
523
  ====================
524
  -----BEGIN CERTIFICATE-----
662
  +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
663
  -----END CERTIFICATE-----
664
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
665
  DigiCert Assured ID Root CA
666
  ===========================
667
  -----BEGIN CERTIFICATE-----
1019
  ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1020
  -----END CERTIFICATE-----
1021
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1022
  COMODO ECC Certification Authority
1023
  ==================================
1024
  -----BEGIN CERTIFICATE-----
1036
  U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1037
  -----END CERTIFICATE-----
1038
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1039
  Security Communication EV RootCA1
1040
  =================================
1041
  -----BEGIN CERTIFICATE-----
1080
  okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
1081
  -----END CERTIFICATE-----
1082
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1083
  Certigna
1084
  ========
1085
  -----BEGIN CERTIFICATE-----
1205
  dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
1206
  -----END CERTIFICATE-----
1207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1208
  certSIGN ROOT CA
1209
  ================
1210
  -----BEGIN CERTIFICATE-----
1225
  TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
1226
  -----END CERTIFICATE-----
1227
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1228
  GeoTrust Primary Certification Authority - G3
1229
  =============================================
1230
  -----BEGIN CERTIFICATE-----
1356
  -----END CERTIFICATE-----
1357
 
1358
  NetLock Arany (Class Gold) Főtanúsítvány
1359
+ ========================================
1360
  -----BEGIN CERTIFICATE-----
1361
  MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1362
  A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
1411
  66+KAQ==
1412
  -----END CERTIFICATE-----
1413
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1414
  Hongkong Post Root CA 1
1415
  =======================
1416
  -----BEGIN CERTIFICATE-----
1844
  -----END CERTIFICATE-----
1845
 
1846
  Certinomis - Autorité Racine
1847
+ ============================
1848
  -----BEGIN CERTIFICATE-----
1849
  MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
1850
  Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
1874
  vgt2Fl43N+bYdJeimUV5
1875
  -----END CERTIFICATE-----
1876
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1877
  TWCA Root Certification Authority
1878
  =================================
1879
  -----BEGIN CERTIFICATE-----
2319
  eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
2320
  -----END CERTIFICATE-----
2321
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2322
  CA Disig Root R1
2323
  ================
2324
  -----BEGIN CERTIFICATE-----
3117
  -----END CERTIFICATE-----
3118
 
3119
  TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
3120
+ ====================================================
3121
  -----BEGIN CERTIFICATE-----
3122
  MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3123
  BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3140
  B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3141
  -----END CERTIFICATE-----
3142
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3143
  Certinomis - Root CA
3144
  ====================
3145
  -----BEGIN CERTIFICATE-----
3229
  a/GRspBl9JrmkO5K
3230
  -----END CERTIFICATE-----
3231
 
3232
+ SZAFIR ROOT CA2
3233
+ ===============
3234
+ -----BEGIN CERTIFICATE-----
3235
+ MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
3236
+ A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
3237
+ BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
3238
+ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
3239
+ VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
3240
+ qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
3241
+ DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
3242
+ 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
3243
+ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
3244
+ ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
3245
+ AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
3246
+ AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
3247
+ O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
3248
+ oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
3249
+ 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
3250
+ +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
3251
+ -----END CERTIFICATE-----
3252
+
3253
+ Certum Trusted Network CA 2
3254
+ ===========================
3255
+ -----BEGIN CERTIFICATE-----
3256
+ MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
3257
+ BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
3258
+ bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
3259
+ ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
3260
+ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
3261
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
3262
+ IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
3263
+ 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
3264
+ CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
3265
+ Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
3266
+ uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
3267
+ GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
3268
+ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
3269
+ Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
3270
+ hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
3271
+ BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3272
+ AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
3273
+ hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
3274
+ Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
3275
+ L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
3276
+ clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
3277
+ pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
3278
+ w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
3279
+ J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
3280
+ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
3281
+ is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
3282
+ zAYspsbiDrW5viSP
3283
+ -----END CERTIFICATE-----
3284
+
3285
+ Hellenic Academic and Research Institutions RootCA 2015
3286
+ =======================================================
3287
+ -----BEGIN CERTIFICATE-----
3288
+ MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
3289
+ BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
3290
+ aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
3291
+ YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
3292
+ MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
3293
+ QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
3294
+ BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
3295
+ MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
3296
+ bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
3297
+ iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
3298
+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
3299
+ FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
3300
+ i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
3301
+ GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
3302
+ fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
3303
+ iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
3304
+ Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3305
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
3306
+ hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
3307
+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
3308
+ d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
3309
+ d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
3310
+ 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
3311
+ davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
3312
+ Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
3313
+ J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
3314
+ JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
3315
+ p/UsQu0yrbYhnr68
3316
+ -----END CERTIFICATE-----
3317
+
3318
+ Hellenic Academic and Research Institutions ECC RootCA 2015
3319
+ ===========================================================
3320
+ -----BEGIN CERTIFICATE-----
3321
+ MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
3322
+ aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
3323
+ cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
3324
+ aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
3325
+ MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
3326
+ IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
3327
+ VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
3328
+ Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
3329
+ dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
3330
+ Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
3331
+ BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
3332
+ GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
3333
+ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
3334
+ -----END CERTIFICATE-----
3335
+
3336
+ Certplus Root CA G1
3337
+ ===================
3338
+ -----BEGIN CERTIFICATE-----
3339
+ MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV
3340
+ BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe
3341
+ Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD
3342
+ ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD
3343
+ ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN
3344
+ r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx
3345
+ Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj
3346
+ BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv
3347
+ LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2
3348
+ z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc
3349
+ 4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd
3350
+ 4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj
3351
+ jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+
3352
+ ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G
3353
+ A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY
3354
+ lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
3355
+ 66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG
3356
+ YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/
3357
+ 2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F
3358
+ 6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX
3359
+ CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe
3360
+ tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC
3361
+ VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/
3362
+ +mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+
3363
+ qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
3364
+ -----END CERTIFICATE-----
3365
+
3366
+ Certplus Root CA G2
3367
+ ===================
3368
+ -----BEGIN CERTIFICATE-----
3369
+ MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
3370
+ AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
3371
+ NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
3372
+ cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
3373
+ BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
3374
+ Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
3375
+ AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
3376
+ IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
3377
+ HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
3378
+ vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
3379
+ -----END CERTIFICATE-----
3380
+
3381
+ OpenTrust Root CA G1
3382
+ ====================
3383
+ -----BEGIN CERTIFICATE-----
3384
+ MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
3385
+ BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx
3386
+ MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
3387
+ CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB
3388
+ AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa
3389
+ Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87
3390
+ ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO
3391
+ YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9
3392
+ xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO
3393
+ 9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq
3394
+ 3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi
3395
+ n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9
3396
+ URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr
3397
+ TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
3398
+ /zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px
3399
+ N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
3400
+ PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv
3401
+ uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK
3402
+ n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh
3403
+ X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80
3404
+ nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm
3405
+ GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/
3406
+ bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o
3407
+ 4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA
3408
+ OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
3409
+ -----END CERTIFICATE-----
3410
+
3411
+ OpenTrust Root CA G2
3412
+ ====================
3413
+ -----BEGIN CERTIFICATE-----
3414
+ MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV
3415
+ BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy
3416
+ MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
3417
+ CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB
3418
+ AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+
3419
+ Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz
3420
+ 4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV
3421
+ eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt
3422
+ UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz
3423
+ 3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj
3424
+ 3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz
3425
+ 9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0
3426
+ 0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT
3427
+ y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
3428
+ /zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59
3429
+ M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
3430
+ Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI
3431
+ mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG
3432
+ S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp
3433
+ EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ
3434
+ 6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr
3435
+ gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo
3436
+ SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0
3437
+ YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm
3438
+ u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
3439
+ -----END CERTIFICATE-----
3440
+
3441
+ OpenTrust Root CA G3
3442
+ ====================
3443
+ -----BEGIN CERTIFICATE-----
3444
+ MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
3445
+ AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
3446
+ DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
3447
+ ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
3448
+ IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
3449
+ ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
3450
+ /wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
3451
+ BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
3452
+ BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
3453
+ 3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
3454
+ -----END CERTIFICATE-----
3455
+
3456
+ ISRG Root X1
3457
+ ============
3458
+ -----BEGIN CERTIFICATE-----
3459
+ MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
3460
+ BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
3461
+ EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
3462
+ EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
3463
+ DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
3464
+ Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
3465
+ 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
3466
+ b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
3467
+ Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
3468
+ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
3469
+ 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
3470
+ hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
3471
+ usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
3472
+ OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
3473
+ A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
3474
+ 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
3475
+ ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
3476
+ 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
3477
+ hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
3478
+ TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
3479
+ e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
3480
+ JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
3481
+ YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
3482
+ JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
3483
+ m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
3484
+ -----END CERTIFICATE-----
3485
+
3486
+ AC RAIZ FNMT-RCM
3487
+ ================
3488
+ -----BEGIN CERTIFICATE-----
3489
+ MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
3490
+ AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
3491
+ MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
3492
+ TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
3493
+ ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
3494
+ qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
3495
+ btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
3496
+ j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
3497
+ 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
3498
+ WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
3499
+ tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
3500
+ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
3501
+ ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
3502
+ i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
3503
+ FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
3504
+ dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
3505
+ nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
3506
+ D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
3507
+ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
3508
+ Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
3509
+ +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
3510
+ Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
3511
+ 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
3512
+ 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
3513
+ rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
3514
+ -----END CERTIFICATE-----
3515
+
3516
+ Amazon Root CA 1
3517
+ ================
3518
+ -----BEGIN CERTIFICATE-----
3519
+ MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
3520
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
3521
+ MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3522
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
3523
+ ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
3524
+ FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
3525
+ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
3526
+ dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
3527
+ VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
3528
+ /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
3529
+ DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
3530
+ CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
3531
+ 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
3532
+ 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
3533
+ xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
3534
+ -----END CERTIFICATE-----
3535
+
3536
+ Amazon Root CA 2
3537
+ ================
3538
+ -----BEGIN CERTIFICATE-----
3539
+ MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
3540
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
3541
+ MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3542
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
3543
+ ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
3544
+ kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
3545
+ N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
3546
+ AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
3547
+ fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
3548
+ kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
3549
+ btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
3550
+ Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
3551
+ c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
3552
+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
3553
+ DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
3554
+ A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
3555
+ +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
3556
+ YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
3557
+ xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
3558
+ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
3559
+ aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
3560
+ Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
3561
+ KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
3562
+ JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
3563
+ -----END CERTIFICATE-----
3564
+
3565
+ Amazon Root CA 3
3566
+ ================
3567
+ -----BEGIN CERTIFICATE-----
3568
+ MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
3569
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
3570
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3571
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
3572
+ f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
3573
+ Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
3574
+ rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
3575
+ eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
3576
+ -----END CERTIFICATE-----
3577
+
3578
+ Amazon Root CA 4
3579
+ ================
3580
+ -----BEGIN CERTIFICATE-----
3581
+ MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
3582
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
3583
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3584
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
3585
+ /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
3586
+ 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
3587
+ HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
3588
+ MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
3589
+ AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
3590
+ -----END CERTIFICATE-----
3591
+
3592
+ LuxTrust Global Root 2
3593
+ ======================
3594
+ -----BEGIN CERTIFICATE-----
3595
+ MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG
3596
+ A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh
3597
+ bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW
3598
+ MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC
3599
+ AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm
3600
+ Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2
3601
+ xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC
3602
+ wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm
3603
+ 1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm
3604
+ FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF
3605
+ wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/
3606
+ a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U
3607
+ ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ
3608
+ MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB
3609
+ /zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5
3610
+ Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
3611
+ +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ
3612
+ FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN
3613
+ H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW
3614
+ 7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu
3615
+ ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA
3616
+ VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR
3617
+ TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt
3618
+ /f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc
3619
+ 7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I
3620
+ iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
3621
+ -----END CERTIFICATE-----
3622
+
3623
+ TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
3624
+ =============================================
3625
+ -----BEGIN CERTIFICATE-----
3626
+ MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
3627
+ D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
3628
+ IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
3629
+ TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
3630
+ ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
3631
+ VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
3632
+ c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
3633
+ bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
3634
+ IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
3635
+ MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
3636
+ 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
3637
+ wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
3638
+ 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
3639
+ WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
3640
+ ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
3641
+ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
3642
+ AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
3643
+ lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
3644
+ e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
3645
+ q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
3646
  -----END CERTIFICATE-----
includes/lib/Stripe/init.php CHANGED
@@ -5,8 +5,10 @@ require(dirname(__FILE__) . '/lib/Stripe.php');
5
 
6
  // Utilities
7
  require(dirname(__FILE__) . '/lib/Util/AutoPagingIterator.php');
 
8
  require(dirname(__FILE__) . '/lib/Util/LoggerInterface.php');
9
  require(dirname(__FILE__) . '/lib/Util/DefaultLogger.php');
 
10
  require(dirname(__FILE__) . '/lib/Util/RequestOptions.php');
11
  require(dirname(__FILE__) . '/lib/Util/Set.php');
12
  require(dirname(__FILE__) . '/lib/Util/Util.php');
@@ -21,6 +23,7 @@ require(dirname(__FILE__) . '/lib/Error/Api.php');
21
  require(dirname(__FILE__) . '/lib/Error/ApiConnection.php');
22
  require(dirname(__FILE__) . '/lib/Error/Authentication.php');
23
  require(dirname(__FILE__) . '/lib/Error/Card.php');
 
24
  require(dirname(__FILE__) . '/lib/Error/InvalidRequest.php');
25
  require(dirname(__FILE__) . '/lib/Error/Permission.php');
26
  require(dirname(__FILE__) . '/lib/Error/RateLimit.php');
@@ -35,18 +38,26 @@ require(dirname(__FILE__) . '/lib/Error/OAuth/InvalidScope.php');
35
  require(dirname(__FILE__) . '/lib/Error/OAuth/UnsupportedGrantType.php');
36
  require(dirname(__FILE__) . '/lib/Error/OAuth/UnsupportedResponseType.php');
37
 
 
 
 
 
 
 
 
 
 
38
  // Plumbing
39
  require(dirname(__FILE__) . '/lib/ApiResponse.php');
40
- require(dirname(__FILE__) . '/lib/JsonSerializable.php');
41
  require(dirname(__FILE__) . '/lib/StripeObject.php');
42
  require(dirname(__FILE__) . '/lib/ApiRequestor.php');
43
  require(dirname(__FILE__) . '/lib/ApiResource.php');
44
  require(dirname(__FILE__) . '/lib/SingletonApiResource.php');
45
- require(dirname(__FILE__) . '/lib/AttachedObject.php');
46
- require(dirname(__FILE__) . '/lib/ExternalAccount.php');
47
 
48
  // Stripe API Resources
49
  require(dirname(__FILE__) . '/lib/Account.php');
 
50
  require(dirname(__FILE__) . '/lib/AlipayAccount.php');
51
  require(dirname(__FILE__) . '/lib/ApplePayDomain.php');
52
  require(dirname(__FILE__) . '/lib/ApplicationFee.php');
@@ -56,39 +67,79 @@ require(dirname(__FILE__) . '/lib/BalanceTransaction.php');
56
  require(dirname(__FILE__) . '/lib/BankAccount.php');
57
  require(dirname(__FILE__) . '/lib/BitcoinReceiver.php');
58
  require(dirname(__FILE__) . '/lib/BitcoinTransaction.php');
 
59
  require(dirname(__FILE__) . '/lib/Card.php');
60
  require(dirname(__FILE__) . '/lib/Charge.php');
 
61
  require(dirname(__FILE__) . '/lib/Collection.php');
62
  require(dirname(__FILE__) . '/lib/CountrySpec.php');
63
  require(dirname(__FILE__) . '/lib/Coupon.php');
 
64
  require(dirname(__FILE__) . '/lib/Customer.php');
 
 
65
  require(dirname(__FILE__) . '/lib/Dispute.php');
66
  require(dirname(__FILE__) . '/lib/EphemeralKey.php');
67
  require(dirname(__FILE__) . '/lib/Event.php');
 
 
 
68
  require(dirname(__FILE__) . '/lib/FileUpload.php');
69
  require(dirname(__FILE__) . '/lib/Invoice.php');
70
  require(dirname(__FILE__) . '/lib/InvoiceItem.php');
 
 
 
 
 
 
 
 
71
  require(dirname(__FILE__) . '/lib/LoginLink.php');
72
  require(dirname(__FILE__) . '/lib/Order.php');
 
73
  require(dirname(__FILE__) . '/lib/OrderReturn.php');
 
 
74
  require(dirname(__FILE__) . '/lib/Payout.php');
 
75
  require(dirname(__FILE__) . '/lib/Plan.php');
76
  require(dirname(__FILE__) . '/lib/Product.php');
 
 
 
77
  require(dirname(__FILE__) . '/lib/Recipient.php');
78
  require(dirname(__FILE__) . '/lib/RecipientTransfer.php');
79
  require(dirname(__FILE__) . '/lib/Refund.php');
 
 
 
 
80
  require(dirname(__FILE__) . '/lib/SKU.php');
 
81
  require(dirname(__FILE__) . '/lib/Source.php');
 
82
  require(dirname(__FILE__) . '/lib/Subscription.php');
83
  require(dirname(__FILE__) . '/lib/SubscriptionItem.php');
 
 
 
 
 
 
 
84
  require(dirname(__FILE__) . '/lib/ThreeDSecure.php');
85
  require(dirname(__FILE__) . '/lib/Token.php');
 
86
  require(dirname(__FILE__) . '/lib/Transfer.php');
87
  require(dirname(__FILE__) . '/lib/TransferReversal.php');
 
 
88
 
89
  // OAuth
90
  require(dirname(__FILE__) . '/lib/OAuth.php');
91
 
92
  // Webhooks
93
  require(dirname(__FILE__) . '/lib/Webhook.php');
 
94
  require(dirname(__FILE__) . '/lib/WebhookSignature.php');
5
 
6
  // Utilities
7
  require(dirname(__FILE__) . '/lib/Util/AutoPagingIterator.php');
8
+ require(dirname(__FILE__) . '/lib/Util/CaseInsensitiveArray.php');
9
  require(dirname(__FILE__) . '/lib/Util/LoggerInterface.php');
10
  require(dirname(__FILE__) . '/lib/Util/DefaultLogger.php');
11
+ require(dirname(__FILE__) . '/lib/Util/RandomGenerator.php');
12
  require(dirname(__FILE__) . '/lib/Util/RequestOptions.php');
13
  require(dirname(__FILE__) . '/lib/Util/Set.php');
14
  require(dirname(__FILE__) . '/lib/Util/Util.php');
23
  require(dirname(__FILE__) . '/lib/Error/ApiConnection.php');
24
  require(dirname(__FILE__) . '/lib/Error/Authentication.php');
25
  require(dirname(__FILE__) . '/lib/Error/Card.php');
26
+ require(dirname(__FILE__) . '/lib/Error/Idempotency.php');
27
  require(dirname(__FILE__) . '/lib/Error/InvalidRequest.php');
28
  require(dirname(__FILE__) . '/lib/Error/Permission.php');
29
  require(dirname(__FILE__) . '/lib/Error/RateLimit.php');
38
  require(dirname(__FILE__) . '/lib/Error/OAuth/UnsupportedGrantType.php');
39
  require(dirname(__FILE__) . '/lib/Error/OAuth/UnsupportedResponseType.php');
40
 
41
+ // API operations
42
+ require(dirname(__FILE__) . '/lib/ApiOperations/All.php');
43
+ require(dirname(__FILE__) . '/lib/ApiOperations/Create.php');
44
+ require(dirname(__FILE__) . '/lib/ApiOperations/Delete.php');
45
+ require(dirname(__FILE__) . '/lib/ApiOperations/NestedResource.php');
46
+ require(dirname(__FILE__) . '/lib/ApiOperations/Request.php');
47
+ require(dirname(__FILE__) . '/lib/ApiOperations/Retrieve.php');
48
+ require(dirname(__FILE__) . '/lib/ApiOperations/Update.php');
49
+
50
  // Plumbing
51
  require(dirname(__FILE__) . '/lib/ApiResponse.php');
52
+ require(dirname(__FILE__) . '/lib/RequestTelemetry.php');
53
  require(dirname(__FILE__) . '/lib/StripeObject.php');
54
  require(dirname(__FILE__) . '/lib/ApiRequestor.php');
55
  require(dirname(__FILE__) . '/lib/ApiResource.php');
56
  require(dirname(__FILE__) . '/lib/SingletonApiResource.php');
 
 
57
 
58
  // Stripe API Resources
59
  require(dirname(__FILE__) . '/lib/Account.php');
60
+ require(dirname(__FILE__) . '/lib/AccountLink.php');
61
  require(dirname(__FILE__) . '/lib/AlipayAccount.php');
62
  require(dirname(__FILE__) . '/lib/ApplePayDomain.php');
63
  require(dirname(__FILE__) . '/lib/ApplicationFee.php');
67
  require(dirname(__FILE__) . '/lib/BankAccount.php');
68
  require(dirname(__FILE__) . '/lib/BitcoinReceiver.php');
69
  require(dirname(__FILE__) . '/lib/BitcoinTransaction.php');
70
+ require(dirname(__FILE__) . '/lib/Capability.php');
71
  require(dirname(__FILE__) . '/lib/Card.php');
72
  require(dirname(__FILE__) . '/lib/Charge.php');
73
+ require(dirname(__FILE__) . '/lib/Checkout/Session.php');
74
  require(dirname(__FILE__) . '/lib/Collection.php');
75
  require(dirname(__FILE__) . '/lib/CountrySpec.php');
76
  require(dirname(__FILE__) . '/lib/Coupon.php');
77
+ require(dirname(__FILE__) . '/lib/CreditNote.php');
78
  require(dirname(__FILE__) . '/lib/Customer.php');
79
+ require(dirname(__FILE__) . '/lib/CustomerBalanceTransaction.php');
80
+ require(dirname(__FILE__) . '/lib/Discount.php');
81
  require(dirname(__FILE__) . '/lib/Dispute.php');
82
  require(dirname(__FILE__) . '/lib/EphemeralKey.php');
83
  require(dirname(__FILE__) . '/lib/Event.php');
84
+ require(dirname(__FILE__) . '/lib/ExchangeRate.php');
85
+ require(dirname(__FILE__) . '/lib/File.php');
86
+ require(dirname(__FILE__) . '/lib/FileLink.php');
87
  require(dirname(__FILE__) . '/lib/FileUpload.php');
88
  require(dirname(__FILE__) . '/lib/Invoice.php');
89
  require(dirname(__FILE__) . '/lib/InvoiceItem.php');
90
+ require(dirname(__FILE__) . '/lib/InvoiceLineItem.php');
91
+ require(dirname(__FILE__) . '/lib/IssuerFraudRecord.php');
92
+ require(dirname(__FILE__) . '/lib/Issuing/Authorization.php');
93
+ require(dirname(__FILE__) . '/lib/Issuing/Card.php');
94
+ require(dirname(__FILE__) . '/lib/Issuing/CardDetails.php');
95
+ require(dirname(__FILE__) . '/lib/Issuing/Cardholder.php');
96
+ require(dirname(__FILE__) . '/lib/Issuing/Dispute.php');
97
+ require(dirname(__FILE__) . '/lib/Issuing/Transaction.php');
98
  require(dirname(__FILE__) . '/lib/LoginLink.php');
99
  require(dirname(__FILE__) . '/lib/Order.php');
100
+ require(dirname(__FILE__) . '/lib/OrderItem.php');
101
  require(dirname(__FILE__) . '/lib/OrderReturn.php');
102
+ require(dirname(__FILE__) . '/lib/PaymentIntent.php');
103
+ require(dirname(__FILE__) . '/lib/PaymentMethod.php');
104
  require(dirname(__FILE__) . '/lib/Payout.php');
105
+ require(dirname(__FILE__) . '/lib/Person.php');
106
  require(dirname(__FILE__) . '/lib/Plan.php');
107
  require(dirname(__FILE__) . '/lib/Product.php');
108
+ require(dirname(__FILE__) . '/lib/Radar/EarlyFraudWarning.php');
109
+ require(dirname(__FILE__) . '/lib/Radar/ValueList.php');
110
+ require(dirname(__FILE__) . '/lib/Radar/ValueListItem.php');
111
  require(dirname(__FILE__) . '/lib/Recipient.php');
112
  require(dirname(__FILE__) . '/lib/RecipientTransfer.php');
113
  require(dirname(__FILE__) . '/lib/Refund.php');
114
+ require(dirname(__FILE__) . '/lib/Reporting/ReportRun.php');
115
+ require(dirname(__FILE__) . '/lib/Reporting/ReportType.php');
116
+ require(dirname(__FILE__) . '/lib/Review.php');
117
+ require(dirname(__FILE__) . '/lib/SetupIntent.php');
118
  require(dirname(__FILE__) . '/lib/SKU.php');
119
+ require(dirname(__FILE__) . '/lib/Sigma/ScheduledQueryRun.php');
120
  require(dirname(__FILE__) . '/lib/Source.php');
121
+ require(dirname(__FILE__) . '/lib/SourceTransaction.php');
122
  require(dirname(__FILE__) . '/lib/Subscription.php');
123
  require(dirname(__FILE__) . '/lib/SubscriptionItem.php');
124
+ require(dirname(__FILE__) . '/lib/SubscriptionSchedule.php');
125
+ require(dirname(__FILE__) . '/lib/SubscriptionScheduleRevision.php');
126
+ require(dirname(__FILE__) . '/lib/TaxId.php');
127
+ require(dirname(__FILE__) . '/lib/TaxRate.php');
128
+ require(dirname(__FILE__) . '/lib/Terminal/ConnectionToken.php');
129
+ require(dirname(__FILE__) . '/lib/Terminal/Location.php');
130
+ require(dirname(__FILE__) . '/lib/Terminal/Reader.php');
131
  require(dirname(__FILE__) . '/lib/ThreeDSecure.php');
132
  require(dirname(__FILE__) . '/lib/Token.php');
133
+ require(dirname(__FILE__) . '/lib/Topup.php');
134
  require(dirname(__FILE__) . '/lib/Transfer.php');
135
  require(dirname(__FILE__) . '/lib/TransferReversal.php');
136
+ require(dirname(__FILE__) . '/lib/UsageRecord.php');
137
+ require(dirname(__FILE__) . '/lib/UsageRecordSummary.php');
138
 
139
  // OAuth
140
  require(dirname(__FILE__) . '/lib/OAuth.php');
141
 
142
  // Webhooks
143
  require(dirname(__FILE__) . '/lib/Webhook.php');
144
+ require(dirname(__FILE__) . '/lib/WebhookEndpoint.php');
145
  require(dirname(__FILE__) . '/lib/WebhookSignature.php');
includes/lib/Stripe/lib/Account.php CHANGED
@@ -7,36 +7,89 @@ namespace Stripe;
7
  *
8
  * @property string $id
9
  * @property string $object
10
- * @property mixed $business_logo
11
- * @property string $business_name
12
- * @property mixed $business_url
13
  * @property bool $charges_enabled
 
14
  * @property string $country
15
- * @property bool $debit_negative_balances
16
- * @property mixed $decline_charge_on
17
  * @property string $default_currency
18
  * @property bool $details_submitted
19
- * @property string $display_name
20
  * @property string $email
21
- * @property mixed $external_accounts
22
- * @property mixed $legal_entity
23
- * @property bool $managed
24
- * @property mixed $payout_schedule
25
- * @property mixed $payout_statement_descriptor
26
  * @property bool $payouts_enabled
27
- * @property mixed $product_description
28
- * @property mixed $statement_descriptor
29
- * @property mixed $support_email
30
- * @property mixed $support_phone
31
- * @property string $timezone
32
  * @property mixed $tos_acceptance
33
- * @property mixed $verification
34
- * @property mixed $keys
35
  *
36
  * @package Stripe
37
  */
38
  class Account extends ApiResource
39
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  public function instanceUrl()
41
  {
42
  if ($this['id'] === null) {
@@ -66,77 +119,275 @@ class Account extends ApiResource
66
  * @param array|null $params
67
  * @param array|string|null $opts
68
  *
69
- * @return Account
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  */
71
- public static function create($params = null, $opts = null)
72
  {
73
- return self::_create($params, $opts);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  }
75
 
76
  /**
77
- * @param string $id The ID of the account to update.
78
  * @param array|null $params
79
  * @param array|string|null $options
80
  *
81
- * @return Account The updated account.
82
  */
83
- public static function update($id, $params = null, $options = null)
84
  {
85
- return self::_update($id, $params, $options);
 
 
 
 
86
  }
87
 
88
  /**
 
 
89
  * @param array|string|null $opts
90
  *
91
- * @return Account
92
  */
93
- public function save($opts = null)
94
  {
95
- return $this->_save($opts);
96
  }
97
 
98
  /**
 
 
99
  * @param array|null $params
100
  * @param array|string|null $opts
101
  *
102
- * @return Account The deleted account.
103
  */
104
- public function delete($params = null, $opts = null)
105
  {
106
- return $this->_delete($params, $opts);
107
  }
108
 
109
  /**
 
 
110
  * @param array|null $params
111
  * @param array|string|null $opts
112
  *
113
- * @return Account The rejected account.
114
  */
115
- public function reject($params = null, $opts = null)
116
  {
117
- $url = $this->instanceUrl() . '/reject';
118
- list($response, $opts) = $this->_request('post', $url, $params, $opts);
119
- $this->refreshFrom($response, $opts);
120
- return $this;
121
  }
122
 
123
  /**
 
 
124
  * @param array|null $params
125
  * @param array|string|null $opts
126
  *
127
- * @return Collection of Accounts
128
  */
129
- public static function all($params = null, $opts = null)
130
  {
131
- return self::_all($params, $opts);
132
  }
133
 
134
- public function deauthorize($clientId = null, $opts = null)
 
 
 
 
 
 
 
135
  {
136
- $params = array(
137
- 'client_id' => $clientId,
138
- 'stripe_user_id' => $this->id,
139
- );
140
- OAuth::deauthorize($params, $opts);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  }
142
  }
7
  *
8
  * @property string $id
9
  * @property string $object
10
+ * @property mixed $business_profile
11
+ * @property string $business_type
12
+ * @property mixed $capabilities
13
  * @property bool $charges_enabled
14
+ * @property mixed $company
15
  * @property string $country
16
+ * @property int $created
 
17
  * @property string $default_currency
18
  * @property bool $details_submitted
 
19
  * @property string $email
20
+ * @property Collection $external_accounts
21
+ * @property mixed $individual
22
+ * @property StripeObject $metadata
 
 
23
  * @property bool $payouts_enabled
24
+ * @property mixed $requirements
25
+ * @property mixed $settings
 
 
 
26
  * @property mixed $tos_acceptance
27
+ * @property string $type
 
28
  *
29
  * @package Stripe
30
  */
31
  class Account extends ApiResource
32
  {
33
+
34
+ const OBJECT_NAME = "account";
35
+
36
+ use ApiOperations\All;
37
+ use ApiOperations\Create;
38
+ use ApiOperations\Delete;
39
+ use ApiOperations\NestedResource;
40
+ use ApiOperations\Retrieve {
41
+ retrieve as protected _retrieve;
42
+ }
43
+ use ApiOperations\Update;
44
+
45
+ /**
46
+ * Possible string representations of an account's business type.
47
+ * @link https://stripe.com/docs/api/accounts/object#account_object-business_type
48
+ */
49
+ const BUSINESS_TYPE_COMPANY = 'company';
50
+ const BUSINESS_TYPE_INDIVIDUAL = 'individual';
51
+
52
+ /**
53
+ * Possible string representations of an account's capabilities.
54
+ * @link https://stripe.com/docs/api/accounts/object#account_object-capabilities
55
+ */
56
+ const CAPABILITY_CARD_PAYMENTS = 'card_payments';
57
+ const CAPABILITY_LEGACY_PAYMENTS = 'legacy_payments';
58
+ const CAPABILITY_PLATFORM_PAYMENTS = 'platform_payments';
59
+
60
+ /**
61
+ * Possible string representations of an account's capability status.
62
+ * @link https://stripe.com/docs/api/accounts/object#account_object-capabilities
63
+ */
64
+ const CAPABILITY_STATUS_ACTIVE = 'active';
65
+ const CAPABILITY_STATUS_INACTIVE = 'inactive';
66
+ const CAPABILITY_STATUS_PENDING = 'pending';
67
+
68
+ /**
69
+ * Possible string representations of an account's type.
70
+ * @link https://stripe.com/docs/api/accounts/object#account_object-type
71
+ */
72
+ const TYPE_CUSTOM = 'custom';
73
+ const TYPE_EXPRESS = 'express';
74
+ const TYPE_STANDARD = 'standard';
75
+
76
+ public static function getSavedNestedResources()
77
+ {
78
+ static $savedNestedResources = null;
79
+ if ($savedNestedResources === null) {
80
+ $savedNestedResources = new Util\Set([
81
+ 'external_account',
82
+ 'bank_account',
83
+ ]);
84
+ }
85
+ return $savedNestedResources;
86
+ }
87
+
88
+ const PATH_CAPABILITIES = '/capabilities';
89
+ const PATH_EXTERNAL_ACCOUNTS = '/external_accounts';
90
+ const PATH_LOGIN_LINKS = '/login_links';
91
+ const PATH_PERSONS = '/persons';
92
+
93
  public function instanceUrl()
94
  {
95
  if ($this['id'] === null) {
119
  * @param array|null $params
120
  * @param array|string|null $opts
121
  *
122
+ * @return Account The rejected account.
123
+ */
124
+ public function reject($params = null, $opts = null)
125
+ {
126
+ $url = $this->instanceUrl() . '/reject';
127
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
128
+ $this->refreshFrom($response, $opts);
129
+ return $this;
130
+ }
131
+
132
+ /**
133
+ * @param array|null $clientId
134
+ * @param array|string|null $opts
135
+ *
136
+ * @return StripeObject Object containing the response from the API.
137
+ */
138
+ public function deauthorize($clientId = null, $opts = null)
139
+ {
140
+ $params = [
141
+ 'client_id' => $clientId,
142
+ 'stripe_user_id' => $this->id,
143
+ ];
144
+ return OAuth::deauthorize($params, $opts);
145
+ }
146
+
147
+ /*
148
+ * Capabilities methods
149
+ * We can not add the capabilities() method today as the Account object already has a
150
+ * capabilities property which is a hash and not the sub-list of capabilities.
151
+ */
152
+
153
+
154
+ /**
155
+ * @param string $id The ID of the account to which the capability belongs.
156
+ * @param string $capabilityId The ID of the capability to retrieve.
157
+ * @param array|null $params
158
+ * @param array|string|null $opts
159
+ *
160
+ * @return Capability
161
+ */
162
+ public static function retrieveCapability($id, $capabilityId, $params = null, $opts = null)
163
+ {
164
+ return self::_retrieveNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts);
165
+ }
166
+
167
+ /**
168
+ * @param string $id The ID of the account to which the capability belongs.
169
+ * @param string $capabilityId The ID of the capability to update.
170
+ * @param array|null $params
171
+ * @param array|string|null $opts
172
+ *
173
+ * @return Capability
174
+ */
175
+ public static function updateCapability($id, $capabilityId, $params = null, $opts = null)
176
+ {
177
+ return self::_updateNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts);
178
+ }
179
+
180
+ /**
181
+ * @param string $id The ID of the account on which to retrieve the capabilities.
182
+ * @param array|null $params
183
+ * @param array|string|null $opts
184
+ *
185
+ * @return Collection The list of capabilities.
186
  */
187
+ public static function allCapabilities($id, $params = null, $opts = null)
188
  {
189
+ return self::_allNestedResources($id, static::PATH_CAPABILITIES, $params, $opts);
190
+ }
191
+
192
+ /**
193
+ * @param string $id The ID of the account on which to create the external account.
194
+ * @param array|null $params
195
+ * @param array|string|null $opts
196
+ *
197
+ * @return BankAccount|Card
198
+ */
199
+ public static function createExternalAccount($id, $params = null, $opts = null)
200
+ {
201
+ return self::_createNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $params, $opts);
202
+ }
203
+
204
+ /**
205
+ * @param string $id The ID of the account to which the external account belongs.
206
+ * @param string $externalAccountId The ID of the external account to retrieve.
207
+ * @param array|null $params
208
+ * @param array|string|null $opts
209
+ *
210
+ * @return BankAccount|Card
211
+ */
212
+ public static function retrieveExternalAccount($id, $externalAccountId, $params = null, $opts = null)
213
+ {
214
+ return self::_retrieveNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts);
215
+ }
216
+
217
+ /**
218
+ * @param string $id The ID of the account to which the external account belongs.
219
+ * @param string $externalAccountId The ID of the external account to update.
220
+ * @param array|null $params
221
+ * @param array|string|null $opts
222
+ *
223
+ * @return BankAccount|Card
224
+ */
225
+ public static function updateExternalAccount($id, $externalAccountId, $params = null, $opts = null)
226
+ {
227
+ return self::_updateNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts);
228
+ }
229
+
230
+ /**
231
+ * @param string $id The ID of the account to which the external account belongs.
232
+ * @param string $externalAccountId The ID of the external account to delete.
233
+ * @param array|null $params
234
+ * @param array|string|null $opts
235
+ *
236
+ * @return BankAccount|Card
237
+ */
238
+ public static function deleteExternalAccount($id, $externalAccountId, $params = null, $opts = null)
239
+ {
240
+ return self::_deleteNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts);
241
+ }
242
+
243
+ /**
244
+ * @param string $id The ID of the account on which to retrieve the external accounts.
245
+ * @param array|null $params
246
+ * @param array|string|null $opts
247
+ *
248
+ * @return Collection The list of external accounts (BankAccount or Card).
249
+ */
250
+ public static function allExternalAccounts($id, $params = null, $opts = null)
251
+ {
252
+ return self::_allNestedResources($id, static::PATH_EXTERNAL_ACCOUNTS, $params, $opts);
253
+ }
254
+
255
+ /**
256
+ * @param string $id The ID of the account on which to create the login link.
257
+ * @param array|null $params
258
+ * @param array|string|null $opts
259
+ *
260
+ * @return LoginLink
261
+ */
262
+ public static function createLoginLink($id, $params = null, $opts = null)
263
+ {
264
+ return self::_createNestedResource($id, static::PATH_LOGIN_LINKS, $params, $opts);
265
  }
266
 
267
  /**
 
268
  * @param array|null $params
269
  * @param array|string|null $options
270
  *
271
+ * @return Collection The list of persons.
272
  */
273
+ public function persons($params = null, $options = null)
274
  {
275
+ $url = $this->instanceUrl() . '/persons';
276
+ list($response, $opts) = $this->_request('get', $url, $params, $options);
277
+ $obj = Util\Util::convertToStripeObject($response, $opts);
278
+ $obj->setLastResponse($response);
279
+ return $obj;
280
  }
281
 
282
  /**
283
+ * @param string $id The ID of the account on which to create the person.
284
+ * @param array|null $params
285
  * @param array|string|null $opts
286
  *
287
+ * @return Person
288
  */
289
+ public static function createPerson($id, $params = null, $opts = null)
290
  {
291
+ return self::_createNestedResource($id, static::PATH_PERSONS, $params, $opts);
292
  }
293
 
294
  /**
295
+ * @param string $id The ID of the account to which the person belongs.
296
+ * @param string $personId The ID of the person to retrieve.
297
  * @param array|null $params
298
  * @param array|string|null $opts
299
  *
300
+ * @return Person
301
  */
302
+ public static function retrievePerson($id, $personId, $params = null, $opts = null)
303
  {
304
+ return self::_retrieveNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts);
305
  }
306
 
307
  /**
308
+ * @param string $id The ID of the account to which the person belongs.
309
+ * @param string $personId The ID of the person to update.
310
  * @param array|null $params
311
  * @param array|string|null $opts
312
  *
313
+ * @return Person
314
  */
315
+ public static function updatePerson($id, $personId, $params = null, $opts = null)
316
  {
317
+ return self::_updateNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts);
 
 
 
318
  }
319
 
320
  /**
321
+ * @param string $id The ID of the account to which the person belongs.
322
+ * @param string $personId The ID of the person to delete.
323
  * @param array|null $params
324
  * @param array|string|null $opts
325
  *
326
+ * @return Person
327
  */
328
+ public static function deletePerson($id, $personId, $params = null, $opts = null)
329
  {
330
+ return self::_deleteNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts);
331
  }
332
 
333
+ /**
334
+ * @param string $id The ID of the account on which to retrieve the persons.
335
+ * @param array|null $params
336
+ * @param array|string|null $opts
337
+ *
338
+ * @return Collection The list of persons.
339
+ */
340
+ public static function allPersons($id, $params = null, $opts = null)
341
  {
342
+ return self::_allNestedResources($id, static::PATH_PERSONS, $params, $opts);
343
+ }
344
+
345
+ public function serializeParameters($force = false)
346
+ {
347
+ $update = parent::serializeParameters($force);
348
+ if (isset($this->_values['legal_entity'])) {
349
+ $entity = $this['legal_entity'];
350
+ if (isset($entity->_values['additional_owners'])) {
351
+ $owners = $entity['additional_owners'];
352
+ $entityUpdate = isset($update['legal_entity']) ? $update['legal_entity'] : [];
353
+ $entityUpdate['additional_owners'] = $this->serializeAdditionalOwners($entity, $owners);
354
+ $update['legal_entity'] = $entityUpdate;
355
+ }
356
+ }
357
+ if (isset($this->_values['individual'])) {
358
+ $individual = $this['individual'];
359
+ if (($individual instanceof Person) && !isset($update['individual'])) {
360
+ $update['individual'] = $individual->serializeParameters($force);
361
+ }
362
+ }
363
+ return $update;
364
+ }
365
+
366
+ private function serializeAdditionalOwners($legalEntity, $additionalOwners)
367
+ {
368
+ if (isset($legalEntity->_originalValues['additional_owners'])) {
369
+ $originalValue = $legalEntity->_originalValues['additional_owners'];
370
+ } else {
371
+ $originalValue = [];
372
+ }
373
+ if (($originalValue) && (count($originalValue) > count($additionalOwners))) {
374
+ throw new \InvalidArgumentException(
375
+ "You cannot delete an item from an array, you must instead set a new array"
376
+ );
377
+ }
378
+
379
+ $updateArr = [];
380
+ foreach ($additionalOwners as $i => $v) {
381
+ $update = ($v instanceof StripeObject) ? $v->serializeParameters() : $v;
382
+
383
+ if ($update !== []) {
384
+ if (!$originalValue ||
385
+ !array_key_exists($i, $originalValue) ||
386
+ ($update != $legalEntity->serializeParamsValue($originalValue[$i], null, false, true))) {
387
+ $updateArr[$i] = $update;
388
+ }
389
+ }
390
+ }
391
+ return $updateArr;
392
  }
393
  }
includes/lib/Stripe/lib/AccountLink.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class AccountLink
7
+ *
8
+ * @property string $object
9
+ * @property int $created
10
+ * @property int $expires_at
11
+ * @property string $url
12
+ *
13
+ * @package Stripe
14
+ */
15
+ class AccountLink extends ApiResource
16
+ {
17
+
18
+ const OBJECT_NAME = "account_link";
19
+
20
+ use ApiOperations\Create;
21
+ }
includes/lib/Stripe/lib/AlipayAccount.php CHANGED
@@ -6,8 +6,67 @@ namespace Stripe;
6
  * Class AlipayAccount
7
  *
8
  * @package Stripe
 
 
 
9
  */
10
- class AlipayAccount extends ExternalAccount
11
  {
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  }
6
  * Class AlipayAccount
7
  *
8
  * @package Stripe
9
+ *
10
+ * @deprecated Alipay accounts are deprecated. Please use the sources API instead.
11
+ * @link https://stripe.com/docs/sources/alipay
12
  */
13
+ class AlipayAccount extends ApiResource
14
  {
15
 
16
+ const OBJECT_NAME = "alipay_account";
17
+
18
+ use ApiOperations\Delete;
19
+ use ApiOperations\Update;
20
+
21
+ /**
22
+ * @return string The instance URL for this resource. It needs to be special
23
+ * cased because it doesn't fit into the standard resource pattern.
24
+ */
25
+ public function instanceUrl()
26
+ {
27
+ if ($this['customer']) {
28
+ $base = Customer::classUrl();
29
+ $parent = $this['customer'];
30
+ $path = 'sources';
31
+ } else {
32
+ $msg = "Alipay accounts cannot be accessed without a customer ID.";
33
+ throw new Error\InvalidRequest($msg, null);
34
+ }
35
+ $parentExtn = urlencode(Util\Util::utf8($parent));
36
+ $extn = urlencode(Util\Util::utf8($this['id']));
37
+ return "$base/$parentExtn/$path/$extn";
38
+ }
39
+
40
+ /**
41
+ * @param array|string $_id
42
+ * @param array|string|null $_opts
43
+ *
44
+ * @throws \Stripe\Error\InvalidRequest
45
+ *
46
+ * @deprecated Alipay accounts are deprecated. Please use the sources API instead.
47
+ * @link https://stripe.com/docs/sources/alipay
48
+ */
49
+ public static function retrieve($_id, $_opts = null)
50
+ {
51
+ $msg = "Alipay accounts cannot be accessed without a customer ID. " .
52
+ "Retrieve an Alipay account using \$customer->sources->retrieve('alipay_account_id') instead.";
53
+ throw new Error\InvalidRequest($msg, null);
54
+ }
55
+
56
+ /**
57
+ * @param string $_id
58
+ * @param array|null $_params
59
+ * @param array|string|null $_options
60
+ *
61
+ * @throws \Stripe\Error\InvalidRequest
62
+ *
63
+ * @deprecated Alipay accounts are deprecated. Please use the sources API instead.
64
+ * @link https://stripe.com/docs/sources/alipay
65
+ */
66
+ public static function update($_id, $_params = null, $_options = null)
67
+ {
68
+ $msg = "Alipay accounts cannot be accessed without a customer ID. " .
69
+ "Call save() on \$customer->sources->retrieve('alipay_account_id') instead.";
70
+ throw new Error\InvalidRequest($msg, null);
71
+ }
72
  }
includes/lib/Stripe/lib/ApiOperations/All.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\ApiOperations;
4
+
5
+ /**
6
+ * Trait for listable resources. Adds a `all()` static method to the class.
7
+ *
8
+ * This trait should only be applied to classes that derive from StripeObject.
9
+ */
10
+ trait All
11
+ {
12
+ /**
13
+ * @param array|null $params
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return \Stripe\Collection of ApiResources
17
+ */
18
+ public static function all($params = null, $opts = null)
19
+ {
20
+ self::_validateParams($params);
21
+ $url = static::classUrl();
22
+
23
+ list($response, $opts) = static::_staticRequest('get', $url, $params, $opts);
24
+ $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts);
25
+ if (!is_a($obj, 'Stripe\\Collection')) {
26
+ $class = get_class($obj);
27
+ $message = "Expected type \"Stripe\\Collection\", got \"$class\" instead";
28
+ throw new \Stripe\Error\Api($message);
29
+ }
30
+ $obj->setLastResponse($response);
31
+ $obj->setRequestParams($params);
32
+ return $obj;
33
+ }
34
+ }
includes/lib/Stripe/lib/ApiOperations/Create.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\ApiOperations;
4
+
5
+ /**
6
+ * Trait for creatable resources. Adds a `create()` static method to the class.
7
+ *
8
+ * This trait should only be applied to classes that derive from StripeObject.
9
+ */
10
+ trait Create
11
+ {
12
+ /**
13
+ * @param array|null $params
14
+ * @param array|string|null $options
15
+ *
16
+ * @return static The created resource.
17
+ */
18
+ public static function create($params = null, $options = null)
19
+ {
20
+ self::_validateParams($params);
21
+ $url = static::classUrl();
22
+
23
+ list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
24
+ $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts);
25
+ $obj->setLastResponse($response);
26
+ return $obj;
27
+ }
28
+ }
includes/lib/Stripe/lib/ApiOperations/Delete.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\ApiOperations;
4
+
5
+ /**
6
+ * Trait for deletable resources. Adds a `delete()` method to the class.
7
+ *
8
+ * This trait should only be applied to classes that derive from StripeObject.
9
+ */
10
+ trait Delete
11
+ {
12
+ /**
13
+ * @param array|null $params
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return static The deleted resource.
17
+ */
18
+ public function delete($params = null, $opts = null)
19
+ {
20
+ self::_validateParams($params);
21
+
22
+ $url = $this->instanceUrl();
23
+ list($response, $opts) = $this->_request('delete', $url, $params, $opts);
24
+ $this->refreshFrom($response, $opts);
25
+ return $this;
26
+ }
27
+ }
includes/lib/Stripe/lib/ApiOperations/NestedResource.php ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\ApiOperations;
4
+
5
+ /**
6
+ * Trait for resources that have nested resources.
7
+ *
8
+ * This trait should only be applied to classes that derive from StripeObject.
9
+ */
10
+ trait NestedResource
11
+ {
12
+ /**
13
+ * @param string $method
14
+ * @param string $url
15
+ * @param array|null $params
16
+ * @param array|string|null $options
17
+ *
18
+ * @return \Stripe\StripeObject
19
+ */
20
+ protected static function _nestedResourceOperation($method, $url, $params = null, $options = null)
21
+ {
22
+ self::_validateParams($params);
23
+
24
+ list($response, $opts) = static::_staticRequest($method, $url, $params, $options);
25
+ $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts);
26
+ $obj->setLastResponse($response);
27
+ return $obj;
28
+ }
29
+
30
+ /**
31
+ * @param string $id
32
+ * @param string $nestedPath
33
+ * @param string|null $nestedId
34
+ *
35
+ * @return string
36
+ */
37
+ protected static function _nestedResourceUrl($id, $nestedPath, $nestedId = null)
38
+ {
39
+ $url = static::resourceUrl($id) . $nestedPath;
40
+ if ($nestedId !== null) {
41
+ $url .= "/$nestedId";
42
+ }
43
+ return $url;
44
+ }
45
+
46
+ /**
47
+ * @param string $id
48
+ * @param string $nestedPath
49
+ * @param array|null $params
50
+ * @param array|string|null $options
51
+ *
52
+ * @return \Stripe\StripeObject
53
+ */
54
+ protected static function _createNestedResource($id, $nestedPath, $params = null, $options = null)
55
+ {
56
+ $url = static::_nestedResourceUrl($id, $nestedPath);
57
+ return self::_nestedResourceOperation('post', $url, $params, $options);
58
+ }
59
+
60
+ /**
61
+ * @param string $id
62
+ * @param string $nestedPath
63
+ * @param string|null $nestedId
64
+ * @param array|null $params
65
+ * @param array|string|null $options
66
+ *
67
+ * @return \Stripe\StripeObject
68
+ */
69
+ protected static function _retrieveNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null)
70
+ {
71
+ $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId);
72
+ return self::_nestedResourceOperation('get', $url, $params, $options);
73
+ }
74
+
75
+ /**
76
+ * @param string $id
77
+ * @param string $nestedPath
78
+ * @param string|null $nestedId
79
+ * @param array|null $params
80
+ * @param array|string|null $options
81
+ *
82
+ * @return \Stripe\StripeObject
83
+ */
84
+ protected static function _updateNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null)
85
+ {
86
+ $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId);
87
+ return self::_nestedResourceOperation('post', $url, $params, $options);
88
+ }
89
+
90
+ /**
91
+ * @param string $id
92
+ * @param string $nestedPath
93
+ * @param string|null $nestedId
94
+ * @param array|null $params
95
+ * @param array|string|null $options
96
+ *
97
+ * @return \Stripe\StripeObject
98
+ */
99
+ protected static function _deleteNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null)
100
+ {
101
+ $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId);
102
+ return self::_nestedResourceOperation('delete', $url, $params, $options);
103
+ }
104
+
105
+ /**
106
+ * @param string $id
107
+ * @param string $nestedPath
108
+ * @param array|null $params
109
+ * @param array|string|null $options
110
+ *
111
+ * @return \Stripe\StripeObject
112
+ */
113
+ protected static function _allNestedResources($id, $nestedPath, $params = null, $options = null)
114
+ {
115
+ $url = static::_nestedResourceUrl($id, $nestedPath);
116
+ return self::_nestedResourceOperation('get', $url, $params, $options);
117
+ }
118
+ }
includes/lib/Stripe/lib/ApiOperations/Request.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\ApiOperations;
4
+
5
+ /**
6
+ * Trait for resources that need to make API requests.
7
+ *
8
+ * This trait should only be applied to classes that derive from StripeObject.
9
+ */
10
+ trait Request
11
+ {
12
+ /**
13
+ * @param array|null|mixed $params The list of parameters to validate
14
+ *
15
+ * @throws \Stripe\Error\Api if $params exists and is not an array
16
+ */
17
+ protected static function _validateParams($params = null)
18
+ {
19
+ if ($params && !is_array($params)) {
20
+ $message = "You must pass an array as the first argument to Stripe API "
21
+ . "method calls. (HINT: an example call to create a charge "
22
+ . "would be: \"Stripe\\Charge::create(['amount' => 100, "
23
+ . "'currency' => 'usd', 'source' => 'tok_1234'])\")";
24
+ throw new \Stripe\Error\Api($message);
25
+ }
26
+ }
27
+
28
+ /**
29
+ * @param string $method HTTP method ('get', 'post', etc.)
30
+ * @param string $url URL for the request
31
+ * @param array $params list of parameters for the request
32
+ * @param array|string|null $options
33
+ *
34
+ * @return array tuple containing (the JSON response, $options)
35
+ */
36
+ protected function _request($method, $url, $params = [], $options = null)
37
+ {
38
+ $opts = $this->_opts->merge($options);
39
+ list($resp, $options) = static::_staticRequest($method, $url, $params, $opts);
40
+ $this->setLastResponse($resp);
41
+ return [$resp->json, $options];
42
+ }
43
+
44
+ /**
45
+ * @param string $method HTTP method ('get', 'post', etc.)
46
+ * @param string $url URL for the request
47
+ * @param array $params list of parameters for the request
48
+ * @param array|string|null $options
49
+ *
50
+ * @return array tuple containing (the JSON response, $options)
51
+ */
52
+ protected static function _staticRequest($method, $url, $params, $options)
53
+ {
54
+ $opts = \Stripe\Util\RequestOptions::parse($options);
55
+ $baseUrl = isset($opts->apiBase) ? $opts->apiBase : static::baseUrl();
56
+ $requestor = new \Stripe\ApiRequestor($opts->apiKey, $baseUrl);
57
+ list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers);
58
+ $opts->discardNonPersistentHeaders();
59
+ return [$response, $opts];
60
+ }
61
+ }
includes/lib/Stripe/lib/ApiOperations/Retrieve.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\ApiOperations;
4
+
5
+ /**
6
+ * Trait for retrievable resources. Adds a `retrieve()` static method to the
7
+ * class.
8
+ *
9
+ * This trait should only be applied to classes that derive from StripeObject.
10
+ */
11
+ trait Retrieve
12
+ {
13
+ /**
14
+ * @param array|string $id The ID of the API resource to retrieve,
15
+ * or an options array containing an `id` key.
16
+ * @param array|string|null $opts
17
+ *
18
+ * @return static
19
+ */
20
+ public static function retrieve($id, $opts = null)
21
+ {
22
+ $opts = \Stripe\Util\RequestOptions::parse($opts);
23
+ $instance = new static($id, $opts);
24
+ $instance->refresh();
25
+ return $instance;
26
+ }
27
+ }
includes/lib/Stripe/lib/ApiOperations/Update.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\ApiOperations;
4
+
5
+ /**
6
+ * Trait for updatable resources. Adds an `update()` static method and a
7
+ * `save()` method to the class.
8
+ *
9
+ * This trait should only be applied to classes that derive from StripeObject.
10
+ */
11
+ trait Update
12
+ {
13
+ /**
14
+ * @param string $id The ID of the resource to update.
15
+ * @param array|null $params
16
+ * @param array|string|null $opts
17
+ *
18
+ * @return static The updated resource.
19
+ */
20
+ public static function update($id, $params = null, $opts = null)
21
+ {
22
+ self::_validateParams($params);
23
+ $url = static::resourceUrl($id);
24
+
25
+ list($response, $opts) = static::_staticRequest('post', $url, $params, $opts);
26
+ $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts);
27
+ $obj->setLastResponse($response);
28
+ return $obj;
29
+ }
30
+
31
+ /**
32
+ * @param array|string|null $opts
33
+ *
34
+ * @return static The saved resource.
35
+ */
36
+ public function save($opts = null)
37
+ {
38
+ $params = $this->serializeParameters();
39
+ if (count($params) > 0) {
40
+ $url = $this->instanceUrl();
41
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
42
+ $this->refreshFrom($response, $opts);
43
+ }
44
+ return $this;
45
+ }
46
+ }
includes/lib/Stripe/lib/ApiRequestor.php CHANGED
@@ -9,12 +9,32 @@ namespace Stripe;
9
  */
10
  class ApiRequestor
11
  {
 
 
 
12
  private $_apiKey;
13
 
 
 
 
14
  private $_apiBase;
15
 
 
 
 
16
  private static $_httpClient;
17
 
 
 
 
 
 
 
 
 
 
 
 
18
  public function __construct($apiKey = null, $apiBase = null)
19
  {
20
  $this->_apiKey = $apiKey;
@@ -24,6 +44,37 @@ class ApiRequestor
24
  $this->_apiBase = $apiBase;
25
  }
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  private static function _encodeObjects($d)
28
  {
29
  if ($d instanceof ApiResource) {
@@ -33,7 +84,7 @@ class ApiRequestor
33
  } elseif ($d === false) {
34
  return 'false';
35
  } elseif (is_array($d)) {
36
- $res = array();
37
  foreach ($d as $k => $v) {
38
  $res[$k] = self::_encodeObjects($v);
39
  }
@@ -44,27 +95,37 @@ class ApiRequestor
44
  }
45
 
46
  /**
47
- * @param string $method
48
- * @param string $url
49
  * @param array|null $params
50
  * @param array|null $headers
51
  *
52
  * @return array An array whose first element is an API response and second
53
  * element is the API key used to make the request.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  */
55
  public function request($method, $url, $params = null, $headers = null)
56
  {
57
- if (!$params) {
58
- $params = array();
59
- }
60
- if (!$headers) {
61
- $headers = array();
62
- }
63
  list($rbody, $rcode, $rheaders, $myApiKey) =
64
  $this->_requestRaw($method, $url, $params, $headers);
65
  $json = $this->_interpretResponse($rbody, $rcode, $rheaders);
66
  $resp = new ApiResponse($rbody, $rcode, $rheaders, $json);
67
- return array($resp, $myApiKey);
68
  }
69
 
70
  /**
@@ -80,6 +141,16 @@ class ApiRequestor
80
  * permissions.
81
  * @throws Error\Card if the error is the error code is 402 (payment
82
  * required)
 
 
 
 
 
 
 
 
 
 
83
  * @throws Error\RateLimit if the error is caused by too many requests
84
  * hitting the API.
85
  * @throws Error\Api otherwise.
@@ -105,11 +176,23 @@ class ApiRequestor
105
  throw $error;
106
  }
107
 
 
 
 
 
 
 
 
 
 
 
 
108
  private static function _specificAPIError($rbody, $rcode, $rheaders, $resp, $errorData)
109
  {
110
  $msg = isset($errorData['message']) ? $errorData['message'] : null;
111
  $param = isset($errorData['param']) ? $errorData['param'] : null;
112
  $code = isset($errorData['code']) ? $errorData['code'] : null;
 
113
 
114
  switch ($rcode) {
115
  case 400:
@@ -118,6 +201,9 @@ class ApiRequestor
118
  if ($code == 'rate_limit') {
119
  return new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders);
120
  }
 
 
 
121
 
122
  // intentional fall-through
123
  case 404:
@@ -135,6 +221,17 @@ class ApiRequestor
135
  }
136
  }
137
 
 
 
 
 
 
 
 
 
 
 
 
138
  private static function _specificOAuthError($rbody, $rcode, $rheaders, $resp, $errorCode)
139
  {
140
  $description = isset($resp['error_description']) ? $resp['error_description'] : $errorCode;
@@ -157,6 +254,13 @@ class ApiRequestor
157
  return null;
158
  }
159
 
 
 
 
 
 
 
 
160
  private static function _formatAppInfo($appInfo)
161
  {
162
  if ($appInfo !== null) {
@@ -173,6 +277,14 @@ class ApiRequestor
173
  }
174
  }
175
 
 
 
 
 
 
 
 
 
176
  private static function _defaultHeaders($apiKey, $clientInfo = null)
177
  {
178
  $uaString = 'Stripe/v1 PhpBindings/' . Stripe::VERSION;
@@ -181,13 +293,13 @@ class ApiRequestor
181
  $uname = php_uname();
182
 
183
  $appInfo = Stripe::getAppInfo();
184
- $ua = array(
185
  'bindings_version' => Stripe::VERSION,
186
  'lang' => 'php',
187
  'lang_version' => $langVersion,
188
  'publisher' => 'stripe',
189
  'uname' => $uname,
190
- );
191
  if ($clientInfo) {
192
  $ua = array_merge($clientInfo, $ua);
193
  }
@@ -196,14 +308,25 @@ class ApiRequestor
196
  $ua['application'] = $appInfo;
197
  }
198
 
199
- $defaultHeaders = array(
200
  'X-Stripe-Client-User-Agent' => json_encode($ua),
201
  'User-Agent' => $uaString,
202
  'Authorization' => 'Bearer ' . $apiKey,
203
- );
204
  return $defaultHeaders;
205
  }
206
 
 
 
 
 
 
 
 
 
 
 
 
207
  private function _requestRaw($method, $url, $params, $headers)
208
  {
209
  $myApiKey = $this->_apiKey;
@@ -238,6 +361,10 @@ class ApiRequestor
238
  $defaultHeaders['Stripe-Account'] = Stripe::$accountId;
239
  }
240
 
 
 
 
 
241
  $hasFile = false;
242
  $hasCurlFile = class_exists('\CURLFile', false);
243
  foreach ($params as $k => $v) {
@@ -256,12 +383,14 @@ class ApiRequestor
256
  }
257
 
258
  $combinedHeaders = array_merge($defaultHeaders, $headers);
259
- $rawHeaders = array();
260
 
261
  foreach ($combinedHeaders as $header => $value) {
262
  $rawHeaders[] = $header . ': ' . $value;
263
  }
264
 
 
 
265
  list($rbody, $rcode, $rheaders) = $this->httpClient()->request(
266
  $method,
267
  $absUrl,
@@ -269,9 +398,24 @@ class ApiRequestor
269
  $params,
270
  $hasFile
271
  );
272
- return array($rbody, $rcode, $rheaders, $myApiKey);
 
 
 
 
 
 
 
 
273
  }
274
 
 
 
 
 
 
 
 
275
  private function _processResourceParam($resource, $hasCurlFile)
276
  {
277
  if (get_resource_type($resource) !== 'stream') {
@@ -295,6 +439,26 @@ class ApiRequestor
295
  }
296
  }
297
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
298
  private function _interpretResponse($rbody, $rcode, $rheaders)
299
  {
300
  $resp = json_decode($rbody, true);
@@ -311,11 +475,29 @@ class ApiRequestor
311
  return $resp;
312
  }
313
 
 
 
 
 
 
314
  public static function setHttpClient($client)
315
  {
316
  self::$_httpClient = $client;
317
  }
318
 
 
 
 
 
 
 
 
 
 
 
 
 
 
319
  private function httpClient()
320
  {
321
  if (!self::$_httpClient) {
9
  */
10
  class ApiRequestor
11
  {
12
+ /**
13
+ * @var string|null
14
+ */
15
  private $_apiKey;
16
 
17
+ /**
18
+ * @var string
19
+ */
20
  private $_apiBase;
21
 
22
+ /**
23
+ * @var HttpClient\ClientInterface
24
+ */
25
  private static $_httpClient;
26
 
27
+ /**
28
+ * @var RequestTelemetry
29
+ */
30
+ private static $requestTelemetry;
31
+
32
+ /**
33
+ * ApiRequestor constructor.
34
+ *
35
+ * @param string|null $apiKey
36
+ * @param string|null $apiBase
37
+ */
38
  public function __construct($apiKey = null, $apiBase = null)
39
  {
40
  $this->_apiKey = $apiKey;
44
  $this->_apiBase = $apiBase;
45
  }
46
 
47
+ /**
48
+ * Creates a telemetry json blob for use in 'X-Stripe-Client-Telemetry' headers
49
+ * @static
50
+ *
51
+ * @param RequestTelemetry $requestTelemetry
52
+ * @return string
53
+ */
54
+ private static function _telemetryJson($requestTelemetry)
55
+ {
56
+ $payload = array(
57
+ 'last_request_metrics' => array(
58
+ 'request_id' => $requestTelemetry->requestId,
59
+ 'request_duration_ms' => $requestTelemetry->requestDuration,
60
+ ));
61
+
62
+ $result = json_encode($payload);
63
+ if ($result != false) {
64
+ return $result;
65
+ } else {
66
+ Stripe::getLogger()->error("Serializing telemetry payload failed!");
67
+ return "{}";
68
+ }
69
+ }
70
+
71
+ /**
72
+ * @static
73
+ *
74
+ * @param ApiResource|bool|array|mixed $d
75
+ *
76
+ * @return ApiResource|array|string|mixed
77
+ */
78
  private static function _encodeObjects($d)
79
  {
80
  if ($d instanceof ApiResource) {
84
  } elseif ($d === false) {
85
  return 'false';
86
  } elseif (is_array($d)) {
87
+ $res = [];
88
  foreach ($d as $k => $v) {
89
  $res[$k] = self::_encodeObjects($v);
90
  }
95
  }
96
 
97
  /**
98
+ * @param string $method
99
+ * @param string $url
100
  * @param array|null $params
101
  * @param array|null $headers
102
  *
103
  * @return array An array whose first element is an API response and second
104
  * element is the API key used to make the request.
105
+ * @throws Error\Api
106
+ * @throws Error\Authentication
107
+ * @throws Error\Card
108
+ * @throws Error\InvalidRequest
109
+ * @throws Error\OAuth\InvalidClient
110
+ * @throws Error\OAuth\InvalidGrant
111
+ * @throws Error\OAuth\InvalidRequest
112
+ * @throws Error\OAuth\InvalidScope
113
+ * @throws Error\OAuth\UnsupportedGrantType
114
+ * @throws Error\OAuth\UnsupportedResponseType
115
+ * @throws Error\Permission
116
+ * @throws Error\RateLimit
117
+ * @throws Error\Idempotency
118
+ * @throws Error\ApiConnection
119
  */
120
  public function request($method, $url, $params = null, $headers = null)
121
  {
122
+ $params = $params ?: [];
123
+ $headers = $headers ?: [];
 
 
 
 
124
  list($rbody, $rcode, $rheaders, $myApiKey) =
125
  $this->_requestRaw($method, $url, $params, $headers);
126
  $json = $this->_interpretResponse($rbody, $rcode, $rheaders);
127
  $resp = new ApiResponse($rbody, $rcode, $rheaders, $json);
128
+ return [$resp, $myApiKey];
129
  }
130
 
131
  /**
141
  * permissions.
142
  * @throws Error\Card if the error is the error code is 402 (payment
143
  * required)
144
+ * @throws Error\InvalidRequest if the error is caused by the user.
145
+ * @throws Error\Idempotency if the error is caused by an idempotency key.
146
+ * @throws Error\OAuth\InvalidClient
147
+ * @throws Error\OAuth\InvalidGrant
148
+ * @throws Error\OAuth\InvalidRequest
149
+ * @throws Error\OAuth\InvalidScope
150
+ * @throws Error\OAuth\UnsupportedGrantType
151
+ * @throws Error\OAuth\UnsupportedResponseType
152
+ * @throws Error\Permission if the error is caused by insufficient
153
+ * permissions.
154
  * @throws Error\RateLimit if the error is caused by too many requests
155
  * hitting the API.
156
  * @throws Error\Api otherwise.
176
  throw $error;
177
  }
178
 
179
+ /**
180
+ * @static
181
+ *
182
+ * @param string $rbody
183
+ * @param int $rcode
184
+ * @param array $rheaders
185
+ * @param array $resp
186
+ * @param array $errorData
187
+ *
188
+ * @return Error\RateLimit|Error\Idempotency|Error\InvalidRequest|Error\Authentication|Error\Card|Error\Permission|Error\Api
189
+ */
190
  private static function _specificAPIError($rbody, $rcode, $rheaders, $resp, $errorData)
191
  {
192
  $msg = isset($errorData['message']) ? $errorData['message'] : null;
193
  $param = isset($errorData['param']) ? $errorData['param'] : null;
194
  $code = isset($errorData['code']) ? $errorData['code'] : null;
195
+ $type = isset($errorData['type']) ? $errorData['type'] : null;
196
 
197
  switch ($rcode) {
198
  case 400:
201
  if ($code == 'rate_limit') {
202
  return new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders);
203
  }
204
+ if ($type == 'idempotency_error') {
205
+ return new Error\Idempotency($msg, $rcode, $rbody, $resp, $rheaders);
206
+ }
207
 
208
  // intentional fall-through
209
  case 404:
221
  }
222
  }
223
 
224
+ /**
225
+ * @static
226
+ *
227
+ * @param string|bool $rbody
228
+ * @param int $rcode
229
+ * @param array $rheaders
230
+ * @param array $resp
231
+ * @param string $errorCode
232
+ *
233
+ * @return null|Error\OAuth\InvalidClient|Error\OAuth\InvalidGrant|Error\OAuth\InvalidRequest|Error\OAuth\InvalidScope|Error\OAuth\UnsupportedGrantType|Error\OAuth\UnsupportedResponseType
234
+ */
235
  private static function _specificOAuthError($rbody, $rcode, $rheaders, $resp, $errorCode)
236
  {
237
  $description = isset($resp['error_description']) ? $resp['error_description'] : $errorCode;
254
  return null;
255
  }
256
 
257
+ /**
258
+ * @static
259
+ *
260
+ * @param null|array $appInfo
261
+ *
262
+ * @return null|string
263
+ */
264
  private static function _formatAppInfo($appInfo)
265
  {
266
  if ($appInfo !== null) {
277
  }
278
  }
279
 
280
+ /**
281
+ * @static
282
+ *
283
+ * @param string $apiKey
284
+ * @param null $clientInfo
285
+ *
286
+ * @return array
287
+ */
288
  private static function _defaultHeaders($apiKey, $clientInfo = null)
289
  {
290
  $uaString = 'Stripe/v1 PhpBindings/' . Stripe::VERSION;
293
  $uname = php_uname();
294
 
295
  $appInfo = Stripe::getAppInfo();
296
+ $ua = [
297
  'bindings_version' => Stripe::VERSION,
298
  'lang' => 'php',
299
  'lang_version' => $langVersion,
300
  'publisher' => 'stripe',
301
  'uname' => $uname,
302
+ ];
303
  if ($clientInfo) {
304
  $ua = array_merge($clientInfo, $ua);
305
  }
308
  $ua['application'] = $appInfo;
309
  }
310
 
311
+ $defaultHeaders = [
312
  'X-Stripe-Client-User-Agent' => json_encode($ua),
313
  'User-Agent' => $uaString,
314
  'Authorization' => 'Bearer ' . $apiKey,
315
+ ];
316
  return $defaultHeaders;
317
  }
318
 
319
+ /**
320
+ * @param string $method
321
+ * @param string $url
322
+ * @param array $params
323
+ * @param array $headers
324
+ *
325
+ * @return array
326
+ * @throws Error\Api
327
+ * @throws Error\ApiConnection
328
+ * @throws Error\Authentication
329
+ */
330
  private function _requestRaw($method, $url, $params, $headers)
331
  {
332
  $myApiKey = $this->_apiKey;
361
  $defaultHeaders['Stripe-Account'] = Stripe::$accountId;
362
  }
363
 
364
+ if (Stripe::$enableTelemetry && self::$requestTelemetry != null) {
365
+ $defaultHeaders["X-Stripe-Client-Telemetry"] = self::_telemetryJson(self::$requestTelemetry);
366
+ }
367
+
368
  $hasFile = false;
369
  $hasCurlFile = class_exists('\CURLFile', false);
370
  foreach ($params as $k => $v) {
383
  }
384
 
385
  $combinedHeaders = array_merge($defaultHeaders, $headers);
386
+ $rawHeaders = [];
387
 
388
  foreach ($combinedHeaders as $header => $value) {
389
  $rawHeaders[] = $header . ': ' . $value;
390
  }
391
 
392
+ $requestStartMs = Util\Util::currentTimeMillis();
393
+
394
  list($rbody, $rcode, $rheaders) = $this->httpClient()->request(
395
  $method,
396
  $absUrl,
398
  $params,
399
  $hasFile
400
  );
401
+
402
+ if (array_key_exists('request-id', $rheaders)) {
403
+ self::$requestTelemetry = new RequestTelemetry(
404
+ $rheaders['request-id'],
405
+ Util\Util::currentTimeMillis() - $requestStartMs
406
+ );
407
+ }
408
+
409
+ return [$rbody, $rcode, $rheaders, $myApiKey];
410
  }
411
 
412
+ /**
413
+ * @param resource $resource
414
+ * @param bool $hasCurlFile
415
+ *
416
+ * @return \CURLFile|string
417
+ * @throws Error\Api
418
+ */
419
  private function _processResourceParam($resource, $hasCurlFile)
420
  {
421
  if (get_resource_type($resource) !== 'stream') {
439
  }
440
  }
441
 
442
+ /**
443
+ * @param string $rbody
444
+ * @param int $rcode
445
+ * @param array $rheaders
446
+ *
447
+ * @return mixed
448
+ * @throws Error\Api
449
+ * @throws Error\Authentication
450
+ * @throws Error\Card
451
+ * @throws Error\InvalidRequest
452
+ * @throws Error\OAuth\InvalidClient
453
+ * @throws Error\OAuth\InvalidGrant
454
+ * @throws Error\OAuth\InvalidRequest
455
+ * @throws Error\OAuth\InvalidScope
456
+ * @throws Error\OAuth\UnsupportedGrantType
457
+ * @throws Error\OAuth\UnsupportedResponseType
458
+ * @throws Error\Permission
459
+ * @throws Error\RateLimit
460
+ * @throws Error\Idempotency
461
+ */
462
  private function _interpretResponse($rbody, $rcode, $rheaders)
463
  {
464
  $resp = json_decode($rbody, true);
475
  return $resp;
476
  }
477
 
478
+ /**
479
+ * @static
480
+ *
481
+ * @param HttpClient\ClientInterface $client
482
+ */
483
  public static function setHttpClient($client)
484
  {
485
  self::$_httpClient = $client;
486
  }
487
 
488
+ /**
489
+ * @static
490
+ *
491
+ * Resets any stateful telemetry data
492
+ */
493
+ public static function resetTelemetry()
494
+ {
495
+ self::$requestTelemetry = null;
496
+ }
497
+
498
+ /**
499
+ * @return HttpClient\ClientInterface
500
+ */
501
  private function httpClient()
502
  {
503
  if (!self::$_httpClient) {
includes/lib/Stripe/lib/ApiResource.php CHANGED
@@ -9,11 +9,42 @@ namespace Stripe;
9
  */
10
  abstract class ApiResource extends StripeObject
11
  {
12
- private static $HEADERS_TO_PERSIST = array('Stripe-Account' => true, 'Stripe-Version' => true);
13
 
14
- public static function baseUrl()
 
 
 
 
 
 
 
15
  {
16
- return Stripe::$apiBase;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  }
18
 
19
  /**
@@ -36,27 +67,11 @@ abstract class ApiResource extends StripeObject
36
  }
37
 
38
  /**
39
- * @return string The name of the class, with namespacing and underscores
40
- * stripped.
41
  */
42
- public static function className()
43
  {
44
- $class = get_called_class();
45
- // Useful for namespaces: Foo\Charge
46
- if ($postfixNamespaces = strrchr($class, '\\')) {
47
- $class = substr($postfixNamespaces, 1);
48
- }
49
- // Useful for underscored 'namespaces': Foo_Charge
50
- if ($postfixFakeNamespaces = strrchr($class, '')) {
51
- $class = $postfixFakeNamespaces;
52
- }
53
- if (substr($class, 0, strlen('Stripe')) == 'Stripe') {
54
- $class = substr($class, strlen('Stripe'));
55
- }
56
- $class = str_replace('_', '', $class);
57
- $name = urlencode($class);
58
- $name = strtolower($name);
59
- return $name;
60
  }
61
 
62
  /**
@@ -64,7 +79,9 @@ abstract class ApiResource extends StripeObject
64
  */
65
  public static function classUrl()
66
  {
67
- $base = static::className();
 
 
68
  return "/v1/${base}s";
69
  }
70
 
@@ -92,111 +109,4 @@ abstract class ApiResource extends StripeObject
92
  {
93
  return static::resourceUrl($this['id']);
94
  }
95
-
96
- protected static function _validateParams($params = null)
97
- {
98
- if ($params && !is_array($params)) {
99
- $message = "You must pass an array as the first argument to Stripe API "
100
- . "method calls. (HINT: an example call to create a charge "
101
- . "would be: \"Stripe\\Charge::create(array('amount' => 100, "
102
- . "'currency' => 'usd', 'source' => 'tok_1234'))\")";
103
- throw new Error\Api($message);
104
- }
105
- }
106
-
107
- protected function _request($method, $url, $params = array(), $options = null)
108
- {
109
- $opts = $this->_opts->merge($options);
110
- list($resp, $options) = static::_staticRequest($method, $url, $params, $opts);
111
- $this->setLastResponse($resp);
112
- return array($resp->json, $options);
113
- }
114
-
115
- protected static function _staticRequest($method, $url, $params, $options)
116
- {
117
- $opts = Util\RequestOptions::parse($options);
118
- $requestor = new ApiRequestor($opts->apiKey, static::baseUrl());
119
- list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers);
120
- foreach ($opts->headers as $k => $v) {
121
- if (!array_key_exists($k, self::$HEADERS_TO_PERSIST)) {
122
- unset($opts->headers[$k]);
123
- }
124
- }
125
- return array($response, $opts);
126
- }
127
-
128
- protected static function _retrieve($id, $options = null)
129
- {
130
- $opts = Util\RequestOptions::parse($options);
131
- $instance = new static($id, $opts);
132
- $instance->refresh();
133
- return $instance;
134
- }
135
-
136
- protected static function _all($params = null, $options = null)
137
- {
138
- self::_validateParams($params);
139
- $url = static::classUrl();
140
-
141
- list($response, $opts) = static::_staticRequest('get', $url, $params, $options);
142
- $obj = Util\Util::convertToStripeObject($response->json, $opts);
143
- if (!is_a($obj, 'Stripe\\Collection')) {
144
- $class = get_class($obj);
145
- $message = "Expected type \"Stripe\\Collection\", got \"$class\" instead";
146
- throw new Error\Api($message);
147
- }
148
- $obj->setLastResponse($response);
149
- $obj->setRequestParams($params);
150
- return $obj;
151
- }
152
-
153
- protected static function _create($params = null, $options = null)
154
- {
155
- self::_validateParams($params);
156
- $url = static::classUrl();
157
-
158
- list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
159
- $obj = Util\Util::convertToStripeObject($response->json, $opts);
160
- $obj->setLastResponse($response);
161
- return $obj;
162
- }
163
-
164
- /**
165
- * @param string $id The ID of the API resource to update.
166
- * @param array|null $params
167
- * @param array|string|null $opts
168
- *
169
- * @return ApiResource the updated API resource
170
- */
171
- protected static function _update($id, $params = null, $options = null)
172
- {
173
- self::_validateParams($params);
174
- $url = static::resourceUrl($id);
175
-
176
- list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
177
- $obj = Util\Util::convertToStripeObject($response->json, $opts);
178
- $obj->setLastResponse($response);
179
- return $obj;
180
- }
181
-
182
- protected function _save($options = null)
183
- {
184
- $params = $this->serializeParameters();
185
- if (count($params) > 0) {
186
- $url = $this->instanceUrl();
187
- list($response, $opts) = $this->_request('post', $url, $params, $options);
188
- $this->refreshFrom($response, $opts);
189
- }
190
- return $this;
191
- }
192
-
193
- protected function _delete($params = null, $options = null)
194
- {
195
- self::_validateParams($params);
196
-
197
- $url = $this->instanceUrl();
198
- list($response, $opts) = $this->_request('delete', $url, $params, $options);
199
- $this->refreshFrom($response, $opts);
200
- return $this;
201
- }
202
  }
9
  */
10
  abstract class ApiResource extends StripeObject
11
  {
12
+ use ApiOperations\Request;
13
 
14
+ /**
15
+ * @return \Stripe\Util\Set A list of fields that can be their own type of
16
+ * API resource (say a nested card under an account for example), and if
17
+ * that resource is set, it should be transmitted to the API on a create or
18
+ * update. Doing so is not the default behavior because API resources
19
+ * should normally be persisted on their own RESTful endpoints.
20
+ */
21
+ public static function getSavedNestedResources()
22
  {
23
+ static $savedNestedResources = null;
24
+ if ($savedNestedResources === null) {
25
+ $savedNestedResources = new Util\Set();
26
+ }
27
+ return $savedNestedResources;
28
+ }
29
+
30
+ /**
31
+ * @var boolean A flag that can be set a behavior that will cause this
32
+ * resource to be encoded and sent up along with an update of its parent
33
+ * resource. This is usually not desirable because resources are updated
34
+ * individually on their own endpoints, but there are certain cases,
35
+ * replacing a customer's source for example, where this is allowed.
36
+ */
37
+ public $saveWithParent = false;
38
+
39
+ public function __set($k, $v)
40
+ {
41
+ parent::__set($k, $v);
42
+ $v = $this->$k;
43
+ if ((static::getSavedNestedResources()->includes($k)) &&
44
+ ($v instanceof ApiResource)) {
45
+ $v->saveWithParent = true;
46
+ }
47
+ return $v;
48
  }
49
 
50
  /**
67
  }
68
 
69
  /**
70
+ * @return string The base URL for the given class.
 
71
  */
72
+ public static function baseUrl()
73
  {
74
+ return Stripe::$apiBase;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  }
76
 
77
  /**
79
  */
80
  public static function classUrl()
81
  {
82
+ // Replace dots with slashes for namespaced resources, e.g. if the object's name is
83
+ // "foo.bar", then its URL will be "/v1/foo/bars".
84
+ $base = str_replace('.', '/', static::OBJECT_NAME);
85
  return "/v1/${base}s";
86
  }
87
 
109
  {
110
  return static::resourceUrl($this['id']);
111
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  }
includes/lib/Stripe/lib/ApplePayDomain.php CHANGED
@@ -9,7 +9,14 @@ namespace Stripe;
9
  */
10
  class ApplePayDomain extends ApiResource
11
  {
12
-
 
 
 
 
 
 
 
13
  /**
14
  * @return string The class URL for this resource. It needs to be special
15
  * cased because it doesn't fit into the standard resource pattern.
@@ -18,49 +25,4 @@ class ApplePayDomain extends ApiResource
18
  {
19
  return '/v1/apple_pay/domains';
20
  }
21
-
22
- /**
23
- * @param array|string $id The ID of the domain to retrieve, or an options
24
- * array containing an `id` key.
25
- * @param array|string|null $opts
26
- *
27
- * @return ApplePayDomain
28
- */
29
- public static function retrieve($id, $opts = null)
30
- {
31
- return self::_retrieve($id, $opts);
32
- }
33
-
34
- /**
35
- * @param array|null $params
36
- * @param array|string|null $opts
37
- *
38
- * @return ApplePayDomain The created domain.
39
- */
40
- public static function create($params = null, $opts = null)
41
- {
42
- return self::_create($params, $opts);
43
- }
44
-
45
- /**
46
- * @param array|null $params
47
- * @param array|string|null $opts
48
- *
49
- * @return ApplePayDomain The deleted domain.
50
- */
51
- public function delete($params = null, $opts = null)
52
- {
53
- return $this->_delete($params, $opts);
54
- }
55
-
56
- /**
57
- * @param array|null $params
58
- * @param array|string|null $opts
59
- *
60
- * @return Collection of ApplePayDomains
61
- */
62
- public static function all($params = null, $opts = null)
63
- {
64
- return self::_all($params, $opts);
65
- }
66
  }
9
  */
10
  class ApplePayDomain extends ApiResource
11
  {
12
+
13
+ const OBJECT_NAME = "apple_pay_domain";
14
+
15
+ use ApiOperations\All;
16
+ use ApiOperations\Create;
17
+ use ApiOperations\Delete;
18
+ use ApiOperations\Retrieve;
19
+
20
  /**
21
  * @return string The class URL for this resource. It needs to be special
22
  * cased because it doesn't fit into the standard resource pattern.
25
  {
26
  return '/v1/apple_pay/domains';
27
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
includes/lib/Stripe/lib/ApplicationFee.php CHANGED
@@ -5,66 +5,94 @@ namespace Stripe;
5
  /**
6
  * Class ApplicationFee
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class ApplicationFee extends ApiResource
11
  {
 
 
 
 
 
 
 
 
 
12
  /**
13
- * This is a special case because the application fee endpoint has an
14
- * underscore in it. The parent `className` function strips underscores.
15
  *
16
- * @return string The name of the class.
17
  */
18
- public static function className()
19
  {
20
- return 'application_fee';
 
 
21
  }
22
 
23
  /**
24
- * @param array|string $id The ID of the application fee to retrieve, or an
25
- * options array containing an `id` key.
26
  * @param array|string|null $opts
27
  *
28
- * @return ApplicationFee
29
  */
30
- public static function retrieve($id, $opts = null)
31
  {
32
- return self::_retrieve($id, $opts);
33
  }
34
 
35
  /**
36
- * @param string $id The ID of the application fee to update.
 
37
  * @param array|null $params
38
- * @param array|string|null $options
39
  *
40
- * @return ApplicationFee The updated application fee.
41
  */
42
- public static function update($id, $params = null, $options = null)
43
  {
44
- return self::_update($id, $params, $options);
45
  }
46
 
47
  /**
 
 
48
  * @param array|null $params
49
  * @param array|string|null $opts
50
  *
51
- * @return Collection of ApplicationFees
52
  */
53
- public static function all($params = null, $opts = null)
54
  {
55
- return self::_all($params, $opts);
56
  }
57
 
58
  /**
 
59
  * @param array|null $params
60
  * @param array|string|null $opts
61
  *
62
- * @return ApplicationFee The refunded application fee.
63
  */
64
- public function refund($params = null, $opts = null)
65
  {
66
- $this->refunds->create($params, $opts);
67
- $this->refresh();
68
- return $this;
69
  }
70
  }
5
  /**
6
  * Class ApplicationFee
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $account
11
+ * @property int $amount
12
+ * @property int $amount_refunded
13
+ * @property string $application
14
+ * @property string $balance_transaction
15
+ * @property string $charge
16
+ * @property int $created
17
+ * @property string $currency
18
+ * @property bool $livemode
19
+ * @property string $originating_transaction
20
+ * @property bool $refunded
21
+ * @property Collection $refunds
22
+ *
23
  * @package Stripe
24
  */
25
  class ApplicationFee extends ApiResource
26
  {
27
+
28
+ const OBJECT_NAME = "application_fee";
29
+
30
+ use ApiOperations\All;
31
+ use ApiOperations\NestedResource;
32
+ use ApiOperations\Retrieve;
33
+
34
+ const PATH_REFUNDS = '/refunds';
35
+
36
  /**
37
+ * @param array|null $params
38
+ * @param array|string|null $opts
39
  *
40
+ * @return ApplicationFee The refunded application fee.
41
  */
42
+ public function refund($params = null, $opts = null)
43
  {
44
+ $this->refunds->create($params, $opts);
45
+ $this->refresh();
46
+ return $this;
47
  }
48
 
49
  /**
50
+ * @param string|null $id The ID of the application fee on which to create the refund.
51
+ * @param array|null $params
52
  * @param array|string|null $opts
53
  *
54
+ * @return ApplicationFeeRefund
55
  */
56
+ public static function createRefund($id, $params = null, $opts = null)
57
  {
58
+ return self::_createNestedResource($id, static::PATH_REFUNDS, $params, $opts);
59
  }
60
 
61
  /**
62
+ * @param string|null $id The ID of the application fee to which the refund belongs.
63
+ * @param array|null $refundId The ID of the refund to retrieve.
64
  * @param array|null $params
65
+ * @param array|string|null $opts
66
  *
67
+ * @return ApplicationFeeRefund
68
  */
69
+ public static function retrieveRefund($id, $refundId, $params = null, $opts = null)
70
  {
71
+ return self::_retrieveNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts);
72
  }
73
 
74
  /**
75
+ * @param string|null $id The ID of the application fee to which the refund belongs.
76
+ * @param array|null $refundId The ID of the refund to update.
77
  * @param array|null $params
78
  * @param array|string|null $opts
79
  *
80
+ * @return ApplicationFeeRefund
81
  */
82
+ public static function updateRefund($id, $refundId, $params = null, $opts = null)
83
  {
84
+ return self::_updateNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts);
85
  }
86
 
87
  /**
88
+ * @param string|null $id The ID of the application fee on which to retrieve the refunds.
89
  * @param array|null $params
90
  * @param array|string|null $opts
91
  *
92
+ * @return Collection The list of refunds.
93
  */
94
+ public static function allRefunds($id, $params = null, $opts = null)
95
  {
96
+ return self::_allNestedResources($id, static::PATH_REFUNDS, $params, $opts);
 
 
97
  }
98
  }
includes/lib/Stripe/lib/ApplicationFeeRefund.php CHANGED
@@ -5,10 +5,26 @@ namespace Stripe;
5
  /**
6
  * Class ApplicationFeeRefund
7
  *
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class ApplicationFeeRefund extends ApiResource
11
  {
 
 
 
 
 
 
 
12
  /**
13
  * @return string The API URL for this Stripe refund.
14
  */
5
  /**
6
  * Class ApplicationFeeRefund
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property string $balance_transaction
12
+ * @property int $created
13
+ * @property string $currency
14
+ * @property string $fee
15
+ * @property StripeObject $metadata
16
+ *
17
  * @package Stripe
18
  */
19
  class ApplicationFeeRefund extends ApiResource
20
  {
21
+
22
+ const OBJECT_NAME = "fee_refund";
23
+
24
+ use ApiOperations\Update {
25
+ save as protected _save;
26
+ }
27
+
28
  /**
29
  * @return string The API URL for this Stripe refund.
30
  */
includes/lib/Stripe/lib/Balance.php CHANGED
@@ -6,14 +6,18 @@ namespace Stripe;
6
  * Class Balance
7
  *
8
  * @property string $object
9
- * @property mixed $available
10
- * @property bool $livedmode
11
- * @property mixed $pending
 
12
  *
13
  * @package Stripe
14
  */
15
  class Balance extends SingletonApiResource
16
  {
 
 
 
17
  /**
18
  * @param array|string|null $opts
19
  *
6
  * Class Balance
7
  *
8
  * @property string $object
9
+ * @property array $available
10
+ * @property array $connect_reserved
11
+ * @property bool $livemode
12
+ * @property array $pending
13
  *
14
  * @package Stripe
15
  */
16
  class Balance extends SingletonApiResource
17
  {
18
+
19
+ const OBJECT_NAME = "balance";
20
+
21
  /**
22
  * @param array|string|null $opts
23
  *
includes/lib/Stripe/lib/BalanceTransaction.php CHANGED
@@ -12,11 +12,11 @@ namespace Stripe;
12
  * @property int $created
13
  * @property string $currency
14
  * @property string $description
 
15
  * @property int $fee
16
  * @property mixed $fee_details
17
  * @property int $net
18
  * @property string $source
19
- * @property mixed $sourced_transfers
20
  * @property string $status
21
  * @property string $type
22
  *
@@ -24,35 +24,52 @@ namespace Stripe;
24
  */
25
  class BalanceTransaction extends ApiResource
26
  {
27
- /**
28
- * @return string The class URL for this resource. It needs to be special
29
- * cased because it doesn't fit into the standard resource pattern.
30
- */
31
- public static function classUrl()
32
- {
33
- return "/v1/balance/history";
34
- }
35
 
36
  /**
37
- * @param array|string $id The ID of the balance transaction to retrieve,
38
- * or an options array containing an `id` key.
39
- * @param array|string|null $opts
40
- *
41
- * @return BalanceTransaction
42
  */
43
- public static function retrieve($id, $opts = null)
44
- {
45
- return self::_retrieve($id, $opts);
46
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
 
48
  /**
49
- * @param array|null $params
50
- * @param array|string|null $opts
51
- *
52
- * @return Collection of BalanceTransactions
53
  */
54
- public static function all($params = null, $opts = null)
55
  {
56
- return self::_all($params, $opts);
57
  }
58
  }
12
  * @property int $created
13
  * @property string $currency
14
  * @property string $description
15
+ * @property float $exchange_rate
16
  * @property int $fee
17
  * @property mixed $fee_details
18
  * @property int $net
19
  * @property string $source
 
20
  * @property string $status
21
  * @property string $type
22
  *
24
  */
25
  class BalanceTransaction extends ApiResource
26
  {
27
+
28
+ const OBJECT_NAME = "balance_transaction";
29
+
30
+ use ApiOperations\All;
31
+ use ApiOperations\Retrieve;
 
 
 
32
 
33
  /**
34
+ * Possible string representations of the type of balance transaction.
35
+ * @link https://stripe.com/docs/api/balance/balance_transaction#balance_transaction_object-type
 
 
 
36
  */
37
+ const TYPE_ADJUSTMENT = 'adjustment';
38
+ const TYPE_ADVANCE = 'advance';
39
+ const TYPE_ADVANCE_FUNDING = 'advance_funding';
40
+ const TYPE_APPLICATION_FEE = 'application_fee';
41
+ const TYPE_APPLICATION_FEE_REFUND = 'application_fee_refund';
42
+ const TYPE_CHARGE = 'charge';
43
+ const TYPE_CONNECT_COLLECTION_TRANSFER = 'connect_collection_transfer';
44
+ const TYPE_ISSUING_AUTHORIZATION_HOLD = 'issuing_authorization_hold';
45
+ const TYPE_ISSUING_AUTHORIZATION_RELEASE = 'issuing_authorization_release';
46
+ const TYPE_ISSUING_TRANSACTION = 'issuing_transaction';
47
+ const TYPE_PAYMENT = 'payment';
48
+ const TYPE_PAYMENT_FAILURE_REFUND = 'payment_failure_refund';
49
+ const TYPE_PAYMENT_REFUND = 'payment_refund';
50
+ const TYPE_PAYOUT = 'payout';
51
+ const TYPE_PAYOUT_CANCEL = 'payout_cancel';
52
+ const TYPE_PAYOUT_FAILURE = 'payout_failure';
53
+ const TYPE_REFUND = 'refund';
54
+ const TYPE_REFUND_FAILURE = 'refund_failure';
55
+ const TYPE_RESERVE_TRANSACTION = 'reserve_transaction';
56
+ const TYPE_RESERVED_FUNDS = 'reserved_funds';
57
+ const TYPE_STRIPE_FEE = 'stripe_fee';
58
+ const TYPE_STRIPE_FX_FEE = 'stripe_fx_fee';
59
+ const TYPE_TAX_FEE = 'tax_fee';
60
+ const TYPE_TOPUP = 'topup';
61
+ const TYPE_TOPUP_REVERSAL = 'topup_reversal';
62
+ const TYPE_TRANSFER = 'transfer';
63
+ const TYPE_TRANSFER_CANCEL = 'transfer_cancel';
64
+ const TYPE_TRANSFER_FAILURE = 'transfer_failure';
65
+ const TYPE_TRANSFER_REFUND = 'transfer_refund';
66
 
67
  /**
68
+ * @return string The class URL for this resource. It needs to be special
69
+ * cased because it doesn't fit into the standard resource pattern.
 
 
70
  */
71
+ public static function classUrl()
72
  {
73
+ return "/v1/balance/history";
74
  }
75
  }
includes/lib/Stripe/lib/BankAccount.php CHANGED
@@ -5,11 +5,95 @@ namespace Stripe;
5
  /**
6
  * Class BankAccount
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
- class BankAccount extends ExternalAccount
11
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  * @param array|null $params
14
  * @param array|string|null $options
15
  *
5
  /**
6
  * Class BankAccount
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $account
11
+ * @property string $account_holder_name
12
+ * @property string $account_holder_type
13
+ * @property string $bank_name
14
+ * @property string $country
15
+ * @property string $currency
16
+ * @property string $customer
17
+ * @property bool $default_for_currency
18
+ * @property string $fingerprint
19
+ * @property string $last4
20
+ * @property StripeObject $metadata
21
+ * @property string $routing_number
22
+ * @property string $status
23
+ *
24
  * @package Stripe
25
  */
26
+ class BankAccount extends ApiResource
27
  {
28
+
29
+ const OBJECT_NAME = "bank_account";
30
+
31
+ use ApiOperations\Delete;
32
+ use ApiOperations\Update;
33
+
34
+ /**
35
+ * Possible string representations of the bank verification status.
36
+ * @link https://stripe.com/docs/api/external_account_bank_accounts/object#account_bank_account_object-status
37
+ */
38
+ const STATUS_NEW = 'new';
39
+ const STATUS_VALIDATED = 'validated';
40
+ const STATUS_VERIFIED = 'verified';
41
+ const STATUS_VERIFICATION_FAILED = 'verification_failed';
42
+ const STATUS_ERRORED = 'errored';
43
+
44
+ /**
45
+ * @return string The instance URL for this resource. It needs to be special
46
+ * cased because it doesn't fit into the standard resource pattern.
47
+ */
48
+ public function instanceUrl()
49
+ {
50
+ if ($this['customer']) {
51
+ $base = Customer::classUrl();
52
+ $parent = $this['customer'];
53
+ $path = 'sources';
54
+ } elseif ($this['account']) {
55
+ $base = Account::classUrl();
56
+ $parent = $this['account'];
57
+ $path = 'external_accounts';
58
+ } else {
59
+ $msg = "Bank accounts cannot be accessed without a customer ID or account ID.";
60
+ throw new Error\InvalidRequest($msg, null);
61
+ }
62
+ $parentExtn = urlencode(Util\Util::utf8($parent));
63
+ $extn = urlencode(Util\Util::utf8($this['id']));
64
+ return "$base/$parentExtn/$path/$extn";
65
+ }
66
+
67
  /**
68
+ * @param array|string $_id
69
+ * @param array|string|null $_opts
70
+ *
71
+ * @throws \Stripe\Error\InvalidRequest
72
+ */
73
+ public static function retrieve($_id, $_opts = null)
74
+ {
75
+ $msg = "Bank accounts cannot be accessed without a customer ID or account ID. " .
76
+ "Retrieve a bank account using \$customer->sources->retrieve('bank_account_id') or " .
77
+ "\$account->external_accounts->retrieve('bank_account_id') instead.";
78
+ throw new Error\InvalidRequest($msg, null);
79
+ }
80
+
81
+ /**
82
+ * @param string $_id
83
+ * @param array|null $_params
84
+ * @param array|string|null $_options
85
+ *
86
+ * @throws \Stripe\Error\InvalidRequest
87
+ */
88
+ public static function update($_id, $_params = null, $_options = null)
89
+ {
90
+ $msg = "Bank accounts cannot be accessed without a customer ID or account ID. " .
91
+ "Call save() on \$customer->sources->retrieve('bank_account_id') or " .
92
+ "\$account->external_accounts->retrieve('bank_account_id') instead.";
93
+ throw new Error\InvalidRequest($msg, null);
94
+ }
95
+
96
+ /**
97
  * @param array|null $params
98
  * @param array|string|null $options
99
  *
includes/lib/Stripe/lib/BitcoinReceiver.php CHANGED
@@ -4,16 +4,23 @@ namespace Stripe;
4
 
5
  /**
6
  * Class BitcoinReceiver
7
-
8
- * @deprecated Please use sources instead.
 
 
 
9
  */
10
- class BitcoinReceiver extends ExternalAccount
11
  {
 
 
 
 
 
 
12
  /**
13
  * @return string The class URL for this resource. It needs to be special
14
  * cased because it doesn't fit into the standard resource pattern.
15
- *
16
- * @deprecated Please use sources instead.
17
  */
18
  public static function classUrl()
19
  {
@@ -23,76 +30,20 @@ class BitcoinReceiver extends ExternalAccount
23
  /**
24
  * @return string The instance URL for this resource. It needs to be special
25
  * cased because it doesn't fit into the standard resource pattern.
26
- *
27
- * @deprecated Please use sources instead.
28
  */
29
  public function instanceUrl()
30
  {
31
- $result = parent::instanceUrl();
32
- if ($result) {
33
- return $result;
 
 
 
 
34
  } else {
35
- $id = $this['id'];
36
- $id = Util\Util::utf8($id);
37
- $extn = urlencode($id);
38
  $base = BitcoinReceiver::classUrl();
 
39
  return "$base/$extn";
40
  }
41
  }
42
-
43
- /**
44
- * @param array|string $id The ID of the bitcoin receiver to retrieve, or
45
- * an options array containing an `id` key.
46
- * @param array|string|null $opts
47
- *
48
- * @return BitcoinReceiver
49
- *
50
- * @deprecated Please use sources instead.
51
- */
52
- public static function retrieve($id, $opts = null)
53
- {
54
- return self::_retrieve($id, $opts);
55
- }
56
-
57
- /**
58
- * @param array|null $params
59
- * @param array|string|null $opts
60
- *
61
- * @return Collection of BitcoinReceivers
62
- *
63
- * @deprecated Please use sources instead.
64
- */
65
- public static function all($params = null, $opts = null)
66
- {
67
- return self::_all($params, $opts);
68
- }
69
-
70
- /**
71
- * @param array|null $params
72
- * @param array|string|null $opts
73
- *
74
- * @return BitcoinReceiver The created Bitcoin Receiver item.
75
- *
76
- * @deprecated Please use sources instead.
77
- */
78
- public static function create($params = null, $opts = null)
79
- {
80
- return self::_create($params, $opts);
81
- }
82
-
83
- /**
84
- * @param array|null $params
85
- * @param array|string|null $options
86
- *
87
- * @return BitcoinReceiver The refunded Bitcoin Receiver item.
88
- *
89
- * @deprecated Please use sources instead.
90
- */
91
- public function refund($params = null, $options = null)
92
- {
93
- $url = $this->instanceUrl() . '/refund';
94
- list($response, $opts) = $this->_request('post', $url, $params, $options);
95
- $this->refreshFrom($response, $opts);
96
- return $this;
97
- }
98
  }
4
 
5
  /**
6
  * Class BitcoinReceiver
7
+ *
8
+ * @package Stripe
9
+ *
10
+ * @deprecated Bitcoin receivers are deprecated. Please use the sources API instead.
11
+ * @link https://stripe.com/docs/sources/bitcoin
12
  */
13
+ class BitcoinReceiver extends ApiResource
14
  {
15
+
16
+ const OBJECT_NAME = "bitcoin_receiver";
17
+
18
+ use ApiOperations\All;
19
+ use ApiOperations\Retrieve;
20
+
21
  /**
22
  * @return string The class URL for this resource. It needs to be special
23
  * cased because it doesn't fit into the standard resource pattern.
 
 
24
  */
25
  public static function classUrl()
26
  {
30
  /**
31
  * @return string The instance URL for this resource. It needs to be special
32
  * cased because it doesn't fit into the standard resource pattern.
 
 
33
  */
34
  public function instanceUrl()
35
  {
36
+ if ($this['customer']) {
37
+ $base = Customer::classUrl();
38
+ $parent = $this['customer'];
39
+ $path = 'sources';
40
+ $parentExtn = urlencode(Util\Util::utf8($parent));
41
+ $extn = urlencode(Util\Util::utf8($this['id']));
42
+ return "$base/$parentExtn/$path/$extn";
43
  } else {
 
 
 
44
  $base = BitcoinReceiver::classUrl();
45
+ $extn = urlencode(Util\Util::utf8($this['id']));
46
  return "$base/$extn";
47
  }
48
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  }
includes/lib/Stripe/lib/BitcoinTransaction.php CHANGED
@@ -10,4 +10,5 @@ namespace Stripe;
10
  class BitcoinTransaction extends ApiResource
11
  {
12
 
 
13
  }
10
  class BitcoinTransaction extends ApiResource
11
  {
12
 
13
+ const OBJECT_NAME = "bitcoin_transaction";
14
  }
includes/lib/Stripe/lib/Capability.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Capability
7
+ *
8
+ * @package Stripe
9
+ *
10
+ * @property string $id
11
+ * @property string $object
12
+ * @property string $account
13
+ * @property bool $requested
14
+ * @property int $requested_at
15
+ * @property mixed $requirements
16
+ * @property string $status
17
+ */
18
+ class Capability extends ApiResource
19
+ {
20
+
21
+ const OBJECT_NAME = "capability";
22
+
23
+ use ApiOperations\Update;
24
+
25
+ /**
26
+ * Possible string representations of a capability's status.
27
+ * @link https://stripe.com/docs/api/capabilities/object#capability_object-status
28
+ */
29
+ const STATUS_ACTIVE = 'active';
30
+ const STATUS_INACTIVE = 'inactive';
31
+ const STATUS_PENDING = 'pending';
32
+ const STATUS_UNREQUESTED = 'unrequested';
33
+
34
+ /**
35
+ * @return string The API URL for this Stripe account reversal.
36
+ */
37
+ public function instanceUrl()
38
+ {
39
+ $id = $this['id'];
40
+ $account = $this['account'];
41
+ if (!$id) {
42
+ throw new Error\InvalidRequest(
43
+ "Could not determine which URL to request: " .
44
+ "class instance has invalid ID: $id",
45
+ null
46
+ );
47
+ }
48
+ $id = Util\Util::utf8($id);
49
+ $account = Util\Util::utf8($account);
50
+
51
+ $base = Account::classUrl();
52
+ $accountExtn = urlencode($account);
53
+ $extn = urlencode($id);
54
+ return "$base/$accountExtn/capabilities/$extn";
55
+ }
56
+
57
+ /**
58
+ * @param array|string $_id
59
+ * @param array|string|null $_opts
60
+ *
61
+ * @throws \Stripe\Error\InvalidRequest
62
+ */
63
+ public static function retrieve($_id, $_opts = null)
64
+ {
65
+ $msg = "Capabilities cannot be accessed without an account ID. " .
66
+ "Retrieve a Capability using \$account->retrieveCapability('acap_123') instead.";
67
+ throw new Error\InvalidRequest($msg, null);
68
+ }
69
+
70
+ /**
71
+ * @param string $_id
72
+ * @param array|null $_params
73
+ * @param array|string|null $_options
74
+ *
75
+ * @throws \Stripe\Error\InvalidRequest
76
+ */
77
+ public static function update($_id, $_params = null, $_options = null)
78
+ {
79
+ $msg = "Capabilities cannot be accessed without an account ID. " .
80
+ "Update a Capability using \$account->updateCapability('acap_123') instead.";
81
+ throw new Error\InvalidRequest($msg, null);
82
+ }
83
+ }
includes/lib/Stripe/lib/Card.php CHANGED
@@ -5,9 +5,126 @@ namespace Stripe;
5
  /**
6
  * Class Card
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
- class Card extends ExternalAccount
11
  {
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  }
5
  /**
6
  * Class Card
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $account
11
+ * @property string $address_city
12
+ * @property string $address_country
13
+ * @property string $address_line1
14
+ * @property string $address_line1_check
15
+ * @property string $address_line2
16
+ * @property string $address_state
17
+ * @property string $address_zip
18
+ * @property string $address_zip_check
19
+ * @property string[] $available_payout_methods
20
+ * @property string $brand
21
+ * @property string $country
22
+ * @property string $currency
23
+ * @property string $customer
24
+ * @property string $cvc_check
25
+ * @property bool $default_for_currency
26
+ * @property string $dynamic_last4
27
+ * @property int $exp_month
28
+ * @property int $exp_year
29
+ * @property string $fingerprint
30
+ * @property string $funding
31
+ * @property string $last4
32
+ * @property StripeObject $metadata
33
+ * @property string $name
34
+ * @property string $recipient
35
+ * @property string $tokenization_method
36
+ *
37
  * @package Stripe
38
  */
39
+ class Card extends ApiResource
40
  {
41
 
42
+ const OBJECT_NAME = "card";
43
+
44
+ use ApiOperations\Delete;
45
+ use ApiOperations\Update;
46
+
47
+ /**
48
+ * Possible string representations of the CVC check status.
49
+ * @link https://stripe.com/docs/api/cards/object#card_object-cvc_check
50
+ */
51
+ const CVC_CHECK_FAIL = 'fail';
52
+ const CVC_CHECK_PASS = 'pass';
53
+ const CVC_CHECK_UNAVAILABLE = 'unavailable';
54
+ const CVC_CHECK_UNCHECKED = 'unchecked';
55
+
56
+ /**
57
+ * Possible string representations of the funding of the card.
58
+ * @link https://stripe.com/docs/api/cards/object#card_object-funding
59
+ */
60
+ const FUNDING_CREDIT = 'credit';
61
+ const FUNDING_DEBIT = 'debit';
62
+ const FUNDING_PREPAID = 'prepaid';
63
+ const FUNDING_UNKNOWN = 'unknown';
64
+
65
+ /**
66
+ * Possible string representations of the tokenization method when using Apple Pay or Google Pay.
67
+ * @link https://stripe.com/docs/api/cards/object#card_object-tokenization_method
68
+ */
69
+ const TOKENIZATION_METHOD_APPLE_PAY = 'apple_pay';
70
+ const TOKENIZATION_METHOD_GOOGLE_PAY = 'google_pay';
71
+
72
+ /**
73
+ * @return string The instance URL for this resource. It needs to be special
74
+ * cased because cards are nested resources that may belong to different
75
+ * top-level resources.
76
+ */
77
+ public function instanceUrl()
78
+ {
79
+ if ($this['customer']) {
80
+ $base = Customer::classUrl();
81
+ $parent = $this['customer'];
82
+ $path = 'sources';
83
+ } elseif ($this['account']) {
84
+ $base = Account::classUrl();
85
+ $parent = $this['account'];
86
+ $path = 'external_accounts';
87
+ } elseif ($this['recipient']) {
88
+ $base = Recipient::classUrl();
89
+ $parent = $this['recipient'];
90
+ $path = 'cards';
91
+ } else {
92
+ $msg = "Cards cannot be accessed without a customer ID, account ID or recipient ID.";
93
+ throw new Error\InvalidRequest($msg, null);
94
+ }
95
+ $parentExtn = urlencode(Util\Util::utf8($parent));
96
+ $extn = urlencode(Util\Util::utf8($this['id']));
97
+ return "$base/$parentExtn/$path/$extn";
98
+ }
99
+
100
+ /**
101
+ * @param array|string $_id
102
+ * @param array|string|null $_opts
103
+ *
104
+ * @throws \Stripe\Error\InvalidRequest
105
+ */
106
+ public static function retrieve($_id, $_opts = null)
107
+ {
108
+ $msg = "Cards cannot be accessed without a customer, recipient or account ID. " .
109
+ "Retrieve a card using \$customer->sources->retrieve('card_id'), " .
110
+ "\$recipient->cards->retrieve('card_id'), or " .
111
+ "\$account->external_accounts->retrieve('card_id') instead.";
112
+ throw new Error\InvalidRequest($msg, null);
113
+ }
114
+
115
+ /**
116
+ * @param string $_id
117
+ * @param array|null $_params
118
+ * @param array|string|null $_options
119
+ *
120
+ * @throws \Stripe\Error\InvalidRequest
121
+ */
122
+ public static function update($_id, $_params = null, $_options = null)
123
+ {
124
+ $msg = "Cards cannot be accessed without a customer, recipient or account ID. " .
125
+ "Call save() on \$customer->sources->retrieve('card_id'), " .
126
+ "\$recipient->cards->retrieve('card_id'), or " .
127
+ "\$account->external_accounts->retrieve('card_id') instead.";
128
+ throw new Error\InvalidRequest($msg, null);
129
+ }
130
  }
includes/lib/Stripe/lib/Charge.php CHANGED
@@ -9,92 +9,114 @@ namespace Stripe;
9
  * @property string $object
10
  * @property int $amount
11
  * @property int $amount_refunded
12
- * @property mixed $application_fee
 
 
13
  * @property string $balance_transaction
 
14
  * @property bool $captured
15
  * @property int $created
16
  * @property string $currency
17
  * @property string $customer
18
- * @property mixed $description
19
- * @property mixed $destination
20
- * @property string|null $dispute
21
- * @property mixed $failure_code
22
- * @property mixed $failure_message
23
  * @property mixed $fraud_details
24
- * @property mixed $invoice
25
  * @property bool $livemode
26
- * @property mixed $metadata
27
- * @property mixed $order
 
 
28
  * @property bool $paid
29
- * @property mixed $receipt_email
30
- * @property mixed $receipt_number
 
 
 
 
31
  * @property bool $refunded
32
- * @property mixed $refunds
 
33
  * @property mixed $shipping
34
  * @property mixed $source
35
- * @property mixed $source_transfer
36
- * @property mixed $statement_descriptor
37
  * @property string $status
 
 
 
38
  *
39
  * @package Stripe
40
  */
41
  class Charge extends ApiResource
42
  {
43
- /**
44
- * @param array|string $id The ID of the charge to retrieve, or an options
45
- * array containing an `id` key.
46
- * @param array|string|null $options
47
- *
48
- * @return Charge
49
- */
50
- public static function retrieve($id, $options = null)
51
- {
52
- return self::_retrieve($id, $options);
53
- }
54
 
55
- /**
56
- * @param array|null $params
57
- * @param array|string|null $options
58
- *
59
- * @return Collection of Charges
60
- */
61
- public static function all($params = null, $options = null)
62
- {
63
- return self::_all($params, $options);
64
- }
65
 
66
- /**
67
- * @param array|null $params
68
- * @param array|string|null $options
69
- *
70
- * @return Charge The created charge.
71
- */
72
- public static function create($params = null, $options = null)
73
- {
74
- return self::_create($params, $options);
75
- }
76
 
77
  /**
78
- * @param string $id The ID of the charge to update.
79
- * @param array|null $params
80
- * @param array|string|null $options
81
- *
82
- * @return Charge The updated charge.
83
  */
84
- public static function update($id, $params = null, $options = null)
85
- {
86
- return self::_update($id, $params, $options);
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
  /**
90
- * @param array|string|null $options
91
- *
92
- * @return Charge The saved charge.
93
  */
94
- public function save($options = null)
95
- {
96
- return $this->_save($options);
97
- }
98
 
99
  /**
100
  * @param array|null $params
@@ -136,7 +158,7 @@ class Charge extends ApiResource
136
  {
137
  $url = $this->instanceUrl() . '/dispute';
138
  list($response, $opts) = $this->_request('post', $url, $params, $options);
139
- $this->refreshFrom(array('dispute' => $response), $opts, true);
140
  return $this->dispute;
141
  }
142
 
@@ -162,7 +184,7 @@ class Charge extends ApiResource
162
  */
163
  public function markAsFraudulent($opts = null)
164
  {
165
- $params = array('fraud_details' => array('user_report' => 'fraudulent'));
166
  $url = $this->instanceUrl();
167
  list($response, $opts) = $this->_request('post', $url, $params, $opts);
168
  $this->refreshFrom($response, $opts);
@@ -176,7 +198,7 @@ class Charge extends ApiResource
176
  */
177
  public function markAsSafe($opts = null)
178
  {
179
- $params = array('fraud_details' => array('user_report' => 'safe'));
180
  $url = $this->instanceUrl();
181
  list($response, $opts) = $this->_request('post', $url, $params, $opts);
182
  $this->refreshFrom($response, $opts);
9
  * @property string $object
10
  * @property int $amount
11
  * @property int $amount_refunded
12
+ * @property string $application
13
+ * @property string $application_fee
14
+ * @property int $application_fee_amount
15
  * @property string $balance_transaction
16
+ * @property mixed $billing_details
17
  * @property bool $captured
18
  * @property int $created
19
  * @property string $currency
20
  * @property string $customer
21
+ * @property string $description
22
+ * @property string $destination
23
+ * @property string $dispute
24
+ * @property string $failure_code
25
+ * @property string $failure_message
26
  * @property mixed $fraud_details
27
+ * @property string $invoice
28
  * @property bool $livemode
29
+ * @property StripeObject $metadata
30
+ * @property string $on_behalf_of
31
+ * @property string $order
32
+ * @property mixed $outcome
33
  * @property bool $paid
34
+ * @property string $payment_intent
35
+ * @property string $payment_method
36
+ * @property mixed $payment_method_details
37
+ * @property string $receipt_email
38
+ * @property string $receipt_number
39
+ * @property string $receipt_url
40
  * @property bool $refunded
41
+ * @property Collection $refunds
42
+ * @property string $review
43
  * @property mixed $shipping
44
  * @property mixed $source
45
+ * @property string $source_transfer
46
+ * @property string $statement_descriptor
47
  * @property string $status
48
+ * @property string $transfer
49
+ * @property mixed $transfer_data
50
+ * @property string $transfer_group
51
  *
52
  * @package Stripe
53
  */
54
  class Charge extends ApiResource
55
  {
 
 
 
 
 
 
 
 
 
 
 
56
 
57
+ const OBJECT_NAME = "charge";
 
 
 
 
 
 
 
 
 
58
 
59
+ use ApiOperations\All;
60
+ use ApiOperations\Create;
61
+ use ApiOperations\Retrieve;
62
+ use ApiOperations\Update;
 
 
 
 
 
 
63
 
64
  /**
65
+ * Possible string representations of decline codes.
66
+ * These strings are applicable to the decline_code property of the \Stripe\Error\Card exception.
67
+ * @link https://stripe.com/docs/declines/codes
 
 
68
  */
69
+ const DECLINED_APPROVE_WITH_ID = 'approve_with_id';
70
+ const DECLINED_CALL_ISSUER = 'call_issuer';
71
+ const DECLINED_CARD_NOT_SUPPORTED = 'card_not_supported';
72
+ const DECLINED_CARD_VELOCITY_EXCEEDED = 'card_velocity_exceeded';
73
+ const DECLINED_CURRENCY_NOT_SUPPORTED = 'currency_not_supported';
74
+ const DECLINED_DO_NOT_HONOR = 'do_not_honor';
75
+ const DECLINED_DO_NOT_TRY_AGAIN = 'do_not_try_again';
76
+ const DECLINED_DUPLICATED_TRANSACTION = 'duplicate_transaction';
77
+ const DECLINED_EXPIRED_CARD = 'expired_card';
78
+ const DECLINED_FRAUDULENT = 'fraudulent';
79
+ const DECLINED_GENERIC_DECLINE = 'generic_decline';
80
+ const DECLINED_INCORRECT_NUMBER = 'incorrect_number';
81
+ const DECLINED_INCORRECT_CVC = 'incorrect_cvc';
82
+ const DECLINED_INCORRECT_PIN = 'incorrect_pin';
83
+ const DECLINED_INCORRECT_ZIP = 'incorrect_zip';
84
+ const DECLINED_INSUFFICIENT_FUNDS = 'insufficient_funds';
85
+ const DECLINED_INVALID_ACCOUNT = 'invalid_account';
86
+ const DECLINED_INVALID_AMOUNT = 'invalid_amount';
87
+ const DECLINED_INVALID_CVC = 'invalid_cvc';
88
+ const DECLINED_INVALID_EXPIRY_YEAR = 'invalid_expiry_year';
89
+ const DECLINED_INVALID_NUMBER = 'invalid_number';
90
+ const DECLINED_INVALID_PIN = 'invalid_pin';
91
+ const DECLINED_ISSUER_NOT_AVAILABLE = 'issuer_not_available';
92
+ const DECLINED_LOST_CARD = 'lost_card';
93
+ const DECLINED_MERCHANT_BLACKLIST = 'merchant_blacklist';
94
+ const DECLINED_NEW_ACCOUNT_INFORMATION_AVAILABLE = 'new_account_information_available';
95
+ const DECLINED_NO_ACTION_TAKEN = 'no_action_taken';
96
+ const DECLINED_NOT_PERMITTED = 'not_permitted';
97
+ const DECLINED_PICKUP_CARD = 'pickup_card';
98
+ const DECLINED_PIN_TRY_EXCEEDED = 'pin_try_exceeded';
99
+ const DECLINED_PROCESSING_ERROR = 'processing_error';
100
+ const DECLINED_REENTER_TRANSACTION = 'reenter_transaction';
101
+ const DECLINED_RESTRICTED_CARD = 'restricted_card';
102
+ const DECLINED_REVOCATION_OF_ALL_AUTHORIZATIONS = 'revocation_of_all_authorizations';
103
+ const DECLINED_REVOCATION_OF_AUTHORIZATION = 'revocation_of_authorization';
104
+ const DECLINED_SECURITY_VIOLATION = 'security_violation';
105
+ const DECLINED_SERVICE_NOT_ALLOWED = 'service_not_allowed';
106
+ const DECLINED_STOLEN_CARD = 'stolen_card';
107
+ const DECLINED_STOP_PAYMENT_ORDER = 'stop_payment_order';
108
+ const DECLINED_TESTMODE_DECLINE = 'testmode_decline';
109
+ const DECLINED_TRANSACTION_NOT_ALLOWED = 'transaction_not_allowed';
110
+ const DECLINED_TRY_AGAIN_LATER = 'try_again_later';
111
+ const DECLINED_WITHDRAWAL_COUNT_LIMIT_EXCEEDED = 'withdrawal_count_limit_exceeded';
112
 
113
  /**
114
+ * Possible string representations of the status of the charge.
115
+ * @link https://stripe.com/docs/api/charges/object#charge_object-status
 
116
  */
117
+ const STATUS_FAILED = 'failed';
118
+ const STATUS_PENDING = 'pending';
119
+ const STATUS_SUCCEEDED = 'succeeded';
 
120
 
121
  /**
122
  * @param array|null $params
158
  {
159
  $url = $this->instanceUrl() . '/dispute';
160
  list($response, $opts) = $this->_request('post', $url, $params, $options);
161
+ $this->refreshFrom(['dispute' => $response], $opts, true);
162
  return $this->dispute;
163
  }
164
 
184
  */
185
  public function markAsFraudulent($opts = null)
186
  {
187
+ $params = ['fraud_details' => ['user_report' => 'fraudulent']];
188
  $url = $this->instanceUrl();
189
  list($response, $opts) = $this->_request('post', $url, $params, $opts);
190
  $this->refreshFrom($response, $opts);
198
  */
199
  public function markAsSafe($opts = null)
200
  {
201
+ $params = ['fraud_details' => ['user_report' => 'safe']];
202
  $url = $this->instanceUrl();
203
  list($response, $opts) = $this->_request('post', $url, $params, $opts);
204
  $this->refreshFrom($response, $opts);
includes/lib/Stripe/lib/Checkout/Session.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Checkout;
4
+
5
+ /**
6
+ * Class Session
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $cancel_url
11
+ * @property string $client_reference_id
12
+ * @property string $customer
13
+ * @property string $customer_email
14
+ * @property mixed $display_items
15
+ * @property bool $livemode
16
+ * @property string $payment_intent
17
+ * @property string[] $payment_method_types
18
+ * @property string $submit_type
19
+ * @property string $subscription
20
+ * @property string $success_url
21
+ *
22
+ * @package Stripe
23
+ */
24
+ class Session extends \Stripe\ApiResource
25
+ {
26
+
27
+ const OBJECT_NAME = "checkout.session";
28
+
29
+ use \Stripe\ApiOperations\Create;
30
+ use \Stripe\ApiOperations\Retrieve;
31
+
32
+ /**
33
+ * Possible string representations of submit type.
34
+ * @link https://stripe.com/docs/api/checkout/sessions/create#create_checkout_session-submit_type
35
+ */
36
+ const SUBMIT_TYPE_AUTO = 'auto';
37
+ const SUBMIT_TYPE_BOOK = 'book';
38
+ const SUBMIT_TYPE_DONATE = 'donate';
39
+ const SUBMIT_TYPE_PAY = 'pay';
40
+ }
includes/lib/Stripe/lib/Collection.php CHANGED
@@ -12,9 +12,22 @@ namespace Stripe;
12
  *
13
  * @package Stripe
14
  */
15
- class Collection extends ApiResource
16
  {
17
- protected $_requestParams = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
  public function setRequestParams($params)
20
  {
@@ -55,6 +68,15 @@ class Collection extends ApiResource
55
  return Util\Util::convertToStripeObject($response, $opts);
56
  }
57
 
 
 
 
 
 
 
 
 
 
58
  /**
59
  * @return Util\AutoPagingIterator An iterator that can be used to iterate
60
  * across all objects across all pages. As page boundaries are
@@ -76,12 +98,11 @@ class Collection extends ApiResource
76
  if (isset($url['query'])) {
77
  // If the URL contains a query param, parse it out into $params so they
78
  // don't interact weirdly with each other.
79
- $query = array();
80
  parse_str($url['query'], $query);
81
- // PHP 5.2 doesn't support the ?: operator :(
82
- $params = array_merge($params ? $params : array(), $query);
83
  }
84
 
85
- return array($url['path'], $params);
86
  }
87
  }
12
  *
13
  * @package Stripe
14
  */
15
+ class Collection extends StripeObject implements \IteratorAggregate
16
  {
17
+
18
+ const OBJECT_NAME = "list";
19
+
20
+ use ApiOperations\Request;
21
+
22
+ protected $_requestParams = [];
23
+
24
+ /**
25
+ * @return string The base URL for the given class.
26
+ */
27
+ public static function baseUrl()
28
+ {
29
+ return Stripe::$apiBase;
30
+ }
31
 
32
  public function setRequestParams($params)
33
  {
68
  return Util\Util::convertToStripeObject($response, $opts);
69
  }
70
 
71
+ /**
72
+ * @return \ArrayIterator An iterator that can be used to iterate
73
+ * across objects in the current page.
74
+ */
75
+ public function getIterator()
76
+ {
77
+ return new \ArrayIterator($this->data);
78
+ }
79
+
80
  /**
81
  * @return Util\AutoPagingIterator An iterator that can be used to iterate
82
  * across all objects across all pages. As page boundaries are
98
  if (isset($url['query'])) {
99
  // If the URL contains a query param, parse it out into $params so they
100
  // don't interact weirdly with each other.
101
+ $query = [];
102
  parse_str($url['query'], $query);
103
+ $params = array_merge($params ?: [], $query);
 
104
  }
105
 
106
+ return [$url['path'], $params];
107
  }
108
  }
includes/lib/Stripe/lib/CountrySpec.php CHANGED
@@ -5,42 +5,22 @@ namespace Stripe;
5
  /**
6
  * Class CountrySpec
7
  *
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class CountrySpec extends ApiResource
11
  {
12
- /**
13
- * This is a special case because the country specs endpoint has an
14
- * underscore in it. The parent `className` function strips underscores.
15
- *
16
- * @return string The name of the class.
17
- */
18
- public static function className()
19
- {
20
- return 'country_spec';
21
- }
22
 
23
- /**
24
- * @param array|string $country The ISO country code of the country we
25
- * retrieve the country specfication for, or an options array
26
- * containing an `id` containing that code.
27
- * @param array|string|null $opts
28
- *
29
- * @return CountrySpec
30
- */
31
- public static function retrieve($country, $opts = null)
32
- {
33
- return self::_retrieve($country, $opts);
34
- }
35
 
36
- /**
37
- * @param array|null $params
38
- * @param array|string|null $opts
39
- *
40
- * @return Collection of CountrySpecs
41
- */
42
- public static function all($params = null, $opts = null)
43
- {
44
- return self::_all($params, $opts);
45
- }
46
  }
5
  /**
6
  * Class CountrySpec
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $default_currency
11
+ * @property mixed $supported_bank_account_currencies
12
+ * @property string[] $supported_payment_currencies
13
+ * @property string[] $supported_payment_methods
14
+ * @property string[] $supported_transfer_countries
15
+ * @property mixed $verification_fields
16
+ *
17
  * @package Stripe
18
  */
19
  class CountrySpec extends ApiResource
20
  {
 
 
 
 
 
 
 
 
 
 
21
 
22
+ const OBJECT_NAME = "country_spec";
 
 
 
 
 
 
 
 
 
 
 
23
 
24
+ use ApiOperations\All;
25
+ use ApiOperations\Retrieve;
 
 
 
 
 
 
 
 
26
  }
includes/lib/Stripe/lib/Coupon.php CHANGED
@@ -5,74 +5,32 @@ namespace Stripe;
5
  /**
6
  * Class Coupon
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class Coupon extends ApiResource
11
  {
12
- /**
13
- * @param array|string $id The ID of the coupon to retrieve, or an options
14
- * array containing an `id` key.
15
- * @param array|string|null $opts
16
- *
17
- * @return Coupon
18
- */
19
- public static function retrieve($id, $opts = null)
20
- {
21
- return self::_retrieve($id, $opts);
22
- }
23
-
24
- /**
25
- * @param array|null $params
26
- * @param array|string|null $opts
27
- *
28
- * @return Coupon The created coupon.
29
- */
30
- public static function create($params = null, $opts = null)
31
- {
32
- return self::_create($params, $opts);
33
- }
34
-
35
- /**
36
- * @param string $id The ID of the coupon to update.
37
- * @param array|null $params
38
- * @param array|string|null $options
39
- *
40
- * @return Coupon The updated coupon.
41
- */
42
- public static function update($id, $params = null, $options = null)
43
- {
44
- return self::_update($id, $params, $options);
45
- }
46
-
47
- /**
48
- * @param array|null $params
49
- * @param array|string|null $opts
50
- *
51
- * @return Coupon The deleted coupon.
52
- */
53
- public function delete($params = null, $opts = null)
54
- {
55
- return $this->_delete($params, $opts);
56
- }
57
 
58
- /**
59
- * @param array|string|null $opts
60
- *
61
- * @return Coupon The saved coupon.
62
- */
63
- public function save($opts = null)
64
- {
65
- return $this->_save($opts);
66
- }
67
 
68
- /**
69
- * @param array|null $params
70
- * @param array|string|null $opts
71
- *
72
- * @return Collection of Coupons
73
- */
74
- public static function all($params = null, $opts = null)
75
- {
76
- return self::_all($params, $opts);
77
- }
78
  }
5
  /**
6
  * Class Coupon
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount_off
11
+ * @property int $created
12
+ * @property string $currency
13
+ * @property string $duration
14
+ * @property int $duration_in_months
15
+ * @property bool $livemode
16
+ * @property int $max_redemptions
17
+ * @property StripeObject $metadata
18
+ * @property string $name
19
+ * @property float $percent_off
20
+ * @property int $redeem_by
21
+ * @property int $times_redeemed
22
+ * @property bool $valid
23
+ *
24
  * @package Stripe
25
  */
26
  class Coupon extends ApiResource
27
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
+ const OBJECT_NAME = "coupon";
 
 
 
 
 
 
 
 
30
 
31
+ use ApiOperations\All;
32
+ use ApiOperations\Create;
33
+ use ApiOperations\Delete;
34
+ use ApiOperations\Retrieve;
35
+ use ApiOperations\Update;
 
 
 
 
 
36
  }
includes/lib/Stripe/lib/CreditNote.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class CreditNote
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property string $customer_balance_transaction
12
+ * @property int $created
13
+ * @property string $currency
14
+ * @property string $customer
15
+ * @property string $invoice
16
+ * @property bool $livemode
17
+ * @property string $memo
18
+ * @property StripeObject $metadata
19
+ * @property string $number
20
+ * @property string $pdf
21
+ * @property string $reason
22
+ * @property string $refund
23
+ * @property string $status
24
+ * @property string $type
25
+ *
26
+ * @package Stripe
27
+ */
28
+ class CreditNote extends ApiResource
29
+ {
30
+
31
+ const OBJECT_NAME = "credit_note";
32
+
33
+ use ApiOperations\All;
34
+ use ApiOperations\Create;
35
+ use ApiOperations\Retrieve;
36
+ use ApiOperations\Update;
37
+
38
+ /**
39
+ * Possible string representations of the credit note reason.
40
+ * @link https://stripe.com/docs/api/credit_notes/object#credit_note_object-reason
41
+ */
42
+ const REASON_DUPLICATE = 'duplicate';
43
+ const REASON_FRAUDULENT = 'fraudulent';
44
+ const REASON_ORDER_CHANGE = 'order_change';
45
+ const REASON_PRODUCT_UNSATISFACTORY = 'product_unsatisfactory';
46
+
47
+ /**
48
+ * Possible string representations of the credit note status.
49
+ * @link https://stripe.com/docs/api/credit_notes/object#credit_note_object-status
50
+ */
51
+ const STATUS_ISSUED = 'issued';
52
+ const STATUS_VOID = 'void';
53
+
54
+ /**
55
+ * Possible string representations of the credit note type.
56
+ * @link https://stripe.com/docs/api/credit_notes/object#credit_note_object-status
57
+ */
58
+ const TYPE_POST_PAYMENT = 'post_payment';
59
+ const TYPE_PRE_PAYMENT = 'pre_payment';
60
+
61
+ /**
62
+ * @param array|null $params
63
+ * @param array|string|null $opts
64
+ *
65
+ * @return CreditNote The voided credit note.
66
+ */
67
+ public function voidCreditNote($params = null, $opts = null)
68
+ {
69
+ $url = $this->instanceUrl() . '/void';
70
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
71
+ $this->refreshFrom($response, $opts);
72
+ return $this;
73
+ }
74
+ }
includes/lib/Stripe/lib/Customer.php CHANGED
@@ -7,185 +7,314 @@ namespace Stripe;
7
  *
8
  * @property string $id
9
  * @property string $object
10
- * @property int $account_balance
11
- * @property string $business_vat_id
12
  * @property string $created
13
  * @property string $currency
14
  * @property string $default_source
15
  * @property bool $delinquent
16
  * @property string $description
17
- * @property mixed $discount
18
  * @property string $email
 
 
19
  * @property bool $livemode
20
- * @property array $metadata
 
 
 
21
  * @property mixed $shipping
22
  * @property Collection $sources
23
  * @property Collection $subscriptions
 
 
24
  *
25
  * @package Stripe
26
  */
27
  class Customer extends ApiResource
28
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  /**
30
- * @param array|string $id The ID of the customer to retrieve, or an
31
- * options array containing an `id` key.
32
  * @param array|string|null $opts
33
  *
34
- * @return Customer
35
  */
36
- public static function retrieve($id, $opts = null)
37
  {
38
- return self::_retrieve($id, $opts);
39
  }
40
 
41
  /**
 
 
42
  * @param array|null $params
43
  * @param array|string|null $opts
44
  *
45
- * @return Collection of Customers
46
  */
47
- public static function all($params = null, $opts = null)
48
  {
49
- return self::_all($params, $opts);
50
  }
51
 
52
  /**
 
 
53
  * @param array|null $params
54
  * @param array|string|null $opts
55
  *
56
- * @return Customer The created customer.
57
  */
58
- public static function create($params = null, $opts = null)
59
  {
60
- return self::_create($params, $opts);
61
  }
62
 
63
  /**
64
- * @param string $id The ID of the customer to update.
 
65
  * @param array|null $params
66
- * @param array|string|null $options
67
  *
68
- * @return Customer The updated customer.
69
  */
70
- public static function update($id, $params = null, $options = null)
71
  {
72
- return self::_update($id, $params, $options);
73
  }
74
 
75
  /**
 
 
76
  * @param array|string|null $opts
77
  *
78
- * @return Customer The saved customer.
79
  */
80
- public function save($opts = null)
81
  {
82
- return $this->_save($opts);
83
  }
84
 
85
  /**
 
86
  * @param array|null $params
87
  * @param array|string|null $opts
88
  *
89
- * @return Customer The deleted customer.
90
  */
91
- public function delete($params = null, $opts = null)
92
  {
93
- return $this->_delete($params, $opts);
94
  }
95
 
96
  /**
 
 
97
  * @param array|null $params
 
98
  *
99
- * @return InvoiceItem The resulting invoice item.
100
  */
101
- public function addInvoiceItem($params = null)
102
  {
103
- if (!$params) {
104
- $params = array();
105
- }
106
- $params['customer'] = $this->id;
107
- $ii = InvoiceItem::create($params, $this->_opts);
108
- return $ii;
109
  }
110
 
111
  /**
 
 
112
  * @param array|null $params
 
113
  *
114
- * @return array An array of the customer's Invoices.
115
  */
116
- public function invoices($params = null)
117
  {
118
- if (!$params) {
119
- $params = array();
120
- }
121
- $params['customer'] = $this->id;
122
- $invoices = Invoice::all($params, $this->_opts);
123
- return $invoices;
124
  }
125
 
126
  /**
 
127
  * @param array|null $params
 
128
  *
129
- * @return array An array of the customer's InvoiceItems.
130
  */
131
- public function invoiceItems($params = null)
132
  {
133
- if (!$params) {
134
- $params = array();
135
- }
136
- $params['customer'] = $this->id;
137
- $iis = InvoiceItem::all($params, $this->_opts);
138
- return $iis;
139
  }
140
 
141
  /**
 
142
  * @param array|null $params
 
143
  *
144
- * @return array An array of the customer's Charges.
145
  */
146
- public function charges($params = null)
147
  {
148
- if (!$params) {
149
- $params = array();
150
- }
151
- $params['customer'] = $this->id;
152
- $charges = Charge::all($params, $this->_opts);
153
- return $charges;
154
  }
155
 
156
  /**
 
 
157
  * @param array|null $params
 
158
  *
159
- * @return Subscription The updated subscription.
160
  */
161
- public function updateSubscription($params = null)
162
  {
163
- $url = $this->instanceUrl() . '/subscription';
164
- list($response, $opts) = $this->_request('post', $url, $params);
165
- $this->refreshFrom(array('subscription' => $response), $opts, true);
166
- return $this->subscription;
167
  }
168
 
169
  /**
 
 
170
  * @param array|null $params
 
171
  *
172
- * @return Subscription The cancelled subscription.
 
173
  */
174
- public function cancelSubscription($params = null)
175
  {
176
- $url = $this->instanceUrl() . '/subscription';
177
- list($response, $opts) = $this->_request('delete', $url, $params);
178
- $this->refreshFrom(array('subscription' => $response), $opts, true);
179
- return $this->subscription;
180
  }
181
 
182
  /**
183
- * @return Customer The updated customer.
 
 
 
 
184
  */
185
- public function deleteDiscount()
186
  {
187
- $url = $this->instanceUrl() . '/discount';
188
- list($response, $opts) = $this->_request('delete', $url);
189
- $this->refreshFrom(array('discount' => null), $opts, true);
190
  }
191
  }
7
  *
8
  * @property string $id
9
  * @property string $object
10
+ * @property mixed $address
11
+ * @property int $balance
12
  * @property string $created
13
  * @property string $currency
14
  * @property string $default_source
15
  * @property bool $delinquent
16
  * @property string $description
17
+ * @property Discount $discount
18
  * @property string $email
19
+ * @property string $invoice_prefix
20
+ * @property mixed $invoice_settings
21
  * @property bool $livemode
22
+ * @property StripeObject $metadata
23
+ * @property string $name
24
+ * @property string $phone
25
+ * @property string[] preferred_locales
26
  * @property mixed $shipping
27
  * @property Collection $sources
28
  * @property Collection $subscriptions
29
+ * @property string $tax_exempt
30
+ * @property Collection $tax_ids
31
  *
32
  * @package Stripe
33
  */
34
  class Customer extends ApiResource
35
  {
36
+
37
+ const OBJECT_NAME = "customer";
38
+
39
+ use ApiOperations\All;
40
+ use ApiOperations\Create;
41
+ use ApiOperations\Delete;
42
+ use ApiOperations\NestedResource;
43
+ use ApiOperations\Retrieve;
44
+ use ApiOperations\Update;
45
+
46
+ /**
47
+ * Possible string representations of the customer's type of tax exemption.
48
+ * @link https://stripe.com/docs/api/customers/object#customer_object-tax_exempt
49
+ */
50
+ const TAX_EXEMPT_NONE = 'none';
51
+ const TAX_EXEMPT_EXEMPT = 'exempt';
52
+ const TAX_EXEMPT_REVERSE = 'reverse';
53
+
54
+ public static function getSavedNestedResources()
55
+ {
56
+ static $savedNestedResources = null;
57
+ if ($savedNestedResources === null) {
58
+ $savedNestedResources = new Util\Set([
59
+ 'source',
60
+ ]);
61
+ }
62
+ return $savedNestedResources;
63
+ }
64
+
65
+ const PATH_BALANCE_TRANSACTIONS = '/balance_transactions';
66
+ const PATH_SOURCES = '/sources';
67
+ const PATH_TAX_IDS = '/tax_ids';
68
+
69
+ /**
70
+ * @param array|null $params
71
+ *
72
+ * @return InvoiceItem The resulting invoice item.
73
+ */
74
+ public function addInvoiceItem($params = null)
75
+ {
76
+ $params = $params ?: [];
77
+ $params['customer'] = $this->id;
78
+ $ii = InvoiceItem::create($params, $this->_opts);
79
+ return $ii;
80
+ }
81
+
82
+ /**
83
+ * @param array|null $params
84
+ *
85
+ * @return array An array of the customer's Invoices.
86
+ */
87
+ public function invoices($params = null)
88
+ {
89
+ $params = $params ?: [];
90
+ $params['customer'] = $this->id;
91
+ $invoices = Invoice::all($params, $this->_opts);
92
+ return $invoices;
93
+ }
94
+
95
+ /**
96
+ * @param array|null $params
97
+ *
98
+ * @return array An array of the customer's InvoiceItems.
99
+ */
100
+ public function invoiceItems($params = null)
101
+ {
102
+ $params = $params ?: [];
103
+ $params['customer'] = $this->id;
104
+ $iis = InvoiceItem::all($params, $this->_opts);
105
+ return $iis;
106
+ }
107
+
108
+ /**
109
+ * @param array|null $params
110
+ *
111
+ * @return array An array of the customer's Charges.
112
+ */
113
+ public function charges($params = null)
114
+ {
115
+ $params = $params ?: [];
116
+ $params['customer'] = $this->id;
117
+ $charges = Charge::all($params, $this->_opts);
118
+ return $charges;
119
+ }
120
+
121
+ /**
122
+ * @param array|null $params
123
+ *
124
+ * @return Subscription The updated subscription.
125
+ */
126
+ public function updateSubscription($params = null)
127
+ {
128
+ $url = $this->instanceUrl() . '/subscription';
129
+ list($response, $opts) = $this->_request('post', $url, $params);
130
+ $this->refreshFrom(['subscription' => $response], $opts, true);
131
+ return $this->subscription;
132
+ }
133
+
134
+ /**
135
+ * @param array|null $params
136
+ *
137
+ * @return Subscription The cancelled subscription.
138
+ */
139
+ public function cancelSubscription($params = null)
140
+ {
141
+ $url = $this->instanceUrl() . '/subscription';
142
+ list($response, $opts) = $this->_request('delete', $url, $params);
143
+ $this->refreshFrom(['subscription' => $response], $opts, true);
144
+ return $this->subscription;
145
+ }
146
+
147
+ /**
148
+ * @return Customer The updated customer.
149
+ */
150
+ public function deleteDiscount()
151
+ {
152
+ $url = $this->instanceUrl() . '/discount';
153
+ list($response, $opts) = $this->_request('delete', $url);
154
+ $this->refreshFrom(['discount' => null], $opts, true);
155
+ }
156
+
157
  /**
158
+ * @param string|null $id The ID of the customer on which to create the source.
159
+ * @param array|null $params
160
  * @param array|string|null $opts
161
  *
162
+ * @return ApiResource
163
  */
164
+ public static function createSource($id, $params = null, $opts = null)
165
  {
166
+ return self::_createNestedResource($id, static::PATH_SOURCES, $params, $opts);
167
  }
168
 
169
  /**
170
+ * @param string|null $id The ID of the customer to which the source belongs.
171
+ * @param string|null $sourceId The ID of the source to retrieve.
172
  * @param array|null $params
173
  * @param array|string|null $opts
174
  *
175
+ * @return ApiResource
176
  */
177
+ public static function retrieveSource($id, $sourceId, $params = null, $opts = null)
178
  {
179
+ return self::_retrieveNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts);
180
  }
181
 
182
  /**
183
+ * @param string|null $id The ID of the customer to which the source belongs.
184
+ * @param string|null $sourceId The ID of the source to update.
185
  * @param array|null $params
186
  * @param array|string|null $opts
187
  *
188
+ * @return ApiResource
189
  */
190
+ public static function updateSource($id, $sourceId, $params = null, $opts = null)
191
  {
192
+ return self::_updateNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts);
193
  }
194
 
195
  /**
196
+ * @param string|null $id The ID of the customer to which the source belongs.
197
+ * @param string|null $sourceId The ID of the source to delete.
198
  * @param array|null $params
199
+ * @param array|string|null $opts
200
  *
201
+ * @return ApiResource
202
  */
203
+ public static function deleteSource($id, $sourceId, $params = null, $opts = null)
204
  {
205
+ return self::_deleteNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts);
206
  }
207
 
208
  /**
209
+ * @param string|null $id The ID of the customer on which to retrieve the sources.
210
+ * @param array|null $params
211
  * @param array|string|null $opts
212
  *
213
+ * @return Collection The list of sources.
214
  */
215
+ public static function allSources($id, $params = null, $opts = null)
216
  {
217
+ return self::_allNestedResources($id, static::PATH_SOURCES, $params, $opts);
218
  }
219
 
220
  /**
221
+ * @param string|null $id The ID of the customer on which to create the tax id.
222
  * @param array|null $params
223
  * @param array|string|null $opts
224
  *
225
+ * @return ApiResource
226
  */
227
+ public static function createTaxId($id, $params = null, $opts = null)
228
  {
229
+ return self::_createNestedResource($id, static::PATH_TAX_IDS, $params, $opts);
230
  }
231
 
232
  /**
233
+ * @param string|null $id The ID of the customer to which the tax id belongs.
234
+ * @param string|null $taxIdId The ID of the tax id to retrieve.
235
  * @param array|null $params
236
+ * @param array|string|null $opts
237
  *
238
+ * @return ApiResource
239
  */
240
+ public static function retrieveTaxId($id, $taxIdId, $params = null, $opts = null)
241
  {
242
+ return self::_retrieveNestedResource($id, static::PATH_TAX_IDS, $taxIdId, $params, $opts);
 
 
 
 
 
243
  }
244
 
245
  /**
246
+ * @param string|null $id The ID of the customer to which the tax id belongs.
247
+ * @param string|null $taxIdId The ID of the tax id to delete.
248
  * @param array|null $params
249
+ * @param array|string|null $opts
250
  *
251
+ * @return ApiResource
252
  */
253
+ public static function deleteTaxId($id, $taxIdId, $params = null, $opts = null)
254
  {
255
+ return self::_deleteNestedResource($id, static::PATH_TAX_IDS, $taxIdId, $params, $opts);
 
 
 
 
 
256
  }
257
 
258
  /**
259
+ * @param string|null $id The ID of the customer on which to retrieve the tax ids.
260
  * @param array|null $params
261
+ * @param array|string|null $opts
262
  *
263
+ * @return Collection The list of tax ids.
264
  */
265
+ public static function allTaxIds($id, $params = null, $opts = null)
266
  {
267
+ return self::_allNestedResources($id, static::PATH_TAX_IDS, $params, $opts);
 
 
 
 
 
268
  }
269
 
270
  /**
271
+ * @param string|null $id The ID of the customer on which to create the balance transaction.
272
  * @param array|null $params
273
+ * @param array|string|null $opts
274
  *
275
+ * @return ApiResource
276
  */
277
+ public static function createBalanceTransaction($id, $params = null, $opts = null)
278
  {
279
+ return self::_createNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $params, $opts);
 
 
 
 
 
280
  }
281
 
282
  /**
283
+ * @param string|null $id The ID of the customer to which the balance transaction belongs.
284
+ * @param string|null $balanceTransactionId The ID of the balance transaction to retrieve.
285
  * @param array|null $params
286
+ * @param array|string|null $opts
287
  *
288
+ * @return ApiResource
289
  */
290
+ public static function retrieveBalanceTransaction($id, $balanceTransactionId, $params = null, $opts = null)
291
  {
292
+ return self::_retrieveNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $balanceTransactionId, $params, $opts);
 
 
 
293
  }
294
 
295
  /**
296
+ * @param string|null $id The ID of the customer on which to update the balance transaction.
297
+ * @param string|null $balanceTransactionId The ID of the balance transaction to update.
298
  * @param array|null $params
299
+ * @param array|string|null $opts
300
  *
301
+ *
302
+ * @return ApiResource
303
  */
304
+ public static function updateBalanceTransaction($id, $balanceTransactionId, $params = null, $opts = null)
305
  {
306
+ return self::_updateNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $balanceTransactionId, $params, $opts);
 
 
 
307
  }
308
 
309
  /**
310
+ * @param string|null $id The ID of the customer on which to retrieve the customer balance transactions.
311
+ * @param array|null $params
312
+ * @param array|string|null $opts
313
+ *
314
+ * @return Collection The list of customer balance transactions.
315
  */
316
+ public static function allBalanceTransactions($id, $params = null, $opts = null)
317
  {
318
+ return self::_allNestedResources($id, static::PATH_BALANCE_TRANSACTIONS, $params, $opts);
 
 
319
  }
320
  }
includes/lib/Stripe/lib/CustomerBalanceTransaction.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class CustomerBalanceTransaction
7
+ *
8
+ * @package Stripe
9
+ *
10
+ * @property string $id
11
+ * @property string $object
12
+ * @property int $amount
13
+ * @property string $credit_note
14
+ * @property int $created
15
+ * @property string $currency
16
+ * @property string $customer
17
+ * @property string $description
18
+ * @property int $ending_balance
19
+ * @property string $invoice
20
+ * @property bool $livemode
21
+ * @property StripeObject $metadata
22
+ * @property string $type
23
+ */
24
+ class CustomerBalanceTransaction extends ApiResource
25
+ {
26
+ const OBJECT_NAME = "customer_balance_transaction";
27
+
28
+ /**
29
+ * Possible string representations of a balance transaction's type.
30
+ * @link https://stripe.com/docs/api/customers/customer_balance_transaction_object#customer_balance_transaction_object-type
31
+ */
32
+ const TYPE_ADJUSTEMENT = 'adjustment';
33
+ const TYPE_APPLIED_TO_INVOICE = 'applied_to_invoice';
34
+ const TYPE_CREDIT_NOTE = 'credit_note';
35
+ const TYPE_INITIAL = 'initial';
36
+ const TYPE_INVOICE_TOO_LARGE = 'invoice_too_large';
37
+ const TYPE_INVOICE_TOO_SMALL = 'invoice_too_small';
38
+ const TYPE_UNSPENT_RECEIVER_CREDIT = 'unspent_receiver_credit';
39
+
40
+ /**
41
+ * @return string The API URL for this balance transaction.
42
+ */
43
+ public function instanceUrl()
44
+ {
45
+ $id = $this['id'];
46
+ $customer = $this['customer'];
47
+ if (!$id) {
48
+ throw new Error\InvalidRequest(
49
+ "Could not determine which URL to request: class instance has invalid ID: $id",
50
+ null
51
+ );
52
+ }
53
+ $id = Util\Util::utf8($id);
54
+ $customer = Util\Util::utf8($customer);
55
+
56
+ $base = Customer::classUrl();
57
+ $customerExtn = urlencode($customer);
58
+ $extn = urlencode($id);
59
+ return "$base/$customerExtn/balance_transactions/$extn";
60
+ }
61
+
62
+ /**
63
+ * @param array|string $_id
64
+ * @param array|string|null $_opts
65
+ *
66
+ * @throws \Stripe\Error\InvalidRequest
67
+ */
68
+ public static function retrieve($_id, $_opts = null)
69
+ {
70
+ $msg = "Customer Balance Transactions cannot be accessed without a customer ID. " .
71
+ "Retrieve a balance transaction using Customer::retrieveBalanceTransaction('cus_123', 'cbtxn_123') instead.";
72
+ throw new Error\InvalidRequest($msg, null);
73
+ }
74
+
75
+ /**
76
+ * @param string $_id
77
+ * @param array|null $_params
78
+ * @param array|string|null $_options
79
+ *
80
+ * @throws \Stripe\Error\InvalidRequest
81
+ */
82
+ public static function update($_id, $_params = null, $_options = null)
83
+ {
84
+ $msg = "Customer Balance Transactions cannot be accessed without a customer ID. " .
85
+ "Update a balance transaction using Customer::updateBalanceTransaction('cus_123', 'cbtxn_123', \$params) instead.";
86
+ throw new Error\InvalidRequest($msg, null);
87
+ }
88
+ }
includes/lib/Stripe/lib/Discount.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Discount
7
+ *
8
+ * @property string $object
9
+ * @property Coupon $coupon
10
+ * @property string $customer
11
+ * @property int $end
12
+ * @property int $start
13
+ * @property string $subscription
14
+ *
15
+ * @package Stripe
16
+ */
17
+ class Discount extends StripeObject
18
+ {
19
+
20
+ const OBJECT_NAME = "discount";
21
+ }
includes/lib/Stripe/lib/Dispute.php CHANGED
@@ -8,7 +8,7 @@ namespace Stripe;
8
  * @property string $id
9
  * @property string $object
10
  * @property int $amount
11
- * @property mixed $balance_transactions
12
  * @property string $charge
13
  * @property int $created
14
  * @property string $currency
@@ -16,7 +16,7 @@ namespace Stripe;
16
  * @property mixed $evidence_details
17
  * @property bool $is_charge_refundable
18
  * @property bool $livemode
19
- * @property mixed $metadata
20
  * @property string $reason
21
  * @property string $status
22
  *
@@ -24,50 +24,44 @@ namespace Stripe;
24
  */
25
  class Dispute extends ApiResource
26
  {
27
- /**
28
- * @param array|string $id The ID of the dispute to retrieve, or an options
29
- * array containing an `id` key.
30
- * @param array|string|null $options
31
- *
32
- * @return Dispute
33
- */
34
- public static function retrieve($id, $options = null)
35
- {
36
- return self::_retrieve($id, $options);
37
- }
38
 
39
- /**
40
- * @param array|null $params
41
- * @param array|string|null $options
42
- *
43
- * @return array An array of Disputes.
44
- */
45
- public static function all($params = null, $options = null)
46
- {
47
- return self::_all($params, $options);
48
- }
49
 
50
  /**
51
- * @param string $id The ID of the dispute to update.
52
- * @param array|null $params
53
- * @param array|string|null $options
54
- *
55
- * @return Dispute The updated dispute.
56
  */
57
- public static function update($id, $params = null, $options = null)
58
- {
59
- return self::_update($id, $params, $options);
60
- }
 
 
 
 
 
 
 
 
 
 
61
 
62
  /**
63
- * @param array|string|null $options
64
- *
65
- * @return Dispute The saved charge.
66
  */
67
- public function save($options = null)
68
- {
69
- return $this->_save($options);
70
- }
 
 
 
 
71
 
72
  /**
73
  * @param array|string|null $options
8
  * @property string $id
9
  * @property string $object
10
  * @property int $amount
11
+ * @property BalanceTransaction[] $balance_transactions
12
  * @property string $charge
13
  * @property int $created
14
  * @property string $currency
16
  * @property mixed $evidence_details
17
  * @property bool $is_charge_refundable
18
  * @property bool $livemode
19
+ * @property StripeObject $metadata
20
  * @property string $reason
21
  * @property string $status
22
  *
24
  */
25
  class Dispute extends ApiResource
26
  {
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ const OBJECT_NAME = "dispute";
29
+
30
+ use ApiOperations\All;
31
+ use ApiOperations\Retrieve;
32
+ use ApiOperations\Update;
 
 
 
 
 
33
 
34
  /**
35
+ * Possible string representations of dispute reasons.
36
+ * @link https://stripe.com/docs/api#dispute_object
 
 
 
37
  */
38
+ const REASON_BANK_CANNOT_PROCESS = 'bank_cannot_process';
39
+ const REASON_CHECK_RETURNED = 'check_returned';
40
+ const REASON_CREDIT_NOT_PROCESSED = 'credit_not_processed';
41
+ const REASON_CUSTOMER_INITIATED = 'customer_initiated';
42
+ const REASON_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized';
43
+ const REASON_DUPLICATE = 'duplicate';
44
+ const REASON_FRAUDULENT = 'fraudulent';
45
+ const REASON_GENERAL = 'general';
46
+ const REASON_INCORRECT_ACCOUNT_DETAILS = 'incorrect_account_details';
47
+ const REASON_INSUFFICIENT_FUNDS = 'insufficient_funds';
48
+ const REASON_PRODUCT_NOT_RECEIVED = 'product_not_received';
49
+ const REASON_PRODUCT_UNACCEPTABLE = 'product_unacceptable';
50
+ const REASON_SUBSCRIPTION_CANCELED = 'subscription_canceled';
51
+ const REASON_UNRECOGNIZED = 'unrecognized';
52
 
53
  /**
54
+ * Possible string representations of dispute statuses.
55
+ * @link https://stripe.com/docs/api#dispute_object
 
56
  */
57
+ const STATUS_CHARGE_REFUNDED = 'charge_refunded';
58
+ const STATUS_LOST = 'lost';
59
+ const STATUS_NEEDS_RESPONSE = 'needs_response';
60
+ const STATUS_UNDER_REVIEW = 'under_review';
61
+ const STATUS_WARNING_CLOSED = 'warning_closed';
62
+ const STATUS_WARNING_NEEDS_RESPONSE = 'warning_needs_response';
63
+ const STATUS_WARNING_UNDER_REVIEW = 'warning_under_review';
64
+ const STATUS_WON = 'won';
65
 
66
  /**
67
  * @param array|string|null $options
includes/lib/Stripe/lib/EphemeralKey.php CHANGED
@@ -17,16 +17,13 @@ namespace Stripe;
17
  */
18
  class EphemeralKey extends ApiResource
19
  {
20
- /**
21
- * This is a special case because the ephemeral key endpoint has an
22
- * underscore in it. The parent `className` function strips underscores.
23
- *
24
- * @return string The name of the class.
25
- */
26
- public static function className()
27
- {
28
- return 'ephemeral_key';
29
  }
 
30
 
31
  /**
32
  * @param array|null $params
@@ -41,15 +38,4 @@ class EphemeralKey extends ApiResource
41
  }
42
  return self::_create($params, $opts);
43
  }
44
-
45
- /**
46
- * @param array|null $params
47
- * @param array|string|null $opts
48
- *
49
- * @return EphemeralKey The deleted key.
50
- */
51
- public function delete($params = null, $opts = null)
52
- {
53
- return $this->_delete($params, $opts);
54
- }
55
  }
17
  */
18
  class EphemeralKey extends ApiResource
19
  {
20
+
21
+ const OBJECT_NAME = "ephemeral_key";
22
+
23
+ use ApiOperations\Create {
24
+ create as protected _create;
 
 
 
 
25
  }
26
+ use ApiOperations\Delete;
27
 
28
  /**
29
  * @param array|null $params
38
  }
39
  return self::_create($params, $opts);
40
  }
 
 
 
 
 
 
 
 
 
 
 
41
  }
includes/lib/Stripe/lib/Error/Base.php CHANGED
@@ -20,11 +20,20 @@ abstract class Base extends Exception
20
  $this->httpHeaders = $httpHeaders;
21
  $this->requestId = null;
22
 
 
 
 
 
23
  if ($httpHeaders && isset($httpHeaders['Request-Id'])) {
24
  $this->requestId = $httpHeaders['Request-Id'];
25
  }
26
  }
27
 
 
 
 
 
 
28
  public function getHttpStatus()
29
  {
30
  return $this->httpStatus;
20
  $this->httpHeaders = $httpHeaders;
21
  $this->requestId = null;
22
 
23
+ // TODO: make this a proper constructor argument in the next major
24
+ // release.
25
+ $this->stripeCode = isset($jsonBody["error"]["code"]) ? $jsonBody["error"]["code"] : null;
26
+
27
  if ($httpHeaders && isset($httpHeaders['Request-Id'])) {
28
  $this->requestId = $httpHeaders['Request-Id'];
29
  }
30
  }
31
 
32
+ public function getStripeCode()
33
+ {
34
+ return $this->stripeCode;
35
+ }
36
+
37
  public function getHttpStatus()
38
  {
39
  return $this->httpStatus;
includes/lib/Stripe/lib/Error/Card.php CHANGED
@@ -15,12 +15,16 @@ class Card extends Base
15
  ) {
16
  parent::__construct($message, $httpStatus, $httpBody, $jsonBody, $httpHeaders);
17
  $this->stripeParam = $stripeParam;
 
 
 
18
  $this->stripeCode = $stripeCode;
19
 
20
  // This one is not like the others because it was added later and we're
21
  // trying to do our best not to change the public interface of this class'
22
- // constructor. We should consider changing its implementation on the
23
- // next major version bump of this library.
 
24
  $this->declineCode = isset($jsonBody["error"]["decline_code"]) ? $jsonBody["error"]["decline_code"] : null;
25
  }
26
 
@@ -29,11 +33,6 @@ class Card extends Base
29
  return $this->declineCode;
30
  }
31
 
32
- public function getStripeCode()
33
- {
34
- return $this->stripeCode;
35
- }
36
-
37
  public function getStripeParam()
38
  {
39
  return $this->stripeParam;
15
  ) {
16
  parent::__construct($message, $httpStatus, $httpBody, $jsonBody, $httpHeaders);
17
  $this->stripeParam = $stripeParam;
18
+
19
+ // TODO: once Error\Base accepts the error code as an argument, pass it
20
+ // in the call to parent::__construct() and stop setting it here.
21
  $this->stripeCode = $stripeCode;
22
 
23
  // This one is not like the others because it was added later and we're
24
  // trying to do our best not to change the public interface of this class'
25
+ // constructor.
26
+ // TODO: make this a proper constructor argument in the next major
27
+ // release.
28
  $this->declineCode = isset($jsonBody["error"]["decline_code"]) ? $jsonBody["error"]["decline_code"] : null;
29
  }
30
 
33
  return $this->declineCode;
34
  }
35
 
 
 
 
 
 
36
  public function getStripeParam()
37
  {
38
  return $this->stripeParam;
includes/lib/Stripe/lib/Error/Idempotency.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ class Idempotency extends Base
6
+ {
7
+ }
includes/lib/Stripe/lib/Error/OAuth/OAuthBase.php CHANGED
@@ -13,11 +13,11 @@ class OAuthBase extends \Stripe\Error\Base
13
  $httpHeaders = null
14
  ) {
15
  parent::__construct($description, $httpStatus, $httpBody, $jsonBody, $httpHeaders);
16
- $this->code = $code;
17
  }
18
 
19
  public function getErrorCode()
20
  {
21
- return $this->code;
22
  }
23
  }
13
  $httpHeaders = null
14
  ) {
15
  parent::__construct($description, $httpStatus, $httpBody, $jsonBody, $httpHeaders);
16
+ $this->errorCode = $code;
17
  }
18
 
19
  public function getErrorCode()
20
  {
21
+ return $this->errorCode;
22
  }
23
  }
includes/lib/Stripe/lib/Event.php CHANGED
@@ -7,38 +7,162 @@ namespace Stripe;
7
  *
8
  * @property string $id
9
  * @property string $object
 
10
  * @property string $api_version
11
- * @property int $created
12
- * @property mixed $data
13
- * @property bool $livemode
14
- * @property int $pending_webhooks
15
- * @property string $request
16
  * @property string $type
17
  *
18
  * @package Stripe
19
  */
20
  class Event extends ApiResource
21
  {
22
- /**
23
- * @param array|string $id The ID of the event to retrieve, or an options
24
- * array containing an `id` key.
25
- * @param array|string|null $opts
26
- *
27
- * @return Event
28
- */
29
- public static function retrieve($id, $opts = null)
30
- {
31
- return self::_retrieve($id, $opts);
32
- }
33
 
34
  /**
35
- * @param array|null $params
36
- * @param array|string|null $opts
37
- *
38
- * @return Collection of Events
39
  */
40
- public static function all($params = null, $opts = null)
41
- {
42
- return self::_all($params, $opts);
43
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  }
7
  *
8
  * @property string $id
9
  * @property string $object
10
+ * @property string $account
11
  * @property string $api_version
12
+ * @property int $created
13
+ * @property mixed $data
14
+ * @property bool $livemode
15
+ * @property int $pending_webhooks
16
+ * @property mixed $request
17
  * @property string $type
18
  *
19
  * @package Stripe
20
  */
21
  class Event extends ApiResource
22
  {
23
+
24
+ const OBJECT_NAME = "event";
 
 
 
 
 
 
 
 
 
25
 
26
  /**
27
+ * Possible string representations of event types.
28
+ * @link https://stripe.com/docs/api#event_types
 
 
29
  */
30
+ const ACCOUNT_UPDATED = 'account.updated';
31
+ const ACCOUNT_APPLICATION_AUTHORIZED = 'account.application.authorized';
32
+ const ACCOUNT_APPLICATION_DEAUTHORIZED = 'account.application.deauthorized';
33
+ const ACCOUNT_EXTERNAL_ACCOUNT_CREATED = 'account.external_account.created';
34
+ const ACCOUNT_EXTERNAL_ACCOUNT_DELETED = 'account.external_account.deleted';
35
+ const ACCOUNT_EXTERNAL_ACCOUNT_UPDATED = 'account.external_account.updated';
36
+ const APPLICATION_FEE_CREATED = 'application_fee.created';
37
+ const APPLICATION_FEE_REFUNDED = 'application_fee.refunded';
38
+ const APPLICATION_FEE_REFUND_UPDATED = 'application_fee.refund.updated';
39
+ const BALANCE_AVAILABLE = 'balance.available';
40
+ const CHARGE_CAPTURED = 'charge.captured';
41
+ const CHARGE_EXPIRED = 'charge.expired';
42
+ const CHARGE_FAILED = 'charge.failed';
43
+ const CHARGE_PENDING = 'charge.pending';
44
+ const CHARGE_REFUNDED = 'charge.refunded';
45
+ const CHARGE_SUCCEEDED = 'charge.succeeded';
46
+ const CHARGE_UPDATED = 'charge.updated';
47
+ const CHARGE_DISPUTE_CLOSED = 'charge.dispute.closed';
48
+ const CHARGE_DISPUTE_CREATED = 'charge.dispute.created';
49
+ const CHARGE_DISPUTE_FUNDS_REINSTATED = 'charge.dispute.funds_reinstated';
50
+ const CHARGE_DISPUTE_FUNDS_WITHDRAWN = 'charge.dispute.funds_withdrawn';
51
+ const CHARGE_DISPUTE_UPDATED = 'charge.dispute.updated';
52
+ const CHARGE_REFUND_UPDATED = 'charge.refund.updated';
53
+ const CHECKOUT_SESSION_COMPLETED = 'checkout.session.completed';
54
+ const COUPON_CREATED = 'coupon.created';
55
+ const COUPON_DELETED = 'coupon.deleted';
56
+ const COUPON_UPDATED = 'coupon.updated';
57
+ const CREDIT_NOTE_CREATED = 'credit_note.created';
58
+ const CREDIT_NOTE_UPDATED = 'credit_note.updated';
59
+ const CREDIT_NOTE_VOIDED = 'credit_note.voided';
60
+ const CUSTOMER_CREATED = 'customer.created';
61
+ const CUSTOMER_DELETED = 'customer.deleted';
62
+ const CUSTOMER_UPDATED = 'customer.updated';
63
+ const CUSTOMER_DISCOUNT_CREATED = 'customer.discount.created';
64
+ const CUSTOMER_DISCOUNT_DELETED = 'customer.discount.deleted';
65
+ const CUSTOMER_DISCOUNT_UPDATED = 'customer.discount.updated';
66
+ const CUSTOMER_SOURCE_CREATED = 'customer.source.created';
67
+ const CUSTOMER_SOURCE_DELETED = 'customer.source.deleted';
68
+ const CUSTOMER_SOURCE_EXPIRING = 'customer.source.expiring';
69
+ const CUSTOMER_SOURCE_UPDATED = 'customer.source.updated';
70
+ const CUSTOMER_SUBSCRIPTION_CREATED = 'customer.subscription.created';
71
+ const CUSTOMER_SUBSCRIPTION_DELETED = 'customer.subscription.deleted';
72
+ const CUSTOMER_SUBSCRIPTION_TRIAL_WILL_END = 'customer.subscription.trial_will_end';
73
+ const CUSTOMER_SUBSCRIPTION_UPDATED = 'customer.subscription.updated';
74
+ const FILE_CREATED = 'file.created';
75
+ const INVOICE_CREATED = 'invoice.created';
76
+ const INVOICE_DELETED = 'invoice.deleted';
77
+ const INVOICE_FINALIZED = 'invoice.finalized';
78
+ const INVOICE_MARKED_UNCOLLECTIBLE = 'invoice.marked_uncollectible';
79
+ const INVOICE_PAYMENT_ACTION_REQUIRED = 'invoice.payment_action_required';
80
+ const INVOICE_PAYMENT_FAILED = 'invoice.payment_failed';
81
+ const INVOICE_PAYMENT_SUCCEEDED = 'invoice.payment_succeeded';
82
+ const INVOICE_SENT = 'invoice.sent';
83
+ const INVOICE_UPCOMING = 'invoice.upcoming';
84
+ const INVOICE_UPDATED = 'invoice.updated';
85
+ const INVOICE_VOIDED = 'invoice.voided';
86
+ const INVOICEITEM_CREATED = 'invoiceitem.created';
87
+ const INVOICEITEM_DELETED = 'invoiceitem.deleted';
88
+ const INVOICEITEM_UPDATED = 'invoiceitem.updated';
89
+ const ISSUER_FRAUD_RECORD_CREATED = 'issuer_fraud_record.created';
90
+ const ISSUING_AUTHORIZATION_CREATED = 'issuing_authorization.created';
91
+ const ISSUING_AUTHORIZATION_REQUEST = 'issuing_authorization.request';
92
+ const ISSUING_AUTHORIZATION_UPDATED = 'issuing_authorization.updated';
93
+ const ISSUING_CARD_CREATED = 'issuing_card.created';
94
+ const ISSUING_CARD_UPDATED = 'issuing_card.updated';
95
+ const ISSUING_CARDHOLDER_CREATED = 'issuing_cardholder.created';
96
+ const ISSUING_CARDHOLDER_UPDATED = 'issuing_cardholder.updated';
97
+ const ISSUING_DISPUTE_CREATED = 'issuing_dispute.created';
98
+ const ISSUING_DISPUTE_UPDATED = 'issuing_dispute.updated';
99
+ const ISSUING_TRANSACTION_CREATED = 'issuing_transaction.created';
100
+ const ISSUING_TRANSACTION_UPDATED = 'issuing_transaction.updated';
101
+ const ORDER_CREATED = 'order.created';
102
+ const ORDER_PAYMENT_FAILED = 'order.payment_failed';
103
+ const ORDER_PAYMENT_SUCCEEDED = 'order.payment_succeeded';
104
+ const ORDER_UPDATED = 'order.updated';
105
+ const ORDER_RETURN_CREATED = 'order_return.created';
106
+ const PAYMENT_INTENT_AMOUNT_CAPTURABLE_UPDATED = 'payment_intent.amount_capturable_updated';
107
+ const PAYMENT_INTENT_CREATED = 'payment_intent.created';
108
+ const PAYMENT_INTENT_PAYMENT_FAILED = 'payment_intent.payment_failed';
109
+ const PAYMENT_INTENT_SUCCEEDED = 'payment_intent.succeeded';
110
+ const PAYMENT_METHOD_ATTACHED = 'payment_method.attached';
111
+ const PAYMENT_METHOD_CARD_AUTOMATICALLY_UPDATED = 'payment_method.card_automatically_updated';
112
+ const PAYMENT_METHOD_DETACHED = 'payment_method.detached';
113
+ const PAYMENT_METHOD_UPDATED = 'payment_method.updated';
114
+ const PAYOUT_CANCELED = 'payout.canceled';
115
+ const PAYOUT_CREATED = 'payout.created';
116
+ const PAYOUT_FAILED = 'payout.failed';
117
+ const PAYOUT_PAID = 'payout.paid';
118
+ const PAYOUT_UPDATED = 'payout.updated';
119
+ const PERSON_CREATED = 'person.created';
120
+ const PERSON_DELETED = 'person.deleted';
121
+ const PERSON_UPDATED = 'person.updated';
122
+ const PING = 'ping';
123
+ const PLAN_CREATED = 'plan.created';
124
+ const PLAN_DELETED = 'plan.deleted';
125
+ const PLAN_UPDATED = 'plan.updated';
126
+ const PRODUCT_CREATED = 'product.created';
127
+ const PRODUCT_DELETED = 'product.deleted';
128
+ const PRODUCT_UPDATED = 'product.updated';
129
+ const RECIPIENT_CREATED = 'recipient.created';
130
+ const RECIPIENT_DELETED = 'recipient.deleted';
131
+ const RECIPIENT_UPDATED = 'recipient.updated';
132
+ const REPORTING_REPORT_RUN_FAILED = 'reporting.report_run.failed';
133
+ const REPORTING_REPORT_RUN_SUCCEEDED = 'reporting.report_run.succeeded';
134
+ const REPORTING_REPORT_TYPE_UPDATED = 'reporting.report_type.updated';
135
+ const REVIEW_CLOSED = 'review.closed';
136
+ const REVIEW_OPENED = 'review.opened';
137
+ const SIGMA_SCHEDULED_QUERY_RUN_CREATED = 'sigma.scheduled_query_run.created';
138
+ const SKU_CREATED = 'sku.created';
139
+ const SKU_DELETED = 'sku.deleted';
140
+ const SKU_UPDATED = 'sku.updated';
141
+ const SOURCE_CANCELED = 'source.canceled';
142
+ const SOURCE_CHARGEABLE = 'source.chargeable';
143
+ const SOURCE_FAILED = 'source.failed';
144
+ const SOURCE_MANDATE_NOTIFICATION = 'source.mandate_notification';
145
+ const SOURCE_REFUND_ATTRIBUTES_REQUIRED = 'source.refund_attributes_required';
146
+ const SOURCE_TRANSACTION_CREATED = 'source.transaction.created';
147
+ const SOURCE_TRANSACTION_UPDATED = 'source.transaction.updated';
148
+ const SUBSCRIPTION_SCHEDULE_ABORTED = 'subscription_schedule.aborted';
149
+ const SUBSCRIPTION_SCHEDULE_CANCELED = 'subscription_schedule.canceled';
150
+ const SUBSCRIPTION_SCHEDULE_COMPLETED = 'subscription_schedule.completed';
151
+ const SUBSCRIPTION_SCHEDULE_CREATED = 'subscription_schedule.created';
152
+ const SUBSCRIPTION_SCHEDULE_EXPIRING = 'subscription_schedule.expiring';
153
+ const SUBSCRIPTION_SCHEDULE_RELEASED = 'subscription_schedule.released';
154
+ const SUBSCRIPTION_SCHEDULE_UPDATED = 'subscription_schedule.updated';
155
+ const TAX_RATE_CREATED = 'tax_rate.created';
156
+ const TAX_RATE_UPDATED = 'tax_rate.updated';
157
+ const TOPUP_CANCELED = 'topup.canceled';
158
+ const TOPUP_CREATED = 'topup.created';
159
+ const TOPUP_FAILED = 'topup.failed';
160
+ const TOPUP_REVERSED = 'topup.reversed';
161
+ const TOPUP_SUCCEEDED = 'topup.succeeded';
162
+ const TRANSFER_CREATED = 'transfer.created';
163
+ const TRANSFER_REVERSED = 'transfer.reversed';
164
+ const TRANSFER_UPDATED = 'transfer.updated';
165
+
166
+ use ApiOperations\All;
167
+ use ApiOperations\Retrieve;
168
  }
includes/lib/Stripe/lib/ExchangeRate.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class ExchangeRate
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class ExchangeRate extends ApiResource
11
+ {
12
+
13
+ const OBJECT_NAME = "exchange_rate";
14
+
15
+ use ApiOperations\All;
16
+ use ApiOperations\Retrieve;
17
+ }
includes/lib/Stripe/lib/File.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class File
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $created
11
+ * @property string $filename
12
+ * @property Collection $links
13
+ * @property string $purpose
14
+ * @property int $size
15
+ * @property string $title
16
+ * @property string $type
17
+ * @property string $url
18
+ *
19
+ * @package Stripe
20
+ */
21
+ class File extends ApiResource
22
+ {
23
+ // This resource can have two different object names. In latter API
24
+ // versions, only `file` is used, but since stripe-php may be used with
25
+ // any API version, we need to support deserializing the older
26
+ // `file_upload` object into the same class.
27
+ const OBJECT_NAME = "file";
28
+ const OBJECT_NAME_ALT = "file_upload";
29
+
30
+ use ApiOperations\All;
31
+ use ApiOperations\Create {
32
+ create as protected _create;
33
+ }
34
+ use ApiOperations\Retrieve;
35
+
36
+ public static function classUrl()
37
+ {
38
+ return '/v1/files';
39
+ }
40
+
41
+ /**
42
+ * @param array|null $params
43
+ * @param array|string|null $options
44
+ *
45
+ * @return \Stripe\File The created resource.
46
+ */
47
+ public static function create($params = null, $options = null)
48
+ {
49
+ $opts = \Stripe\Util\RequestOptions::parse($options);
50
+ if (is_null($opts->apiBase)) {
51
+ $opts->apiBase = Stripe::$apiUploadBase;
52
+ }
53
+ // Manually flatten params, otherwise curl's multipart encoder will
54
+ // choke on nested arrays.
55
+ // TODO: use array_column() once we drop support for PHP 5.4
56
+ $flatParams = [];
57
+ foreach (\Stripe\Util\Util::flattenParams($params) as $pair) {
58
+ $flatParams[$pair[0]] = $pair[1];
59
+ }
60
+ return static::_create($flatParams, $opts);
61
+ }
62
+ }
includes/lib/Stripe/lib/FileLink.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class FileLink
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $created
11
+ * @property bool $expired
12
+ * @property int $expires_at
13
+ * @property string $file
14
+ * @property bool $livemode
15
+ * @property StripeObject $metadata
16
+ * @property string $url
17
+ *
18
+ * @package Stripe
19
+ */
20
+ class FileLink extends ApiResource
21
+ {
22
+
23
+ const OBJECT_NAME = "file_link";
24
+
25
+ use ApiOperations\All;
26
+ use ApiOperations\Create;
27
+ use ApiOperations\Retrieve;
28
+ use ApiOperations\Update;
29
+ }
includes/lib/Stripe/lib/FileUpload.php CHANGED
@@ -2,61 +2,5 @@
2
 
3
  namespace Stripe;
4
 
5
- /**
6
- * Class FileUpload
7
- *
8
- * @property string $id
9
- * @property string $object
10
- * @property int $created
11
- * @property string $purpose
12
- * @property int $size
13
- * @property string $type
14
- *
15
- * @package Stripe
16
- */
17
- class FileUpload extends ApiResource
18
- {
19
- public static function baseUrl()
20
- {
21
- return Stripe::$apiUploadBase;
22
- }
23
-
24
- public static function className()
25
- {
26
- return 'file';
27
- }
28
-
29
- /**
30
- * @param array|string $id The ID of the file upload to retrieve, or an
31
- * options array containing an `id key.
32
- * @param array|string|null $opts
33
- *
34
- * @return FileUpload
35
- */
36
- public static function retrieve($id, $opts = null)
37
- {
38
- return self::_retrieve($id, $opts);
39
- }
40
-
41
- /**
42
- * @param array|null $params
43
- * @param array|string|null $opts
44
- *
45
- * @return FileUpload The created file upload.
46
- */
47
- public static function create($params = null, $opts = null)
48
- {
49
- return self::_create($params, $opts);
50
- }
51
-
52
- /**
53
- * @param array|null $params
54
- * @param array|string|null $opts
55
- *
56
- * @return Collection of FileUploads
57
- */
58
- public static function all($params = null, $opts = null)
59
- {
60
- return self::_all($params, $opts);
61
- }
62
- }
2
 
3
  namespace Stripe;
4
 
5
+ // For backwards compatibility, the `File` class is aliased to `FileUpload`.
6
+ class_alias('Stripe\\File', 'Stripe\\FileUpload');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/lib/HttpClient/ClientInterface.php CHANGED
@@ -11,8 +11,11 @@ interface ClientInterface
11
  * @param array $params KV pairs for parameters. Can be nested for arrays and hashes
12
  * @param boolean $hasFile Whether or not $params references a file (via an @ prefix or
13
  * CurlFile)
14
- * @throws \Stripe\Error\Api & \Stripe\Error\ApiConnection
15
- * @return array($rawBody, $httpStatusCode, $httpHeader)
 
 
 
16
  */
17
  public function request($method, $absUrl, $headers, $params, $hasFile);
18
  }
11
  * @param array $params KV pairs for parameters. Can be nested for arrays and hashes
12
  * @param boolean $hasFile Whether or not $params references a file (via an @ prefix or
13
  * CurlFile)
14
+ *
15
+ * @throws \Stripe\Error\Api
16
+ * @throws \Stripe\Error\ApiConnection
17
+ * @return array An array whose first element is raw request body, second
18
+ * element is HTTP status code and third array of HTTP headers.
19
  */
20
  public function request($method, $absUrl, $headers, $params, $hasFile);
21
  }
includes/lib/Stripe/lib/HttpClient/CurlClient.php CHANGED
@@ -22,6 +22,10 @@ if (!defined('CURL_SSLVERSION_TLSv1_2')) {
22
  }
23
  // @codingStandardsIgnoreEnd
24
 
 
 
 
 
25
  class CurlClient implements ClientInterface
26
  {
27
  private static $instance;
@@ -38,6 +42,12 @@ class CurlClient implements ClientInterface
38
 
39
  protected $userAgentInfo;
40
 
 
 
 
 
 
 
41
  /**
42
  * CurlClient constructor.
43
  *
@@ -51,19 +61,31 @@ class CurlClient implements ClientInterface
51
  *
52
  * @param array|callable|null $defaultOptions
53
  */
54
- public function __construct($defaultOptions = null)
55
  {
56
  $this->defaultOptions = $defaultOptions;
 
57
  $this->initUserAgentInfo();
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
 
60
  public function initUserAgentInfo()
61
  {
62
  $curlVersion = curl_version();
63
- $this->userAgentInfo = array(
64
  'httplib' => 'curl ' . $curlVersion['version'],
65
  'ssllib' => $curlVersion['ssl_version'],
66
- );
67
  }
68
 
69
  public function getDefaultOptions()
@@ -76,6 +98,38 @@ class CurlClient implements ClientInterface
76
  return $this->userAgentInfo;
77
  }
78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  // USER DEFINED TIMEOUTS
80
 
81
  const DEFAULT_TIMEOUT = 80;
@@ -110,10 +164,9 @@ class CurlClient implements ClientInterface
110
 
111
  public function request($method, $absUrl, $headers, $params, $hasFile)
112
  {
113
- $curl = curl_init();
114
  $method = strtolower($method);
115
 
116
- $opts = array();
117
  if (is_callable($this->defaultOptions)) { // call defaultOptions callback, set options to return value
118
  $opts = call_user_func_array($this->defaultOptions, func_get_args());
119
  if (!is_array($opts)) {
@@ -123,6 +176,8 @@ class CurlClient implements ClientInterface
123
  $opts = $this->defaultOptions;
124
  }
125
 
 
 
126
  if ($method == 'get') {
127
  if ($hasFile) {
128
  throw new Error\Api(
@@ -131,24 +186,32 @@ class CurlClient implements ClientInterface
131
  }
132
  $opts[CURLOPT_HTTPGET] = 1;
133
  if (count($params) > 0) {
134
- $encoded = Util\Util::urlEncode($params);
135
  $absUrl = "$absUrl?$encoded";
136
  }
137
  } elseif ($method == 'post') {
138
  $opts[CURLOPT_POST] = 1;
139
- $opts[CURLOPT_POSTFIELDS] = $hasFile ? $params : Util\Util::urlEncode($params);
140
  } elseif ($method == 'delete') {
141
  $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
142
  if (count($params) > 0) {
143
- $encoded = Util\Util::urlEncode($params);
144
  $absUrl = "$absUrl?$encoded";
145
  }
146
  } else {
147
  throw new Error\Api("Unrecognized method $method");
148
  }
149
 
 
 
 
 
 
 
 
 
150
  // Create a callback to capture HTTP headers for the response
151
- $rheaders = array();
152
  $headerCallback = function ($curl, $header_line) use (&$rheaders) {
153
  // Ignore the HTTP request line (HTTP/1.1 200 OK)
154
  if (strpos($header_line, ":") === false) {
@@ -180,50 +243,70 @@ class CurlClient implements ClientInterface
180
  $opts[CURLOPT_TIMEOUT] = $this->timeout;
181
  $opts[CURLOPT_HEADERFUNCTION] = $headerCallback;
182
  $opts[CURLOPT_HTTPHEADER] = $headers;
183
- if (!Stripe::$verifySslCerts) {
 
184
  $opts[CURLOPT_SSL_VERIFYPEER] = false;
185
  }
186
 
187
- curl_setopt_array($curl, $opts);
188
- $rbody = curl_exec($curl);
189
-
190
- if (!defined('CURLE_SSL_CACERT_BADFILE')) {
191
- define('CURLE_SSL_CACERT_BADFILE', 77); // constant not defined in PHP
192
  }
193
 
194
- $errno = curl_errno($curl);
195
- if ($errno == CURLE_SSL_CACERT ||
196
- $errno == CURLE_SSL_PEER_CERTIFICATE ||
197
- $errno == CURLE_SSL_CACERT_BADFILE
198
- ) {
199
- array_push(
200
- $headers,
201
- 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}'
202
- );
203
- $cert = self::caBundle();
204
- curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
205
- curl_setopt($curl, CURLOPT_CAINFO, $cert);
206
- $rbody = curl_exec($curl);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  }
208
 
209
  if ($rbody === false) {
210
- $errno = curl_errno($curl);
211
- $message = curl_error($curl);
212
- curl_close($curl);
213
- $this->handleCurlError($absUrl, $errno, $message);
214
  }
215
 
216
- $rcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
217
- curl_close($curl);
218
- return array($rbody, $rcode, $rheaders);
219
  }
220
 
221
  /**
222
- * @param number $errno
 
223
  * @param string $message
 
224
  * @throws Error\ApiConnection
225
  */
226
- private function handleCurlError($url, $errno, $message)
227
  {
228
  switch ($errno) {
229
  case CURLE_COULDNT_CONNECT:
@@ -248,11 +331,130 @@ class CurlClient implements ClientInterface
248
  $msg .= " let us know at support@stripe.com.";
249
 
250
  $msg .= "\n\n(Network error [errno $errno]: $message)";
 
 
 
 
 
251
  throw new Error\ApiConnection($msg);
252
  }
253
 
254
- private static function caBundle()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255
  {
256
- return dirname(__FILE__) . '/../../data/ca-certificates.crt';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  }
258
  }
22
  }
23
  // @codingStandardsIgnoreEnd
24
 
25
+ if (!defined('CURL_HTTP_VERSION_2TLS')) {
26
+ define('CURL_HTTP_VERSION_2TLS', 4);
27
+ }
28
+
29
  class CurlClient implements ClientInterface
30
  {
31
  private static $instance;
42
 
43
  protected $userAgentInfo;
44
 
45
+ protected $enablePersistentConnections = null;
46
+
47
+ protected $enableHttp2 = null;
48
+
49
+ protected $curlHandle = null;
50
+
51
  /**
52
  * CurlClient constructor.
53
  *
61
  *
62
  * @param array|callable|null $defaultOptions
63
  */
64
+ public function __construct($defaultOptions = null, $randomGenerator = null)
65
  {
66
  $this->defaultOptions = $defaultOptions;
67
+ $this->randomGenerator = $randomGenerator ?: new Util\RandomGenerator();
68
  $this->initUserAgentInfo();
69
+
70
+ // TODO: curl_reset requires PHP >= 5.5.0. Once we drop support for PHP 5.4, we can simply
71
+ // initialize this to true.
72
+ $this->enablePersistentConnections = function_exists('curl_reset');
73
+
74
+ $this->enableHttp2 = $this->canSafelyUseHttp2();
75
+ }
76
+
77
+ public function __destruct()
78
+ {
79
+ $this->closeCurlHandle();
80
  }
81
 
82
  public function initUserAgentInfo()
83
  {
84
  $curlVersion = curl_version();
85
+ $this->userAgentInfo = [
86
  'httplib' => 'curl ' . $curlVersion['version'],
87
  'ssllib' => $curlVersion['ssl_version'],
88
+ ];
89
  }
90
 
91
  public function getDefaultOptions()
98
  return $this->userAgentInfo;
99
  }
100
 
101
+ /**
102
+ * @return boolean
103
+ */
104
+ public function getEnablePersistentConnections()
105
+ {
106
+ return $this->enablePersistentConnections;
107
+ }
108
+
109
+ /**
110
+ * @param boolean $enable
111
+ */
112
+ public function setEnablePersistentConnections($enable)
113
+ {
114
+ $this->enablePersistentConnections = $enable;
115
+ }
116
+
117
+ /**
118
+ * @return boolean
119
+ */
120
+ public function getEnableHttp2()
121
+ {
122
+ return $this->enableHttp2;
123
+ }
124
+
125
+ /**
126
+ * @param boolean $enable
127
+ */
128
+ public function setEnableHttp2($enable)
129
+ {
130
+ $this->enableHttp2 = $enable;
131
+ }
132
+
133
  // USER DEFINED TIMEOUTS
134
 
135
  const DEFAULT_TIMEOUT = 80;
164
 
165
  public function request($method, $absUrl, $headers, $params, $hasFile)
166
  {
 
167
  $method = strtolower($method);
168
 
169
+ $opts = [];
170
  if (is_callable($this->defaultOptions)) { // call defaultOptions callback, set options to return value
171
  $opts = call_user_func_array($this->defaultOptions, func_get_args());
172
  if (!is_array($opts)) {
176
  $opts = $this->defaultOptions;
177
  }
178
 
179
+ $params = Util\Util::objectsToIds($params);
180
+
181
  if ($method == 'get') {
182
  if ($hasFile) {
183
  throw new Error\Api(
186
  }
187
  $opts[CURLOPT_HTTPGET] = 1;
188
  if (count($params) > 0) {
189
+ $encoded = Util\Util::encodeParameters($params);
190
  $absUrl = "$absUrl?$encoded";
191
  }
192
  } elseif ($method == 'post') {
193
  $opts[CURLOPT_POST] = 1;
194
+ $opts[CURLOPT_POSTFIELDS] = $hasFile ? $params : Util\Util::encodeParameters($params);
195
  } elseif ($method == 'delete') {
196
  $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
197
  if (count($params) > 0) {
198
+ $encoded = Util\Util::encodeParameters($params);
199
  $absUrl = "$absUrl?$encoded";
200
  }
201
  } else {
202
  throw new Error\Api("Unrecognized method $method");
203
  }
204
 
205
+ // It is only safe to retry network failures on POST requests if we
206
+ // add an Idempotency-Key header
207
+ if (($method == 'post') && (Stripe::$maxNetworkRetries > 0)) {
208
+ if (!$this->hasHeader($headers, "Idempotency-Key")) {
209
+ array_push($headers, 'Idempotency-Key: ' . $this->randomGenerator->uuid());
210
+ }
211
+ }
212
+
213
  // Create a callback to capture HTTP headers for the response
214
+ $rheaders = new Util\CaseInsensitiveArray();
215
  $headerCallback = function ($curl, $header_line) use (&$rheaders) {
216
  // Ignore the HTTP request line (HTTP/1.1 200 OK)
217
  if (strpos($header_line, ":") === false) {
243
  $opts[CURLOPT_TIMEOUT] = $this->timeout;
244
  $opts[CURLOPT_HEADERFUNCTION] = $headerCallback;
245
  $opts[CURLOPT_HTTPHEADER] = $headers;
246
+ $opts[CURLOPT_CAINFO] = Stripe::getCABundlePath();
247
+ if (!Stripe::getVerifySslCerts()) {
248
  $opts[CURLOPT_SSL_VERIFYPEER] = false;
249
  }
250
 
251
+ if (!isset($opts[CURLOPT_HTTP_VERSION]) && $this->getEnableHttp2()) {
252
+ // For HTTPS requests, enable HTTP/2, if supported
253
+ $opts[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2TLS;
 
 
254
  }
255
 
256
+ list($rbody, $rcode) = $this->executeRequestWithRetries($opts, $absUrl);
257
+
258
+ return [$rbody, $rcode, $rheaders];
259
+ }
260
+
261
+ /**
262
+ * @param array $opts cURL options
263
+ */
264
+ private function executeRequestWithRetries($opts, $absUrl)
265
+ {
266
+ $numRetries = 0;
267
+
268
+ while (true) {
269
+ $rcode = 0;
270
+ $errno = 0;
271
+
272
+ $this->resetCurlHandle();
273
+ curl_setopt_array($this->curlHandle, $opts);
274
+ $rbody = curl_exec($this->curlHandle);
275
+
276
+ if ($rbody === false) {
277
+ $errno = curl_errno($this->curlHandle);
278
+ $message = curl_error($this->curlHandle);
279
+ } else {
280
+ $rcode = curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE);
281
+ }
282
+ if (!$this->getEnablePersistentConnections()) {
283
+ $this->closeCurlHandle();
284
+ }
285
+
286
+ if ($this->shouldRetry($errno, $rcode, $numRetries)) {
287
+ $numRetries += 1;
288
+ $sleepSeconds = $this->sleepTime($numRetries);
289
+ usleep(intval($sleepSeconds * 1000000));
290
+ } else {
291
+ break;
292
+ }
293
  }
294
 
295
  if ($rbody === false) {
296
+ $this->handleCurlError($absUrl, $errno, $message, $numRetries);
 
 
 
297
  }
298
 
299
+ return [$rbody, $rcode];
 
 
300
  }
301
 
302
  /**
303
+ * @param string $url
304
+ * @param int $errno
305
  * @param string $message
306
+ * @param int $numRetries
307
  * @throws Error\ApiConnection
308
  */
309
+ private function handleCurlError($url, $errno, $message, $numRetries)
310
  {
311
  switch ($errno) {
312
  case CURLE_COULDNT_CONNECT:
331
  $msg .= " let us know at support@stripe.com.";
332
 
333
  $msg .= "\n\n(Network error [errno $errno]: $message)";
334
+
335
+ if ($numRetries > 0) {
336
+ $msg .= "\n\nRequest was retried $numRetries times.";
337
+ }
338
+
339
  throw new Error\ApiConnection($msg);
340
  }
341
 
342
+ /**
343
+ * Checks if an error is a problem that we should retry on. This includes both
344
+ * socket errors that may represent an intermittent problem and some special
345
+ * HTTP statuses.
346
+ * @param int $errno
347
+ * @param int $rcode
348
+ * @param int $numRetries
349
+ * @return bool
350
+ */
351
+ private function shouldRetry($errno, $rcode, $numRetries)
352
+ {
353
+ if ($numRetries >= Stripe::getMaxNetworkRetries()) {
354
+ return false;
355
+ }
356
+
357
+ // Retry on timeout-related problems (either on open or read).
358
+ if ($errno === CURLE_OPERATION_TIMEOUTED) {
359
+ return true;
360
+ }
361
+
362
+ // Destination refused the connection, the connection was reset, or a
363
+ // variety of other connection failures. This could occur from a single
364
+ // saturated server, so retry in case it's intermittent.
365
+ if ($errno === CURLE_COULDNT_CONNECT) {
366
+ return true;
367
+ }
368
+
369
+ // 409 conflict
370
+ if ($rcode === 409) {
371
+ return true;
372
+ }
373
+
374
+ return false;
375
+ }
376
+
377
+ private function sleepTime($numRetries)
378
  {
379
+ // Apply exponential backoff with $initialNetworkRetryDelay on the
380
+ // number of $numRetries so far as inputs. Do not allow the number to exceed
381
+ // $maxNetworkRetryDelay.
382
+ $sleepSeconds = min(
383
+ Stripe::getInitialNetworkRetryDelay() * 1.0 * pow(2, $numRetries - 1),
384
+ Stripe::getMaxNetworkRetryDelay()
385
+ );
386
+
387
+ // Apply some jitter by randomizing the value in the range of
388
+ // ($sleepSeconds / 2) to ($sleepSeconds).
389
+ $sleepSeconds *= 0.5 * (1 + $this->randomGenerator->randFloat());
390
+
391
+ // But never sleep less than the base sleep seconds.
392
+ $sleepSeconds = max(Stripe::getInitialNetworkRetryDelay(), $sleepSeconds);
393
+
394
+ return $sleepSeconds;
395
+ }
396
+
397
+ /**
398
+ * Initializes the curl handle. If already initialized, the handle is closed first.
399
+ */
400
+ private function initCurlHandle()
401
+ {
402
+ $this->closeCurlHandle();
403
+ $this->curlHandle = curl_init();
404
+ }
405
+
406
+ /**
407
+ * Closes the curl handle if initialized. Do nothing if already closed.
408
+ */
409
+ private function closeCurlHandle()
410
+ {
411
+ if (!is_null($this->curlHandle)) {
412
+ curl_close($this->curlHandle);
413
+ $this->curlHandle = null;
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Resets the curl handle. If the handle is not already initialized, or if persistent
419
+ * connections are disabled, the handle is reinitialized instead.
420
+ */
421
+ private function resetCurlHandle()
422
+ {
423
+ if (!is_null($this->curlHandle) && $this->getEnablePersistentConnections()) {
424
+ curl_reset($this->curlHandle);
425
+ } else {
426
+ $this->initCurlHandle();
427
+ }
428
+ }
429
+
430
+ /**
431
+ * Indicates whether it is safe to use HTTP/2 or not.
432
+ *
433
+ * @return boolean
434
+ */
435
+ private function canSafelyUseHttp2()
436
+ {
437
+ // Versions of curl older than 7.60.0 don't respect GOAWAY frames
438
+ // (cf. https://github.com/curl/curl/issues/2416), which Stripe use.
439
+ $curlVersion = curl_version()['version'];
440
+ return (version_compare($curlVersion, '7.60.0') >= 0);
441
+ }
442
+
443
+ /**
444
+ * Checks if a list of headers contains a specific header name.
445
+ *
446
+ * @param string[] $headers
447
+ * @param string $name
448
+ * @return boolean
449
+ */
450
+ private function hasHeader($headers, $name)
451
+ {
452
+ foreach ($headers as $header) {
453
+ if (strncasecmp($header, "{$name}: ", strlen($name) + 2) === 0) {
454
+ return true;
455
+ }
456
+ }
457
+
458
+ return false;
459
  }
460
  }
includes/lib/Stripe/lib/Invoice.php CHANGED
@@ -5,54 +5,171 @@ namespace Stripe;
5
  /**
6
  * Class Invoice
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class Invoice extends ApiResource
11
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  /**
13
  * @param array|null $params
14
  * @param array|string|null $opts
15
  *
16
- * @return Invoice The created invoice.
17
  */
18
- public static function create($params = null, $opts = null)
19
  {
20
- return self::_create($params, $opts);
 
 
 
21
  }
22
 
23
  /**
24
- * @param array|string $id The ID of the invoice to retrieve, or an options
25
- * array containing an `id` key.
26
  * @param array|string|null $opts
27
  *
28
- * @return Invoice
29
  */
30
- public static function retrieve($id, $opts = null)
31
  {
32
- return self::_retrieve($id, $opts);
 
 
 
33
  }
34
 
35
  /**
36
  * @param array|null $params
37
  * @param array|string|null $opts
38
  *
39
- * @return Collection of Invoices
40
  */
41
- public static function all($params = null, $opts = null)
42
  {
43
- return self::_all($params, $opts);
 
 
 
44
  }
45
 
46
  /**
47
- * @param string $id The ID of the invoice to update.
48
  * @param array|null $params
49
- * @param array|string|null $options
50
  *
51
- * @return Invoice The updated invoice.
52
  */
53
- public static function update($id, $params = null, $options = null)
54
  {
55
- return self::_update($id, $params, $options);
 
 
 
56
  }
57
 
58
  /**
@@ -71,21 +188,14 @@ class Invoice extends ApiResource
71
  }
72
 
73
  /**
 
74
  * @param array|string|null $opts
75
  *
76
- * @return Invoice The saved invoice.
77
- */
78
- public function save($opts = null)
79
- {
80
- return $this->_save($opts);
81
- }
82
-
83
- /**
84
- * @return Invoice The paid invoice.
85
  */
86
- public function pay($params = null, $opts = null)
87
  {
88
- $url = $this->instanceUrl() . '/pay';
89
  list($response, $opts) = $this->_request('post', $url, $params, $opts);
90
  $this->refreshFrom($response, $opts);
91
  return $this;
5
  /**
6
  * Class Invoice
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $account_country
11
+ * @property string $account_name
12
+ * @property int $amount_due
13
+ * @property int $amount_paid
14
+ * @property int $amount_remaining
15
+ * @property int $application_fee_amount
16
+ * @property int $attempt_count
17
+ * @property bool $attempted
18
+ * @property bool $auto_advance
19
+ * @property string $billing
20
+ * @property string $billing_reason
21
+ * @property string $charge
22
+ * @property string $collection_method
23
+ * @property int $created
24
+ * @property string $currency
25
+ * @property array $custom_fields
26
+ * @property string $customer
27
+ * @property mixed $customer_address
28
+ * @property string $customer_email
29
+ * @property string $customer_name
30
+ * @property string $customer_phone
31
+ * @property mixed $customer_shipping
32
+ * @property string $customer_tax_exempt
33
+ * @property array $customer_tax_ids
34
+ * @property string $default_payment_method
35
+ * @property string $default_source
36
+ * @property array $default_tax_rates
37
+ * @property string $description
38
+ * @property Discount $discount
39
+ * @property int $due_date
40
+ * @property int $ending_balance
41
+ * @property string $footer
42
+ * @property string $hosted_invoice_url
43
+ * @property string $invoice_pdf
44
+ * @property Collection $lines
45
+ * @property bool $livemode
46
+ * @property StripeObject $metadata
47
+ * @property int $next_payment_attempt
48
+ * @property string $number
49
+ * @property bool $paid
50
+ * @property string $payment_intent
51
+ * @property int $period_end
52
+ * @property int $period_start
53
+ * @property int $post_payment_credit_notes_amount
54
+ * @property int $pre_payment_credit_notes_amount
55
+ * @property string $receipt_number
56
+ * @property int $starting_balance
57
+ * @property string $statement_descriptor
58
+ * @property string $status
59
+ * @property mixed $status_transitions
60
+ * @property string $subscription
61
+ * @property int $subscription_proration_date
62
+ * @property int $subtotal
63
+ * @property int $tax
64
+ * @property mixed $threshold_reason
65
+ * @property int $total
66
+ * @property array $total_tax_amounts
67
+ * @property int $webhooks_delivered_at
68
+ *
69
  * @package Stripe
70
  */
71
  class Invoice extends ApiResource
72
  {
73
+
74
+ const OBJECT_NAME = "invoice";
75
+
76
+ use ApiOperations\All;
77
+ use ApiOperations\Create;
78
+ use ApiOperations\Delete;
79
+ use ApiOperations\Retrieve;
80
+ use ApiOperations\Update;
81
+
82
+ /**
83
+ * Possible string representations of the billing reason.
84
+ * @link https://stripe.com/docs/api/invoices/object#invoice_object-billing_reason
85
+ */
86
+ const BILLING_REASON_MANUAL = 'manual';
87
+ const BILLING_REASON_SUBSCRIPTION = 'subscription';
88
+ const BILLING_REASON_SUBSCRIPTION_CREATE = 'subscription_create';
89
+ const BILLING_REASON_SUBSCRIPTION_CYCLE = 'subscription_cycle';
90
+ const BILLING_REASON_SUBSCRIPTION_THRESHOLD = 'subscription_threshold';
91
+ const BILLING_REASON_SUBSCRIPTION_UPDATE = 'subscription_update';
92
+ const BILLING_REASON_UPCOMING = 'upcoming';
93
+
94
+ /**
95
+ * Possible string representations of the `collection_method` property.
96
+ * @link https://stripe.com/docs/api/invoices/object#invoice_object-collection_method
97
+ */
98
+ const COLLECTION_METHOD_CHARGE_AUTOMATICALLY = 'charge_automatically';
99
+ const COLLECTION_METHOD_SEND_INVOICE = 'send_invoice';
100
+
101
+ /**
102
+ * Possible string representations of the invoice status.
103
+ * @link https://stripe.com/docs/api/invoices/object#invoice_object-status
104
+ */
105
+ const STATUS_DRAFT = 'draft';
106
+ const STATUS_OPEN = 'open';
107
+ const STATUS_PAID = 'paid';
108
+ const STATUS_UNCOLLECTIBLE = 'uncollectible';
109
+ const STATUS_VOID = 'void';
110
+
111
+ /**
112
+ * Possible string representations of the `billing` property.
113
+ * @deprecated Use `collection_method` instead.
114
+ * @link https://stripe.com/docs/api/invoices/object#invoice_object-billing
115
+ */
116
+ const BILLING_CHARGE_AUTOMATICALLY = 'charge_automatically';
117
+ const BILLING_SEND_INVOICE = 'send_invoice';
118
+
119
  /**
120
  * @param array|null $params
121
  * @param array|string|null $opts
122
  *
123
+ * @return Invoice The finalized invoice.
124
  */
125
+ public function finalizeInvoice($params = null, $opts = null)
126
  {
127
+ $url = $this->instanceUrl() . '/finalize';
128
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
129
+ $this->refreshFrom($response, $opts);
130
+ return $this;
131
  }
132
 
133
  /**
134
+ * @param array|null $params
 
135
  * @param array|string|null $opts
136
  *
137
+ * @return Invoice The uncollectible invoice.
138
  */
139
+ public function markUncollectible($params = null, $opts = null)
140
  {
141
+ $url = $this->instanceUrl() . '/mark_uncollectible';
142
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
143
+ $this->refreshFrom($response, $opts);
144
+ return $this;
145
  }
146
 
147
  /**
148
  * @param array|null $params
149
  * @param array|string|null $opts
150
  *
151
+ * @return Invoice The paid invoice.
152
  */
153
+ public function pay($params = null, $opts = null)
154
  {
155
+ $url = $this->instanceUrl() . '/pay';
156
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
157
+ $this->refreshFrom($response, $opts);
158
+ return $this;
159
  }
160
 
161
  /**
 
162
  * @param array|null $params
163
+ * @param array|string|null $opts
164
  *
165
+ * @return Invoice The sent invoice.
166
  */
167
+ public function sendInvoice($params = null, $opts = null)
168
  {
169
+ $url = $this->instanceUrl() . '/send';
170
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
171
+ $this->refreshFrom($response, $opts);
172
+ return $this;
173
  }
174
 
175
  /**
188
  }
189
 
190
  /**
191
+ * @param array|null $params
192
  * @param array|string|null $opts
193
  *
194
+ * @return Invoice The voided invoice.
 
 
 
 
 
 
 
 
195
  */
196
+ public function voidInvoice($params = null, $opts = null)
197
  {
198
+ $url = $this->instanceUrl() . '/void';
199
  list($response, $opts) = $this->_request('post', $url, $params, $opts);
200
  $this->refreshFrom($response, $opts);
201
  return $this;
includes/lib/Stripe/lib/InvoiceItem.php CHANGED
@@ -5,74 +5,36 @@ namespace Stripe;
5
  /**
6
  * Class InvoiceItem
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class InvoiceItem extends ApiResource
11
  {
12
- /**
13
- * @param array|string $id The ID of the invoice item to retrieve, or an
14
- * options array containing an `id` key.
15
- * @param array|string|null $opts
16
- *
17
- * @return InvoiceItem
18
- */
19
- public static function retrieve($id, $opts = null)
20
- {
21
- return self::_retrieve($id, $opts);
22
- }
23
-
24
- /**
25
- * @param array|null $params
26
- * @param array|string|null $opts
27
- *
28
- * @return Collection of InvoiceItems
29
- */
30
- public static function all($params = null, $opts = null)
31
- {
32
- return self::_all($params, $opts);
33
- }
34
-
35
- /**
36
- * @param array|null $params
37
- * @param array|string|null $opts
38
- *
39
- * @return InvoiceItem The created invoice item.
40
- */
41
- public static function create($params = null, $opts = null)
42
- {
43
- return self::_create($params, $opts);
44
- }
45
-
46
- /**
47
- * @param string $id The ID of the invoice item to update.
48
- * @param array|null $params
49
- * @param array|string|null $options
50
- *
51
- * @return InvoiceItem The updated invoice item.
52
- */
53
- public static function update($id, $params = null, $options = null)
54
- {
55
- return self::_update($id, $params, $options);
56
- }
57
 
58
- /**
59
- * @param array|string|null $opts
60
- *
61
- * @return InvoiceItem The saved invoice item.
62
- */
63
- public function save($opts = null)
64
- {
65
- return $this->_save($opts);
66
- }
67
 
68
- /**
69
- * @param array|null $params
70
- * @param array|string|null $opts
71
- *
72
- * @return InvoiceItem The deleted invoice item.
73
- */
74
- public function delete($params = null, $opts = null)
75
- {
76
- return $this->_delete($params, $opts);
77
- }
78
  }
5
  /**
6
  * Class InvoiceItem
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property string $currency
12
+ * @property string $customer
13
+ * @property int $date
14
+ * @property string $description
15
+ * @property bool $discountable
16
+ * @property string $invoice
17
+ * @property bool $livemode
18
+ * @property StripeObject $metadata
19
+ * @property mixed $period
20
+ * @property Plan $plan
21
+ * @property bool $proration
22
+ * @property int $quantity
23
+ * @property string $subscription
24
+ * @property string $subscription_item
25
+ * @property array $tax_rates
26
+ * @property int $unit_amount
27
+ *
28
  * @package Stripe
29
  */
30
  class InvoiceItem extends ApiResource
31
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
+ const OBJECT_NAME = "invoiceitem";
 
 
 
 
 
 
 
 
34
 
35
+ use ApiOperations\All;
36
+ use ApiOperations\Create;
37
+ use ApiOperations\Delete;
38
+ use ApiOperations\Retrieve;
39
+ use ApiOperations\Update;
 
 
 
 
 
40
  }
includes/lib/Stripe/lib/InvoiceLineItem.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class InvoiceLineItem
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property string $currency
12
+ * @property string $description
13
+ * @property bool $discountable
14
+ * @property string $invoice_item
15
+ * @property bool $livemode
16
+ * @property StripeObject $metadata
17
+ * @property mixed $period
18
+ * @property Plan $plan
19
+ * @property bool $proration
20
+ * @property int $quantity
21
+ * @property string $subscription
22
+ * @property string $subscription_item
23
+ * @property array $tax_amounts
24
+ * @property array $tax_rates
25
+ * @property string $type
26
+ *
27
+ * @package Stripe
28
+ */
29
+ class InvoiceLineItem extends ApiResource
30
+ {
31
+ const OBJECT_NAME = "line_item";
32
+ }
includes/lib/Stripe/lib/IssuerFraudRecord.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class IssuerFraudRecord
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $charge
11
+ * @property int $created
12
+ * @property int $post_date
13
+ * @property string $fraud_type
14
+ * @property bool $livemode
15
+ *
16
+ * @package Stripe
17
+ */
18
+ class IssuerFraudRecord extends ApiResource
19
+ {
20
+
21
+ const OBJECT_NAME = "issuer_fraud_record";
22
+
23
+ use ApiOperations\All;
24
+ use ApiOperations\Retrieve;
25
+ }
includes/lib/Stripe/lib/Issuing/Authorization.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Issuing;
4
+
5
+ /**
6
+ * Class Authorization
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property bool $approved
11
+ * @property string $authorization_method
12
+ * @property int $authorized_amount
13
+ * @property string $authorized_currency
14
+ * @property \Stripe\Collection $balance_transactions
15
+ * @property Card $card
16
+ * @property Cardholder $cardholder
17
+ * @property int $created
18
+ * @property int $held_amount
19
+ * @property string $held_currency
20
+ * @property bool $is_held_amount_controllable
21
+ * @property bool $livemode
22
+ * @property mixed $merchant_data
23
+ * @property \Stripe\StripeObject $metadata
24
+ * @property int $pending_authorized_amount
25
+ * @property int $pending_held_amount
26
+ * @property mixed $request_history
27
+ * @property string $status
28
+ * @property \Stripe\Collection $transactions
29
+ * @property mixed $verification_data
30
+ *
31
+ * @package Stripe\Issuing
32
+ */
33
+ class Authorization extends \Stripe\ApiResource
34
+ {
35
+ const OBJECT_NAME = "issuing.authorization";
36
+
37
+ use \Stripe\ApiOperations\All;
38
+ use \Stripe\ApiOperations\Retrieve;
39
+ use \Stripe\ApiOperations\Update;
40
+
41
+ /**
42
+ * @param array|null $params
43
+ * @param array|string|null $options
44
+ *
45
+ * @return Authorization The approved authorization.
46
+ */
47
+ public function approve($params = null, $options = null)
48
+ {
49
+ $url = $this->instanceUrl() . '/approve';
50
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
51
+ $this->refreshFrom($response, $opts);
52
+ return $this;
53
+ }
54
+
55
+ /**
56
+ * @param array|null $params
57
+ * @param array|string|null $options
58
+ *
59
+ * @return Authorization The declined authorization.
60
+ */
61
+ public function decline($params = null, $options = null)
62
+ {
63
+ $url = $this->instanceUrl() . '/decline';
64
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
65
+ $this->refreshFrom($response, $opts);
66
+ return $this;
67
+ }
68
+ }
includes/lib/Stripe/lib/Issuing/Card.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Issuing;
4
+
5
+ /**
6
+ * Class Card
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property mixed $authorization_controls
11
+ * @property mixed $billing
12
+ * @property string $brand
13
+ * @property Cardholder $cardholder
14
+ * @property int $created
15
+ * @property string $currency
16
+ * @property int $exp_month
17
+ * @property int $exp_year
18
+ * @property string $last4
19
+ * @property bool $livemode
20
+ * @property \Stripe\StripeObject $metadata
21
+ * @property string $name
22
+ * @property mixed $shipping
23
+ * @property string $status
24
+ * @property string $type
25
+ *
26
+ * @package Stripe\Issuing
27
+ */
28
+ class Card extends \Stripe\ApiResource
29
+ {
30
+ const OBJECT_NAME = "issuing.card";
31
+
32
+ use \Stripe\ApiOperations\All;
33
+ use \Stripe\ApiOperations\Create;
34
+ use \Stripe\ApiOperations\Retrieve;
35
+ use \Stripe\ApiOperations\Update;
36
+
37
+ /**
38
+ * @param array|null $params
39
+ * @param array|string|null $options
40
+ *
41
+ * @return CardDetails The card details associated with that issuing card.
42
+ */
43
+ public function details($params = null, $options = null)
44
+ {
45
+ $url = $this->instanceUrl() . '/details';
46
+ list($response, $opts) = $this->_request('get', $url, $params, $options);
47
+ $obj = \Stripe\Util\Util::convertToStripeObject($response, $opts);
48
+ $obj->setLastResponse($response);
49
+ return $obj;
50
+ }
51
+ }
includes/lib/Stripe/lib/Issuing/CardDetails.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Issuing;
4
+
5
+ /**
6
+ * Class CardDetails
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property Card $card
11
+ * @property string $cvc
12
+ * @property int $exp_month
13
+ * @property int $exp_year
14
+ * @property string $number
15
+ *
16
+ * @package Stripe\Issuing
17
+ */
18
+ class CardDetails extends \Stripe\ApiResource
19
+ {
20
+ const OBJECT_NAME = "issuing.card_details";
21
+ }
includes/lib/Stripe/lib/Issuing/Cardholder.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Issuing;
4
+
5
+ /**
6
+ * Class Cardholder
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property mixed $billing
11
+ * @property int $created
12
+ * @property string $email
13
+ * @property bool $livemode
14
+ * @property \Stripe\StripeObject $metadata
15
+ * @property string $name
16
+ * @property string $phone_number
17
+ * @property string $status
18
+ * @property string $type
19
+ *
20
+ * @package Stripe\Issuing
21
+ */
22
+ class Cardholder extends \Stripe\ApiResource
23
+ {
24
+ const OBJECT_NAME = "issuing.cardholder";
25
+
26
+ use \Stripe\ApiOperations\All;
27
+ use \Stripe\ApiOperations\Create;
28
+ use \Stripe\ApiOperations\Retrieve;
29
+ use \Stripe\ApiOperations\Update;
30
+ }
includes/lib/Stripe/lib/Issuing/Dispute.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Issuing;
4
+
5
+ /**
6
+ * Class Dispute
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property int $created
12
+ * @property string $currency
13
+ * @property mixed $evidence
14
+ * @property bool $livemode
15
+ * @property \Stripe\StripeObject $metadata
16
+ * @property string $reason
17
+ * @property string $status
18
+ * @property Transaction $transaction
19
+ *
20
+ * @package Stripe\Issuing
21
+ */
22
+ class Dispute extends \Stripe\ApiResource
23
+ {
24
+ const OBJECT_NAME = "issuing.dispute";
25
+
26
+ use \Stripe\ApiOperations\All;
27
+ use \Stripe\ApiOperations\Create;
28
+ use \Stripe\ApiOperations\Retrieve;
29
+ use \Stripe\ApiOperations\Update;
30
+ }
includes/lib/Stripe/lib/Issuing/Transaction.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Issuing;
4
+
5
+ /**
6
+ * Class Transaction
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property string $authorization
12
+ * @property string $balance_transaction
13
+ * @property string $card
14
+ * @property string $cardholder
15
+ * @property int $created
16
+ * @property string $currency
17
+ * @property string $dispute
18
+ * @property bool $livemode
19
+ * @property mixed $merchant_data
20
+ * @property int $merchant_amount
21
+ * @property string $merchant_currency
22
+ * @property \Stripe\StripeObject $metadata
23
+ * @property string $type
24
+ *
25
+ * @package Stripe\Issuing
26
+ */
27
+ class Transaction extends \Stripe\ApiResource
28
+ {
29
+ const OBJECT_NAME = "issuing.transaction";
30
+
31
+ use \Stripe\ApiOperations\All;
32
+ use \Stripe\ApiOperations\Create;
33
+ use \Stripe\ApiOperations\Retrieve;
34
+ use \Stripe\ApiOperations\Update;
35
+ }
includes/lib/Stripe/lib/LoginLink.php CHANGED
@@ -5,9 +5,14 @@ namespace Stripe;
5
  /**
6
  * Class LoginLink
7
  *
 
 
 
 
8
  * @package Stripe
9
  */
10
  class LoginLink extends ApiResource
11
  {
12
 
 
13
  }
5
  /**
6
  * Class LoginLink
7
  *
8
+ * @property string $object
9
+ * @property int $created
10
+ * @property string $url
11
+ *
12
  * @package Stripe
13
  */
14
  class LoginLink extends ApiResource
15
  {
16
 
17
+ const OBJECT_NAME = "login_link";
18
  }
includes/lib/Stripe/lib/OAuth.php CHANGED
@@ -14,9 +14,7 @@ abstract class OAuth
14
  */
15
  public static function authorizeUrl($params = null, $opts = null)
16
  {
17
- if (!$params) {
18
- $params = array();
19
- }
20
 
21
  $base = ($opts && array_key_exists('connect_base', $opts)) ? $opts['connect_base'] : Stripe::$connectBase;
22
 
@@ -24,7 +22,7 @@ abstract class OAuth
24
  if (!array_key_exists('response_type', $params)) {
25
  $params['response_type'] = 'code';
26
  }
27
- $query = Util\Util::urlEncode($params);
28
 
29
  return $base . '/oauth/authorize?' . $query;
30
  }
@@ -61,10 +59,7 @@ abstract class OAuth
61
  */
62
  public static function deauthorize($params = null, $opts = null)
63
  {
64
- if (!$params) {
65
- $params = array();
66
- }
67
-
68
  $base = ($opts && array_key_exists('connect_base', $opts)) ? $opts['connect_base'] : Stripe::$connectBase;
69
  $requestor = new ApiRequestor(null, $base);
70
  $params['client_id'] = self::_getClientId($params);
14
  */
15
  public static function authorizeUrl($params = null, $opts = null)
16
  {
17
+ $params = $params ?: [];
 
 
18
 
19
  $base = ($opts && array_key_exists('connect_base', $opts)) ? $opts['connect_base'] : Stripe::$connectBase;
20
 
22
  if (!array_key_exists('response_type', $params)) {
23
  $params['response_type'] = 'code';
24
  }
25
+ $query = Util\Util::encodeParameters($params);
26
 
27
  return $base . '/oauth/authorize?' . $query;
28
  }
59
  */
60
  public static function deauthorize($params = null, $opts = null)
61
  {
62
+ $params = $params ?: [];
 
 
 
63
  $base = ($opts && array_key_exists('connect_base', $opts)) ? $opts['connect_base'] : Stripe::$connectBase;
64
  $requestor = new ApiRequestor(null, $base);
65
  $params['client_id'] = self::_getClientId($params);
includes/lib/Stripe/lib/Order.php CHANGED
@@ -5,65 +5,41 @@ namespace Stripe;
5
  /**
6
  * Class Order
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class Order extends ApiResource
11
  {
12
- /**
13
- * @param array|string $id The ID of the order to retrieve, or an options
14
- * array containing an `id` key.
15
- * @param array|string|null $opts
16
- *
17
- * @return Order
18
- */
19
- public static function retrieve($id, $opts = null)
20
- {
21
- return self::_retrieve($id, $opts);
22
- }
23
 
24
- /**
25
- * @param array|null $params
26
- * @param array|string|null $opts
27
- *
28
- * @return Order The created Order.
29
- */
30
- public static function create($params = null, $opts = null)
31
- {
32
- return self::_create($params, $opts);
33
- }
34
 
35
- /**
36
- * @param string $id The ID of the order to update.
37
- * @param array|null $params
38
- * @param array|string|null $options
39
- *
40
- * @return Order The updated order.
41
- */
42
- public static function update($id, $params = null, $options = null)
43
- {
44
- return self::_update($id, $params, $options);
45
- }
46
-
47
- /**
48
- * @param array|string|null $opts
49
- *
50
- * @return Order The saved Order.
51
- */
52
- public function save($opts = null)
53
- {
54
- return $this->_save($opts);
55
- }
56
-
57
- /**
58
- * @param array|null $params
59
- * @param array|string|null $opts
60
- *
61
- * @return Collection of Orders
62
- */
63
- public static function all($params = null, $opts = null)
64
- {
65
- return self::_all($params, $opts);
66
- }
67
 
68
  /**
69
  * @return Order The paid order.
5
  /**
6
  * Class Order
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property int $amount_returned
12
+ * @property string $application
13
+ * @property int $application_fee
14
+ * @property string $charge
15
+ * @property int $created
16
+ * @property string $currency
17
+ * @property string $customer
18
+ * @property string $email
19
+ * @property string $external_coupon_code
20
+ * @property OrderItem[] $items
21
+ * @property bool $livemode
22
+ * @property StripeObject $metadata
23
+ * @property Collection $returns
24
+ * @property string $selected_shipping_method
25
+ * @property mixed $shipping
26
+ * @property array $shipping_methods
27
+ * @property string $status
28
+ * @property mixed $status_transitions
29
+ * @property int $updated
30
+ * @property string $upstream_id
31
+ *
32
  * @package Stripe
33
  */
34
  class Order extends ApiResource
35
  {
 
 
 
 
 
 
 
 
 
 
 
36
 
37
+ const OBJECT_NAME = "order";
 
 
 
 
 
 
 
 
 
38
 
39
+ use ApiOperations\All;
40
+ use ApiOperations\Create;
41
+ use ApiOperations\Retrieve;
42
+ use ApiOperations\Update;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
  /**
45
  * @return Order The paid order.
includes/lib/Stripe/lib/OrderItem.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class OrderItem
7
+ *
8
+ * @property string $object
9
+ * @property int $amount
10
+ * @property string $currency
11
+ * @property string $description
12
+ * @property string $parent
13
+ * @property int $quantity
14
+ * @property string $type
15
+ *
16
+ * @package Stripe
17
+ */
18
+ class OrderItem extends StripeObject
19
+ {
20
+
21
+ const OBJECT_NAME = "order_item";
22
+ }
includes/lib/Stripe/lib/OrderReturn.php CHANGED
@@ -5,41 +5,23 @@ namespace Stripe;
5
  /**
6
  * Class OrderReturn
7
  *
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class OrderReturn extends ApiResource
11
  {
12
- /**
13
- * This is a special case because the order returns endpoint has an
14
- * underscore in it. The parent `className` function strips underscores.
15
- *
16
- * @return string The name of the class.
17
- */
18
- public static function className()
19
- {
20
- return 'order_return';
21
- }
22
 
23
- /**
24
- * @param array|string $id The ID of the order return to retrieve, or an
25
- * options array containing an `id` field.
26
- * @param array|string|null $opts
27
- *
28
- * @return Order
29
- */
30
- public static function retrieve($id, $opts = null)
31
- {
32
- return self::_retrieve($id, $opts);
33
- }
34
 
35
- /**
36
- * @param array|null $params
37
- * @param array|string|null $opts
38
- *
39
- * @return Collection of OrderReturns
40
- */
41
- public static function all($params = null, $opts = null)
42
- {
43
- return self::_all($params, $opts);
44
- }
45
  }
5
  /**
6
  * Class OrderReturn
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property int $created
12
+ * @property string $currency
13
+ * @property OrderItem[] $items
14
+ * @property bool $livemode
15
+ * @property string $order
16
+ * @property string $refund
17
+ *
18
  * @package Stripe
19
  */
20
  class OrderReturn extends ApiResource
21
  {
 
 
 
 
 
 
 
 
 
 
22
 
23
+ const OBJECT_NAME = "order_return";
 
 
 
 
 
 
 
 
 
 
24
 
25
+ use ApiOperations\All;
26
+ use ApiOperations\Retrieve;
 
 
 
 
 
 
 
 
27
  }
includes/lib/Stripe/lib/PaymentIntent.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class PaymentIntent
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property int $amount_capturable
12
+ * @property int $amount_received
13
+ * @property string $application
14
+ * @property int $application_fee_amount
15
+ * @property int $canceled_at
16
+ * @property string $cancellation_reason
17
+ * @property string $capture_method
18
+ * @property Collection $charges
19
+ * @property string $client_secret
20
+ * @property string $confirmation_method
21
+ * @property int $created
22
+ * @property string $currency
23
+ * @property string $customer
24
+ * @property string $description
25
+ * @property mixed $last_payment_error
26
+ * @property bool $livemode
27
+ * @property StripeObject $metadata
28
+ * @property mixed $next_action
29
+ * @property string $on_behalf_of
30
+ * @property string $payment_method
31
+ * @property string[] $payment_method_types
32
+ * @property string $receipt_email
33
+ * @property string $review
34
+ * @property mixed $shipping
35
+ * @property string $source
36
+ * @property string $statement_descriptor
37
+ * @property string $status
38
+ * @property mixed $transfer_data
39
+ * @property string $transfer_group
40
+ *
41
+ * @package Stripe
42
+ */
43
+ class PaymentIntent extends ApiResource
44
+ {
45
+
46
+ const OBJECT_NAME = "payment_intent";
47
+
48
+ use ApiOperations\All;
49
+ use ApiOperations\Create;
50
+ use ApiOperations\Retrieve;
51
+ use ApiOperations\Update;
52
+
53
+ /**
54
+ * These constants are possible representations of the status field.
55
+ *
56
+ * @link https://stripe.com/docs/api/payment_intents/object#payment_intent_object-status
57
+ */
58
+ const STATUS_CANCELED = 'canceled';
59
+ const STATUS_PROCESSING = 'processing';
60
+ const STATUS_REQUIRES_ACTION = 'requires_action';
61
+ const STATUS_REQUIRES_CAPTURE = 'requires_capture';
62
+ const STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation';
63
+ const STATUS_REQUIRES_PAYMENT_METHOD = 'requires_payment_method';
64
+ const STATUS_SUCCEEDED = 'succeeded';
65
+
66
+ /**
67
+ * @param array|null $params
68
+ * @param array|string|null $options
69
+ *
70
+ * @return PaymentIntent The canceled payment intent.
71
+ */
72
+ public function cancel($params = null, $options = null)
73
+ {
74
+ $url = $this->instanceUrl() . '/cancel';
75
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
76
+ $this->refreshFrom($response, $opts);
77
+ return $this;
78
+ }
79
+
80
+ /**
81
+ * @param array|null $params
82
+ * @param array|string|null $options
83
+ *
84
+ * @return PaymentIntent The captured payment intent.
85
+ */
86
+ public function capture($params = null, $options = null)
87
+ {
88
+ $url = $this->instanceUrl() . '/capture';
89
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
90
+ $this->refreshFrom($response, $opts);
91
+ return $this;
92
+ }
93
+
94
+ /**
95
+ * @param array|null $params
96
+ * @param array|string|null $options
97
+ *
98
+ * @return PaymentIntent The confirmed payment intent.
99
+ */
100
+ public function confirm($params = null, $options = null)
101
+ {
102
+ $url = $this->instanceUrl() . '/confirm';
103
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
104
+ $this->refreshFrom($response, $opts);
105
+ return $this;
106
+ }
107
+ }
includes/lib/Stripe/lib/PaymentMethod.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class PaymentMethod
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property mixed $billing_details
11
+ * @property mixed $card
12
+ * @property mixed $card_present
13
+ * @property int $created
14
+ * @property string $customer
15
+ * @property mixed $ideal
16
+ * @property bool $livemode
17
+ * @property StripeObject $metadata
18
+ * @property mixed $sepa_debit
19
+ * @property string $type
20
+ *
21
+ * @package Stripe
22
+ */
23
+ class PaymentMethod extends ApiResource
24
+ {
25
+
26
+ const OBJECT_NAME = "payment_method";
27
+
28
+ use ApiOperations\All;
29
+ use ApiOperations\Create;
30
+ use ApiOperations\Retrieve;
31
+ use ApiOperations\Update;
32
+
33
+ /**
34
+ * @param array|null $params
35
+ * @param array|string|null $opts
36
+ *
37
+ * @return PaymentMethod The attached payment method.
38
+ */
39
+ public function attach($params = null, $opts = null)
40
+ {
41
+ $url = $this->instanceUrl() . '/attach';
42
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
43
+ $this->refreshFrom($response, $opts);
44
+ return $this;
45
+ }
46
+
47
+ /**
48
+ * @param array|null $params
49
+ * @param array|string|null $opts
50
+ *
51
+ * @return PaymentMethod The detached payment method.
52
+ */
53
+ public function detach($params = null, $opts = null)
54
+ {
55
+ $url = $this->instanceUrl() . '/detach';
56
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
57
+ $this->refreshFrom($response, $opts);
58
+ return $this;
59
+ }
60
+ }
includes/lib/Stripe/lib/Payout.php CHANGED
@@ -8,18 +8,19 @@ namespace Stripe;
8
  * @property string $id
9
  * @property string $object
10
  * @property int $amount
 
 
11
  * @property string $balance_transaction
12
- * @property string $cancellation_balance_transaction
13
  * @property int $created
14
  * @property string $currency
15
- * @property int $arrival_date
16
  * @property string $destination
 
17
  * @property string $failure_code
18
  * @property string $failure_message
19
  * @property bool $livemode
20
- * @property mixed $metadata
21
  * @property string $method
22
- * @property string $recipient
23
  * @property string $source_type
24
  * @property string $statement_descriptor
25
  * @property string $status
@@ -29,51 +30,55 @@ namespace Stripe;
29
  */
30
  class Payout extends ApiResource
31
  {
 
 
 
 
 
 
 
 
32
  /**
33
- * @param array|string $id The ID of the payout to retrieve, or an options
34
- * array containing an `id` key.
35
- * @param array|string|null $opts
36
- *
37
- * @return Payout
38
  */
39
- public static function retrieve($id, $opts = null)
40
- {
41
- return self::_retrieve($id, $opts);
42
- }
 
 
 
 
 
 
 
 
 
43
 
44
  /**
45
- * @param array|null $params
46
- * @param array|string|null $opts
47
- *
48
- * @return Collection of Payouts
49
  */
50
- public static function all($params = null, $opts = null)
51
- {
52
- return self::_all($params, $opts);
53
- }
54
 
55
  /**
56
- * @param array|null $params
57
- * @param array|string|null $opts
58
- *
59
- * @return Payout The created payout.
60
  */
61
- public static function create($params = null, $opts = null)
62
- {
63
- return self::_create($params, $opts);
64
- }
 
65
 
66
  /**
67
- * @param string $id The ID of the payout to update.
68
- * @param array|null $params
69
- * @param array|string|null $options
70
- *
71
- * @return Payout The updated payout.
72
  */
73
- public static function update($id, $params = null, $options = null)
74
- {
75
- return self::_update($id, $params, $options);
76
- }
77
 
78
  /**
79
  * @return Payout The canceled payout.
@@ -85,14 +90,4 @@ class Payout extends ApiResource
85
  $this->refreshFrom($response, $opts);
86
  return $this;
87
  }
88
-
89
- /**
90
- * @param array|string|null $opts
91
- *
92
- * @return Payout The saved payout.
93
- */
94
- public function save($opts = null)
95
- {
96
- return $this->_save($opts);
97
- }
98
  }
8
  * @property string $id
9
  * @property string $object
10
  * @property int $amount
11
+ * @property int $arrival_date
12
+ * @property bool $automatic
13
  * @property string $balance_transaction
 
14
  * @property int $created
15
  * @property string $currency
16
+ * @property string $description
17
  * @property string $destination
18
+ * @property string $failure_balance_transaction
19
  * @property string $failure_code
20
  * @property string $failure_message
21
  * @property bool $livemode
22
+ * @property StripeObject $metadata
23
  * @property string $method
 
24
  * @property string $source_type
25
  * @property string $statement_descriptor
26
  * @property string $status
30
  */
31
  class Payout extends ApiResource
32
  {
33
+
34
+ const OBJECT_NAME = "payout";
35
+
36
+ use ApiOperations\All;
37
+ use ApiOperations\Create;
38
+ use ApiOperations\Retrieve;
39
+ use ApiOperations\Update;
40
+
41
  /**
42
+ * Types of payout failure codes.
43
+ * @link https://stripe.com/docs/api#payout_failures
 
 
 
44
  */
45
+ const FAILURE_ACCOUNT_CLOSED = 'account_closed';
46
+ const FAILURE_ACCOUNT_FROZEN = 'account_frozen';
47
+ const FAILURE_BANK_ACCOUNT_RESTRICTED = 'bank_account_restricted';
48
+ const FAILURE_BANK_OWNERSHIP_CHANGED = 'bank_ownership_changed';
49
+ const FAILURE_COULD_NOT_PROCESS = 'could_not_process';
50
+ const FAILURE_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized';
51
+ const FAILURE_DECLINED = 'declined';
52
+ const FAILURE_INCORRECT_ACCOUNT_HOLDER_NAME = 'incorrect_account_holder_name';
53
+ const FAILURE_INSUFFICIENT_FUNDS = 'insufficient_funds';
54
+ const FAILURE_INVALID_ACCOUNT_NUMBER = 'invalid_account_number';
55
+ const FAILURE_INVALID_CURRENCY = 'invalid_currency';
56
+ const FAILURE_NO_ACCOUNT = 'no_account';
57
+ const FAILURE_UNSUPPORTED_CARD = 'unsupported_card';
58
 
59
  /**
60
+ * Possible string representations of the payout methods.
61
+ * @link https://stripe.com/docs/api/payouts/object#payout_object-method
 
 
62
  */
63
+ const METHOD_STANDARD = 'standard';
64
+ const METHOD_INSTANT = 'instant';
 
 
65
 
66
  /**
67
+ * Possible string representations of the status of the payout.
68
+ * @link https://stripe.com/docs/api/payouts/object#payout_object-status
 
 
69
  */
70
+ const STATUS_CANCELED = 'canceled';
71
+ const STATUS_IN_TRANSIT = 'in_transit';
72
+ const STATUS_FAILED = 'failed';
73
+ const STATUS_PAID = 'paid';
74
+ const STATUS_PENDING = 'pending';
75
 
76
  /**
77
+ * Possible string representations of the type of payout.
78
+ * @link https://stripe.com/docs/api/payouts/object#payout_object-type
 
 
 
79
  */
80
+ const TYPE_BANK_ACCOUNT = 'bank_account';
81
+ const TYPE_CARD = 'card';
 
 
82
 
83
  /**
84
  * @return Payout The canceled payout.
90
  $this->refreshFrom($response, $opts);
91
  return $this;
92
  }
 
 
 
 
 
 
 
 
 
 
93
  }
includes/lib/Stripe/lib/Person.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Person
7
+ *
8
+ * @package Stripe
9
+ *
10
+ * @property string $id
11
+ * @property string $object
12
+ * @property string $account
13
+ * @property mixed $address
14
+ * @property mixed $address_kana
15
+ * @property mixed $address_kanji
16
+ * @property int $created
17
+ * @property bool $deleted
18
+ * @property mixed $dob
19
+ * @property string $email
20
+ * @property string $first_name
21
+ * @property string $first_name_kana
22
+ * @property string $first_name_kanji
23
+ * @property string $gender
24
+ * @property bool $id_number_provided
25
+ * @property string $last_name
26
+ * @property string $last_name_kana
27
+ * @property string $last_name_kanji
28
+ * @property string $maiden_name
29
+ * @property StripeObject $metadata
30
+ * @property string $phone
31
+ * @property mixed $relationship
32
+ * @property mixed $requirements
33
+ * @property bool $ssn_last_4_provided
34
+ * @property mixed $verification
35
+ */
36
+ class Person extends ApiResource
37
+ {
38
+
39
+ const OBJECT_NAME = "person";
40
+
41
+ use ApiOperations\Delete;
42
+ use ApiOperations\Update;
43
+
44
+ /**
45
+ * Possible string representations of a person's gender.
46
+ * @link https://stripe.com/docs/api/persons/object#person_object-gender
47
+ */
48
+ const GENDER_MALE = 'male';
49
+ const GENDER_FEMALE = 'female';
50
+
51
+ /**
52
+ * Possible string representations of a person's verification status.
53
+ * @link https://stripe.com/docs/api/persons/object#person_object-verification-status
54
+ */
55
+ const VERIFICATION_STATUS_PENDING = 'pending';
56
+ const VERIFICATION_STATUS_UNVERIFIED = 'unverified';
57
+ const VERIFICATION_STATUS_VERIFIED = 'verified';
58
+
59
+ /**
60
+ * @return string The API URL for this Stripe account reversal.
61
+ */
62
+ public function instanceUrl()
63
+ {
64
+ $id = $this['id'];
65
+ $account = $this['account'];
66
+ if (!$id) {
67
+ throw new Error\InvalidRequest(
68
+ "Could not determine which URL to request: " .
69
+ "class instance has invalid ID: $id",
70
+ null
71
+ );
72
+ }
73
+ $id = Util\Util::utf8($id);
74
+ $account = Util\Util::utf8($account);
75
+
76
+ $base = Account::classUrl();
77
+ $accountExtn = urlencode($account);
78
+ $extn = urlencode($id);
79
+ return "$base/$accountExtn/persons/$extn";
80
+ }
81
+
82
+ /**
83
+ * @param array|string $_id
84
+ * @param array|string|null $_opts
85
+ *
86
+ * @throws \Stripe\Error\InvalidRequest
87
+ */
88
+ public static function retrieve($_id, $_opts = null)
89
+ {
90
+ $msg = "Persons cannot be accessed without an account ID. " .
91
+ "Retrieve a Person using \$account->retrievePerson('person_id') instead.";
92
+ throw new Error\InvalidRequest($msg, null);
93
+ }
94
+
95
+ /**
96
+ * @param string $_id
97
+ * @param array|null $_params
98
+ * @param array|string|null $_options
99
+ *
100
+ * @throws \Stripe\Error\InvalidRequest
101
+ */
102
+ public static function update($_id, $_params = null, $_options = null)
103
+ {
104
+ $msg = "Persons cannot be accessed without an account ID. " .
105
+ "Retrieve a Person using \$account->retrievePerson('person_id') instead.";
106
+ throw new Error\InvalidRequest($msg, null);
107
+ }
108
+ }
includes/lib/Stripe/lib/Plan.php CHANGED
@@ -7,85 +7,34 @@ namespace Stripe;
7
  *
8
  * @package Stripe
9
  *
10
- * @property $id
11
- * @property $object
12
- * @property $amount
13
- * @property $created
14
- * @property $currency
15
- * @property $interval
16
- * @property $interval_count
17
- * @property $livemode
18
- * @property AttachedObject $metadata
19
- * @property $name
20
- * @property $statement_descriptor
21
- * @property $trial_period_days
 
 
 
 
 
 
 
22
  */
23
  class Plan extends ApiResource
24
  {
25
- /**
26
- * @param array|string $id The ID of the plan to retrieve, or an options
27
- * array containing an `id` key.
28
- * @param array|string|null $opts
29
- *
30
- * @return Plan
31
- */
32
- public static function retrieve($id, $opts = null)
33
- {
34
- return self::_retrieve($id, $opts);
35
- }
36
 
37
- /**
38
- * @param array|null $params
39
- * @param array|string|null $opts
40
- *
41
- * @return Plan The created plan.
42
- */
43
- public static function create($params = null, $opts = null)
44
- {
45
- return self::_create($params, $opts);
46
- }
47
 
48
- /**
49
- * @param string $id The ID of the plan to update.
50
- * @param array|null $params
51
- * @param array|string|null $options
52
- *
53
- * @return Plan The updated plan.
54
- */
55
- public static function update($id, $params = null, $options = null)
56
- {
57
- return self::_update($id, $params, $options);
58
- }
59
-
60
- /**
61
- * @param array|null $params
62
- * @param array|string|null $opts
63
- *
64
- * @return Plan The deleted plan.
65
- */
66
- public function delete($params = null, $opts = null)
67
- {
68
- return $this->_delete($params, $opts);
69
- }
70
-
71
- /**
72
- * @param array|string|null $opts
73
- *
74
- * @return Plan The saved plan.
75
- */
76
- public function save($opts = null)
77
- {
78
- return $this->_save($opts);
79
- }
80
-
81
- /**
82
- * @param array|null $params
83
- * @param array|string|null $opts
84
- *
85
- * @return Collection of Plans
86
- */
87
- public static function all($params = null, $opts = null)
88
- {
89
- return self::_all($params, $opts);
90
- }
91
  }
7
  *
8
  * @package Stripe
9
  *
10
+ * @property string $id
11
+ * @property string $object
12
+ * @property bool $active
13
+ * @property string $aggregate_usage
14
+ * @property int $amount
15
+ * @property string $billing_scheme
16
+ * @property int $created
17
+ * @property string $currency
18
+ * @property string $interval
19
+ * @property int $interval_count
20
+ * @property bool $livemode
21
+ * @property StripeObject $metadata
22
+ * @property string $nickname
23
+ * @property string $product
24
+ * @property mixed $tiers
25
+ * @property string $tiers_mode
26
+ * @property mixed $transform_usage
27
+ * @property int $trial_period_days
28
+ * @property string $usage_type
29
  */
30
  class Plan extends ApiResource
31
  {
 
 
 
 
 
 
 
 
 
 
 
32
 
33
+ const OBJECT_NAME = "plan";
 
 
 
 
 
 
 
 
 
34
 
35
+ use ApiOperations\All;
36
+ use ApiOperations\Create;
37
+ use ApiOperations\Delete;
38
+ use ApiOperations\Retrieve;
39
+ use ApiOperations\Update;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  }
includes/lib/Stripe/lib/Product.php CHANGED
@@ -5,74 +5,43 @@ namespace Stripe;
5
  /**
6
  * Class Product
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class Product extends ApiResource
11
  {
12
- /**
13
- * @param array|string $id The ID of the product to retrieve, or an options
14
- * array contianing an `id` key.
15
- * @param array|string|null $opts
16
- *
17
- * @return Product
18
- */
19
- public static function retrieve($id, $opts = null)
20
- {
21
- return self::_retrieve($id, $opts);
22
- }
23
 
24
- /**
25
- * @param array|null $params
26
- * @param array|string|null $opts
27
- *
28
- * @return Product The created Product.
29
- */
30
- public static function create($params = null, $opts = null)
31
- {
32
- return self::_create($params, $opts);
33
- }
34
 
35
- /**
36
- * @param string $id The ID of the product to update.
37
- * @param array|null $params
38
- * @param array|string|null $options
39
- *
40
- * @return Product The updated product.
41
- */
42
- public static function update($id, $params = null, $options = null)
43
- {
44
- return self::_update($id, $params, $options);
45
- }
46
-
47
- /**
48
- * @param array|string|null $opts
49
- *
50
- * @return Product The saved Product.
51
- */
52
- public function save($opts = null)
53
- {
54
- return $this->_save($opts);
55
- }
56
-
57
- /**
58
- * @param array|null $params
59
- * @param array|string|null $opts
60
- *
61
- * @return Collection of Products
62
- */
63
- public static function all($params = null, $opts = null)
64
- {
65
- return self::_all($params, $opts);
66
- }
67
 
68
  /**
69
- * @param array|null $params
70
- * @param array|string|null $opts
71
- *
72
- * @return Product The deleted product.
73
  */
74
- public function delete($params = null, $opts = null)
75
- {
76
- return $this->_delete($params, $opts);
77
- }
78
  }
5
  /**
6
  * Class Product
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property bool $active
11
+ * @property string[] $attributes
12
+ * @property string $caption
13
+ * @property int $created
14
+ * @property string[] $deactivate_on
15
+ * @property string $description
16
+ * @property string[] $images
17
+ * @property bool $livemode
18
+ * @property StripeObject $metadata
19
+ * @property string $name
20
+ * @property mixed $package_dimensions
21
+ * @property bool $shippable
22
+ * @property string $statement_descriptor
23
+ * @property string $type
24
+ * @property string $unit_label
25
+ * @property int $updated
26
+ * @property string $url
27
+ *
28
  * @package Stripe
29
  */
30
  class Product extends ApiResource
31
  {
 
 
 
 
 
 
 
 
 
 
 
32
 
33
+ const OBJECT_NAME = "product";
 
 
 
 
 
 
 
 
 
34
 
35
+ use ApiOperations\All;
36
+ use ApiOperations\Create;
37
+ use ApiOperations\Delete;
38
+ use ApiOperations\Retrieve;
39
+ use ApiOperations\Update;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
  /**
42
+ * Possible string representations of the type of product.
43
+ * @link https://stripe.com/docs/api/service_products/object#service_product_object-type
 
 
44
  */
45
+ const TYPE_GOOD = 'good';
46
+ const TYPE_SERVICE = 'service';
 
 
47
  }
includes/lib/Stripe/lib/Radar/EarlyFraudWarning.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Radar;
4
+
5
+ /**
6
+ * Class EarlyFraudWarning
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property bool $actionable
11
+ * @property string $charge
12
+ * @property int $created
13
+ * @property string $fraud_type
14
+ * @property bool $livemode
15
+ *
16
+ * @package Stripe\Radar
17
+ */
18
+ class EarlyFraudWarning extends \Stripe\ApiResource
19
+ {
20
+ const OBJECT_NAME = "radar.early_fraud_warning";
21
+
22
+ use \Stripe\ApiOperations\All;
23
+ use \Stripe\ApiOperations\Retrieve;
24
+
25
+ /**
26
+ * Possible string representations of an early fraud warning's fraud type.
27
+ * @link https://stripe.com/docs/api/early_fraud_warnings/object#early_fraud_warning_object-fraud_type
28
+ */
29
+ const FRAUD_TYPE_CARD_NEVER_RECEIVED = 'card_never_received';
30
+ const FRAUD_TYPE_FRAUDULENT_CARD_APPLICATION = 'fraudulent_card_application';
31
+ const FRAUD_TYPE_MADE_WITH_COUNTERFEIT_CARD = 'made_with_counterfeit_card';
32
+ const FRAUD_TYPE_MADE_WITH_LOST_CARD = 'made_with_lost_card';
33
+ const FRAUD_TYPE_MADE_WITH_STOLEN_CARD = 'made_with_stolen_card';
34
+ const FRAUD_TYPE_MISC = 'misc';
35
+ const FRAUD_TYPE_UNAUTHORIZED_USE_OF_CARD = 'unauthorized_use_of_card';
36
+ }
includes/lib/Stripe/lib/Radar/ValueList.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Radar;
4
+
5
+ /**
6
+ * Class ValueList
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $alias
11
+ * @property int $created
12
+ * @property string $created_by
13
+ * @property string $item_type
14
+ * @property Collection $list_items
15
+ * @property bool $livemode
16
+ * @property StripeObject $metadata
17
+ * @property mixed $name
18
+ * @property int $updated
19
+ * @property string $updated_by
20
+ *
21
+ * @package Stripe\Radar
22
+ */
23
+ class ValueList extends \Stripe\ApiResource
24
+ {
25
+ const OBJECT_NAME = "radar.value_list";
26
+
27
+ use \Stripe\ApiOperations\All;
28
+ use \Stripe\ApiOperations\Create;
29
+ use \Stripe\ApiOperations\Delete;
30
+ use \Stripe\ApiOperations\Retrieve;
31
+ use \Stripe\ApiOperations\Update;
32
+ }
includes/lib/Stripe/lib/Radar/ValueListItem.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Radar;
4
+
5
+ /**
6
+ * Class ValueListItem
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $created
11
+ * @property string $created_by
12
+ * @property string $list
13
+ * @property bool $livemode
14
+ * @property string $value
15
+ *
16
+ * @package Stripe\Radar
17
+ */
18
+ class ValueListItem extends \Stripe\ApiResource
19
+ {
20
+ const OBJECT_NAME = "radar.value_list_item";
21
+
22
+ use \Stripe\ApiOperations\All;
23
+ use \Stripe\ApiOperations\Create;
24
+ use \Stripe\ApiOperations\Delete;
25
+ use \Stripe\ApiOperations\Retrieve;
26
+ }
includes/lib/Stripe/lib/Recipient.php CHANGED
@@ -6,75 +6,32 @@ namespace Stripe;
6
  * Class Recipient
7
  *
8
  * @package Stripe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  */
10
  class Recipient extends ApiResource
11
  {
12
- /**
13
- * @param array|string $id The ID of the recipient to retrieve, or an
14
- * options array containing an `id` key.
15
- * @param array|string|null $opts
16
- *
17
- * @return Recipient
18
- */
19
- public static function retrieve($id, $opts = null)
20
- {
21
- return self::_retrieve($id, $opts);
22
- }
23
-
24
- /**
25
- * @param array|null $params
26
- * @param array|string|null $opts
27
- *
28
- * @return Collection of Recipients
29
- */
30
- public static function all($params = null, $opts = null)
31
- {
32
- return self::_all($params, $opts);
33
- }
34
-
35
- /**
36
- * @param array|null $params
37
- * @param array|string|null $opts
38
- *
39
- * @return Recipient The created recipient.
40
- */
41
- public static function create($params = null, $opts = null)
42
- {
43
- return self::_create($params, $opts);
44
- }
45
 
46
- /**
47
- * @param string $id The ID of the recipient to update.
48
- * @param array|null $params
49
- * @param array|string|null $options
50
- *
51
- * @return Recipient The updated recipient.
52
- */
53
- public static function update($id, $params = null, $options = null)
54
- {
55
- return self::_update($id, $params, $options);
56
- }
57
-
58
- /**
59
- * @param array|string|null $opts
60
- *
61
- * @return Recipient The saved recipient.
62
- */
63
- public function save($opts = null)
64
- {
65
- return $this->_save($opts);
66
- }
67
-
68
- /**
69
- * @param array|null $params
70
- *
71
- * @return Recipient The deleted recipient.
72
- */
73
- public function delete($params = null, $opts = null)
74
- {
75
- return $this->_delete($params, $opts);
76
- }
77
 
 
 
 
 
 
78
 
79
  /**
80
  * @param array|null $params
@@ -83,9 +40,7 @@ class Recipient extends ApiResource
83
  */
84
  public function transfers($params = null)
85
  {
86
- if ($params === null) {
87
- $params = array();
88
- }
89
  $params['recipient'] = $this->id;
90
  $transfers = Transfer::all($params, $this->_opts);
91
  return $transfers;
6
  * Class Recipient
7
  *
8
  * @package Stripe
9
+ *
10
+ * @property string $id
11
+ * @property string $object
12
+ * @property mixed $active_account
13
+ * @property Collection $cards
14
+ * @property int $created
15
+ * @property string $default_card
16
+ * @property string $description
17
+ * @property string $email
18
+ * @property bool $livemode
19
+ * @property StripeObject $metadata
20
+ * @property string $migrated_to
21
+ * @property string $name
22
+ * @property string $rolled_back_from
23
+ * @property string $type
24
  */
25
  class Recipient extends ApiResource
26
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ const OBJECT_NAME = "recipient";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
+ use ApiOperations\All;
31
+ use ApiOperations\Create;
32
+ use ApiOperations\Delete;
33
+ use ApiOperations\Retrieve;
34
+ use ApiOperations\Update;
35
 
36
  /**
37
  * @param array|null $params
40
  */
41
  public function transfers($params = null)
42
  {
43
+ $params = $params ?: [];
 
 
44
  $params['recipient'] = $this->id;
45
  $transfers = Transfer::all($params, $this->_opts);
46
  return $transfers;
includes/lib/Stripe/lib/RecipientTransfer.php CHANGED
@@ -20,7 +20,7 @@ namespace Stripe;
20
  * @property string $failure_code
21
  * @property string $failure_message
22
  * @property bool $livemode
23
- * @property mixed $metadata
24
  * @property string $method
25
  * @property string $recipient
26
  * @property mixed $reversals
@@ -35,4 +35,5 @@ namespace Stripe;
35
  class RecipientTransfer extends ApiResource
36
  {
37
 
 
38
  }
20
  * @property string $failure_code
21
  * @property string $failure_message
22
  * @property bool $livemode
23
+ * @property StripeObject $metadata
24
  * @property string $method
25
  * @property string $recipient
26
  * @property mixed $reversals
35
  class RecipientTransfer extends ApiResource
36
  {
37
 
38
+ const OBJECT_NAME = "recipient_transfer";
39
  }
includes/lib/Stripe/lib/Refund.php CHANGED
@@ -8,73 +8,54 @@ namespace Stripe;
8
  * @property string $id
9
  * @property string $object
10
  * @property int $amount
11
- * @property mixed $balance_transaction
12
  * @property string $charge
13
  * @property int $created
14
  * @property string $currency
15
- * @property mixed $metadata
16
- * @property mixed $reason
17
- * @property mixed $receipt_number
 
 
 
 
18
  * @property string $status
 
19
  *
20
  * @package Stripe
21
  */
22
  class Refund extends ApiResource
23
  {
24
 
25
- /**
26
- * @param array|string $id The ID of the refund to retrieve, or an options
27
- * array containing an `id` key.
28
- * @param array|string|null $options
29
- *
30
- * @return Refund
31
- */
32
- public static function retrieve($id, $options = null)
33
- {
34
- return self::_retrieve($id, $options);
35
- }
36
 
37
- /**
38
- * @param string $id The ID of the refund to update.
39
- * @param array|null $params
40
- * @param array|string|null $options
41
- *
42
- * @return Refund The updated refund.
43
- */
44
- public static function update($id, $params = null, $options = null)
45
- {
46
- return self::_update($id, $params, $options);
47
- }
48
 
49
  /**
50
- * @param array|null $params
51
- * @param array|string|null $options
52
- *
53
- * @return Collection of Refunds
54
  */
55
- public static function all($params = null, $options = null)
56
- {
57
- return self::_all($params, $options);
58
- }
59
 
60
  /**
61
- * @param array|null $params
62
- * @param array|string|null $options
63
- *
64
- * @return Refund The created refund.
65
  */
66
- public static function create($params = null, $options = null)
67
- {
68
- return self::_create($params, $options);
69
- }
70
 
71
  /**
72
- * @param array|string|null $opts
73
- *
74
- * @return Refund The saved refund.
75
  */
76
- public function save($opts = null)
77
- {
78
- return $this->_save($opts);
79
- }
80
  }
8
  * @property string $id
9
  * @property string $object
10
  * @property int $amount
11
+ * @property string $balance_transaction
12
  * @property string $charge
13
  * @property int $created
14
  * @property string $currency
15
+ * @property string $description
16
+ * @property string $failure_balance_transaction
17
+ * @property string $failure_reason
18
+ * @property StripeObject $metadata
19
+ * @property string $reason
20
+ * @property string $receipt_number
21
+ * @property string $source_transfer_reversal
22
  * @property string $status
23
+ * @property string $transfer_reversal
24
  *
25
  * @package Stripe
26
  */
27
  class Refund extends ApiResource
28
  {
29
 
30
+ const OBJECT_NAME = "refund";
 
 
 
 
 
 
 
 
 
 
31
 
32
+ use ApiOperations\All;
33
+ use ApiOperations\Create;
34
+ use ApiOperations\Retrieve;
35
+ use ApiOperations\Update;
 
 
 
 
 
 
 
36
 
37
  /**
38
+ * Possible string representations of the failure reason.
39
+ * @link https://stripe.com/docs/api/refunds/object#refund_object-failure_reason
 
 
40
  */
41
+ const FAILURE_REASON = 'expired_or_canceled_card';
42
+ const FAILURE_REASON_LOST_OR_STOLEN_CARD = 'lost_or_stolen_card';
43
+ const FAILURE_REASON_UNKNOWN = 'unknown';
 
44
 
45
  /**
46
+ * Possible string representations of the refund reason.
47
+ * @link https://stripe.com/docs/api/refunds/object#refund_object-reason
 
 
48
  */
49
+ const REASON_DUPLICATE = 'duplicate';
50
+ const REASON_FRAUDULENT = 'fraudulent';
51
+ const REASON_REQUESTED_BY_CUSTOMER = 'requested_by_customer';
 
52
 
53
  /**
54
+ * Possible string representations of the refund status.
55
+ * @link https://stripe.com/docs/api/refunds/object#refund_object-status
 
56
  */
57
+ const STATUS_CANCELED = 'canceled';
58
+ const STATUS_FAILED = 'failed';
59
+ const STATUS_PENDING = 'pending';
60
+ const STATUS_SUCCEEDED = 'succeeded';
61
  }
includes/lib/Stripe/lib/Reporting/ReportRun.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Reporting;
4
+
5
+ /**
6
+ * Class ReportRun
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $created
11
+ * @property string $error
12
+ * @property bool $livemode
13
+ * @property mixed $parameters
14
+ * @property string $report_type
15
+ * @property mixed $result
16
+ * @property string $status
17
+ * @property int $succeeded_at
18
+ *
19
+ * @package Stripe\Reporting
20
+ */
21
+ class ReportRun extends \Stripe\ApiResource
22
+ {
23
+ const OBJECT_NAME = "reporting.report_run";
24
+
25
+ use \Stripe\ApiOperations\All;
26
+ use \Stripe\ApiOperations\Create;
27
+ use \Stripe\ApiOperations\Retrieve;
28
+ }
includes/lib/Stripe/lib/Reporting/ReportType.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Reporting;
4
+
5
+ /**
6
+ * Class ReportType
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $data_available_end
11
+ * @property int $data_available_start
12
+ * @property string $name
13
+ * @property int $updated
14
+ * @property string $version
15
+ *
16
+ * @package Stripe\Reporting
17
+ */
18
+ class ReportType extends \Stripe\ApiResource
19
+ {
20
+ const OBJECT_NAME = "reporting.report_type";
21
+
22
+ use \Stripe\ApiOperations\All;
23
+ use \Stripe\ApiOperations\Retrieve;
24
+ }
includes/lib/Stripe/lib/RequestTelemetry.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class RequestTelemetry
7
+ *
8
+ * Tracks client request telemetry
9
+ * @package Stripe
10
+ */
11
+ class RequestTelemetry
12
+ {
13
+ public $requestId;
14
+ public $requestDuration;
15
+
16
+ /**
17
+ * Initialize a new telemetry object.
18
+ *
19
+ * @param string $requestId The request's request ID.
20
+ * @param int $requestDuration The request's duration in milliseconds.
21
+ */
22
+ public function __construct($requestId, $requestDuration)
23
+ {
24
+ $this->requestId = $requestId;
25
+ $this->requestDuration = $requestDuration;
26
+ }
27
+ }
includes/lib/Stripe/lib/Review.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Review
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $billing_zip
11
+ * @property string $charge
12
+ * @property string $closed_reason
13
+ * @property int $created
14
+ * @property string $ip_address
15
+ * @property mixed $ip_address_location
16
+ * @property bool $livemode
17
+ * @property bool $open
18
+ * @property string $opened_reason
19
+ * @property string $payment_intent
20
+ * @property string $reason
21
+ * @property mixed $session
22
+ *
23
+ * @package Stripe
24
+ */
25
+ class Review extends ApiResource
26
+ {
27
+ const OBJECT_NAME = "review";
28
+
29
+ use ApiOperations\All;
30
+ use ApiOperations\Retrieve;
31
+
32
+ /**
33
+ * Possible string representations of the current, the opening or the closure reason of the review.
34
+ * Not all of these enumeration apply to all of the ´reason´ fields. Please consult the Review object to
35
+ * determine where these are apply.
36
+ * @link https://stripe.com/docs/api/radar/reviews/object
37
+ */
38
+ const REASON_APPROVED = 'approved';
39
+ const REASON_DISPUTED = 'disputed';
40
+ const REASON_MANUAL = 'manual';
41
+ const REASON_REFUNDED = 'refunded';
42
+ const REASON_REFUNDED_AS_FRAUD = 'refunded_as_fraud';
43
+ const REASON_RULE = 'rule';
44
+
45
+ /**
46
+ * @param array|string|null $options
47
+ *
48
+ * @return Review The approved review.
49
+ */
50
+ public function approve($params = null, $options = null)
51
+ {
52
+ $url = $this->instanceUrl() . '/approve';
53
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
54
+ $this->refreshFrom($response, $opts);
55
+ return $this;
56
+ }
57
+ }
includes/lib/Stripe/lib/SKU.php CHANGED
@@ -5,74 +5,31 @@ namespace Stripe;
5
  /**
6
  * Class SKU
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class SKU extends ApiResource
11
  {
12
- /**
13
- * @param array|string $id The ID of the SKU to retrieve, or an options
14
- * array containing an `id` key.
15
- * @param array|string|null $opts
16
- *
17
- * @return SKU
18
- */
19
- public static function retrieve($id, $opts = null)
20
- {
21
- return self::_retrieve($id, $opts);
22
- }
23
-
24
- /**
25
- * @param array|null $params
26
- * @param array|string|null $opts
27
- *
28
- * @return SKU The created SKU.
29
- */
30
- public static function create($params = null, $opts = null)
31
- {
32
- return self::_create($params, $opts);
33
- }
34
-
35
- /**
36
- * @param string $id The ID of the SKU to update.
37
- * @param array|null $params
38
- * @param array|string|null $options
39
- *
40
- * @return SKU The updated SKU.
41
- */
42
- public static function update($id, $params = null, $options = null)
43
- {
44
- return self::_update($id, $params, $options);
45
- }
46
-
47
- /**
48
- * @param array|string|null $opts
49
- *
50
- * @return SKU The saved SKU.
51
- */
52
- public function save($opts = null)
53
- {
54
- return $this->_save($opts);
55
- }
56
 
57
- /**
58
- * @param array|null $params
59
- * @param array|string|null $opts
60
- *
61
- * @return Collection of SKUs
62
- */
63
- public static function all($params = null, $opts = null)
64
- {
65
- return self::_all($params, $opts);
66
- }
67
 
68
- /**
69
- * @param array|null $params
70
- * @param array|string|null $opts
71
- *
72
- * @return SKU The deleted sku.
73
- */
74
- public function delete($params = null, $opts = null)
75
- {
76
- return $this->_delete($params, $opts);
77
- }
78
  }
5
  /**
6
  * Class SKU
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property bool $active
11
+ * @property mixed $attributes
12
+ * @property int $created
13
+ * @property string $currency
14
+ * @property string $image
15
+ * @property mixed $inventory
16
+ * @property bool $livemode
17
+ * @property StripeObject $metadata
18
+ * @property mixed $package_dimensions
19
+ * @property int $price
20
+ * @property string $product
21
+ * @property int $updated
22
+ *
23
  * @package Stripe
24
  */
25
  class SKU extends ApiResource
26
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ const OBJECT_NAME = "sku";
 
 
 
 
 
 
 
 
 
29
 
30
+ use ApiOperations\All;
31
+ use ApiOperations\Create;
32
+ use ApiOperations\Delete;
33
+ use ApiOperations\Retrieve;
34
+ use ApiOperations\Update;
 
 
 
 
 
35
  }
includes/lib/Stripe/lib/SetupIntent.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class SetupIntent
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $application
11
+ * @property string $client_secret
12
+ * @property int $created
13
+ * @property string $customer
14
+ * @property string $description
15
+ * @property mixed $last_setup_error
16
+ * @property bool $livemode
17
+ * @property StripeObject $metadata
18
+ * @property mixed $next_action
19
+ * @property string $on_behalf_of
20
+ * @property string $payment_method
21
+ * @property string[] $payment_method_types
22
+ * @property string $status
23
+ *
24
+ * @package Stripe
25
+ */
26
+ class SetupIntent extends ApiResource
27
+ {
28
+
29
+ const OBJECT_NAME = "setup_intent";
30
+
31
+ use ApiOperations\All;
32
+ use ApiOperations\Create;
33
+ use ApiOperations\Retrieve;
34
+ use ApiOperations\Update;
35
+
36
+ /**
37
+ * These constants are possible representations of the status field.
38
+ *
39
+ * @link https://stripe.com/docs/api/setup_intents/object#setup_intent_object-status
40
+ */
41
+ const STATUS_CANCELED = 'canceled';
42
+ const STATUS_PROCESSING = 'processing';
43
+ const STATUS_REQUIRES_ACTION = 'requires_action';
44
+ const STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation';
45
+ const STATUS_REQUIRES_PAYMENT_METHOD = 'requires_payment_method';
46
+ const STATUS_SUCCEEDED = 'succeeded';
47
+
48
+ /**
49
+ * @param array|null $params
50
+ * @param array|string|null $options
51
+ *
52
+ * @return SetupIntent The canceled setup intent.
53
+ */
54
+ public function cancel($params = null, $options = null)
55
+ {
56
+ $url = $this->instanceUrl() . '/cancel';
57
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
58
+ $this->refreshFrom($response, $opts);
59
+ return $this;
60
+ }
61
+
62
+ /**
63
+ * @param array|null $params
64
+ * @param array|string|null $options
65
+ *
66
+ * @return SetupIntent The confirmed setup intent.
67
+ */
68
+ public function confirm($params = null, $options = null)
69
+ {
70
+ $url = $this->instanceUrl() . '/confirm';
71
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
72
+ $this->refreshFrom($response, $opts);
73
+ return $this;
74
+ }
75
+ }
includes/lib/Stripe/lib/Sigma/ScheduledQueryRun.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Sigma;
4
+
5
+ /**
6
+ * Class Authorization
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $created
11
+ * @property int $data_load_time
12
+ * @property string $error
13
+ * @property \Stripe\FileUpload $file
14
+ * @property bool $livemode
15
+ * @property int $result_available_until
16
+ * @property string $sql
17
+ * @property string $status
18
+ * @property string $title
19
+ *
20
+ * @package Stripe\Sigma
21
+ */
22
+ class ScheduledQueryRun extends \Stripe\ApiResource
23
+ {
24
+ const OBJECT_NAME = "scheduled_query_run";
25
+
26
+ use \Stripe\ApiOperations\All;
27
+ use \Stripe\ApiOperations\Retrieve;
28
+
29
+ public static function classUrl()
30
+ {
31
+ return "/v1/sigma/scheduled_query_runs";
32
+ }
33
+ }
includes/lib/Stripe/lib/SingletonApiResource.php CHANGED
@@ -22,7 +22,9 @@ abstract class SingletonApiResource extends ApiResource
22
  */
23
  public static function classUrl()
24
  {
25
- $base = static::className();
 
 
26
  return "/v1/${base}";
27
  }
28
 
22
  */
23
  public static function classUrl()
24
  {
25
+ // Replace dots with slashes for namespaced resources, e.g. if the object's name is
26
+ // "foo.bar", then its URL will be "/v1/foo/bar".
27
+ $base = str_replace('.', '/', static::OBJECT_NAME);
28
  return "/v1/${base}";
29
  }
30
 
includes/lib/Stripe/lib/Source.php CHANGED
@@ -5,73 +5,84 @@ namespace Stripe;
5
  /**
6
  * Class Source
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class Source extends ApiResource
11
  {
12
- /**
13
- * @param array|string $id The ID of the source to retrieve, or an options
14
- * array containing an `id` key.
15
- * @param array|string|null $opts
16
- *
17
- * @return Source
18
- */
19
- public static function retrieve($id, $opts = null)
20
- {
21
- return self::_retrieve($id, $opts);
22
- }
23
 
24
- /**
25
- * @param array|null $params
26
- * @param array|string|null $opts
27
- *
28
- * @return Collection of Sources
29
- */
30
- public static function all($params = null, $opts = null)
31
- {
32
- return self::_all($params, $opts);
33
- }
34
 
35
  /**
36
- * @param array|null $params
37
- * @param array|string|null $opts
38
- *
39
- * @return Source The created Source.
40
  */
41
- public static function create($params = null, $opts = null)
42
- {
43
- return self::_create($params, $opts);
44
- }
45
 
46
  /**
47
- * @param string $id The ID of the source to update.
48
- * @param array|null $params
49
- * @param array|string|null $options
50
- *
51
- * @return Source The updated source.
52
  */
53
- public static function update($id, $params = null, $options = null)
54
- {
55
- return self::_update($id, $params, $options);
56
- }
 
57
 
58
  /**
59
- * @param array|string|null $opts
60
- *
61
- * @return Source The saved source.
62
  */
63
- public function save($opts = null)
64
- {
65
- return $this->_save($opts);
66
- }
67
 
68
  /**
69
  * @param array|null $params
70
- * @param array|string|null $opts
71
  *
72
- * @return Source The deleted source.
73
  */
74
- public function delete($params = null, $options = null)
75
  {
76
  self::_validateParams($params);
77
 
@@ -93,9 +104,8 @@ class Source extends ApiResource
93
  $this->refreshFrom($response, $opts);
94
  return $this;
95
  } else {
96
- $message = "Source objects cannot be deleted, they can only be "
97
- . "detached from customer objects. This source object does not "
98
- . "appear to be currently attached to a customer object.";
99
  throw new Error\Api($message);
100
  }
101
  }
@@ -104,7 +114,35 @@ class Source extends ApiResource
104
  * @param array|null $params
105
  * @param array|string|null $options
106
  *
107
- * @return BankAccount The verified bank account.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  */
109
  public function verify($params = null, $options = null)
110
  {
5
  /**
6
  * Class Source
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property mixed $ach_credit_transfer
11
+ * @property mixed $ach_debit
12
+ * @property mixed $alipay
13
+ * @property int $amount
14
+ * @property mixed $bancontact
15
+ * @property mixed $card
16
+ * @property mixed $card_present
17
+ * @property string $client_secret
18
+ * @property mixed $code_verification
19
+ * @property int $created
20
+ * @property string $currency
21
+ * @property string $customer
22
+ * @property mixed $eps
23
+ * @property string $flow
24
+ * @property mixed $giropay
25
+ * @property mixed $ideal
26
+ * @property bool $livemode
27
+ * @property StripeObject $metadata
28
+ * @property mixed $multibanco
29
+ * @property mixed $owner
30
+ * @property mixed $p24
31
+ * @property mixed $receiver
32
+ * @property mixed $redirect
33
+ * @property mixed $sepa_debit
34
+ * @property mixed $sofort
35
+ * @property string $statement_descriptor
36
+ * @property string $status
37
+ * @property mixed $three_d_secure
38
+ * @property string $type
39
+ * @property string $usage
40
+ * @property mixed $wechat
41
+
42
  * @package Stripe
43
  */
44
  class Source extends ApiResource
45
  {
 
 
 
 
 
 
 
 
 
 
 
46
 
47
+ const OBJECT_NAME = "source";
48
+
49
+ use ApiOperations\Create;
50
+ use ApiOperations\Retrieve;
51
+ use ApiOperations\Update;
 
 
 
 
 
52
 
53
  /**
54
+ * Possible string representations of source flows.
55
+ * @link https://stripe.com/docs/api#source_object-flow
 
 
56
  */
57
+ const FLOW_REDIRECT = 'redirect';
58
+ const FLOW_RECEIVER = 'receiver';
59
+ const FLOW_CODE_VERIFICATION = 'code_verification';
60
+ const FLOW_NONE = 'none';
61
 
62
  /**
63
+ * Possible string representations of source statuses.
64
+ * @link https://stripe.com/docs/api#source_object-status
 
 
 
65
  */
66
+ const STATUS_CANCELED = 'canceled';
67
+ const STATUS_CHARGEABLE = 'chargeable';
68
+ const STATUS_CONSUMED = 'consumed';
69
+ const STATUS_FAILED = 'failed';
70
+ const STATUS_PENDING = 'pending';
71
 
72
  /**
73
+ * Possible string representations of source usage.
74
+ * @link https://stripe.com/docs/api#source_object-usage
 
75
  */
76
+ const USAGE_REUSABLE = 'reusable';
77
+ const USAGE_SINGLE_USE = 'single_use';
 
 
78
 
79
  /**
80
  * @param array|null $params
81
+ * @param array|string|null $options
82
  *
83
+ * @return Source The detached source.
84
  */
85
+ public function detach($params = null, $options = null)
86
  {
87
  self::_validateParams($params);
88
 
104
  $this->refreshFrom($response, $opts);
105
  return $this;
106
  } else {
107
+ $message = "This source object does not appear to be currently attached "
108
+ . "to a customer object.";
 
109
  throw new Error\Api($message);
110
  }
111
  }
114
  * @param array|null $params
115
  * @param array|string|null $options
116
  *
117
+ * @return Source The detached source.
118
+ *
119
+ * @deprecated Use the `detach` method instead.
120
+ */
121
+ public function delete($params = null, $options = null)
122
+ {
123
+ $this->detach($params, $options);
124
+ }
125
+
126
+ /**
127
+ * @param array|null $params
128
+ * @param array|string|null $options
129
+ *
130
+ * @return Collection The list of source transactions.
131
+ */
132
+ public function sourceTransactions($params = null, $options = null)
133
+ {
134
+ $url = $this->instanceUrl() . '/source_transactions';
135
+ list($response, $opts) = $this->_request('get', $url, $params, $options);
136
+ $obj = Util\Util::convertToStripeObject($response, $opts);
137
+ $obj->setLastResponse($response);
138
+ return $obj;
139
+ }
140
+
141
+ /**
142
+ * @param array|null $params
143
+ * @param array|string|null $options
144
+ *
145
+ * @return Source The verified source.
146
  */
147
  public function verify($params = null, $options = null)
148
  {
includes/lib/Stripe/lib/SourceTransaction.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class SourceTransaction
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property int $created
12
+ * @property string $customer_data
13
+ * @property string $currency
14
+ * @property string $type
15
+ * @property mixed $ach_credit_transfer
16
+ *
17
+ * @package Stripe
18
+ */
19
+ class SourceTransaction extends ApiResource
20
+ {
21
+
22
+ const OBJECT_NAME = "source_transaction";
23
+ }
includes/lib/Stripe/lib/Stripe.php CHANGED
@@ -22,7 +22,7 @@ class Stripe
22
  public static $connectBase = 'https://connect.stripe.com';
23
 
24
  // @var string The base URL for the Stripe API uploads endpoint.
25
- public static $apiUploadBase = 'https://uploads.stripe.com';
26
 
27
  // @var string|null The version of the Stripe API to use for requests.
28
  public static $apiVersion = null;
@@ -30,6 +30,9 @@ class Stripe
30
  // @var string|null The account ID for connected accounts requests.
31
  public static $accountId = null;
32
 
 
 
 
33
  // @var boolean Defaults to true.
34
  public static $verifySslCerts = true;
35
 
@@ -40,7 +43,19 @@ class Stripe
40
  // produce messages.
41
  public static $logger = null;
42
 
43
- const VERSION = '5.2.2';
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  /**
46
  * @return string The API key used for requests.
@@ -116,6 +131,30 @@ class Stripe
116
  self::$apiVersion = $apiVersion;
117
  }
118
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  /**
120
  * @return boolean
121
  */
@@ -163,13 +202,64 @@ class Stripe
163
  * @param string $appVersion The application's version
164
  * @param string $appUrl The application's URL
165
  */
166
- public static function setAppInfo($appName, $appVersion = null, $appUrl = null)
167
  {
168
- if (self::$appInfo === null) {
169
- self::$appInfo = array();
170
- }
171
  self::$appInfo['name'] = $appName;
172
- self::$appInfo['version'] = $appVersion;
173
  self::$appInfo['url'] = $appUrl;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  }
175
  }
22
  public static $connectBase = 'https://connect.stripe.com';
23
 
24
  // @var string The base URL for the Stripe API uploads endpoint.
25
+ public static $apiUploadBase = 'https://files.stripe.com';
26
 
27
  // @var string|null The version of the Stripe API to use for requests.
28
  public static $apiVersion = null;
30
  // @var string|null The account ID for connected accounts requests.
31
  public static $accountId = null;
32
 
33
+ // @var string Path to the CA bundle used to verify SSL certificates
34
+ public static $caBundlePath = null;
35
+
36
  // @var boolean Defaults to true.
37
  public static $verifySslCerts = true;
38
 
43
  // produce messages.
44
  public static $logger = null;
45
 
46
+ // @var int Maximum number of request retries
47
+ public static $maxNetworkRetries = 0;
48
+
49
+ // @var boolean Whether client telemetry is enabled. Defaults to false.
50
+ public static $enableTelemetry = true;
51
+
52
+ // @var float Maximum delay between retries, in seconds
53
+ private static $maxNetworkRetryDelay = 2.0;
54
+
55
+ // @var float Initial delay between retries, in seconds
56
+ private static $initialNetworkRetryDelay = 0.5;
57
+
58
+ const VERSION = '6.40.0';
59
 
60
  /**
61
  * @return string The API key used for requests.
131
  self::$apiVersion = $apiVersion;
132
  }
133
 
134
+ /**
135
+ * @return string
136
+ */
137
+ private static function getDefaultCABundlePath()
138
+ {
139
+ return realpath(dirname(__FILE__) . '/../data/ca-certificates.crt');
140
+ }
141
+
142
+ /**
143
+ * @return string
144
+ */
145
+ public static function getCABundlePath()
146
+ {
147
+ return self::$caBundlePath ?: self::getDefaultCABundlePath();
148
+ }
149
+
150
+ /**
151
+ * @param string $caBundlePath
152
+ */
153
+ public static function setCABundlePath($caBundlePath)
154
+ {
155
+ self::$caBundlePath = $caBundlePath;
156
+ }
157
+
158
  /**
159
  * @return boolean
160
  */
202
  * @param string $appVersion The application's version
203
  * @param string $appUrl The application's URL
204
  */
205
+ public static function setAppInfo($appName, $appVersion = null, $appUrl = null, $appPartnerId = null)
206
  {
207
+ self::$appInfo = self::$appInfo ?: [];
 
 
208
  self::$appInfo['name'] = $appName;
209
+ self::$appInfo['partner_id'] = $appPartnerId;
210
  self::$appInfo['url'] = $appUrl;
211
+ self::$appInfo['version'] = $appVersion;
212
+ }
213
+
214
+ /**
215
+ * @return int Maximum number of request retries
216
+ */
217
+ public static function getMaxNetworkRetries()
218
+ {
219
+ return self::$maxNetworkRetries;
220
+ }
221
+
222
+ /**
223
+ * @param int $maxNetworkRetries Maximum number of request retries
224
+ */
225
+ public static function setMaxNetworkRetries($maxNetworkRetries)
226
+ {
227
+ self::$maxNetworkRetries = $maxNetworkRetries;
228
+ }
229
+
230
+ /**
231
+ * @return float Maximum delay between retries, in seconds
232
+ */
233
+ public static function getMaxNetworkRetryDelay()
234
+ {
235
+ return self::$maxNetworkRetryDelay;
236
+ }
237
+
238
+ /**
239
+ * @return float Initial delay between retries, in seconds
240
+ */
241
+ public static function getInitialNetworkRetryDelay()
242
+ {
243
+ return self::$initialNetworkRetryDelay;
244
+ }
245
+
246
+ /**
247
+ * @return bool Whether client telemetry is enabled
248
+ */
249
+ public static function getEnableTelemetry()
250
+ {
251
+ return self::$enableTelemetry;
252
+ }
253
+
254
+ /**
255
+ * @param bool $enableTelemetry Enables client telemetry.
256
+ *
257
+ * Client telemetry enables timing and request metrics to be sent back to Stripe as an HTTP Header
258
+ * with the current request. This enables Stripe to do latency and metrics analysis without adding extra
259
+ * overhead (such as extra network calls) on the client.
260
+ */
261
+ public static function setEnableTelemetry($enableTelemetry)
262
+ {
263
+ self::$enableTelemetry = $enableTelemetry;
264
  }
265
  }
includes/lib/Stripe/lib/StripeObject.php CHANGED
@@ -2,120 +2,151 @@
2
 
3
  namespace Stripe;
4
 
5
- use ArrayAccess;
6
- use InvalidArgumentException;
7
-
8
  /**
9
  * Class StripeObject
10
  *
11
  * @package Stripe
12
  */
13
- class StripeObject implements ArrayAccess, JsonSerializable
14
  {
15
- /**
16
- * @var Util\Set Attributes that should not be sent to the API because
17
- * they're not updatable (e.g. API key, ID).
18
- */
19
- public static $permanentAttributes;
20
- /**
21
- * @var Util\Set Attributes that are nested but still updatable from
22
- * the parent class's URL (e.g. metadata).
23
- */
24
- public static $nestedUpdatableAttributes;
25
-
26
- public static function init()
27
- {
28
- self::$permanentAttributes = new Util\Set(array('_opts', 'id'));
29
- self::$nestedUpdatableAttributes = new Util\Set(array(
30
- 'metadata', 'legal_entity', 'address', 'dob', 'payout_schedule', 'transfer_schedule', 'verification',
31
- 'tos_acceptance', 'personal_address', 'address_kana', 'address_kanji', 'shipping',
32
- // will make the array into an AttachedObject: weird, but works for now
33
- 'additional_owners', 0, 1, 2, 3, 4, // Max 3, but leave the 4th so errors work properly
34
- 'inventory',
35
- 'owner',
36
- ));
37
- }
38
 
39
  /**
40
- * @return object The last response from the Stripe API
 
41
  */
42
- public function getLastResponse()
43
  {
44
- return $this->_lastResponse;
 
 
 
 
 
 
45
  }
46
 
47
  /**
48
- * @param ApiResponse
 
 
 
 
 
 
 
 
 
49
  *
50
- * @return void Set the last response from the Stripe API
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  */
52
- public function setLastResponse($resp)
53
  {
54
- $this->_lastResponse = $resp;
 
 
 
 
 
 
 
 
 
 
 
 
55
  }
56
 
57
- protected $_opts;
58
- protected $_values;
59
- protected $_unsavedValues;
60
- protected $_transientValues;
61
- protected $_retrieveOptions;
62
- protected $_lastResponse;
63
-
64
  public function __construct($id = null, $opts = null)
65
  {
66
- $this->_opts = $opts ? $opts : new Util\RequestOptions();
67
- $this->_values = array();
 
 
68
  $this->_unsavedValues = new Util\Set();
69
  $this->_transientValues = new Util\Set();
70
-
71
- $this->_retrieveOptions = array();
72
- if (is_array($id)) {
73
- foreach ($id as $key => $value) {
74
- if ($key != 'id') {
75
- $this->_retrieveOptions[$key] = $value;
76
- }
77
- }
78
- $id = $id['id'];
79
- }
80
-
81
  if ($id !== null) {
82
- $this->id = $id;
83
  }
84
  }
85
 
86
  // Standard accessor magic methods
87
  public function __set($k, $v)
88
  {
 
 
 
 
 
 
 
89
  if ($v === "") {
90
- throw new InvalidArgumentException(
91
  'You cannot set \''.$k.'\'to an empty string. '
92
  .'We interpret empty strings as NULL in requests. '
93
  .'You may set obj->'.$k.' = NULL to delete the property'
94
  );
95
  }
96
 
97
- if (self::$nestedUpdatableAttributes->includes($k)
98
- && isset($this->$k) && $this->$k instanceof AttachedObject && is_array($v)) {
99
- $this->$k->replaceWith($v);
100
- } else {
101
- // TODO: may want to clear from $_transientValues (Won't be user-visible).
102
- $this->_values[$k] = $v;
103
- }
104
- if (!self::$permanentAttributes->includes($k)) {
105
- $this->_unsavedValues->add($k);
106
- }
107
  }
108
 
109
  public function __isset($k)
110
  {
111
  return isset($this->_values[$k]);
112
  }
 
113
  public function __unset($k)
114
  {
115
  unset($this->_values[$k]);
116
  $this->_transientValues->add($k);
117
  $this->_unsavedValues->discard($k);
118
  }
 
119
  public function &__get($k)
120
  {
121
  // function should return a reference, using $nullval to return a reference to null
@@ -140,6 +171,12 @@ class StripeObject implements ArrayAccess, JsonSerializable
140
  }
141
  }
142
 
 
 
 
 
 
 
143
  // ArrayAccess methods
144
  public function offsetSet($k, $v)
145
  {
@@ -155,25 +192,37 @@ class StripeObject implements ArrayAccess, JsonSerializable
155
  {
156
  unset($this->$k);
157
  }
 
158
  public function offsetGet($k)
159
  {
160
  return array_key_exists($k, $this->_values) ? $this->_values[$k] : null;
161
  }
162
 
 
 
 
 
 
 
163
  public function keys()
164
  {
165
  return array_keys($this->_values);
166
  }
167
 
 
 
 
 
 
168
  /**
169
  * This unfortunately needs to be public to be used in Util\Util
170
  *
171
  * @param array $values
172
- * @param array $opts
173
  *
174
- * @return StripeObject The object constructed from the given values.
175
  */
176
- public static function constructFrom($values, $opts)
177
  {
178
  $obj = new static(isset($values['id']) ? $values['id'] : null);
179
  $obj->refreshFrom($values, $opts);
@@ -184,16 +233,18 @@ class StripeObject implements ArrayAccess, JsonSerializable
184
  * Refreshes this object using the provided values.
185
  *
186
  * @param array $values
187
- * @param array|Util\RequestOptions $opts
188
  * @param boolean $partial Defaults to false.
189
  */
190
  public function refreshFrom($values, $opts, $partial = false)
191
  {
192
- if (is_array($opts)) {
193
- $opts = Util\RequestOptions::parse($opts);
194
- }
195
 
196
- $this->_opts = $opts;
 
 
 
 
197
 
198
  // Wipe old state before setting new. This is useful for e.g. updating a
199
  // customer, where there is no persistent card parameter. Mark those values
@@ -201,30 +252,43 @@ class StripeObject implements ArrayAccess, JsonSerializable
201
  if ($partial) {
202
  $removed = new Util\Set();
203
  } else {
204
- $removed = array_diff(array_keys($this->_values), array_keys($values));
205
  }
206
 
207
- foreach ($removed as $k) {
208
- if (self::$permanentAttributes->includes($k)) {
209
- continue;
210
- }
211
-
212
  unset($this->$k);
213
  }
214
 
 
215
  foreach ($values as $k => $v) {
216
- if (self::$permanentAttributes->includes($k) && isset($this[$k])) {
217
- continue;
218
- }
 
219
 
220
- if (self::$nestedUpdatableAttributes->includes($k) && is_array($v)) {
221
- $this->_values[$k] = AttachedObject::constructFrom($v, $opts);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
222
  } else {
223
  $this->_values[$k] = Util\Util::convertToStripeObject($v, $opts);
224
  }
225
-
226
- $this->_transientValues->discard($k);
227
- $this->_unsavedValues->discard($k);
 
228
  }
229
  }
230
 
@@ -232,33 +296,107 @@ class StripeObject implements ArrayAccess, JsonSerializable
232
  * @return array A recursive mapping of attributes to values for this object,
233
  * including the proper value for deleted attributes.
234
  */
235
- public function serializeParameters()
236
  {
237
- $params = array();
238
- if ($this->_unsavedValues) {
239
- foreach ($this->_unsavedValues->toArray() as $k) {
240
- $v = $this->$k;
241
- if ($v === null) {
242
- $v = '';
243
- }
244
-
245
- $params[$k] = $v;
 
 
 
 
 
 
 
 
 
 
 
 
246
  }
247
  }
248
 
249
- // Get nested updates.
250
- foreach (self::$nestedUpdatableAttributes->toArray() as $property) {
251
- if (isset($this->$property)) {
252
- if ($this->$property instanceof StripeObject) {
253
- $serialized = $this->$property->serializeParameters();
254
- if ($serialized) {
255
- $params[$property] = $serialized;
256
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  }
 
 
 
 
 
 
 
 
258
  }
 
 
 
259
  }
260
-
261
- return $params;
262
  }
263
 
264
  public function jsonSerialize()
@@ -268,11 +406,7 @@ class StripeObject implements ArrayAccess, JsonSerializable
268
 
269
  public function __toJSON()
270
  {
271
- if (defined('JSON_PRETTY_PRINT')) {
272
- return json_encode($this->__toArray(true), JSON_PRETTY_PRINT);
273
- } else {
274
- return json_encode($this->__toArray(true));
275
- }
276
  }
277
 
278
  public function __toString()
@@ -289,6 +423,101 @@ class StripeObject implements ArrayAccess, JsonSerializable
289
  return $this->_values;
290
  }
291
  }
292
- }
293
 
294
- StripeObject::init();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  namespace Stripe;
4
 
 
 
 
5
  /**
6
  * Class StripeObject
7
  *
8
  * @package Stripe
9
  */
10
+ class StripeObject implements \ArrayAccess, \Countable, \JsonSerializable
11
  {
12
+ protected $_opts;
13
+ protected $_originalValues;
14
+ protected $_values;
15
+ protected $_unsavedValues;
16
+ protected $_transientValues;
17
+ protected $_retrieveOptions;
18
+ protected $_lastResponse;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
  /**
21
+ * @return Util\Set Attributes that should not be sent to the API because
22
+ * they're not updatable (e.g. ID).
23
  */
24
+ public static function getPermanentAttributes()
25
  {
26
+ static $permanentAttributes = null;
27
+ if ($permanentAttributes === null) {
28
+ $permanentAttributes = new Util\Set([
29
+ 'id',
30
+ ]);
31
+ }
32
+ return $permanentAttributes;
33
  }
34
 
35
  /**
36
+ * Additive objects are subobjects in the API that don't have the same
37
+ * semantics as most subobjects, which are fully replaced when they're set.
38
+ * This is best illustrated by example. The `source` parameter sent when
39
+ * updating a subscription is *not* additive; if we set it:
40
+ *
41
+ * source[object]=card&source[number]=123
42
+ *
43
+ * We expect the old `source` object to have been overwritten completely. If
44
+ * the previous source had an `address_state` key associated with it and we
45
+ * didn't send one this time, that value of `address_state` is gone.
46
  *
47
+ * By contrast, additive objects are those that will have new data added to
48
+ * them while keeping any existing data in place. The only known case of its
49
+ * use is for `metadata`, but it could in theory be more general. As an
50
+ * example, say we have a `metadata` object that looks like this on the
51
+ * server side:
52
+ *
53
+ * metadata = ["old" => "old_value"]
54
+ *
55
+ * If we update the object with `metadata[new]=new_value`, the server side
56
+ * object now has *both* fields:
57
+ *
58
+ * metadata = ["old" => "old_value", "new" => "new_value"]
59
+ *
60
+ * This is okay in itself because usually users will want to treat it as
61
+ * additive:
62
+ *
63
+ * $obj->metadata["new"] = "new_value";
64
+ * $obj->save();
65
+ *
66
+ * However, in other cases, they may want to replace the entire existing
67
+ * contents:
68
+ *
69
+ * $obj->metadata = ["new" => "new_value"];
70
+ * $obj->save();
71
+ *
72
+ * This is where things get a little bit tricky because in order to clear
73
+ * any old keys that may have existed, we actually have to send an explicit
74
+ * empty string to the server. So the operation above would have to send
75
+ * this form to get the intended behavior:
76
+ *
77
+ * metadata[old]=&metadata[new]=new_value
78
+ *
79
+ * This method allows us to track which parameters are considered additive,
80
+ * and lets us behave correctly where appropriate when serializing
81
+ * parameters to be sent.
82
+ *
83
+ * @return Util\Set Set of additive parameters
84
  */
85
+ public static function getAdditiveParams()
86
  {
87
+ static $additiveParams = null;
88
+ if ($additiveParams === null) {
89
+ // Set `metadata` as additive so that when it's set directly we remember
90
+ // to clear keys that may have been previously set by sending empty
91
+ // values for them.
92
+ //
93
+ // It's possible that not every object has `metadata`, but having this
94
+ // option set when there is no `metadata` field is not harmful.
95
+ $additiveParams = new Util\Set([
96
+ 'metadata',
97
+ ]);
98
+ }
99
+ return $additiveParams;
100
  }
101
 
 
 
 
 
 
 
 
102
  public function __construct($id = null, $opts = null)
103
  {
104
+ list($id, $this->_retrieveOptions) = Util\Util::normalizeId($id);
105
+ $this->_opts = Util\RequestOptions::parse($opts);
106
+ $this->_originalValues = [];
107
+ $this->_values = [];
108
  $this->_unsavedValues = new Util\Set();
109
  $this->_transientValues = new Util\Set();
 
 
 
 
 
 
 
 
 
 
 
110
  if ($id !== null) {
111
+ $this->_values['id'] = $id;
112
  }
113
  }
114
 
115
  // Standard accessor magic methods
116
  public function __set($k, $v)
117
  {
118
+ if (static::getPermanentAttributes()->includes($k)) {
119
+ throw new \InvalidArgumentException(
120
+ "Cannot set $k on this object. HINT: you can't set: " .
121
+ join(', ', static::getPermanentAttributes()->toArray())
122
+ );
123
+ }
124
+
125
  if ($v === "") {
126
+ throw new \InvalidArgumentException(
127
  'You cannot set \''.$k.'\'to an empty string. '
128
  .'We interpret empty strings as NULL in requests. '
129
  .'You may set obj->'.$k.' = NULL to delete the property'
130
  );
131
  }
132
 
133
+ $this->_values[$k] = Util\Util::convertToStripeObject($v, $this->_opts);
134
+ $this->dirtyValue($this->_values[$k]);
135
+ $this->_unsavedValues->add($k);
 
 
 
 
 
 
 
136
  }
137
 
138
  public function __isset($k)
139
  {
140
  return isset($this->_values[$k]);
141
  }
142
+
143
  public function __unset($k)
144
  {
145
  unset($this->_values[$k]);
146
  $this->_transientValues->add($k);
147
  $this->_unsavedValues->discard($k);
148
  }
149
+
150
  public function &__get($k)
151
  {
152
  // function should return a reference, using $nullval to return a reference to null
171
  }
172
  }
173
 
174
+ // Magic method for var_dump output. Only works with PHP >= 5.6
175
+ public function __debugInfo()
176
+ {
177
+ return $this->_values;
178
+ }
179
+
180
  // ArrayAccess methods
181
  public function offsetSet($k, $v)
182
  {
192
  {
193
  unset($this->$k);
194
  }
195
+
196
  public function offsetGet($k)
197
  {
198
  return array_key_exists($k, $this->_values) ? $this->_values[$k] : null;
199
  }
200
 
201
+ // Countable method
202
+ public function count()
203
+ {
204
+ return count($this->_values);
205
+ }
206
+
207
  public function keys()
208
  {
209
  return array_keys($this->_values);
210
  }
211
 
212
+ public function values()
213
+ {
214
+ return array_values($this->_values);
215
+ }
216
+
217
  /**
218
  * This unfortunately needs to be public to be used in Util\Util
219
  *
220
  * @param array $values
221
+ * @param null|string|array|Util\RequestOptions $opts
222
  *
223
+ * @return static The object constructed from the given values.
224
  */
225
+ public static function constructFrom($values, $opts = null)
226
  {
227
  $obj = new static(isset($values['id']) ? $values['id'] : null);
228
  $obj->refreshFrom($values, $opts);
233
  * Refreshes this object using the provided values.
234
  *
235
  * @param array $values
236
+ * @param null|string|array|Util\RequestOptions $opts
237
  * @param boolean $partial Defaults to false.
238
  */
239
  public function refreshFrom($values, $opts, $partial = false)
240
  {
241
+ $this->_opts = Util\RequestOptions::parse($opts);
 
 
242
 
243
+ $this->_originalValues = self::deepCopy($values);
244
+
245
+ if ($values instanceof StripeObject) {
246
+ $values = $values->__toArray(true);
247
+ }
248
 
249
  // Wipe old state before setting new. This is useful for e.g. updating a
250
  // customer, where there is no persistent card parameter. Mark those values
252
  if ($partial) {
253
  $removed = new Util\Set();
254
  } else {
255
+ $removed = new Util\Set(array_diff(array_keys($this->_values), array_keys($values)));
256
  }
257
 
258
+ foreach ($removed->toArray() as $k) {
 
 
 
 
259
  unset($this->$k);
260
  }
261
 
262
+ $this->updateAttributes($values, $opts, false);
263
  foreach ($values as $k => $v) {
264
+ $this->_transientValues->discard($k);
265
+ $this->_unsavedValues->discard($k);
266
+ }
267
+ }
268
 
269
+ /**
270
+ * Mass assigns attributes on the model.
271
+ *
272
+ * @param array $values
273
+ * @param null|string|array|Util\RequestOptions $opts
274
+ * @param boolean $dirty Defaults to true.
275
+ */
276
+ public function updateAttributes($values, $opts = null, $dirty = true)
277
+ {
278
+ foreach ($values as $k => $v) {
279
+ // Special-case metadata to always be cast as a StripeObject
280
+ // This is necessary in case metadata is empty, as PHP arrays do
281
+ // not differentiate between lists and hashes, and we consider
282
+ // empty arrays to be lists.
283
+ if (($k === "metadata") && (is_array($v))) {
284
+ $this->_values[$k] = StripeObject::constructFrom($v, $opts);
285
  } else {
286
  $this->_values[$k] = Util\Util::convertToStripeObject($v, $opts);
287
  }
288
+ if ($dirty) {
289
+ $this->dirtyValue($this->_values[$k]);
290
+ }
291
+ $this->_unsavedValues->add($k);
292
  }
293
  }
294
 
296
  * @return array A recursive mapping of attributes to values for this object,
297
  * including the proper value for deleted attributes.
298
  */
299
+ public function serializeParameters($force = false)
300
  {
301
+ $updateParams = [];
302
+
303
+ foreach ($this->_values as $k => $v) {
304
+ // There are a few reasons that we may want to add in a parameter for
305
+ // update:
306
+ //
307
+ // 1. The `$force` option has been set.
308
+ // 2. We know that it was modified.
309
+ // 3. Its value is a StripeObject. A StripeObject may contain modified
310
+ // values within in that its parent StripeObject doesn't know about.
311
+ //
312
+ $original = array_key_exists($k, $this->_originalValues) ? $this->_originalValues[$k] : null;
313
+ $unsaved = $this->_unsavedValues->includes($k);
314
+ if ($force || $unsaved || $v instanceof StripeObject) {
315
+ $updateParams[$k] = $this->serializeParamsValue(
316
+ $this->_values[$k],
317
+ $original,
318
+ $unsaved,
319
+ $force,
320
+ $k
321
+ );
322
  }
323
  }
324
 
325
+ // a `null` that makes it out of `serializeParamsValue` signals an empty
326
+ // value that we shouldn't appear in the serialized form of the object
327
+ $updateParams = array_filter(
328
+ $updateParams,
329
+ function ($v) {
330
+ return $v !== null;
331
+ }
332
+ );
333
+
334
+ return $updateParams;
335
+ }
336
+
337
+
338
+ public function serializeParamsValue($value, $original, $unsaved, $force, $key = null)
339
+ {
340
+ // The logic here is that essentially any object embedded in another
341
+ // object that had a `type` is actually an API resource of a different
342
+ // type that's been included in the response. These other resources must
343
+ // be updated from their proper endpoints, and therefore they are not
344
+ // included when serializing even if they've been modified.
345
+ //
346
+ // There are _some_ known exceptions though.
347
+ //
348
+ // For example, if the value is unsaved (meaning the user has set it), and
349
+ // it looks like the API resource is persisted with an ID, then we include
350
+ // the object so that parameters are serialized with a reference to its
351
+ // ID.
352
+ //
353
+ // Another example is that on save API calls it's sometimes desirable to
354
+ // update a customer's default source by setting a new card (or other)
355
+ // object with `->source=` and then saving the customer. The
356
+ // `saveWithParent` flag to override the default behavior allows us to
357
+ // handle these exceptions.
358
+ //
359
+ // We throw an error if a property was set explicitly but we can't do
360
+ // anything with it because the integration is probably not working as the
361
+ // user intended it to.
362
+ if ($value === null) {
363
+ return "";
364
+ } elseif (($value instanceof APIResource) && (!$value->saveWithParent)) {
365
+ if (!$unsaved) {
366
+ return null;
367
+ } elseif (isset($value->id)) {
368
+ return $value;
369
+ } else {
370
+ throw new \InvalidArgumentException(
371
+ "Cannot save property `$key` containing an API resource of type " .
372
+ get_class($value) . ". It doesn't appear to be persisted and is " .
373
+ "not marked as `saveWithParent`."
374
+ );
375
+ }
376
+ } elseif (is_array($value)) {
377
+ if (Util\Util::isList($value)) {
378
+ // Sequential array, i.e. a list
379
+ $update = [];
380
+ foreach ($value as $v) {
381
+ array_push($update, $this->serializeParamsValue($v, null, true, $force));
382
+ }
383
+ // This prevents an array that's unchanged from being resent.
384
+ if ($update !== $this->serializeParamsValue($original, null, true, $force, $key)) {
385
+ return $update;
386
  }
387
+ } else {
388
+ // Associative array, i.e. a map
389
+ return Util\Util::convertToStripeObject($value, $this->_opts)->serializeParameters();
390
+ }
391
+ } elseif ($value instanceof StripeObject) {
392
+ $update = $value->serializeParameters($force);
393
+ if ($original && $unsaved && $key && static::getAdditiveParams()->includes($key)) {
394
+ $update = array_merge(self::emptyValues($original), $update);
395
  }
396
+ return $update;
397
+ } else {
398
+ return $value;
399
  }
 
 
400
  }
401
 
402
  public function jsonSerialize()
406
 
407
  public function __toJSON()
408
  {
409
+ return json_encode($this->__toArray(true), JSON_PRETTY_PRINT);
 
 
 
 
410
  }
411
 
412
  public function __toString()
423
  return $this->_values;
424
  }
425
  }
 
426
 
427
+ /**
428
+ * Sets all keys within the StripeObject as unsaved so that they will be
429
+ * included with an update when `serializeParameters` is called. This
430
+ * method is also recursive, so any StripeObjects contained as values or
431
+ * which are values in a tenant array are also marked as dirty.
432
+ */
433
+ public function dirty()
434
+ {
435
+ $this->_unsavedValues = new Util\Set(array_keys($this->_values));
436
+ foreach ($this->_values as $k => $v) {
437
+ $this->dirtyValue($v);
438
+ }
439
+ }
440
+
441
+ protected function dirtyValue($value)
442
+ {
443
+ if (is_array($value)) {
444
+ foreach ($value as $v) {
445
+ $this->dirtyValue($v);
446
+ }
447
+ } elseif ($value instanceof StripeObject) {
448
+ $value->dirty();
449
+ }
450
+ }
451
+
452
+ /**
453
+ * Produces a deep copy of the given object including support for arrays
454
+ * and StripeObjects.
455
+ */
456
+ protected static function deepCopy($obj)
457
+ {
458
+ if (is_array($obj)) {
459
+ $copy = [];
460
+ foreach ($obj as $k => $v) {
461
+ $copy[$k] = self::deepCopy($v);
462
+ }
463
+ return $copy;
464
+ } elseif ($obj instanceof StripeObject) {
465
+ return $obj::constructFrom(
466
+ self::deepCopy($obj->_values),
467
+ clone $obj->_opts
468
+ );
469
+ } else {
470
+ return $obj;
471
+ }
472
+ }
473
+
474
+ /**
475
+ * Returns a hash of empty values for all the values that are in the given
476
+ * StripeObject.
477
+ */
478
+ public static function emptyValues($obj)
479
+ {
480
+ if (is_array($obj)) {
481
+ $values = $obj;
482
+ } elseif ($obj instanceof StripeObject) {
483
+ $values = $obj->_values;
484
+ } else {
485
+ throw new \InvalidArgumentException(
486
+ "empty_values got got unexpected object type: " . get_class($obj)
487
+ );
488
+ }
489
+ $update = array_fill_keys(array_keys($values), "");
490
+ return $update;
491
+ }
492
+
493
+ /**
494
+ * @return object The last response from the Stripe API
495
+ */
496
+ public function getLastResponse()
497
+ {
498
+ return $this->_lastResponse;
499
+ }
500
+
501
+ /**
502
+ * Sets the last response from the Stripe API
503
+ *
504
+ * @param ApiResponse $resp
505
+ * @return void
506
+ */
507
+ public function setLastResponse($resp)
508
+ {
509
+ $this->_lastResponse = $resp;
510
+ }
511
+
512
+ /**
513
+ * Indicates whether or not the resource has been deleted on the server.
514
+ * Note that some, but not all, resources can indicate whether they have
515
+ * been deleted.
516
+ *
517
+ * @return bool Whether the resource is deleted.
518
+ */
519
+ public function isDeleted()
520
+ {
521
+ return isset($this->_values['deleted']) ? $this->_values['deleted'] : false;
522
+ }
523
+ }
includes/lib/Stripe/lib/Subscription.php CHANGED
@@ -5,65 +5,76 @@ namespace Stripe;
5
  /**
6
  * Class Subscription
7
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class Subscription extends ApiResource
11
  {
12
- /**
13
- * These constants are possible representations of the status field.
14
- *
15
- * @link https://stripe.com/docs/api#subscription_object-status
16
- */
17
- const STATUS_ACTIVE = 'active';
18
- const STATUS_CANCELED = 'canceled';
19
- const STATUS_PAST_DUE = 'past_due';
20
- const STATUS_TRIALING = 'trialing';
21
- const STATUS_UNPAID = 'unpaid';
22
 
23
- /**
24
- * @param array|string $id The ID of the subscription to retrieve, or an
25
- * options array containing an `id` key.
26
- * @param array|string|null $opts
27
- *
28
- * @return Subscription
29
- */
30
- public static function retrieve($id, $opts = null)
31
- {
32
- return self::_retrieve($id, $opts);
33
- }
34
 
35
- /**
36
- * @param array|null $params
37
- * @param array|string|null $opts
38
- *
39
- * @return Collection of Subscriptions
40
- */
41
- public static function all($params = null, $opts = null)
42
- {
43
- return self::_all($params, $opts);
44
  }
 
 
45
 
46
  /**
47
- * @param array|null $params
48
- * @param array|string|null $opts
49
  *
50
- * @return Subscription The created subscription.
51
  */
52
- public static function create($params = null, $opts = null)
53
- {
54
- return self::_create($params, $opts);
55
- }
 
 
 
56
 
57
- /**
58
- * @param string $id The ID of the subscription to retrieve.
59
- * @param array|null $params
60
- * @param array|string|null $options
61
- *
62
- * @return Subscription The updated subscription.
63
- */
64
- public static function update($id, $params = null, $options = null)
65
  {
66
- return self::_update($id, $params, $options);
 
 
 
 
 
 
67
  }
68
 
69
  /**
@@ -76,16 +87,6 @@ class Subscription extends ApiResource
76
  return $this->_delete($params, $opts);
77
  }
78
 
79
- /**
80
- * @param array|string|null $opts
81
- *
82
- * @return Subscription The saved subscription.
83
- */
84
- public function save($opts = null)
85
- {
86
- return $this->_save($opts);
87
- }
88
-
89
  /**
90
  * @return Subscription The updated subscription.
91
  */
@@ -93,6 +94,6 @@ class Subscription extends ApiResource
93
  {
94
  $url = $this->instanceUrl() . '/discount';
95
  list($response, $opts) = $this->_request('delete', $url);
96
- $this->refreshFrom(array('discount' => null), $opts, true);
97
  }
98
  }
5
  /**
6
  * Class Subscription
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property float $application_fee_percent
11
+ * @property string $billing
12
+ * @property int $billing_cycle_anchor
13
+ * @property mixed $billing_thresholds
14
+ * @property bool $cancel_at_period_end
15
+ * @property int $canceled_at
16
+ * @property string $collection_method
17
+ * @property int $created
18
+ * @property int $current_period_end
19
+ * @property int $current_period_start
20
+ * @property string $customer
21
+ * @property int $days_until_due
22
+ * @property string $default_payment_method
23
+ * @property string $default_source
24
+ * @property array $default_tax_rates
25
+ * @property Discount $discount
26
+ * @property int $ended_at
27
+ * @property Collection $items
28
+ * @property string $latest_invoice
29
+ * @property boolean $livemode
30
+ * @property StripeObject $metadata
31
+ * @property Plan $plan
32
+ * @property int $quantity
33
+ * @property SubscriptionSchedule $schedule
34
+ * @property int $start
35
+ * @property int $start_date
36
+ * @property string $status
37
+ * @property float $tax_percent
38
+ * @property int $trial_end
39
+ * @property int $trial_start
40
+ *
41
  * @package Stripe
42
  */
43
  class Subscription extends ApiResource
44
  {
 
 
 
 
 
 
 
 
 
 
45
 
46
+ const OBJECT_NAME = "subscription";
 
 
 
 
 
 
 
 
 
 
47
 
48
+ use ApiOperations\All;
49
+ use ApiOperations\Create;
50
+ use ApiOperations\Delete {
51
+ delete as protected _delete;
 
 
 
 
 
52
  }
53
+ use ApiOperations\Retrieve;
54
+ use ApiOperations\Update;
55
 
56
  /**
57
+ * These constants are possible representations of the status field.
 
58
  *
59
+ * @link https://stripe.com/docs/api#subscription_object-status
60
  */
61
+ const STATUS_ACTIVE = 'active';
62
+ const STATUS_CANCELED = 'canceled';
63
+ const STATUS_PAST_DUE = 'past_due';
64
+ const STATUS_TRIALING = 'trialing';
65
+ const STATUS_UNPAID = 'unpaid';
66
+ const STATUS_INCOMPLETE = 'incomplete';
67
+ const STATUS_INCOMPLETE_EXPIRED = 'incomplete_expired';
68
 
69
+ public static function getSavedNestedResources()
 
 
 
 
 
 
 
70
  {
71
+ static $savedNestedResources = null;
72
+ if ($savedNestedResources === null) {
73
+ $savedNestedResources = new Util\Set([
74
+ 'source',
75
+ ]);
76
+ }
77
+ return $savedNestedResources;
78
  }
79
 
80
  /**
87
  return $this->_delete($params, $opts);
88
  }
89
 
 
 
 
 
 
 
 
 
 
 
90
  /**
91
  * @return Subscription The updated subscription.
92
  */
94
  {
95
  $url = $this->instanceUrl() . '/discount';
96
  list($response, $opts) = $this->_request('delete', $url);
97
+ $this->refreshFrom(['discount' => null], $opts, true);
98
  }
99
  }
includes/lib/Stripe/lib/SubscriptionItem.php CHANGED
@@ -5,85 +5,41 @@ namespace Stripe;
5
  /**
6
  * Class SubscriptionItem
7
  *
 
 
 
 
 
 
 
 
 
 
8
  * @package Stripe
9
  */
10
  class SubscriptionItem extends ApiResource
11
  {
12
- /**
13
- * This is a special case because the subscription items endpoint has an
14
- * underscore in it. The parent `className` function strips underscores.
15
- *
16
- * @return string The name of the class.
17
- */
18
- public static function className()
19
- {
20
- return 'subscription_item';
21
- }
22
 
23
- /**
24
- * @param array|string $id The ID of the subscription item to retrieve, or
25
- * an options array containing an `id` key.
26
- * @param array|string|null $opts
27
- *
28
- * @return SubscriptionItem
29
- */
30
- public static function retrieve($id, $opts = null)
31
- {
32
- return self::_retrieve($id, $opts);
33
- }
34
 
35
- /**
36
- * @param array|null $params
37
- * @param array|string|null $opts
38
- *
39
- * @return Collection of SubscriptionItems
40
- */
41
- public static function all($params = null, $opts = null)
42
- {
43
- return self::_all($params, $opts);
44
- }
45
 
46
  /**
47
- * @param array|null $params
48
- * @param array|string|null $opts
49
- *
50
- * @return SubscriptionItem The created subscription item.
51
- */
52
- public static function create($params = null, $opts = null)
53
- {
54
- return self::_create($params, $opts);
55
- }
56
-
57
- /**
58
- * @param string $id The ID of the subscription item to update.
59
  * @param array|null $params
60
  * @param array|string|null $options
61
  *
62
- * @return SubscriptionItem The updated subscription item.
63
- */
64
- public static function update($id, $params = null, $options = null)
65
- {
66
- return self::_update($id, $params, $options);
67
- }
68
-
69
- /**
70
- * @param array|string|null $opts
71
- *
72
- * @return SubscriptionItem The saved subscription item.
73
- */
74
- public function save($opts = null)
75
- {
76
- return $this->_save($opts);
77
- }
78
-
79
- /**
80
- * @param array|null $params
81
- * @param array|string|null $opts
82
- *
83
- * @return SubscriptionItem The deleted subscription item.
84
  */
85
- public function delete($params = null, $opts = null)
86
  {
87
- return $this->_delete($params, $opts);
 
 
 
 
88
  }
89
  }
5
  /**
6
  * Class SubscriptionItem
7
  *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property mixed $billing_thresholds
11
+ * @property int $created
12
+ * @property StripeObject $metadata
13
+ * @property Plan $plan
14
+ * @property int $quantity
15
+ * @property string $subscription
16
+ * @property array $tax_rates
17
+ *
18
  * @package Stripe
19
  */
20
  class SubscriptionItem extends ApiResource
21
  {
 
 
 
 
 
 
 
 
 
 
22
 
23
+ const OBJECT_NAME = "subscription_item";
 
 
 
 
 
 
 
 
 
 
24
 
25
+ use ApiOperations\All;
26
+ use ApiOperations\Create;
27
+ use ApiOperations\Delete;
28
+ use ApiOperations\Retrieve;
29
+ use ApiOperations\Update;
 
 
 
 
 
30
 
31
  /**
 
 
 
 
 
 
 
 
 
 
 
 
32
  * @param array|null $params
33
  * @param array|string|null $options
34
  *
35
+ * @return Collection The list of source transactions.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  */
37
+ public function usageRecordSummaries($params = null, $options = null)
38
  {
39
+ $url = $this->instanceUrl() . '/usage_record_summaries';
40
+ list($response, $opts) = $this->_request('get', $url, $params, $options);
41
+ $obj = Util\Util::convertToStripeObject($response, $opts);
42
+ $obj->setLastResponse($response);
43
+ return $obj;
44
  }
45
  }
includes/lib/Stripe/lib/SubscriptionSchedule.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class SubscriptionSchedule
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $billing
11
+ * @property mixed $billing_thresholds
12
+ * @property int $canceled_at
13
+ * @property int $completed_at
14
+ * @property int $created
15
+ * @property mixed $current_phase
16
+ * @property string $customer
17
+ * @property mixed $invoice_settings
18
+ * @property boolean $livemode
19
+ * @property StripeObject $metadata
20
+ * @property mixed $phases
21
+ * @property int $released_at
22
+ * @property string $released_subscription
23
+ * @property string $renewal_behavior
24
+ * @property mixed $renewal_interval
25
+ * @property string $revision
26
+ * @property string $status
27
+ * @property string $subscription
28
+ *
29
+ * @package Stripe
30
+ */
31
+ class SubscriptionSchedule extends ApiResource
32
+ {
33
+
34
+ const OBJECT_NAME = "subscription_schedule";
35
+
36
+ use ApiOperations\All;
37
+ use ApiOperations\Create;
38
+ use ApiOperations\Retrieve;
39
+ use ApiOperations\Update;
40
+ use ApiOperations\NestedResource;
41
+
42
+ const PATH_REVISIONS = '/revisions';
43
+
44
+ /**
45
+ * @param array|null $params
46
+ * @param array|string|null $opts
47
+ *
48
+ * @return SubscriptionSchedule The canceled subscription schedule.
49
+ */
50
+ public function cancel($params = null, $opts = null)
51
+ {
52
+ $url = $this->instanceUrl() . '/cancel';
53
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
54
+ $this->refreshFrom($response, $opts);
55
+ return $this;
56
+ }
57
+
58
+ /**
59
+ * @param array|null $params
60
+ * @param array|string|null $opts
61
+ *
62
+ * @return SubscriptionSchedule The released subscription schedule.
63
+ */
64
+ public function release($params = null, $opts = null)
65
+ {
66
+ $url = $this->instanceUrl() . '/release';
67
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
68
+ $this->refreshFrom($response, $opts);
69
+ return $this;
70
+ }
71
+
72
+ /**
73
+ * @param array|null $params
74
+ * @param array|string|null $options
75
+ *
76
+ * @return Collection The list of subscription schedule revisions.
77
+ */
78
+ public function revisions($params = null, $options = null)
79
+ {
80
+ $url = $this->instanceUrl() . '/revisions';
81
+ list($response, $opts) = $this->_request('get', $url, $params, $options);
82
+ $obj = Util\Util::convertToStripeObject($response, $opts);
83
+ $obj->setLastResponse($response);
84
+ return $obj;
85
+ }
86
+
87
+ /**
88
+ * @param array|null $id The ID of the subscription schedule to which the person belongs.
89
+ * @param array|null $personId The ID of the person to retrieve.
90
+ * @param array|null $params
91
+ * @param array|string|null $opts
92
+ *
93
+ * @return Revision
94
+ */
95
+ public static function retrieveRevision($id, $personId, $params = null, $opts = null)
96
+ {
97
+ return self::_retrieveNestedResource($id, static::PATH_REVISIONS, $personId, $params, $opts);
98
+ }
99
+
100
+ /**
101
+ * @param array|null $id The ID of the subscription schedule on which to retrieve the persons.
102
+ * @param array|null $params
103
+ * @param array|string|null $opts
104
+ *
105
+ * @return Collection The list of revisions.
106
+ */
107
+ public static function allRevisions($id, $params = null, $opts = null)
108
+ {
109
+ return self::_allNestedResources($id, static::PATH_REVISIONS, $params, $opts);
110
+ }
111
+ }
includes/lib/Stripe/lib/SubscriptionScheduleRevision.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class SubscriptionScheduleRevision
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $created
11
+ * @property mixed $invoice_settings
12
+ * @property boolean $livemode
13
+ * @property mixed $phases
14
+ * @property string $previous_revision
15
+ * @property string $renewal_behavior
16
+ * @property mixed $renewal_interval
17
+ * @property string $schedule
18
+ *
19
+ * @package Stripe
20
+ */
21
+ class SubscriptionScheduleRevision extends ApiResource
22
+ {
23
+
24
+ const OBJECT_NAME = "subscription_schedule_revision";
25
+
26
+ use ApiOperations\All;
27
+ use ApiOperations\Retrieve;
28
+
29
+ /**
30
+ * @return string The API URL for this Subscription Schedule Revision.
31
+ */
32
+ public function instanceUrl()
33
+ {
34
+ $id = $this['id'];
35
+ $schedule = $this['schedule'];
36
+ if (!$id) {
37
+ throw new Error\InvalidRequest(
38
+ "Could not determine which URL to request: " .
39
+ "class instance has invalid ID: $id",
40
+ null
41
+ );
42
+ }
43
+ $id = Util\Util::utf8($id);
44
+ $schedule = Util\Util::utf8($schedule);
45
+
46
+ $base = SubscriptionSchedule::classUrl();
47
+ $scheduleExtn = urlencode($schedule);
48
+ $extn = urlencode($id);
49
+ return "$base/$scheduleExtn/revisions/$extn";
50
+ }
51
+
52
+ /**
53
+ * @param array|string $_id
54
+ * @param array|string|null $_opts
55
+ *
56
+ * @throws \Stripe\Error\InvalidRequest
57
+ */
58
+ public static function retrieve($_id, $_opts = null)
59
+ {
60
+ $msg = "Subscription Schedule Revisions cannot be accessed without a Subscription Schedule ID. " .
61
+ "Retrieve one using \$schedule->retrieveRevision('revision_id') instead.";
62
+ throw new Error\InvalidRequest($msg, null);
63
+ }
64
+
65
+ /**
66
+ * @param array|string $_id
67
+ * @param array|string|null $_opts
68
+ *
69
+ * @throws \Stripe\Error\InvalidRequest
70
+ */
71
+ public static function all($params = null, $opts = null)
72
+ {
73
+ $msg = "Subscription Schedule Revisions cannot be listed without a Subscription Schedule ID. " .
74
+ "List those using \$schedule->allRevisions('revision_id') instead.";
75
+ throw new Error\InvalidRequest($msg, null);
76
+ }
77
+ }
includes/lib/Stripe/lib/TaxId.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class TaxId
7
+ *
8
+ * @package Stripe
9
+ *
10
+ * @property string $id
11
+ * @property string $object
12
+ * @property string $country
13
+ * @property int $created
14
+ * @property string $customer
15
+ * @property bool $livemode
16
+ * @property string $type
17
+ * @property string $value
18
+ * @property mixed $verification
19
+ */
20
+ class TaxId extends ApiResource
21
+ {
22
+
23
+ const OBJECT_NAME = "tax_id";
24
+
25
+ use ApiOperations\Delete;
26
+
27
+ /**
28
+ * Possible string representations of a tax id's type.
29
+ * @link https://stripe.com/docs/api/customer_tax_ids/object#tax_id_object-type
30
+ */
31
+ const TYPE_AU_ABN = 'au_abn';
32
+ const TYPE_EU_VAT = 'eu_vat';
33
+ const TYPE_IN_GST = 'in_gst';
34
+ const TYPE_NO_VAT = 'no_vat';
35
+ const TYPE_NZ_GST = 'nz_gst';
36
+ const TYPE_UNKNOWN = 'unknown';
37
+
38
+ /**
39
+ * Possible string representations of the verification status.
40
+ * @link https://stripe.com/docs/api/customer_tax_ids/object#tax_id_object-verification
41
+ */
42
+ const VERIFICATION_STATUS_PENDING = 'pending';
43
+ const VERIFICATION_STATUS_UNAVAILABLE = 'unavailable';
44
+ const VERIFICATION_STATUS_UNVERIFIED = 'unverified';
45
+ const VERIFICATION_STATUS_VERIFIED = 'verified';
46
+
47
+ /**
48
+ * @return string The API URL for this tax id.
49
+ */
50
+ public function instanceUrl()
51
+ {
52
+ $id = $this['id'];
53
+ $customer = $this['customer'];
54
+ if (!$id) {
55
+ throw new Error\InvalidRequest(
56
+ "Could not determine which URL to request: class instance has invalid ID: $id",
57
+ null
58
+ );
59
+ }
60
+ $id = Util\Util::utf8($id);
61
+ $customer = Util\Util::utf8($customer);
62
+
63
+ $base = Customer::classUrl();
64
+ $customerExtn = urlencode($customer);
65
+ $extn = urlencode($id);
66
+ return "$base/$customerExtn/tax_ids/$extn";
67
+ }
68
+
69
+ /**
70
+ * @param array|string $_id
71
+ * @param array|string|null $_opts
72
+ *
73
+ * @throws \Stripe\Error\InvalidRequest
74
+ */
75
+ public static function retrieve($_id, $_opts = null)
76
+ {
77
+ $msg = "Tax Ids cannot be accessed without a customer ID. " .
78
+ "Retrieve a Tax Id using Customer::retrieveTaxId('tax_id') instead.";
79
+ throw new Error\InvalidRequest($msg, null);
80
+ }
81
+ }
includes/lib/Stripe/lib/TaxRate.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class TaxRate
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property bool $active
11
+ * @property int $created
12
+ * @property string $description
13
+ * @property string $display_name
14
+ * @property bool $inclusive
15
+ * @property string $jurisdiction
16
+ * @property bool $livemode
17
+ * @property StripeObject $metadata
18
+ * @property float $percentage
19
+ *
20
+ * @package Stripe
21
+ */
22
+ class TaxRate extends ApiResource
23
+ {
24
+
25
+ const OBJECT_NAME = "tax_rate";
26
+
27
+ use ApiOperations\All;
28
+ use ApiOperations\Create;
29
+ use ApiOperations\Retrieve;
30
+ use ApiOperations\Update;
31
+ }
includes/lib/Stripe/lib/Terminal/ConnectionToken.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Terminal;
4
+
5
+ /**
6
+ * Class ConnectionToken
7
+ *
8
+ * @property string $secret
9
+ *
10
+ * @package Stripe\Terminal
11
+ */
12
+ class ConnectionToken extends \Stripe\ApiResource
13
+ {
14
+ const OBJECT_NAME = "terminal.connection_token";
15
+
16
+ use \Stripe\ApiOperations\Create;
17
+ }
includes/lib/Stripe/lib/Terminal/Location.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Terminal;
4
+
5
+ /**
6
+ * Class Location
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property mixed $address
11
+ * @property bool $deleted
12
+ * @property string $display_name
13
+ *
14
+ * @package Stripe\Terminal
15
+ */
16
+ class Location extends \Stripe\ApiResource
17
+ {
18
+ const OBJECT_NAME = "terminal.location";
19
+
20
+ use \Stripe\ApiOperations\All;
21
+ use \Stripe\ApiOperations\Create;
22
+ use \Stripe\ApiOperations\Delete;
23
+ use \Stripe\ApiOperations\Retrieve;
24
+ use \Stripe\ApiOperations\Update;
25
+ }
includes/lib/Stripe/lib/Terminal/Reader.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Terminal;
4
+
5
+ /**
6
+ * Class Reader
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property bool $deleted
11
+ * @property string $device_sw_version
12
+ * @property string $device_type
13
+ * @property string $ip_address
14
+ * @property string $label
15
+ * @property string $location
16
+ * @property string $serial_number
17
+ * @property string $status
18
+ *
19
+ * @package Stripe\Terminal
20
+ */
21
+ class Reader extends \Stripe\ApiResource
22
+ {
23
+ const OBJECT_NAME = "terminal.reader";
24
+
25
+ use \Stripe\ApiOperations\All;
26
+ use \Stripe\ApiOperations\Create;
27
+ use \Stripe\ApiOperations\Delete;
28
+ use \Stripe\ApiOperations\Retrieve;
29
+ use \Stripe\ApiOperations\Update;
30
+ }
includes/lib/Stripe/lib/ThreeDSecure.php CHANGED
@@ -4,6 +4,12 @@ namespace Stripe;
4
 
5
  class ThreeDSecure extends ApiResource
6
  {
 
 
 
 
 
 
7
  /**
8
  * @return string The endpoint URL for the given class.
9
  */
@@ -11,27 +17,4 @@ class ThreeDSecure extends ApiResource
11
  {
12
  return "/v1/3d_secure";
13
  }
14
-
15
- /**
16
- * @param array|string $id The ID of the 3DS auth to retrieve, or an
17
- * options array contianing an `id` key.
18
- * @param array|string|null $options
19
- *
20
- * @return ThreeDSecure
21
- */
22
- public static function retrieve($id, $options = null)
23
- {
24
- return self::_retrieve($id, $options);
25
- }
26
-
27
- /**
28
- * @param array|null $params
29
- * @param array|string|null $opts
30
- *
31
- * @return ThreeDSecure The created 3D Secure object.
32
- */
33
- public static function create($params = null, $opts = null)
34
- {
35
- return self::_create($params, $opts);
36
- }
37
  }
4
 
5
  class ThreeDSecure extends ApiResource
6
  {
7
+
8
+ const OBJECT_NAME = "three_d_secure";
9
+
10
+ use ApiOperations\Create;
11
+ use ApiOperations\Retrieve;
12
+
13
  /**
14
  * @return string The endpoint URL for the given class.
15
  */
17
  {
18
  return "/v1/3d_secure";
19
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  }
includes/lib/Stripe/lib/Token.php CHANGED
@@ -7,9 +7,9 @@ namespace Stripe;
7
  *
8
  * @property string $id
9
  * @property string $object
10
- * @property mixed $bank_account
11
- * @property mixed $card
12
- * @property mixed $client_ip
13
  * @property int $created
14
  * @property bool $livemode
15
  * @property string $type
@@ -19,26 +19,18 @@ namespace Stripe;
19
  */
20
  class Token extends ApiResource
21
  {
22
- /**
23
- * @param array|string $id The ID of the token to retrieve, or an options
24
- * array containing an `id` key.
25
- * @param array|string|null $opts
26
- *
27
- * @return Token
28
- */
29
- public static function retrieve($id, $opts = null)
30
- {
31
- return self::_retrieve($id, $opts);
32
- }
33
 
34
  /**
35
- * @param array|null $params
36
- * @param array|string|null $opts
37
- *
38
- * @return Token The created token.
39
  */
40
- public static function create($params = null, $opts = null)
41
- {
42
- return self::_create($params, $opts);
43
- }
44
  }
7
  *
8
  * @property string $id
9
  * @property string $object
10
+ * @property BankAccount $bank_account
11
+ * @property Card $card
12
+ * @property string $client_ip
13
  * @property int $created
14
  * @property bool $livemode
15
  * @property string $type
19
  */
20
  class Token extends ApiResource
21
  {
22
+
23
+ const OBJECT_NAME = "token";
24
+
25
+ use ApiOperations\Create;
26
+ use ApiOperations\Retrieve;
 
 
 
 
 
 
27
 
28
  /**
29
+ * Possible string representations of the token type.
30
+ * @link https://stripe.com/docs/api/tokens/object#token_object-type
 
 
31
  */
32
+ const TYPE_ACCOUNT = 'account';
33
+ const TYPE_BANK_ACCOUNT = 'bank_account';
34
+ const TYPE_CARD = 'card';
35
+ const TYPE_PII = 'pii';
36
  }
includes/lib/Stripe/lib/Topup.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Topup
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property string $balance_transaction
12
+ * @property int $created
13
+ * @property string $currency
14
+ * @property string $description
15
+ * @property int $expected_availability_date
16
+ * @property string $failure_code
17
+ * @property string $failure_message
18
+ * @property bool $livemode
19
+ * @property StripeObject $metadata
20
+ * @property mixed $source
21
+ * @property string $statement_descriptor
22
+ * @property string $status
23
+ * @property string $transfer_group
24
+ *
25
+ * @package Stripe
26
+ */
27
+ class Topup extends ApiResource
28
+ {
29
+
30
+ const OBJECT_NAME = "topup";
31
+
32
+ use ApiOperations\All;
33
+ use ApiOperations\Create;
34
+ use ApiOperations\Retrieve;
35
+ use ApiOperations\Update;
36
+
37
+ /**
38
+ * Possible string representations of the status of the top-up.
39
+ * @link https://stripe.com/docs/api/topups/object#topup_object-status
40
+ */
41
+ const STATUS_CANCELED = 'canceled';
42
+ const STATUS_FAILED = 'failed';
43
+ const STATUS_PENDING = 'pending';
44
+ const STATUS_REVERSED = 'reversed';
45
+ const STATUS_SUCCEEDED = 'succeeded';
46
+
47
+ /**
48
+ * @param array|null $params
49
+ * @param array|string|null $options
50
+ *
51
+ * @return Topup The canceled topup.
52
+ */
53
+ public function cancel($params = null, $options = null)
54
+ {
55
+ $url = $this->instanceUrl() . '/cancel';
56
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
57
+ $this->refreshFrom($response, $opts);
58
+ return $this;
59
+ }
60
+ }
includes/lib/Stripe/lib/Transfer.php CHANGED
@@ -12,94 +12,110 @@ namespace Stripe;
12
  * @property string $balance_transaction
13
  * @property int $created
14
  * @property string $currency
15
- * @property int $date
16
- * @property mixed $destination
17
- * @property mixed $destination_payment
18
  * @property bool $livemode
19
- * @property mixed $metadata
20
- * @property mixed $reversals
21
  * @property bool $reversed
22
- * @property mixed $source_transaction
 
 
23
  *
24
  * @package Stripe
25
  */
26
  class Transfer extends ApiResource
27
  {
 
 
 
 
 
 
 
 
 
 
 
28
  /**
29
- * @param array|string $id The ID of the transfer to retrieve, or an
30
- * options array containing an `id` key.
31
- * @param array|string|null $opts
32
- *
33
- * @return Transfer
34
  */
35
- public static function retrieve($id, $opts = null)
36
- {
37
- return self::_retrieve($id, $opts);
38
- }
39
 
40
  /**
41
- * @param array|null $params
42
- * @param array|string|null $opts
43
- *
44
- * @return Collection of Transfers
45
  */
46
- public static function all($params = null, $opts = null)
47
  {
48
- return self::_all($params, $opts);
 
 
 
49
  }
50
 
51
  /**
52
- * @param array|null $params
53
- * @param array|string|null $opts
54
- *
55
- * @return Transfer The created transfer.
56
  */
57
- public static function create($params = null, $opts = null)
58
  {
59
- return self::_create($params, $opts);
 
 
 
60
  }
61
 
62
  /**
63
- * @param string $id The ID of the transfer to update.
64
  * @param array|null $params
65
- * @param array|string|null $options
66
  *
67
- * @return Transfer The updated transfer.
68
  */
69
- public static function update($id, $params = null, $options = null)
70
  {
71
- return self::_update($id, $params, $options);
72
  }
73
 
74
  /**
75
- * @return TransferReversal The created transfer reversal.
 
 
 
 
 
76
  */
77
- public function reverse($params = null, $opts = null)
78
  {
79
- $url = $this->instanceUrl() . '/reversals';
80
- list($response, $opts) = $this->_request('post', $url, $params, $opts);
81
- $this->refreshFrom($response, $opts);
82
- return $this;
83
  }
84
 
85
  /**
86
- * @return Transfer The canceled transfer.
 
 
 
 
 
87
  */
88
- public function cancel()
89
  {
90
- $url = $this->instanceUrl() . '/cancel';
91
- list($response, $opts) = $this->_request('post', $url);
92
- $this->refreshFrom($response, $opts);
93
- return $this;
94
  }
95
 
96
  /**
 
 
97
  * @param array|string|null $opts
98
  *
99
- * @return Transfer The saved transfer.
100
  */
101
- public function save($opts = null)
102
  {
103
- return $this->_save($opts);
104
  }
105
  }
12
  * @property string $balance_transaction
13
  * @property int $created
14
  * @property string $currency
15
+ * @property string $description
16
+ * @property string $destination
17
+ * @property string $destination_payment
18
  * @property bool $livemode
19
+ * @property StripeObject $metadata
20
+ * @property Collection $reversals
21
  * @property bool $reversed
22
+ * @property string $source_transaction
23
+ * @property string $source_type
24
+ * @property string $transfer_group
25
  *
26
  * @package Stripe
27
  */
28
  class Transfer extends ApiResource
29
  {
30
+
31
+ const OBJECT_NAME = "transfer";
32
+
33
+ use ApiOperations\All;
34
+ use ApiOperations\Create;
35
+ use ApiOperations\NestedResource;
36
+ use ApiOperations\Retrieve;
37
+ use ApiOperations\Update;
38
+
39
+ const PATH_REVERSALS = '/reversals';
40
+
41
  /**
42
+ * Possible string representations of the source type of the transfer.
43
+ * @link https://stripe.com/docs/api/transfers/object#transfer_object-source_type
 
 
 
44
  */
45
+ const SOURCE_TYPE_ALIPAY_ACCOUNT = 'alipay_account';
46
+ const SOURCE_TYPE_BANK_ACCOUNT = 'bank_account';
47
+ const SOURCE_TYPE_CARD = 'card';
48
+ const SOURCE_TYPE_FINANCING = 'financing';
49
 
50
  /**
51
+ * @return TransferReversal The created transfer reversal.
 
 
 
52
  */
53
+ public function reverse($params = null, $opts = null)
54
  {
55
+ $url = $this->instanceUrl() . '/reversals';
56
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
57
+ $this->refreshFrom($response, $opts);
58
+ return $this;
59
  }
60
 
61
  /**
62
+ * @return Transfer The canceled transfer.
 
 
 
63
  */
64
+ public function cancel()
65
  {
66
+ $url = $this->instanceUrl() . '/cancel';
67
+ list($response, $opts) = $this->_request('post', $url);
68
+ $this->refreshFrom($response, $opts);
69
+ return $this;
70
  }
71
 
72
  /**
73
+ * @param string|null $id The ID of the transfer on which to create the reversal.
74
  * @param array|null $params
75
+ * @param array|string|null $opts
76
  *
77
+ * @return TransferReversal
78
  */
79
+ public static function createReversal($id, $params = null, $opts = null)
80
  {
81
+ return self::_createNestedResource($id, static::PATH_REVERSALS, $params, $opts);
82
  }
83
 
84
  /**
85
+ * @param string|null $id The ID of the transfer to which the reversal belongs.
86
+ * @param array|null $reversalId The ID of the reversal to retrieve.
87
+ * @param array|null $params
88
+ * @param array|string|null $opts
89
+ *
90
+ * @return TransferReversal
91
  */
92
+ public static function retrieveReversal($id, $reversalId, $params = null, $opts = null)
93
  {
94
+ return self::_retrieveNestedResource($id, static::PATH_REVERSALS, $reversalId, $params, $opts);
 
 
 
95
  }
96
 
97
  /**
98
+ * @param string|null $id The ID of the transfer to which the reversal belongs.
99
+ * @param array|null $reversalId The ID of the reversal to update.
100
+ * @param array|null $params
101
+ * @param array|string|null $opts
102
+ *
103
+ * @return TransferReversal
104
  */
105
+ public static function updateReversal($id, $reversalId, $params = null, $opts = null)
106
  {
107
+ return self::_updateNestedResource($id, static::PATH_REVERSALS, $reversalId, $params, $opts);
 
 
 
108
  }
109
 
110
  /**
111
+ * @param string|null $id The ID of the transfer on which to retrieve the reversals.
112
+ * @param array|null $params
113
  * @param array|string|null $opts
114
  *
115
+ * @return Collection The list of reversals.
116
  */
117
+ public static function allReversals($id, $params = null, $opts = null)
118
  {
119
+ return self::_allNestedResources($id, static::PATH_REVERSALS, $params, $opts);
120
  }
121
  }
includes/lib/Stripe/lib/TransferReversal.php CHANGED
@@ -11,13 +11,22 @@ namespace Stripe;
11
  * @property string $balance_transaction
12
  * @property int $created
13
  * @property string $currency
14
- * @property mixed $metadata
 
 
15
  * @property string $transfer
16
  *
17
  * @package Stripe
18
  */
19
  class TransferReversal extends ApiResource
20
  {
 
 
 
 
 
 
 
21
  /**
22
  * @return string The API URL for this Stripe transfer reversal.
23
  */
11
  * @property string $balance_transaction
12
  * @property int $created
13
  * @property string $currency
14
+ * @property string $destination_payment_refund
15
+ * @property StripeObject $metadata
16
+ * @property string $source_refund
17
  * @property string $transfer
18
  *
19
  * @package Stripe
20
  */
21
  class TransferReversal extends ApiResource
22
  {
23
+
24
+ const OBJECT_NAME = "transfer_reversal";
25
+
26
+ use ApiOperations\Update {
27
+ save as protected _save;
28
+ }
29
+
30
  /**
31
  * @return string The API URL for this Stripe transfer reversal.
32
  */
includes/lib/Stripe/lib/UsageRecord.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class UsageRecord
7
+ *
8
+ * @package Stripe
9
+ *
10
+ * @property string $id
11
+ * @property string $object
12
+ * @property bool $livemode
13
+ * @property int $quantity
14
+ * @property string $subscription_item
15
+ * @property int $timestamp
16
+ */
17
+ class UsageRecord extends ApiResource
18
+ {
19
+
20
+ const OBJECT_NAME = "usage_record";
21
+
22
+ /**
23
+ * @param array|null $params
24
+ * @param array|string|null $options
25
+ *
26
+ * @return \Stripe\ApiResource The created resource.
27
+ */
28
+ public static function create($params = null, $options = null)
29
+ {
30
+ self::_validateParams($params);
31
+ if (!array_key_exists('subscription_item', $params)) {
32
+ throw new Error\InvalidRequest("Missing subscription_item param in request", null);
33
+ }
34
+ $subscription_item = $params['subscription_item'];
35
+ $url = "/v1/subscription_items/$subscription_item/usage_records";
36
+ $request_params = $params;
37
+ unset($request_params['subscription_item']);
38
+
39
+ list($response, $opts) = static::_staticRequest('post', $url, $request_params, $options);
40
+ $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts);
41
+ $obj->setLastResponse($response);
42
+ return $obj;
43
+ }
44
+ }
includes/lib/Stripe/lib/UsageRecordSummary.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class UsageRecord
7
+ *
8
+ * @package Stripe
9
+ *
10
+ * @property string $id
11
+ * @property string $object
12
+ * @property string $invoice
13
+ * @property bool $livemode
14
+ * @property mixed $period
15
+ * @property string $subscription_item
16
+ * @property int $total_usage
17
+ */
18
+ class UsageRecordSummary extends ApiResource
19
+ {
20
+
21
+ const OBJECT_NAME = "usage_record_summary";
22
+ }
includes/lib/Stripe/lib/Util/AutoPagingIterator.php CHANGED
@@ -7,7 +7,7 @@ class AutoPagingIterator implements \Iterator
7
  private $lastId = null;
8
  private $page = null;
9
  private $pageOffset = 0;
10
- private $params = array();
11
 
12
  public function __construct($collection, $params)
13
  {
@@ -42,8 +42,8 @@ class AutoPagingIterator implements \Iterator
42
  $this->pageOffset += count($this->page->data);
43
  if ($this->page['has_more']) {
44
  $this->params = array_merge(
45
- $this->params ? $this->params : array(),
46
- array('starting_after' => $this->lastId)
47
  );
48
  $this->page = $this->page->all($this->params);
49
  } else {
7
  private $lastId = null;
8
  private $page = null;
9
  private $pageOffset = 0;
10
+ private $params = [];
11
 
12
  public function __construct($collection, $params)
13
  {
42
  $this->pageOffset += count($this->page->data);
43
  if ($this->page['has_more']) {
44
  $this->params = array_merge(
45
+ $this->params ?: [],
46
+ ['starting_after' => $this->lastId]
47
  );
48
  $this->page = $this->page->all($this->params);
49
  } else {
includes/lib/Stripe/lib/Util/CaseInsensitiveArray.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Util;
4
+
5
+ use ArrayAccess;
6
+
7
+ /**
8
+ * CaseInsensitiveArray is an array-like class that ignores case for keys.
9
+ *
10
+ * It is used to store HTTP headers. Per RFC 2616, section 4.2:
11
+ * Each header field consists of a name followed by a colon (":") and the field value. Field names
12
+ * are case-insensitive.
13
+ *
14
+ * In the context of stripe-php, this is useful because the API will return headers with different
15
+ * case depending on whether HTTP/2 is used or not (with HTTP/2, headers are always in lowercase).
16
+ */
17
+ class CaseInsensitiveArray implements ArrayAccess
18
+ {
19
+ private $container = array();
20
+
21
+ public function __construct($initial_array = array())
22
+ {
23
+ $this->container = array_map("strtolower", $initial_array);
24
+ }
25
+
26
+ public function offsetSet($offset, $value)
27
+ {
28
+ $offset = static::maybeLowercase($offset);
29
+ if (is_null($offset)) {
30
+ $this->container[] = $value;
31
+ } else {
32
+ $this->container[$offset] = $value;
33
+ }
34
+ }
35
+
36
+ public function offsetExists($offset)
37
+ {
38
+ $offset = static::maybeLowercase($offset);
39
+ return isset($this->container[$offset]);
40
+ }
41
+
42
+ public function offsetUnset($offset)
43
+ {
44
+ $offset = static::maybeLowercase($offset);
45
+ unset($this->container[$offset]);
46
+ }
47
+
48
+ public function offsetGet($offset)
49
+ {
50
+ $offset = static::maybeLowercase($offset);
51
+ return isset($this->container[$offset]) ? $this->container[$offset] : null;
52
+ }
53
+
54
+ private static function maybeLowercase($v)
55
+ {
56
+ if (is_string($v)) {
57
+ return strtolower($v);
58
+ } else {
59
+ return $v;
60
+ }
61
+ }
62
+ }
includes/lib/Stripe/lib/Util/DefaultLogger.php CHANGED
@@ -8,10 +8,10 @@ namespace Stripe\Util;
8
  */
9
  class DefaultLogger implements LoggerInterface
10
  {
11
- public function error($message, array $context = array())
12
  {
13
  if (count($context) > 0) {
14
- throw new Exception('DefaultLogger does not currently implement context. Please implement if you need it.');
15
  }
16
  error_log($message);
17
  }
8
  */
9
  class DefaultLogger implements LoggerInterface
10
  {
11
+ public function error($message, array $context = [])
12
  {
13
  if (count($context) > 0) {
14
+ throw new \Exception('DefaultLogger does not currently implement context. Please implement if you need it.');
15
  }
16
  error_log($message);
17
  }
includes/lib/Stripe/lib/Util/LoggerInterface.php CHANGED
@@ -32,5 +32,5 @@ interface LoggerInterface
32
  * @param array $context
33
  * @return null
34
  */
35
- public function error($message, array $context = array());
36
  }
32
  * @param array $context
33
  * @return null
34
  */
35
+ public function error($message, array $context = []);
36
  }
includes/lib/Stripe/lib/Util/RandomGenerator.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Util;
4
+
5
+ /**
6
+ * A basic random generator. This is in a separate class so we the generator
7
+ * can be injected as a dependency and replaced with a mock in tests.
8
+ */
9
+ class RandomGenerator
10
+ {
11
+ /**
12
+ * Returns a random value between 0 and $max.
13
+ *
14
+ * @param float $max (optional)
15
+ * @return float
16
+ */
17
+ public function randFloat($max = 1.0)
18
+ {
19
+ return mt_rand() / mt_getrandmax() * $max;
20
+ }
21
+
22
+ /**
23
+ * Returns a v4 UUID.
24
+ *
25
+ * @return string
26
+ */
27
+ public function uuid()
28
+ {
29
+ $arr = array_values(unpack('N1a/n4b/N1c', openssl_random_pseudo_bytes(16)));
30
+ $arr[2] = ($arr[2] & 0x0fff) | 0x4000;
31
+ $arr[3] = ($arr[3] & 0x3fff) | 0x8000;
32
+ return vsprintf('%08x-%04x-%04x-%04x-%04x%08x', $arr);
33
+ }
34
+ }
includes/lib/Stripe/lib/Util/RequestOptions.php CHANGED
@@ -6,13 +6,23 @@ use Stripe\Error;
6
 
7
  class RequestOptions
8
  {
 
 
 
 
 
 
 
 
9
  public $headers;
10
  public $apiKey;
 
11
 
12
- public function __construct($key = null, $headers = array())
13
  {
14
  $this->apiKey = $key;
15
  $this->headers = $headers;
 
16
  }
17
 
18
  /**
@@ -28,10 +38,25 @@ class RequestOptions
28
  if ($other_options->apiKey === null) {
29
  $other_options->apiKey = $this->apiKey;
30
  }
 
 
 
31
  $other_options->headers = array_merge($this->headers, $other_options->headers);
32
  return $other_options;
33
  }
34
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  /**
36
  * Unpacks an options array into an RequestOptions object
37
  * @param array|string|null $options a key => value array
@@ -45,16 +70,17 @@ class RequestOptions
45
  }
46
 
47
  if (is_null($options)) {
48
- return new RequestOptions(null, array());
49
  }
50
 
51
  if (is_string($options)) {
52
- return new RequestOptions($options, array());
53
  }
54
 
55
  if (is_array($options)) {
56
- $headers = array();
57
  $key = null;
 
58
  if (array_key_exists('api_key', $options)) {
59
  $key = $options['api_key'];
60
  }
@@ -67,7 +93,10 @@ class RequestOptions
67
  if (array_key_exists('stripe_version', $options)) {
68
  $headers['Stripe-Version'] = $options['stripe_version'];
69
  }
70
- return new RequestOptions($key, $headers);
 
 
 
71
  }
72
 
73
  $message = 'The second argument to Stripe API method calls is an '
6
 
7
  class RequestOptions
8
  {
9
+ /**
10
+ * @var array A list of headers that should be persisted across requests.
11
+ */
12
+ public static $HEADERS_TO_PERSIST = [
13
+ 'Stripe-Account',
14
+ 'Stripe-Version',
15
+ ];
16
+
17
  public $headers;
18
  public $apiKey;
19
+ public $apiBase;
20
 
21
+ public function __construct($key = null, $headers = [], $base = null)
22
  {
23
  $this->apiKey = $key;
24
  $this->headers = $headers;
25
+ $this->apiBase = $base;
26
  }
27
 
28
  /**
38
  if ($other_options->apiKey === null) {
39
  $other_options->apiKey = $this->apiKey;
40
  }
41
+ if ($other_options->apiBase === null) {
42
+ $other_options->apiBase = $this->apiBase;
43
+ }
44
  $other_options->headers = array_merge($this->headers, $other_options->headers);
45
  return $other_options;
46
  }
47
 
48
+ /**
49
+ * Discards all headers that we don't want to persist across requests.
50
+ */
51
+ public function discardNonPersistentHeaders()
52
+ {
53
+ foreach ($this->headers as $k => $v) {
54
+ if (!in_array($k, self::$HEADERS_TO_PERSIST)) {
55
+ unset($this->headers[$k]);
56
+ }
57
+ }
58
+ }
59
+
60
  /**
61
  * Unpacks an options array into an RequestOptions object
62
  * @param array|string|null $options a key => value array
70
  }
71
 
72
  if (is_null($options)) {
73
+ return new RequestOptions(null, [], null);
74
  }
75
 
76
  if (is_string($options)) {
77
+ return new RequestOptions($options, [], null);
78
  }
79
 
80
  if (is_array($options)) {
81
+ $headers = [];
82
  $key = null;
83
+ $base = null;
84
  if (array_key_exists('api_key', $options)) {
85
  $key = $options['api_key'];
86
  }
93
  if (array_key_exists('stripe_version', $options)) {
94
  $headers['Stripe-Version'] = $options['stripe_version'];
95
  }
96
+ if (array_key_exists('api_base', $options)) {
97
+ $base = $options['api_base'];
98
+ }
99
+ return new RequestOptions($key, $headers, $base);
100
  }
101
 
102
  $message = 'The second argument to Stripe API method calls is an '
includes/lib/Stripe/lib/Util/Set.php CHANGED
@@ -9,9 +9,9 @@ class Set implements IteratorAggregate
9
  {
10
  private $_elts;
11
 
12
- public function __construct($members = array())
13
  {
14
- $this->_elts = array();
15
  foreach ($members as $item) {
16
  $this->_elts[$item] = true;
17
  }
9
  {
10
  private $_elts;
11
 
12
+ public function __construct($members = [])
13
  {
14
+ $this->_elts = [];
15
  foreach ($members as $item) {
16
  $this->_elts[$item] = true;
17
  }
includes/lib/Stripe/lib/Util/Util.php CHANGED
@@ -11,21 +11,22 @@ abstract class Util
11
 
12
  /**
13
  * Whether the provided array (or other) is a list rather than a dictionary.
 
 
14
  *
15
  * @param array|mixed $array
16
- * @return boolean True if the given object is a list.
17
  */
18
  public static function isList($array)
19
  {
20
  if (!is_array($array)) {
21
  return false;
22
  }
23
-
24
- // TODO: generally incorrect, but it's correct given Stripe's response
25
- foreach (array_keys($array) as $k) {
26
- if (!is_numeric($k)) {
27
- return false;
28
- }
29
  }
30
  return true;
31
  }
@@ -38,7 +39,7 @@ abstract class Util
38
  */
39
  public static function convertStripeObjectToArray($values)
40
  {
41
- $results = array();
42
  foreach ($values as $k => $v) {
43
  // FIXME: this is an encapsulation violation
44
  if ($k[0] == '_') {
@@ -64,47 +65,93 @@ abstract class Util
64
  */
65
  public static function convertToStripeObject($resp, $opts)
66
  {
67
- $types = array(
68
- 'account' => 'Stripe\\Account',
69
- 'alipay_account' => 'Stripe\\AlipayAccount',
70
- 'apple_pay_domain' => 'Stripe\\ApplePayDomain',
71
- 'bank_account' => 'Stripe\\BankAccount',
72
- 'balance_transaction' => 'Stripe\\BalanceTransaction',
73
- 'card' => 'Stripe\\Card',
74
- 'charge' => 'Stripe\\Charge',
75
- 'country_spec' => 'Stripe\\CountrySpec',
76
- 'coupon' => 'Stripe\\Coupon',
77
- 'customer' => 'Stripe\\Customer',
78
- 'dispute' => 'Stripe\\Dispute',
79
- 'ephemeral_key' => 'Stripe\\EphemeralKey',
80
- 'list' => 'Stripe\\Collection',
81
- 'login_link' => 'Stripe\\LoginLink',
82
- 'invoice' => 'Stripe\\Invoice',
83
- 'invoiceitem' => 'Stripe\\InvoiceItem',
84
- 'event' => 'Stripe\\Event',
85
- 'file_upload' => 'Stripe\\FileUpload',
86
- 'token' => 'Stripe\\Token',
87
- 'transfer' => 'Stripe\\Transfer',
88
- 'transfer_reversal' => 'Stripe\\TransferReversal',
89
- 'order' => 'Stripe\\Order',
90
- 'order_return' => 'Stripe\\OrderReturn',
91
- 'payout' => 'Stripe\\Payout',
92
- 'plan' => 'Stripe\\Plan',
93
- 'product' => 'Stripe\\Product',
94
- 'recipient' => 'Stripe\\Recipient',
95
- 'recipient_transfer' => 'Stripe\\RecipientTransfer',
96
- 'refund' => 'Stripe\\Refund',
97
- 'sku' => 'Stripe\\SKU',
98
- 'source' => 'Stripe\\Source',
99
- 'subscription' => 'Stripe\\Subscription',
100
- 'subscription_item' => 'Stripe\\SubscriptionItem',
101
- 'three_d_secure' => 'Stripe\\ThreeDSecure',
102
- 'fee_refund' => 'Stripe\\ApplicationFeeRefund',
103
- 'bitcoin_receiver' => 'Stripe\\BitcoinReceiver',
104
- 'bitcoin_transaction' => 'Stripe\\BitcoinTransaction',
105
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  if (self::isList($resp)) {
107
- $mapped = array();
108
  foreach ($resp as $i) {
109
  array_push($mapped, self::convertToStripeObject($i, $opts));
110
  }
@@ -177,41 +224,138 @@ abstract class Util
177
  }
178
 
179
  /**
180
- * @param array $arr A map of param keys to values.
181
- * @param string|null $prefix
 
182
  *
183
- * @return string A querystring, essentially.
 
184
  */
185
- public static function urlEncode($arr, $prefix = null)
186
  {
187
- if (!is_array($arr)) {
188
- return $arr;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  }
 
190
 
191
- $r = array();
192
- foreach ($arr as $k => $v) {
193
- if (is_null($v)) {
194
- continue;
195
- }
 
 
 
 
 
 
 
 
 
 
196
 
197
- if ($prefix) {
198
- if ($k !== null && (!is_int($k) || is_array($v))) {
199
- $k = $prefix."[".$k."]";
200
- } else {
201
- $k = $prefix."[]";
202
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  }
 
204
 
205
- if (is_array($v)) {
206
- $enc = self::urlEncode($v, $k);
207
- if ($enc) {
208
- $r[] = $enc;
209
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
210
  } else {
211
- $r[] = urlencode($k)."=".urlencode($v);
212
  }
213
  }
214
 
215
- return implode("&", $r);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  }
217
  }
11
 
12
  /**
13
  * Whether the provided array (or other) is a list rather than a dictionary.
14
+ * A list is defined as an array for which all the keys are consecutive
15
+ * integers starting at 0. Empty arrays are considered to be lists.
16
  *
17
  * @param array|mixed $array
18
+ * @return boolean true if the given object is a list.
19
  */
20
  public static function isList($array)
21
  {
22
  if (!is_array($array)) {
23
  return false;
24
  }
25
+ if ($array === []) {
26
+ return true;
27
+ }
28
+ if (array_keys($array) !== range(0, count($array) - 1)) {
29
+ return false;
 
30
  }
31
  return true;
32
  }
39
  */
40
  public static function convertStripeObjectToArray($values)
41
  {
42
+ $results = [];
43
  foreach ($values as $k => $v) {
44
  // FIXME: this is an encapsulation violation
45
  if ($k[0] == '_') {
65
  */
66
  public static function convertToStripeObject($resp, $opts)
67
  {
68
+ $types = [
69
+ // data structures
70
+ \Stripe\Collection::OBJECT_NAME => 'Stripe\\Collection',
71
+
72
+ // business objects
73
+ \Stripe\Account::OBJECT_NAME => 'Stripe\\Account',
74
+ \Stripe\AccountLink::OBJECT_NAME => 'Stripe\\AccountLink',
75
+ \Stripe\AlipayAccount::OBJECT_NAME => 'Stripe\\AlipayAccount',
76
+ \Stripe\ApplePayDomain::OBJECT_NAME => 'Stripe\\ApplePayDomain',
77
+ \Stripe\ApplicationFee::OBJECT_NAME => 'Stripe\\ApplicationFee',
78
+ \Stripe\Balance::OBJECT_NAME => 'Stripe\\Balance',
79
+ \Stripe\BalanceTransaction::OBJECT_NAME => 'Stripe\\BalanceTransaction',
80
+ \Stripe\BankAccount::OBJECT_NAME => 'Stripe\\BankAccount',
81
+ \Stripe\BitcoinReceiver::OBJECT_NAME => 'Stripe\\BitcoinReceiver',
82
+ \Stripe\BitcoinTransaction::OBJECT_NAME => 'Stripe\\BitcoinTransaction',
83
+ \Stripe\Capability::OBJECT_NAME => 'Stripe\\Capability',
84
+ \Stripe\Card::OBJECT_NAME => 'Stripe\\Card',
85
+ \Stripe\Charge::OBJECT_NAME => 'Stripe\\Charge',
86
+ \Stripe\Checkout\Session::OBJECT_NAME => 'Stripe\\Checkout\\Session',
87
+ \Stripe\CountrySpec::OBJECT_NAME => 'Stripe\\CountrySpec',
88
+ \Stripe\Coupon::OBJECT_NAME => 'Stripe\\Coupon',
89
+ \Stripe\CreditNote::OBJECT_NAME => 'Stripe\\CreditNote',
90
+ \Stripe\Customer::OBJECT_NAME => 'Stripe\\Customer',
91
+ \Stripe\CustomerBalanceTransaction::OBJECT_NAME => 'Stripe\\CustomerBalanceTransaction',
92
+ \Stripe\Discount::OBJECT_NAME => 'Stripe\\Discount',
93
+ \Stripe\Dispute::OBJECT_NAME => 'Stripe\\Dispute',
94
+ \Stripe\EphemeralKey::OBJECT_NAME => 'Stripe\\EphemeralKey',
95
+ \Stripe\Event::OBJECT_NAME => 'Stripe\\Event',
96
+ \Stripe\ExchangeRate::OBJECT_NAME => 'Stripe\\ExchangeRate',
97
+ \Stripe\ApplicationFeeRefund::OBJECT_NAME => 'Stripe\\ApplicationFeeRefund',
98
+ \Stripe\File::OBJECT_NAME => 'Stripe\\File',
99
+ \Stripe\File::OBJECT_NAME_ALT => 'Stripe\\File',
100
+ \Stripe\FileLink::OBJECT_NAME => 'Stripe\\FileLink',
101
+ \Stripe\Invoice::OBJECT_NAME => 'Stripe\\Invoice',
102
+ \Stripe\InvoiceItem::OBJECT_NAME => 'Stripe\\InvoiceItem',
103
+ \Stripe\InvoiceLineItem::OBJECT_NAME => 'Stripe\\InvoiceLineItem',
104
+ \Stripe\IssuerFraudRecord::OBJECT_NAME => 'Stripe\\IssuerFraudRecord',
105
+ \Stripe\Issuing\Authorization::OBJECT_NAME => 'Stripe\\Issuing\\Authorization',
106
+ \Stripe\Issuing\Card::OBJECT_NAME => 'Stripe\\Issuing\\Card',
107
+ \Stripe\Issuing\CardDetails::OBJECT_NAME => 'Stripe\\Issuing\\CardDetails',
108
+ \Stripe\Issuing\Cardholder::OBJECT_NAME => 'Stripe\\Issuing\\Cardholder',
109
+ \Stripe\Issuing\Dispute::OBJECT_NAME => 'Stripe\\Issuing\\Dispute',
110
+ \Stripe\Issuing\Transaction::OBJECT_NAME => 'Stripe\\Issuing\\Transaction',
111
+ \Stripe\LoginLink::OBJECT_NAME => 'Stripe\\LoginLink',
112
+ \Stripe\Order::OBJECT_NAME => 'Stripe\\Order',
113
+ \Stripe\OrderItem::OBJECT_NAME => 'Stripe\\OrderItem',
114
+ \Stripe\OrderReturn::OBJECT_NAME => 'Stripe\\OrderReturn',
115
+ \Stripe\PaymentIntent::OBJECT_NAME => 'Stripe\\PaymentIntent',
116
+ \Stripe\PaymentMethod::OBJECT_NAME => 'Stripe\\PaymentMethod',
117
+ \Stripe\Payout::OBJECT_NAME => 'Stripe\\Payout',
118
+ \Stripe\Person::OBJECT_NAME => 'Stripe\\Person',
119
+ \Stripe\Plan::OBJECT_NAME => 'Stripe\\Plan',
120
+ \Stripe\Product::OBJECT_NAME => 'Stripe\\Product',
121
+ \Stripe\Radar\EarlyFraudWarning::OBJECT_NAME => 'Stripe\\Radar\\EarlyFraudWarning',
122
+ \Stripe\Radar\ValueList::OBJECT_NAME => 'Stripe\\Radar\\ValueList',
123
+ \Stripe\Radar\ValueListItem::OBJECT_NAME => 'Stripe\\Radar\\ValueListItem',
124
+ \Stripe\Recipient::OBJECT_NAME => 'Stripe\\Recipient',
125
+ \Stripe\RecipientTransfer::OBJECT_NAME => 'Stripe\\RecipientTransfer',
126
+ \Stripe\Refund::OBJECT_NAME => 'Stripe\\Refund',
127
+ \Stripe\Reporting\ReportRun::OBJECT_NAME => 'Stripe\\Reporting\\ReportRun',
128
+ \Stripe\Reporting\ReportType::OBJECT_NAME => 'Stripe\\Reporting\\ReportType',
129
+ \Stripe\Review::OBJECT_NAME => 'Stripe\\Review',
130
+ \Stripe\SetupIntent::OBJECT_NAME => 'Stripe\\SetupIntent',
131
+ \Stripe\SKU::OBJECT_NAME => 'Stripe\\SKU',
132
+ \Stripe\Sigma\ScheduledQueryRun::OBJECT_NAME => 'Stripe\\Sigma\\ScheduledQueryRun',
133
+ \Stripe\Source::OBJECT_NAME => 'Stripe\\Source',
134
+ \Stripe\SourceTransaction::OBJECT_NAME => 'Stripe\\SourceTransaction',
135
+ \Stripe\Subscription::OBJECT_NAME => 'Stripe\\Subscription',
136
+ \Stripe\SubscriptionItem::OBJECT_NAME => 'Stripe\\SubscriptionItem',
137
+ \Stripe\SubscriptionSchedule::OBJECT_NAME => 'Stripe\\SubscriptionSchedule',
138
+ \Stripe\SubscriptionScheduleRevision::OBJECT_NAME => 'Stripe\\SubscriptionScheduleRevision',
139
+ \Stripe\TaxId::OBJECT_NAME => 'Stripe\\TaxId',
140
+ \Stripe\TaxRate::OBJECT_NAME => 'Stripe\\TaxRate',
141
+ \Stripe\ThreeDSecure::OBJECT_NAME => 'Stripe\\ThreeDSecure',
142
+ \Stripe\Terminal\ConnectionToken::OBJECT_NAME => 'Stripe\\Terminal\\ConnectionToken',
143
+ \Stripe\Terminal\Location::OBJECT_NAME => 'Stripe\\Terminal\\Location',
144
+ \Stripe\Terminal\Reader::OBJECT_NAME => 'Stripe\\Terminal\\Reader',
145
+ \Stripe\Token::OBJECT_NAME => 'Stripe\\Token',
146
+ \Stripe\Topup::OBJECT_NAME => 'Stripe\\Topup',
147
+ \Stripe\Transfer::OBJECT_NAME => 'Stripe\\Transfer',
148
+ \Stripe\TransferReversal::OBJECT_NAME => 'Stripe\\TransferReversal',
149
+ \Stripe\UsageRecord::OBJECT_NAME => 'Stripe\\UsageRecord',
150
+ \Stripe\UsageRecordSummary::OBJECT_NAME => 'Stripe\\UsageRecordSummary',
151
+ \Stripe\WebhookEndpoint::OBJECT_NAME => 'Stripe\\WebhookEndpoint',
152
+ ];
153
  if (self::isList($resp)) {
154
+ $mapped = [];
155
  foreach ($resp as $i) {
156
  array_push($mapped, self::convertToStripeObject($i, $opts));
157
  }
224
  }
225
 
226
  /**
227
+ * Recursively goes through an array of parameters. If a parameter is an instance of
228
+ * ApiResource, then it is replaced by the resource's ID.
229
+ * Also clears out null values.
230
  *
231
+ * @param mixed $h
232
+ * @return mixed
233
  */
234
+ public static function objectsToIds($h)
235
  {
236
+ if ($h instanceof \Stripe\ApiResource) {
237
+ return $h->id;
238
+ } elseif (static::isList($h)) {
239
+ $results = [];
240
+ foreach ($h as $v) {
241
+ array_push($results, static::objectsToIds($v));
242
+ }
243
+ return $results;
244
+ } elseif (is_array($h)) {
245
+ $results = [];
246
+ foreach ($h as $k => $v) {
247
+ if (is_null($v)) {
248
+ continue;
249
+ }
250
+ $results[$k] = static::objectsToIds($v);
251
+ }
252
+ return $results;
253
+ } else {
254
+ return $h;
255
  }
256
+ }
257
 
258
+ /**
259
+ * @param array $params
260
+ *
261
+ * @return string
262
+ */
263
+ public static function encodeParameters($params)
264
+ {
265
+ $flattenedParams = self::flattenParams($params);
266
+ $pieces = [];
267
+ foreach ($flattenedParams as $param) {
268
+ list($k, $v) = $param;
269
+ array_push($pieces, self::urlEncode($k) . '=' . self::urlEncode($v));
270
+ }
271
+ return implode('&', $pieces);
272
+ }
273
 
274
+ /**
275
+ * @param array $params
276
+ * @param string|null $parentKey
277
+ *
278
+ * @return array
279
+ */
280
+ public static function flattenParams($params, $parentKey = null)
281
+ {
282
+ $result = [];
283
+
284
+ foreach ($params as $key => $value) {
285
+ $calculatedKey = $parentKey ? "{$parentKey}[{$key}]" : $key;
286
+
287
+ if (self::isList($value)) {
288
+ $result = array_merge($result, self::flattenParamsList($value, $calculatedKey));
289
+ } elseif (is_array($value)) {
290
+ $result = array_merge($result, self::flattenParams($value, $calculatedKey));
291
+ } else {
292
+ array_push($result, [$calculatedKey, $value]);
293
  }
294
+ }
295
 
296
+ return $result;
297
+ }
298
+
299
+ /**
300
+ * @param array $value
301
+ * @param string $calculatedKey
302
+ *
303
+ * @return array
304
+ */
305
+ public static function flattenParamsList($value, $calculatedKey)
306
+ {
307
+ $result = [];
308
+
309
+ foreach ($value as $i => $elem) {
310
+ if (self::isList($elem)) {
311
+ $result = array_merge($result, self::flattenParamsList($elem, $calculatedKey));
312
+ } elseif (is_array($elem)) {
313
+ $result = array_merge($result, self::flattenParams($elem, "{$calculatedKey}[{$i}]"));
314
  } else {
315
+ array_push($result, ["{$calculatedKey}[{$i}]", $elem]);
316
  }
317
  }
318
 
319
+ return $result;
320
+ }
321
+
322
+ /**
323
+ * @param string $key A string to URL-encode.
324
+ *
325
+ * @return string The URL-encoded string.
326
+ */
327
+ public static function urlEncode($key)
328
+ {
329
+ $s = urlencode($key);
330
+
331
+ // Don't use strict form encoding by changing the square bracket control
332
+ // characters back to their literals. This is fine by the server, and
333
+ // makes these parameter strings easier to read.
334
+ $s = str_replace('%5B', '[', $s);
335
+ $s = str_replace('%5D', ']', $s);
336
+
337
+ return $s;
338
+ }
339
+
340
+ public static function normalizeId($id)
341
+ {
342
+ if (is_array($id)) {
343
+ $params = $id;
344
+ $id = $params['id'];
345
+ unset($params['id']);
346
+ } else {
347
+ $params = [];
348
+ }
349
+ return [$id, $params];
350
+ }
351
+
352
+ /**
353
+ * Returns UNIX timestamp in milliseconds
354
+ *
355
+ * @return integer current time in millis
356
+ */
357
+ public static function currentTimeMillis()
358
+ {
359
+ return (int) round(microtime(true) * 1000);
360
  }
361
  }
includes/lib/Stripe/lib/Webhook.php CHANGED
@@ -20,10 +20,12 @@ abstract class Webhook
20
  * timestamp and the current time
21
  * @return \Stripe\Event the Event instance
22
  * @throws \UnexpectedValueException if the payload is not valid JSON,
23
- * \Stripe\SignatureVerification if the verification fails.
24
  */
25
  public static function constructEvent($payload, $sigHeader, $secret, $tolerance = self::DEFAULT_TOLERANCE)
26
  {
 
 
27
  $data = json_decode($payload, true);
28
  $jsonError = json_last_error();
29
  if ($data === null && $jsonError !== JSON_ERROR_NONE) {
@@ -31,9 +33,7 @@ abstract class Webhook
31
  . "(json_last_error() was $jsonError)";
32
  throw new \UnexpectedValueException($msg);
33
  }
34
- $event = Event::constructFrom($data, null);
35
-
36
- WebhookSignature::verifyHeader($payload, $sigHeader, $secret, $tolerance);
37
 
38
  return $event;
39
  }
20
  * timestamp and the current time
21
  * @return \Stripe\Event the Event instance
22
  * @throws \UnexpectedValueException if the payload is not valid JSON,
23
+ * @throws \Stripe\Error\SignatureVerification if the verification fails.
24
  */
25
  public static function constructEvent($payload, $sigHeader, $secret, $tolerance = self::DEFAULT_TOLERANCE)
26
  {
27
+ WebhookSignature::verifyHeader($payload, $sigHeader, $secret, $tolerance);
28
+
29
  $data = json_decode($payload, true);
30
  $jsonError = json_last_error();
31
  if ($data === null && $jsonError !== JSON_ERROR_NONE) {
33
  . "(json_last_error() was $jsonError)";
34
  throw new \UnexpectedValueException($msg);
35
  }
36
+ $event = Event::constructFrom($data);
 
 
37
 
38
  return $event;
39
  }
includes/lib/Stripe/lib/WebhookEndpoint.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class WebhookEndpoint
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $created
11
+ * @property string[] $enabled_events
12
+ * @property bool $livemode
13
+ * @property string $secret
14
+ * @property string $status
15
+ * @property string $url
16
+ *
17
+ * @package Stripe
18
+ */
19
+ class WebhookEndpoint extends ApiResource
20
+ {
21
+
22
+ const OBJECT_NAME = "webhook_endpoint";
23
+
24
+ use ApiOperations\All;
25
+ use ApiOperations\Create;
26
+ use ApiOperations\Delete;
27
+ use ApiOperations\Retrieve;
28
+ use ApiOperations\Update;
29
+ }
includes/lib/Stripe/lib/WebhookSignature.php CHANGED
@@ -17,7 +17,8 @@ abstract class WebhookSignature
17
  * @param string $secret secret used to generate the signature.
18
  * @param int $tolerance maximum difference allowed between the header's
19
  * timestamp and the current time
20
- * @throws SignatureVerification if the verification fails.
 
21
  */
22
  public static function verifyHeader($payload, $header, $secret, $tolerance = null)
23
  {
@@ -59,7 +60,7 @@ abstract class WebhookSignature
59
  }
60
 
61
  // Check if timestamp is within tolerance
62
- if (($tolerance > 0) && ((time() - $timestamp) > $tolerance)) {
63
  throw new Error\SignatureVerification(
64
  "Timestamp outside the tolerance zone",
65
  $header,
@@ -103,7 +104,7 @@ abstract class WebhookSignature
103
  */
104
  private static function getSignatures($header, $scheme)
105
  {
106
- $signatures = array();
107
  $items = explode(",", $header);
108
 
109
  foreach ($items as $item) {
17
  * @param string $secret secret used to generate the signature.
18
  * @param int $tolerance maximum difference allowed between the header's
19
  * timestamp and the current time
20
+ * @throws \Stripe\Error\SignatureVerification if the verification fails.
21
+ * @return bool
22
  */
23
  public static function verifyHeader($payload, $header, $secret, $tolerance = null)
24
  {
60
  }
61
 
62
  // Check if timestamp is within tolerance
63
+ if (($tolerance > 0) && (abs(time() - $timestamp) > $tolerance)) {
64
  throw new Error\SignatureVerification(
65
  "Timestamp outside the tolerance zone",
66
  $header,
104
  */
105
  private static function getSignatures($header, $scheme)
106
  {
107
+ $signatures = [];
108
  $items = explode(",", $header);
109
 
110
  foreach ($items as $item) {
includes/lib/php-jwt/BeforeValidException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Firebase\JWT;
3
+
4
+ class BeforeValidException extends \UnexpectedValueException
5
+ {
6
+
7
+ }
includes/lib/php-jwt/ExpiredException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Firebase\JWT;
3
+
4
+ class ExpiredException extends \UnexpectedValueException
5
+ {
6
+
7
+ }
includes/lib/php-jwt/JWT.php ADDED
@@ -0,0 +1,379 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Added PMPro to namespace to avoid conflicts.
3
+ namespace PMPro\Firebase\JWT;
4
+ use \DomainException;
5
+ use \InvalidArgumentException;
6
+ use \UnexpectedValueException;
7
+ use \DateTime;
8
+
9
+ /**
10
+ * JSON Web Token implementation, based on this spec:
11
+ * https://tools.ietf.org/html/rfc7519
12
+ *
13
+ * PHP version 5
14
+ *
15
+ * @category Authentication
16
+ * @package Authentication_JWT
17
+ * @author Neuman Vong <neuman@twilio.com>
18
+ * @author Anant Narayanan <anant@php.net>
19
+ * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
20
+ * @link https://github.com/firebase/php-jwt
21
+ */
22
+ class JWT
23
+ {
24
+
25
+ /**
26
+ * When checking nbf, iat or expiration times,
27
+ * we want to provide some extra leeway time to
28
+ * account for clock skew.
29
+ */
30
+ public static $leeway = 0;
31
+
32
+ /**
33
+ * Allow the current timestamp to be specified.
34
+ * Useful for fixing a value within unit testing.
35
+ *
36
+ * Will default to PHP time() value if null.
37
+ */
38
+ public static $timestamp = null;
39
+
40
+ public static $supported_algs = array(
41
+ 'HS256' => array('hash_hmac', 'SHA256'),
42
+ 'HS512' => array('hash_hmac', 'SHA512'),
43
+ 'HS384' => array('hash_hmac', 'SHA384'),
44
+ 'RS256' => array('openssl', 'SHA256'),
45
+ 'RS384' => array('openssl', 'SHA384'),
46
+ 'RS512' => array('openssl', 'SHA512'),
47
+ );
48
+
49
+ /**
50
+ * Decodes a JWT string into a PHP object.
51
+ *
52
+ * @param string $jwt The JWT
53
+ * @param string|array $key The key, or map of keys.
54
+ * If the algorithm used is asymmetric, this is the public key
55
+ * @param array $allowed_algs List of supported verification algorithms
56
+ * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
57
+ *
58
+ * @return object The JWT's payload as a PHP object
59
+ *
60
+ * @throws UnexpectedValueException Provided JWT was invalid
61
+ * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed
62
+ * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf'
63
+ * @throws BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat'
64
+ * @throws ExpiredException Provided JWT has since expired, as defined by the 'exp' claim
65
+ *
66
+ * @uses jsonDecode
67
+ * @uses urlsafeB64Decode
68
+ */
69
+ public static function decode($jwt, $key, array $allowed_algs = array())
70
+ {
71
+ $timestamp = is_null(static::$timestamp) ? time() : static::$timestamp;
72
+
73
+ if (empty($key)) {
74
+ throw new InvalidArgumentException('Key may not be empty');
75
+ }
76
+ $tks = explode('.', $jwt);
77
+ if (count($tks) != 3) {
78
+ throw new UnexpectedValueException('Wrong number of segments');
79
+ }
80
+ list($headb64, $bodyb64, $cryptob64) = $tks;
81
+ if (null === ($header = static::jsonDecode(static::urlsafeB64Decode($headb64)))) {
82
+ throw new UnexpectedValueException('Invalid header encoding');
83
+ }
84
+ if (null === $payload = static::jsonDecode(static::urlsafeB64Decode($bodyb64))) {
85
+ throw new UnexpectedValueException('Invalid claims encoding');
86
+ }
87
+ if (false === ($sig = static::urlsafeB64Decode($cryptob64))) {
88
+ throw new UnexpectedValueException('Invalid signature encoding');
89
+ }
90
+ if (empty($header->alg)) {
91
+ throw new UnexpectedValueException('Empty algorithm');
92
+ }
93
+ if (empty(static::$supported_algs[$header->alg])) {
94
+ throw new UnexpectedValueException('Algorithm not supported');
95
+ }
96
+ if (!in_array($header->alg, $allowed_algs)) {
97
+ throw new UnexpectedValueException('Algorithm not allowed');
98
+ }
99
+ if (is_array($key) || $key instanceof \ArrayAccess) {
100
+ if (isset($header->kid)) {
101
+ if (!isset($key[$header->kid])) {
102
+ throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key');
103
+ }
104
+ $key = $key[$header->kid];
105
+ } else {
106
+ throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
107
+ }
108
+ }
109
+
110
+ // Check the signature
111
+ if (!static::verify("$headb64.$bodyb64", $sig, $key, $header->alg)) {
112
+ throw new SignatureInvalidException('Signature verification failed');
113
+ }
114
+
115
+ // Check if the nbf if it is defined. This is the time that the
116
+ // token can actually be used. If it's not yet that time, abort.
117
+ if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) {
118
+ throw new BeforeValidException(
119
+ 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->nbf)
120
+ );
121
+ }
122
+
123
+ // Check that this token has been created before 'now'. This prevents
124
+ // using tokens that have been created for later use (and haven't
125
+ // correctly used the nbf claim).
126
+ if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) {
127
+ throw new BeforeValidException(
128
+ 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->iat)
129
+ );
130
+ }
131
+
132
+ // Check if this token has expired.
133
+ if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) {
134
+ throw new ExpiredException('Expired token');
135
+ }
136
+
137
+ return $payload;
138
+ }
139
+
140
+ /**
141
+ * Converts and signs a PHP object or array into a JWT string.
142
+ *
143
+ * @param object|array $payload PHP object or array
144
+ * @param string $key The secret key.
145
+ * If the algorithm used is asymmetric, this is the private key
146
+ * @param string $alg The signing algorithm.
147
+ * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
148
+ * @param mixed $keyId
149
+ * @param array $head An array with header elements to attach
150
+ *
151
+ * @return string A signed JWT
152
+ *
153
+ * @uses jsonEncode
154
+ * @uses urlsafeB64Encode
155
+ */
156
+ public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null)
157
+ {
158
+ $header = array('typ' => 'JWT', 'alg' => $alg);
159
+ if ($keyId !== null) {
160
+ $header['kid'] = $keyId;
161
+ }
162
+ if ( isset($head) && is_array($head) ) {
163
+ $header = array_merge($head, $header);
164
+ }
165
+ $segments = array();
166
+ $segments[] = static::urlsafeB64Encode(static::jsonEncode($header));
167
+ $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload));
168
+ $signing_input = implode('.', $segments);
169
+
170
+ $signature = static::sign($signing_input, $key, $alg);
171
+ $segments[] = static::urlsafeB64Encode($signature);
172
+
173
+ return implode('.', $segments);
174
+ }
175
+
176
+ /**
177
+ * Sign a string with a given key and algorithm.
178
+ *
179
+ * @param string $msg The message to sign
180
+ * @param string|resource $key The secret key
181
+ * @param string $alg The signing algorithm.
182
+ * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
183
+ *
184
+ * @return string An encrypted message
185
+ *
186
+ * @throws DomainException Unsupported algorithm was specified
187
+ */
188
+ public static function sign($msg, $key, $alg = 'HS256')
189
+ {
190
+ if (empty(static::$supported_algs[$alg])) {
191
+ throw new DomainException('Algorithm not supported');
192
+ }
193
+ list($function, $algorithm) = static::$supported_algs[$alg];
194
+ switch($function) {
195
+ case 'hash_hmac':
196
+ return hash_hmac($algorithm, $msg, $key, true);
197
+ case 'openssl':
198
+ $signature = '';
199
+ $success = openssl_sign($msg, $signature, $key, $algorithm);
200
+ if (!$success) {
201
+ throw new DomainException("OpenSSL unable to sign data");
202
+ } else {
203
+ return $signature;
204
+ }
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Verify a signature with the message, key and method. Not all methods
210
+ * are symmetric, so we must have a separate verify and sign method.
211
+ *
212
+ * @param string $msg The original message (header and body)
213
+ * @param string $signature The original signature
214
+ * @param string|resource $key For HS*, a string key works. for RS*, must be a resource of an openssl public key
215
+ * @param string $alg The algorithm
216
+ *
217
+ * @return bool
218
+ *
219
+ * @throws DomainException Invalid Algorithm or OpenSSL failure
220
+ */
221
+ private static function verify($msg, $signature, $key, $alg)
222
+ {
223
+ if (empty(static::$supported_algs[$alg])) {
224
+ throw new DomainException('Algorithm not supported');
225
+ }
226
+
227
+ list($function, $algorithm) = static::$supported_algs[$alg];
228
+ switch($function) {
229
+ case 'openssl':
230
+ $success = openssl_verify($msg, $signature, $key, $algorithm);
231
+ if ($success === 1) {
232
+ return true;
233
+ } elseif ($success === 0) {
234
+ return false;
235
+ }
236
+ // returns 1 on success, 0 on failure, -1 on error.
237
+ throw new DomainException(
238
+ 'OpenSSL error: ' . openssl_error_string()
239
+ );
240
+ case 'hash_hmac':
241
+ default:
242
+ $hash = hash_hmac($algorithm, $msg, $key, true);
243
+ if (function_exists('hash_equals')) {
244
+ return hash_equals($signature, $hash);
245
+ }
246
+ $len = min(static::safeStrlen($signature), static::safeStrlen($hash));
247
+
248
+ $status = 0;
249
+ for ($i = 0; $i < $len; $i++) {
250
+ $status |= (ord($signature[$i]) ^ ord($hash[$i]));
251
+ }
252
+ $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash));
253
+
254
+ return ($status === 0);
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Decode a JSON string into a PHP object.
260
+ *
261
+ * @param string $input JSON string
262
+ *
263
+ * @return object Object representation of JSON string
264
+ *
265
+ * @throws DomainException Provided string was invalid JSON
266
+ */
267
+ public static function jsonDecode($input)
268
+ {
269
+ if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
270
+ /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you
271
+ * to specify that large ints (like Steam Transaction IDs) should be treated as
272
+ * strings, rather than the PHP default behaviour of converting them to floats.
273
+ */
274
+ $obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING);
275
+ } else {
276
+ /** Not all servers will support that, however, so for older versions we must
277
+ * manually detect large ints in the JSON string and quote them (thus converting
278
+ *them to strings) before decoding, hence the preg_replace() call.
279
+ */
280
+ $max_int_length = strlen((string) PHP_INT_MAX) - 1;
281
+ $json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input);
282
+ $obj = json_decode($json_without_bigints);
283
+ }
284
+
285
+ if (function_exists('json_last_error') && $errno = json_last_error()) {
286
+ static::handleJsonError($errno);
287
+ } elseif ($obj === null && $input !== 'null') {
288
+ throw new DomainException('Null result with non-null input');
289
+ }
290
+ return $obj;
291
+ }
292
+
293
+ /**
294
+ * Encode a PHP object into a JSON string.
295
+ *
296
+ * @param object|array $input A PHP object or array
297
+ *
298
+ * @return string JSON representation of the PHP object or array
299
+ *
300
+ * @throws DomainException Provided object could not be encoded to valid JSON
301
+ */
302
+ public static function jsonEncode($input)
303
+ {
304
+ $json = json_encode($input);
305
+ if (function_exists('json_last_error') && $errno = json_last_error()) {
306
+ static::handleJsonError($errno);
307
+ } elseif ($json === 'null' && $input !== null) {
308
+ throw new DomainException('Null result with non-null input');
309
+ }
310
+ return $json;
311
+ }
312
+
313
+ /**
314
+ * Decode a string with URL-safe Base64.
315
+ *
316
+ * @param string $input A Base64 encoded string
317
+ *
318
+ * @return string A decoded string
319
+ */
320
+ public static function urlsafeB64Decode($input)
321
+ {
322
+ $remainder = strlen($input) % 4;
323
+ if ($remainder) {
324
+ $padlen = 4 - $remainder;
325
+ $input .= str_repeat('=', $padlen);
326
+ }
327
+ return base64_decode(strtr($input, '-_', '+/'));
328
+ }
329
+
330
+ /**
331
+ * Encode a string with URL-safe Base64.
332
+ *
333
+ * @param string $input The string you want encoded
334
+ *
335
+ * @return string The base64 encode of what you passed in
336
+ */
337
+ public static function urlsafeB64Encode($input)
338
+ {
339
+ return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
340
+ }
341
+
342
+ /**
343
+ * Helper method to create a JSON error.
344
+ *
345
+ * @param int $errno An error number from json_last_error()
346
+ *
347
+ * @return void
348
+ */
349
+ private static function handleJsonError($errno)
350
+ {
351
+ $messages = array(
352
+ JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
353
+ JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
354
+ JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',
355
+ JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON',
356
+ JSON_ERROR_UTF8 => 'Malformed UTF-8 characters' //PHP >= 5.3.3
357
+ );
358
+ throw new DomainException(
359
+ isset($messages[$errno])
360
+ ? $messages[$errno]
361
+ : 'Unknown JSON error: ' . $errno
362
+ );
363
+ }
364
+
365
+ /**
366
+ * Get the number of bytes in cryptographic strings.
367
+ *
368
+ * @param string
369
+ *
370
+ * @return int
371
+ */
372
+ private static function safeStrlen($str)
373
+ {
374
+ if (function_exists('mb_strlen')) {
375
+ return mb_strlen($str, '8bit');
376
+ }
377
+ return strlen($str);
378
+ }
379
+ }
includes/lib/php-jwt/SignatureInvalidException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Firebase\JWT;
3
+
4
+ class SignatureInvalidException extends \UnexpectedValueException
5
+ {
6
+
7
+ }
includes/profile.php CHANGED
@@ -9,11 +9,11 @@ function pmpro_membership_level_profile_fields($user)
9
 
10
  $server_tz = date_default_timezone_get();
11
  $wp_tz = get_option( 'timezone_string' );
12
-
13
  //option "timezone_string" is empty if set to UTC+0
14
  if(empty($wp_tz))
15
  $wp_tz = 'UTC';
16
-
17
  date_default_timezone_set($wp_tz);
18
 
19
  $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
@@ -57,7 +57,7 @@ function pmpro_membership_level_profile_fields($user)
57
  </select>
58
  <span id="current_level_cost">
59
  <?php
60
- $membership_values = pmpro_getMembershipLevelForUser($user->ID);
61
 
62
  //we tweak the initial payment here so the text here effectively shows the recurring amount
63
  if(!empty($membership_values))
@@ -67,14 +67,14 @@ function pmpro_membership_level_profile_fields($user)
67
  }
68
 
69
  if(empty($membership_values) || pmpro_isLevelFree($membership_values))
70
- {
71
  if(!empty($membership_values->original_initial_payment) && $membership_values->original_initial_payment > 0)
72
- echo "Paid " . pmpro_formatPrice($membership_values->original_initial_payment) . ".";
73
  else
74
- _e('Not paying.', 'paid-memberships-pro' );
75
- }
76
  else
77
- {
78
  echo pmpro_getLevelCost($membership_values, true, true);
79
  }
80
  ?>
@@ -84,7 +84,7 @@ function pmpro_membership_level_profile_fields($user)
84
  </tr>
85
  <?php
86
  }
87
-
88
  $show_expiration = true;
89
  $show_expiration = apply_filters("pmpro_profile_show_expiration", $show_expiration, $user);
90
  if($show_expiration)
@@ -93,26 +93,26 @@ function pmpro_membership_level_profile_fields($user)
93
  //is there an end date?
94
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
95
  $end_date = (!empty($user->membership_level) && !empty($user->membership_level->enddate)); // Returned as UTC timestamp
96
-
97
  // Convert UTC to local time
98
  if ( $end_date ) {
99
  $user->membership_level->enddate = strtotime( $wp_tz, $user->membership_level->enddate );
100
  }
101
 
102
  //some vars for the dates
103
- $current_day = date_i18n("j", current_time('timestamp'));
104
  if($end_date)
105
  $selected_expires_day = date_i18n("j", $user->membership_level->enddate);
106
  else
107
  $selected_expires_day = $current_day;
108
-
109
- $current_month = date_i18n("M", current_time('timestamp'));
110
  if($end_date)
111
  $selected_expires_month = date_i18n("m", $user->membership_level->enddate);
112
  else
113
  $selected_expires_month = date_i18n("m");
114
-
115
- $current_year = date_i18n("Y", current_time('timestamp'));
116
  if($end_date)
117
  $selected_expires_year = date_i18n("Y", $user->membership_level->enddate);
118
  else
@@ -128,7 +128,7 @@ function pmpro_membership_level_profile_fields($user)
128
  <span id="expires_date" <?php if(!$end_date) { ?>style="display: none;"<?php } ?>>
129
  on
130
  <select name="expires_month">
131
- <?php
132
  for($i = 1; $i < 13; $i++)
133
  {
134
  ?>
@@ -200,14 +200,14 @@ function pmpro_membership_level_profile_fields($user)
200
  var $expires_month_select = jQuery("[name=expires_month]");
201
  var $expires_day_text = jQuery("[name=expires_day]");
202
  var $expires_year_text = jQuery("[name=expires_year]");
203
-
204
  //note old data to check for changes
205
  var old_level = $membership_level_select.val();
206
  var old_expires = $expires_select.val();
207
  var old_expires_month = $expires_month_select.val();
208
  var old_expires_day = $expires_day_text.val();
209
  var old_expires_year = $expires_year_text.val();
210
-
211
  var current_level_cost = jQuery("#current_level_cost").text();
212
 
213
  //hide by default
@@ -224,7 +224,7 @@ function pmpro_membership_level_profile_fields($user)
224
  jQuery("#cancel_subscription").attr('checked', false);
225
  jQuery("#current_level_cost").text(current_level_cost);
226
  }
227
-
228
  //did level or expiration change?
229
  if(
230
  $membership_level_select.val() != old_level ||
@@ -235,15 +235,15 @@ function pmpro_membership_level_profile_fields($user)
235
  )
236
  {
237
  jQuery(".more_level_options").show();
238
- jQuery("#cancel_description").show();
239
  }
240
  else
241
  {
242
  jQuery(".more_level_options").hide();
243
- jQuery("#cancel_description").hide();
244
  }
245
  }
246
-
247
  //run check when fields change
248
  $membership_level_select.change(function() {
249
  pmpro_checkForLevelChangeInProfile();
@@ -259,8 +259,8 @@ function pmpro_membership_level_profile_fields($user)
259
  });
260
  $expires_year_text.change(function() {
261
  pmpro_checkForLevelChangeInProfile();
262
- });
263
-
264
  jQuery("#cancel_subscription").change(function() {
265
  if(jQuery(this).attr('checked') == 'checked')
266
  {
@@ -296,8 +296,8 @@ function pmpro_membership_level_profile_fields_update()
296
  //get the user id
297
  global $wpdb, $current_user, $user_ID;
298
  wp_get_current_user();
299
-
300
- if(!empty($_REQUEST['user_id']))
301
  $user_ID = $_REQUEST['user_id'];
302
 
303
  $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
@@ -316,10 +316,10 @@ function pmpro_membership_level_profile_fields_update()
316
  else
317
  $changed_or_cancelled = 'admin_changed';
318
 
319
- //if the cancel at gateway box is not checked, don't cancel
320
  if(empty($_REQUEST['cancel_subscription']))
321
  add_filter('pmpro_cancel_previous_subscriptions', 'pmpro_cancel_previous_subscriptions_false');
322
-
323
  //do the change
324
  if(pmpro_changeMembershipLevel(intval($_REQUEST['membership_level']), $user_ID, $changed_or_cancelled))
325
  {
@@ -331,22 +331,22 @@ function pmpro_membership_level_profile_fields_update()
331
  //the level didn't change, but we were asked to cancel the subscription at the gateway, let's do that
332
  $order = new MemberOrder();
333
  $order->getLastMemberOrder($user_ID);
334
-
335
  if(!empty($order) && !empty($order->id))
336
- $r = $order->cancel();
337
  }
338
-
339
- //remove filter after ward
340
  if(empty($_REQUEST['cancel_subscription']))
341
  remove_filter('pmpro_cancel_previous_subscriptions', 'pmpro_cancel_previous_subscriptions_false');
342
  }
343
-
344
  //expiration change
345
  if(!empty($_REQUEST['expires']))
346
  {
347
  //update the expiration date
348
  $expiration_date = intval($_REQUEST['expires_year']) . "-" . str_pad(intval($_REQUEST['expires_month']), 2, "0", STR_PAD_LEFT) . "-" . str_pad(intval($_REQUEST['expires_day']), 2, "0", STR_PAD_LEFT);
349
- $sqlQuery = "UPDATE $wpdb->pmpro_memberships_users SET enddate = '" . $expiration_date . "' WHERE status = 'active' AND membership_id = '" . intval($_REQUEST['membership_level']) . "' AND user_id = '" . $user_ID . "' LIMIT 1";
350
  if($wpdb->query($sqlQuery))
351
  $expiration_changed = true;
352
  }
@@ -355,16 +355,16 @@ function pmpro_membership_level_profile_fields_update()
355
  //already blank? have to check for null or '0000-00-00 00:00:00' or '' here.
356
  $sqlQuery = "SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE (enddate IS NULL OR enddate = '' OR enddate = '0000-00-00 00:00:00') AND status = 'active' AND user_id = '" . $user_ID . "' LIMIT 1";
357
  $blank = $wpdb->get_var($sqlQuery);
358
-
359
  if(empty($blank))
360
- {
361
  //null out the expiration
362
  $sqlQuery = "UPDATE $wpdb->pmpro_memberships_users SET enddate = NULL WHERE status = 'active' AND membership_id = '" . intval($_REQUEST['membership_level']) . "' AND user_id = '" . $user_ID . "' LIMIT 1";
363
  if($wpdb->query($sqlQuery))
364
  $expiration_changed = true;
365
  }
366
  }
367
-
368
  //emails if there was a change
369
  if(!empty($level_changed) || !empty($expiration_changed))
370
  {
@@ -373,7 +373,7 @@ function pmpro_membership_level_profile_fields_update()
373
  if(!empty($expiration_changed))
374
  $pmproemail->expiration_changed = true;
375
  $pmproemail->sendAdminChangeAdminEmail(get_userdata($user_ID));
376
-
377
  //send email
378
  if(!empty($_REQUEST['send_admin_change_email']))
379
  {
@@ -381,7 +381,7 @@ function pmpro_membership_level_profile_fields_update()
381
  $pmproemail = new PMProEmail();
382
  if(!empty($expiration_changed))
383
  $pmproemail->expiration_changed = true;
384
- $pmproemail->sendAdminChangeEmail(get_userdata($user_ID));
385
  }
386
  }
387
  }
9
 
10
  $server_tz = date_default_timezone_get();
11
  $wp_tz = get_option( 'timezone_string' );
12
+
13
  //option "timezone_string" is empty if set to UTC+0
14
  if(empty($wp_tz))
15
  $wp_tz = 'UTC';
16
+
17
  date_default_timezone_set($wp_tz);
18
 
19
  $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
57
  </select>
58
  <span id="current_level_cost">
59
  <?php
60
+ $membership_values = pmpro_getMembershipLevelForUser($user->ID);
61
 
62
  //we tweak the initial payment here so the text here effectively shows the recurring amount
63
  if(!empty($membership_values))
67
  }
68
 
69
  if(empty($membership_values) || pmpro_isLevelFree($membership_values))
70
+ {
71
  if(!empty($membership_values->original_initial_payment) && $membership_values->original_initial_payment > 0)
72
+ echo __('Paid', 'paid-memberships-pro' ) . pmpro_formatPrice($membership_values->original_initial_payment) . ".";
73
  else
74
+ _e('Not paying.', 'paid-memberships-pro' );
75
+ }
76
  else
77
+ {
78
  echo pmpro_getLevelCost($membership_values, true, true);
79
  }
80
  ?>
84
  </tr>
85
  <?php
86
  }
87
+
88
  $show_expiration = true;
89
  $show_expiration = apply_filters("pmpro_profile_show_expiration", $show_expiration, $user);
90
  if($show_expiration)
93
  //is there an end date?
94
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
95
  $end_date = (!empty($user->membership_level) && !empty($user->membership_level->enddate)); // Returned as UTC timestamp
96
+
97
  // Convert UTC to local time
98
  if ( $end_date ) {
99
  $user->membership_level->enddate = strtotime( $wp_tz, $user->membership_level->enddate );
100
  }
101
 
102
  //some vars for the dates
103
+ $current_day = date_i18n("j", current_time('timestamp'));
104
  if($end_date)
105
  $selected_expires_day = date_i18n("j", $user->membership_level->enddate);
106
  else
107
  $selected_expires_day = $current_day;
108
+
109
+ $current_month = date_i18n("M", current_time('timestamp'));
110
  if($end_date)
111
  $selected_expires_month = date_i18n("m", $user->membership_level->enddate);
112
  else
113
  $selected_expires_month = date_i18n("m");
114
+
115
+ $current_year = date_i18n("Y", current_time('timestamp'));
116
  if($end_date)
117
  $selected_expires_year = date_i18n("Y", $user->membership_level->enddate);
118
  else
128
  <span id="expires_date" <?php if(!$end_date) { ?>style="display: none;"<?php } ?>>
129
  on
130
  <select name="expires_month">
131
+ <?php
132
  for($i = 1; $i < 13; $i++)
133
  {
134
  ?>
200
  var $expires_month_select = jQuery("[name=expires_month]");
201
  var $expires_day_text = jQuery("[name=expires_day]");
202
  var $expires_year_text = jQuery("[name=expires_year]");
203
+
204
  //note old data to check for changes
205
  var old_level = $membership_level_select.val();
206
  var old_expires = $expires_select.val();
207
  var old_expires_month = $expires_month_select.val();
208
  var old_expires_day = $expires_day_text.val();
209
  var old_expires_year = $expires_year_text.val();
210
+
211
  var current_level_cost = jQuery("#current_level_cost").text();
212
 
213
  //hide by default
224
  jQuery("#cancel_subscription").attr('checked', false);
225
  jQuery("#current_level_cost").text(current_level_cost);
226
  }
227
+
228
  //did level or expiration change?
229
  if(
230
  $membership_level_select.val() != old_level ||
235
  )
236
  {
237
  jQuery(".more_level_options").show();
238
+ jQuery("#cancel_description").show();
239
  }
240
  else
241
  {
242
  jQuery(".more_level_options").hide();
243
+ jQuery("#cancel_description").hide();
244
  }
245
  }
246
+
247
  //run check when fields change
248
  $membership_level_select.change(function() {
249
  pmpro_checkForLevelChangeInProfile();
259
  });
260
  $expires_year_text.change(function() {
261
  pmpro_checkForLevelChangeInProfile();
262
+ });
263
+
264
  jQuery("#cancel_subscription").change(function() {
265
  if(jQuery(this).attr('checked') == 'checked')
266
  {
296
  //get the user id
297
  global $wpdb, $current_user, $user_ID;
298
  wp_get_current_user();
299
+
300
+ if(!empty($_REQUEST['user_id']))
301
  $user_ID = $_REQUEST['user_id'];
302
 
303
  $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
316
  else
317
  $changed_or_cancelled = 'admin_changed';
318
 
319
+ //if the cancel at gateway box is not checked, don't cancel
320
  if(empty($_REQUEST['cancel_subscription']))
321
  add_filter('pmpro_cancel_previous_subscriptions', 'pmpro_cancel_previous_subscriptions_false');
322
+
323
  //do the change
324
  if(pmpro_changeMembershipLevel(intval($_REQUEST['membership_level']), $user_ID, $changed_or_cancelled))
325
  {
331
  //the level didn't change, but we were asked to cancel the subscription at the gateway, let's do that
332
  $order = new MemberOrder();
333
  $order->getLastMemberOrder($user_ID);
334
+
335
  if(!empty($order) && !empty($order->id))
336
+ $r = $order->cancel();
337
  }
338
+
339
+ //remove filter after ward
340
  if(empty($_REQUEST['cancel_subscription']))
341
  remove_filter('pmpro_cancel_previous_subscriptions', 'pmpro_cancel_previous_subscriptions_false');
342
  }
343
+
344
  //expiration change
345
  if(!empty($_REQUEST['expires']))
346
  {
347
  //update the expiration date
348
  $expiration_date = intval($_REQUEST['expires_year']) . "-" . str_pad(intval($_REQUEST['expires_month']), 2, "0", STR_PAD_LEFT) . "-" . str_pad(intval($_REQUEST['expires_day']), 2, "0", STR_PAD_LEFT);
349
+ $sqlQuery = "UPDATE $wpdb->pmpro_memberships_users SET enddate = '" . $expiration_date . "' WHERE status = 'active' AND membership_id = '" . intval($_REQUEST['membership_level']) . "' AND user_id = '" . $user_ID . "' LIMIT 1";
350
  if($wpdb->query($sqlQuery))
351
  $expiration_changed = true;
352
  }
355
  //already blank? have to check for null or '0000-00-00 00:00:00' or '' here.
356
  $sqlQuery = "SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE (enddate IS NULL OR enddate = '' OR enddate = '0000-00-00 00:00:00') AND status = 'active' AND user_id = '" . $user_ID . "' LIMIT 1";
357
  $blank = $wpdb->get_var($sqlQuery);
358
+
359
  if(empty($blank))
360
+ {
361
  //null out the expiration
362
  $sqlQuery = "UPDATE $wpdb->pmpro_memberships_users SET enddate = NULL WHERE status = 'active' AND membership_id = '" . intval($_REQUEST['membership_level']) . "' AND user_id = '" . $user_ID . "' LIMIT 1";
363
  if($wpdb->query($sqlQuery))
364
  $expiration_changed = true;
365
  }
366
  }
367
+
368
  //emails if there was a change
369
  if(!empty($level_changed) || !empty($expiration_changed))
370
  {
373
  if(!empty($expiration_changed))
374
  $pmproemail->expiration_changed = true;
375
  $pmproemail->sendAdminChangeAdminEmail(get_userdata($user_ID));
376
+
377
  //send email
378
  if(!empty($_REQUEST['send_admin_change_email']))
379
  {
381
  $pmproemail = new PMProEmail();
382
  if(!empty($expiration_changed))
383
  $pmproemail->expiration_changed = true;
384
+ $pmproemail->sendAdminChangeEmail(get_userdata($user_ID));
385
  }
386
  }
387
  }
includes/recaptcha.php CHANGED
@@ -6,15 +6,21 @@ function pmpro_init_recaptcha() {
6
  }
7
 
8
  //use recaptcha?
9
- global $recaptcha;
10
  $recaptcha = pmpro_getOption( 'recaptcha' );
11
-
 
 
 
 
 
12
  if($recaptcha) {
13
  global $recaptcha_publickey, $recaptcha_privatekey;
14
 
15
  require_once(PMPRO_DIR . '/includes/lib/recaptchalib.php' );
16
 
17
  function pmpro_recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) {
 
18
  // Figure out language.
19
  $locale = get_locale();
20
  if(!empty($locale)) {
@@ -124,6 +130,7 @@ function pmpro_wp_ajax_validate_recaptcha() {
124
  $resp = $reCaptcha->verifyResponse( $_SERVER['REMOTE_ADDR'], $_REQUEST['g-recaptcha-response'] );
125
 
126
  if ( $resp->success ) {
 
127
  echo "1";
128
  } else {
129
  echo "0";
@@ -133,3 +140,8 @@ function pmpro_wp_ajax_validate_recaptcha() {
133
  }
134
  add_action( 'wp_ajax_nopriv_pmpro_validate_recaptcha', 'pmpro_wp_ajax_validate_recaptcha' );
135
  add_action( 'wp_ajax_pmpro_validate_recaptcha', 'pmpro_wp_ajax_validate_recaptcha' );
 
 
 
 
 
6
  }
7
 
8
  //use recaptcha?
9
+ global $recaptcha, $recaptcha_validated;
10
  $recaptcha = pmpro_getOption( 'recaptcha' );
11
+
12
+ $recaptcha_validated = pmpro_get_session_var( 'pmpro_recaptcha_validated' );
13
+ if ( ! empty( $recaptcha_validated ) ) {
14
+ $recaptcha = false;
15
+ }
16
+
17
  if($recaptcha) {
18
  global $recaptcha_publickey, $recaptcha_privatekey;
19
 
20
  require_once(PMPRO_DIR . '/includes/lib/recaptchalib.php' );
21
 
22
  function pmpro_recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) {
23
+
24
  // Figure out language.
25
  $locale = get_locale();
26
  if(!empty($locale)) {
130
  $resp = $reCaptcha->verifyResponse( $_SERVER['REMOTE_ADDR'], $_REQUEST['g-recaptcha-response'] );
131
 
132
  if ( $resp->success ) {
133
+ pmpro_set_session_var( 'pmpro_recaptcha_validated', true );
134
  echo "1";
135
  } else {
136
  echo "0";
140
  }
141
  add_action( 'wp_ajax_nopriv_pmpro_validate_recaptcha', 'pmpro_wp_ajax_validate_recaptcha' );
142
  add_action( 'wp_ajax_pmpro_validate_recaptcha', 'pmpro_wp_ajax_validate_recaptcha' );
143
+
144
+ function pmpro_after_checkout_reset_recaptcha() {
145
+ pmpro_unset_session_var( 'pmpro_recaptcha_validated' );
146
+ }
147
+ add_action( 'pmpro_after_checkout', 'pmpro_after_checkout_reset_recaptcha' );
includes/rest-api.php CHANGED
@@ -1,53 +1,58 @@
1
  <?php
2
-
3
- class PMPro_REST_API_Routes extends WP_REST_Controller {
4
- public function pmpro_rest_api_register_routes() {
5
- $namespace = 'wp/v2';
6
- register_rest_route( $namespace, '/users/(?P<id>\d+)'.'/pmpro_membership_level' ,
7
- array(
8
  array(
9
- 'methods' => WP_REST_Server::READABLE,
10
- 'callback' => array( $this, 'pmpro_rest_api_get_user_level' ),
11
- 'permission_callback' => array( $this, 'pmpro_rest_api_get_permissions_check' ),
12
- ),));
13
-
14
- register_rest_route( $namespace, '/posts/(?P<post_id>\d+)'.'/user_id/(?P<user_id>\d+)/pmpro_has_membership_access' ,
15
- array(
16
  array(
17
- 'methods' => WP_REST_Server::READABLE,
18
- 'callback' => array( $this, 'pmpro_rest_api_get_has_membership_access' ),
19
- 'permission_callback' => array( $this, 'pmpro_rest_api_get_permissions_check' ),
20
- ),));
21
- }
22
-
23
- //Ex:http://example.com/wp-json/wp/v2/users/2/pmpro_membership_level
24
- function pmpro_rest_api_get_user_level($request) {
25
- $params = $request->get_params();
26
 
27
- $user_id = $params['id'];
 
 
 
 
 
 
 
 
 
 
 
28
 
29
- $level = pmpro_getMembershipLevelForUser($user_id);
30
- return new WP_REST_Response((array)$level, 200 );
31
- }
32
-
33
- //Ex: http://example.com/wp-json/wp/v2/posts/58/user_id/2/pmpro_has_membership_access
34
- function pmpro_rest_api_get_has_membership_access($request) {
35
- $params = $request->get_params();
36
- $post_id = $params['post_id'];
37
- $user_id = $params['user_id'];
38
 
39
- $has_access = pmpro_has_membership_access($post_id, $user_id);
40
- return $has_access;
41
- }
42
-
43
- function pmpro_rest_api_get_permissions_check($request) {
44
- return current_user_can('edit_users');
45
  }
46
- }
47
 
48
- function pmpro_rest_api_register_custom_routes() {
49
- $pmpro_rest_api_routes = new PMPro_REST_API_Routes;
50
- $pmpro_rest_api_routes->pmpro_rest_api_register_routes();
51
- }
52
 
53
- add_action( 'rest_api_init', 'pmpro_rest_api_register_custom_routes', 5 );
 
1
  <?php
2
+
3
+ if ( class_exists( 'WP_REST_Controller' ) ) {
4
+ class PMPro_REST_API_Routes extends WP_REST_Controller {
5
+ public function pmpro_rest_api_register_routes() {
6
+ $namespace = 'wp/v2';
7
+ register_rest_route( $namespace, '/users/(?P<id>\d+)'.'/pmpro_membership_level' ,
8
  array(
9
+ array(
10
+ 'methods' => WP_REST_Server::READABLE,
11
+ 'callback' => array( $this, 'pmpro_rest_api_get_user_level' ),
12
+ 'permission_callback' => array( $this, 'pmpro_rest_api_get_permissions_check' ),
13
+ ),));
14
+
15
+ register_rest_route( $namespace, '/posts/(?P<post_id>\d+)'.'/user_id/(?P<user_id>\d+)/pmpro_has_membership_access' ,
16
  array(
17
+ array(
18
+ 'methods' => WP_REST_Server::READABLE,
19
+ 'callback' => array( $this, 'pmpro_rest_api_get_has_membership_access' ),
20
+ 'permission_callback' => array( $this, 'pmpro_rest_api_get_permissions_check' ),
21
+ ),));
22
+ }
 
 
 
23
 
24
+ //Ex:http://example.com/wp-json/wp/v2/users/2/pmpro_membership_level
25
+ function pmpro_rest_api_get_user_level($request) {
26
+ $params = $request->get_params();
27
+
28
+ $user_id = $params['id'];
29
+
30
+ $level = pmpro_getMembershipLevelForUser($user_id);
31
+ if ( ! empty( $level ) ) {
32
+ $level = (array)$level;
33
+ }
34
+ return new WP_REST_Response($level, 200 );
35
+ }
36
 
37
+ //Ex: http://example.com/wp-json/wp/v2/posts/58/user_id/2/pmpro_has_membership_access
38
+ function pmpro_rest_api_get_has_membership_access($request) {
39
+ $params = $request->get_params();
40
+ $post_id = $params['post_id'];
41
+ $user_id = $params['user_id'];
42
+
43
+ $has_access = pmpro_has_membership_access($post_id, $user_id);
44
+ return $has_access;
45
+ }
46
 
47
+ function pmpro_rest_api_get_permissions_check($request) {
48
+ return current_user_can('edit_users');
49
+ }
 
 
 
50
  }
 
51
 
52
+ function pmpro_rest_api_register_custom_routes() {
53
+ $pmpro_rest_api_routes = new PMPro_REST_API_Routes;
54
+ $pmpro_rest_api_routes->pmpro_rest_api_register_routes();
55
+ }
56
 
57
+ add_action( 'rest_api_init', 'pmpro_rest_api_register_custom_routes', 5 );
58
+ }
includes/scripts.php ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Enqueue frontend JavaScript and CSS
4
+ */
5
+ function pmpro_enqueue_scripts() {
6
+ // Frontend styles.
7
+ $frontend_css_rtl = false;
8
+ if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/frontend.css")) {
9
+ $frontend_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/frontend.css";
10
+ if( is_rtl() && file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/frontend-rtl.css") ) {
11
+ $frontend_css_rtl = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/frontend-rtl.css";
12
+ }
13
+ } elseif(file_exists(get_template_directory() . "/paid-memberships-pro/frontend.css")) {
14
+ $frontend_css = get_template_directory_uri() . "/paid-memberships-pro/frontend.css";
15
+ if( is_rtl() && file_exists(get_template_directory() . "/paid-memberships-pro/css/frontend-rtl.css") ) {
16
+ $frontend_css_rtl = get_template_directory_uri() . "/paid-memberships-pro/css/frontend-rtl.css";
17
+ }
18
+ } else {
19
+ $frontend_css = plugins_url('css/frontend.css',dirname(__FILE__) );
20
+ if( is_rtl() ) {
21
+ $frontend_css_rtl = plugins_url('css/frontend-rtl.css',dirname(__FILE__) );
22
+ }
23
+ }
24
+ wp_enqueue_style('pmpro_frontend', $frontend_css, array(), PMPRO_VERSION, "screen");
25
+ if( $frontend_css_rtl ) {
26
+ wp_enqueue_style('pmpro_frontend_rtl', $frontend_css_rtl, array(), PMPRO_VERSION, "screen");
27
+ }
28
+
29
+ // Print styles.
30
+ if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/print.css"))
31
+ $print_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/print.css";
32
+ elseif(file_exists(get_template_directory() . "/paid-memberships-pro/print.css"))
33
+ $print_css = get_template_directory_uri() . "/paid-memberships-pro/print.css";
34
+ else
35
+ $print_css = plugins_url('css/print.css',dirname(__FILE__) );
36
+ wp_enqueue_style('pmpro_print', $print_css, array(), PMPRO_VERSION, "print");
37
+
38
+ // Checkout page JS
39
+ if ( pmpro_is_checkout() ) {
40
+ wp_register_script( 'pmpro_checkout',
41
+ plugins_url( 'js/pmpro-checkout.js', dirname(__FILE__) ),
42
+ array( 'jquery' ),
43
+ PMPRO_VERSION );
44
+
45
+ wp_localize_script( 'pmpro_checkout', 'pmpro', array(
46
+ 'ajaxurl' => admin_url( 'admin-ajax.php' ),
47
+ 'ajax_timeout' => apply_filters( 'pmpro_ajax_timeout', 5000, 'applydiscountcode' ),
48
+ 'show_discount_code' => pmpro_show_discount_code(),
49
+ 'discount_code_passed_in' => !empty( $_REQUEST['discount_code'] ),
50
+ ));
51
+ wp_enqueue_script( 'pmpro_checkout' );
52
+ }
53
+ }
54
+ add_action( 'wp_enqueue_scripts', 'pmpro_enqueue_scripts' );
55
+
56
+ /**
57
+ * Enqueue admin JavaScript and CSS
58
+ */
59
+ function pmpro_admin_enqueue_scripts() {
60
+ // Admin JS
61
+ wp_register_script( 'pmpro_admin',
62
+ plugins_url( 'js/pmpro-admin.js', dirname(__FILE__) ),
63
+ array( 'jquery', 'jquery-ui-sortable' ),
64
+ PMPRO_VERSION );
65
+ $all_levels = pmpro_getAllLevels( true, true );
66
+ $all_level_values_and_labels = array();
67
+ foreach( $all_levels as $level ) {
68
+ $all_level_values_and_labels[] = array( 'value' => $level->id, 'label' => $level->name );
69
+ }
70
+ wp_localize_script( 'pmpro_admin', 'pmpro', array(
71
+ 'all_levels' => $all_levels,
72
+ 'all_level_values_and_labels' => $all_level_values_and_labels
73
+ ));
74
+ wp_enqueue_script( 'pmpro_admin' );
75
+
76
+ // Admin CSS
77
+ $admin_css_rtl = false;
78
+ if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/admin.css")) {
79
+ $admin_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/admin.css";
80
+ if( is_rtl() && file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/admin-rtl.css") ) {
81
+ $admin_css_rtl = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/admin-rtl.css";
82
+ }
83
+ } elseif(file_exists(get_template_directory() . "/paid-memberships-pro/admin.css")) {
84
+ $admin_css = get_template_directory_uri() . "/paid-memberships-pro/admin.css";
85
+ if( is_rtl() && file_exists(get_template_directory() . "/paid-memberships-pro/css/admin-rtl.css") ) {
86
+ $admin_css_rtl = get_template_directory_uri() . "/paid-memberships-pro/css/admin-rtl.css";
87
+ }
88
+ } else {
89
+ $admin_css = plugins_url('css/admin.css',dirname(__FILE__) );
90
+ if( is_rtl() ) {
91
+ $admin_css_rtl = plugins_url('css/admin-rtl.css',dirname(__FILE__) );
92
+ }
93
+ }
94
+ wp_enqueue_style('pmpro_admin', $admin_css, array(), PMPRO_VERSION, "screen");
95
+ if( $admin_css_rtl ) {
96
+ wp_enqueue_style('pmpro_admin_rtl', $admin_css_rtl, array(), PMPRO_VERSION, "screen");
97
+ }
98
+ }
99
+ add_action( 'admin_enqueue_scripts', 'pmpro_admin_enqueue_scripts' );
includes/sessions.php CHANGED
@@ -1,4 +1,5 @@
1
  <?php
 
2
  /*
3
  Copyright 2011 Stranger Studios (email : jason@strangerstudios.com)
4
  GPLv2 Full license details in license.txt
@@ -9,49 +10,93 @@
9
  * A general function to start sessions for Paid Memberships Pro.
10
  * @since 1.9.2
11
  */
12
- function pmpro_start_session() {
13
-
14
- //if the session hasn't been started yet, start it (ignore if running from command line)
15
- if ( ! defined( 'PMPRO_USE_SESSIONS' ) || PMPRO_USE_SESSIONS == true ) {
16
- if ( defined( 'STDIN' ) ) {
17
- //command line
18
- } else {
19
- if ( version_compare( phpversion(), '5.4.0', '>=' ) ) {
20
- if ( session_status() == PHP_SESSION_NONE ) {
21
- session_start();
22
- }
23
- } else {
24
- if ( ! session_id() ) {
25
- session_start();
26
- }
27
- }
28
- }
29
- }
 
30
  }
31
 
32
- add_action( 'pmpro_checkout_preheader_before_get_level_at_checkout', 'pmpro_start_session', -1 );
33
 
34
  /**
35
  * Close the session object for new updates
36
  * @since 1.9.2
37
  */
38
- function pmpro_close_session() {
39
-
40
- if ( ! defined( 'PMPRO_USE_SESSIONS' ) || PMPRO_USE_SESSIONS == true ) {
41
- if ( defined( 'STDIN' ) ) {
42
- //command line
43
- } else {
44
- if ( version_compare( phpversion(), '5.4.0', '>=' ) ) {
45
- if ( session_status() == PHP_SESSION_ACTIVE ) {
46
- session_write_close();
47
- }
48
- } else {
49
- if ( session_id() ) {
50
- session_write_close();
51
- }
52
- }
53
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  }
55
  }
56
 
57
- add_action( 'pmpro_after_checkout', 'pmpro_close_session', 32768 );
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
+
3
  /*
4
  Copyright 2011 Stranger Studios (email : jason@strangerstudios.com)
5
  GPLv2 Full license details in license.txt
10
  * A general function to start sessions for Paid Memberships Pro.
11
  * @since 1.9.2
12
  */
13
+ function pmpro_start_session()
14
+ {
15
+
16
+ //if the session hasn't been started yet, start it (ignore if running from command line)
17
+ if (!defined('PMPRO_USE_SESSIONS') || PMPRO_USE_SESSIONS == true) {
18
+ if (defined('STDIN')) {
19
+ //command line
20
+ } else {
21
+ if (version_compare(phpversion(), '5.4.0', '>=')) {
22
+ if (session_status() == PHP_SESSION_NONE) {
23
+ session_start();
24
+ }
25
+ } else {
26
+ if (!session_id()) {
27
+ session_start();
28
+ }
29
+ }
30
+ }
31
+ }
32
  }
33
 
34
+ add_action('pmpro_checkout_preheader_before_get_level_at_checkout', 'pmpro_start_session', -1);
35
 
36
  /**
37
  * Close the session object for new updates
38
  * @since 1.9.2
39
  */
40
+ function pmpro_close_session()
41
+ {
42
+
43
+ if (!defined('PMPRO_USE_SESSIONS') || PMPRO_USE_SESSIONS == true) {
44
+ if (defined('STDIN')) {
45
+ //command line
46
+ } else {
47
+ if (version_compare(phpversion(), '5.4.0', '>=')) {
48
+ if (session_status() == PHP_SESSION_ACTIVE) {
49
+ session_write_close();
50
+ }
51
+ } else {
52
+ if (session_id()) {
53
+ session_write_close();
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ add_action('pmpro_after_checkout', 'pmpro_close_session', 32768);
61
+
62
+ /**
63
+ * Set a session variable.
64
+ *
65
+ * @since 2.1.0
66
+ *
67
+ * TODO: Update docblock.
68
+ */
69
+ function pmpro_set_session_var($key, $value)
70
+ {
71
+ pmpro_start_session();
72
+ $_SESSION[$key] = $value;
73
+ }
74
+
75
+ /**
76
+ * Get a session variable.
77
+ *
78
+ * @since 2.1.0
79
+ *
80
+ * TODO: Update docblock.
81
+ */
82
+ function pmpro_get_session_var( $key ) {
83
+ pmpro_start_session();
84
+ if ( array_key_exists( $key, $_SESSION ) ) {
85
+ return $_SESSION[$key] ;
86
+ } else {
87
+ return false;
88
  }
89
  }
90
 
91
+ /**
92
+ * Unset a session variable.
93
+ *
94
+ * @since 2.1.0
95
+ *
96
+ * TODO: Update docblock.
97
+ */
98
+ function pmpro_unset_session_var($key)
99
+ {
100
+ pmpro_start_session();
101
+ unset($_SESSION[$key]);
102
+ }
includes/upgradecheck.php CHANGED
@@ -225,6 +225,13 @@ function pmpro_checkForUpgrades()
225
  $pmpro_db_version = '1.944';
226
  pmpro_setOption('db_version', '1.944');
227
  }
 
 
 
 
 
 
 
228
  }
229
 
230
  function pmpro_db_delta()
@@ -250,12 +257,12 @@ function pmpro_db_delta()
250
  `name` varchar(255) NOT NULL,
251
  `description` longtext NOT NULL,
252
  `confirmation` longtext NOT NULL,
253
- `initial_payment` decimal(10,2) NOT NULL DEFAULT '0.00',
254
- `billing_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
255
  `cycle_number` int(11) NOT NULL DEFAULT '0',
256
  `cycle_period` enum('Day','Week','Month','Year') DEFAULT 'Month',
257
  `billing_limit` int(11) NOT NULL COMMENT 'After how many cycles should billing stop?',
258
- `trial_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
259
  `trial_limit` int(11) NOT NULL DEFAULT '0',
260
  `allow_signups` tinyint(4) NOT NULL DEFAULT '1',
261
  `expiration_number` int(10) unsigned NOT NULL,
@@ -354,12 +361,12 @@ function pmpro_db_delta()
354
  `user_id` int(11) unsigned NOT NULL,
355
  `membership_id` int(11) unsigned NOT NULL,
356
  `code_id` int(11) unsigned NOT NULL,
357
- `initial_payment` decimal(10,2) NOT NULL,
358
- `billing_amount` decimal(10,2) NOT NULL,
359
  `cycle_number` int(11) NOT NULL,
360
  `cycle_period` enum('Day','Week','Month','Year') NOT NULL DEFAULT 'Month',
361
  `billing_limit` int(11) NOT NULL,
362
- `trial_amount` decimal(10,2) NOT NULL,
363
  `trial_limit` int(11) NOT NULL,
364
  `status` varchar(20) NOT NULL DEFAULT 'active',
365
  `startdate` datetime NOT NULL,
@@ -397,12 +404,12 @@ function pmpro_db_delta()
397
  CREATE TABLE `" . $wpdb->pmpro_discount_codes_levels . "` (
398
  `code_id` int(11) unsigned NOT NULL,
399
  `level_id` int(11) unsigned NOT NULL,
400
- `initial_payment` decimal(10,2) NOT NULL DEFAULT '0.00',
401
- `billing_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
402
  `cycle_number` int(11) NOT NULL DEFAULT '0',
403
  `cycle_period` enum('Day','Week','Month','Year') DEFAULT 'Month',
404
  `billing_limit` int(11) NOT NULL COMMENT 'After how many cycles should billing stop?',
405
- `trial_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
406
  `trial_limit` int(11) NOT NULL DEFAULT '0',
407
  `expiration_number` int(10) unsigned NOT NULL,
408
  `expiration_period` enum('Day','Week','Month','Year') NOT NULL,
225
  $pmpro_db_version = '1.944';
226
  pmpro_setOption('db_version', '1.944');
227
  }
228
+
229
+ if ( $pmpro_db_version < 2.1 ) {
230
+ pmpro_db_delta();
231
+
232
+ $pmpro_db_version = 2.1;
233
+ pmpro_setOption( 'db_version', '2.1' );
234
+ }
235
  }
236
 
237
  function pmpro_db_delta()
257
  `name` varchar(255) NOT NULL,
258
  `description` longtext NOT NULL,
259
  `confirmation` longtext NOT NULL,
260
+ `initial_payment` decimal(18,8) NOT NULL DEFAULT '0.00',
261
+ `billing_amount` decimal(18,8) NOT NULL DEFAULT '0.00',
262
  `cycle_number` int(11) NOT NULL DEFAULT '0',
263
  `cycle_period` enum('Day','Week','Month','Year') DEFAULT 'Month',
264
  `billing_limit` int(11) NOT NULL COMMENT 'After how many cycles should billing stop?',
265
+ `trial_amount` decimal(18,8) NOT NULL DEFAULT '0.00',
266
  `trial_limit` int(11) NOT NULL DEFAULT '0',
267
  `allow_signups` tinyint(4) NOT NULL DEFAULT '1',
268
  `expiration_number` int(10) unsigned NOT NULL,
361
  `user_id` int(11) unsigned NOT NULL,
362
  `membership_id` int(11) unsigned NOT NULL,
363
  `code_id` int(11) unsigned NOT NULL,
364
+ `initial_payment` decimal(18,8) NOT NULL,
365
+ `billing_amount` decimal(18,8) NOT NULL,
366
  `cycle_number` int(11) NOT NULL,
367
  `cycle_period` enum('Day','Week','Month','Year') NOT NULL DEFAULT 'Month',
368
  `billing_limit` int(11) NOT NULL,
369
+ `trial_amount` decimal(18,8) NOT NULL,
370
  `trial_limit` int(11) NOT NULL,
371
  `status` varchar(20) NOT NULL DEFAULT 'active',
372
  `startdate` datetime NOT NULL,
404
  CREATE TABLE `" . $wpdb->pmpro_discount_codes_levels . "` (
405
  `code_id` int(11) unsigned NOT NULL,
406
  `level_id` int(11) unsigned NOT NULL,
407
+ `initial_payment` decimal(18,8) NOT NULL DEFAULT '0.00',
408
+ `billing_amount` decimal(18,8) NOT NULL DEFAULT '0.00',
409
  `cycle_number` int(11) NOT NULL DEFAULT '0',
410
  `cycle_period` enum('Day','Week','Month','Year') DEFAULT 'Month',
411
  `billing_limit` int(11) NOT NULL COMMENT 'After how many cycles should billing stop?',
412
+ `trial_amount` decimal(18,8) NOT NULL DEFAULT '0.00',
413
  `trial_limit` int(11) NOT NULL DEFAULT '0',
414
  `expiration_number` int(10) unsigned NOT NULL,
415
  `expiration_period` enum('Day','Week','Month','Year') NOT NULL,
js/pmpro-admin.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Show a system prompt before redirecting to a URL.
3
+ * Used for delete links/etc.
4
+ * @param text The prompt, i.e. are you sure?
5
+ * @param url The url to redirect to.
6
+ */
7
+ function pmpro_askfirst( text, url ) {
8
+ var answer = window.confirm( text );
9
+
10
+ if ( answer ) {
11
+ window.location = url;
12
+ }
13
+ }
14
+
15
+ /**
16
+ * Deprecated in v2.1
17
+ * In case add-ons/etc are expecting the non-prefixed version.
18
+ */
19
+ if ( typeof askfirst !== 'function' ) {
20
+ function askfirst( text, url ) {
21
+ return pmpro_askfirst( text, url );
22
+ }
23
+ }
24
+
25
+ /*
26
+ * Toggle elements with a specific CSS class selector.
27
+ * Used to hide/show sub settings when a main setting is enabled.
28
+ * @since v2.1
29
+ */
30
+ function pmpro_toggle_elements_by_selector( selector, checked ) {
31
+ if( checked === undefined ) {
32
+ jQuery( selector ).toggle();
33
+ } else if ( checked ) {
34
+ jQuery( selector ).show();
35
+ } else {
36
+ jQuery( selector ).hide();
37
+ }
38
+ }
39
+
40
+ /*
41
+ * Find inputs with a custom attribute pmpro_toggle_trigger_for,
42
+ * and bind change to toggle the specified elements.
43
+ * @since v2.1
44
+ */
45
+ jQuery(document).ready(function() {
46
+ jQuery( 'input[pmpro_toggle_trigger_for]' ).change( function() {
47
+ pmpro_toggle_elements_by_selector( jQuery( this ).attr( 'pmpro_toggle_trigger_for' ), jQuery( this ).prop( 'checked' ) );
48
+ });
49
+ });
js/pmpro-braintree.js ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function() {
2
+ //set up braintree encryption
3
+ var braintree = Braintree.create( pmpro_braintree.encryptionkey );
4
+ braintree.onSubmitEncryptForm('pmpro_form');
5
+
6
+ //pass expiration dates in original format
7
+ function pmpro_updateBraintreeCardExp()
8
+ {
9
+ jQuery('#credit_card_exp').val(jQuery('#ExpirationMonth').val() + "/" + jQuery('#ExpirationYear').val());
10
+ }
11
+ jQuery('#ExpirationMonth, #ExpirationYear').change(function() {
12
+ pmpro_updateBraintreeCardExp();
13
+ });
14
+ pmpro_updateBraintreeCardExp();
15
+
16
+ //pass last 4 of credit card
17
+ function pmpro_updateBraintreeAccountNumber()
18
+ {
19
+ jQuery('#BraintreeAccountNumber').val('XXXXXXXXXXXXX' + jQuery('#AccountNumber').val().substr(jQuery('#AccountNumber').val().length - 4));
20
+ }
21
+ jQuery('#AccountNumber').change(function() {
22
+ pmpro_updateBraintreeAccountNumber();
23
+ });
24
+ pmpro_updateBraintreeAccountNumber();
25
+ });
js/pmpro-checkout.js ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function(){
2
+ // Discount code JS if we are showing discount codes.
3
+ if ( pmpro.show_discount_code ) {
4
+ //update discount code link to show field at top of form
5
+ jQuery('#other_discount_code_a').attr('href', 'javascript:void(0);');
6
+ jQuery('#other_discount_code_a').click(function() {
7
+ jQuery('#other_discount_code_tr').show();
8
+ jQuery('#other_discount_code_p').hide();
9
+ jQuery('#other_discount_code').focus();
10
+ });
11
+
12
+ //update real discount code field as the other discount code field is updated
13
+ jQuery('#other_discount_code').keyup(function() {
14
+ jQuery('#discount_code').val(jQuery('#other_discount_code').val());
15
+ });
16
+ jQuery('#other_discount_code').blur(function() {
17
+ jQuery('#discount_code').val(jQuery('#other_discount_code').val());
18
+ });
19
+
20
+ //update other discount code field as the real discount code field is updated
21
+ jQuery('#discount_code').keyup(function() {
22
+ jQuery('#other_discount_code').val(jQuery('#discount_code').val());
23
+ });
24
+ jQuery('#discount_code').blur(function() {
25
+ jQuery('#other_discount_code').val(jQuery('#discount_code').val());
26
+ });
27
+
28
+ // Top discount code field click handler.
29
+ jQuery('#other_discount_code_button').click(function() {
30
+ var code = jQuery('#other_discount_code').val();
31
+ var level_id = jQuery('#level').val();
32
+
33
+ if(code)
34
+ {
35
+ //hide any previous message
36
+ jQuery('.pmpro_discount_code_msg').hide();
37
+
38
+ //disable the apply button
39
+ jQuery('#other_discount_code_button').attr('disabled', 'disabled');
40
+
41
+ jQuery.ajax({
42
+ url: pmpro.ajaxurl, type:'GET',timeout: pmpro.ajax_timeout,
43
+ dataType: 'html',
44
+ data: "action=applydiscountcode&code=" + code + "&level=" + level_id + "&msgfield=pmpro_message",
45
+ error: function(xml){
46
+ alert('Error applying discount code [1]');
47
+
48
+ //enable apply button
49
+ jQuery('#other_discount_code_button').removeAttr('disabled');
50
+ },
51
+ success: function(responseHTML){
52
+ if (responseHTML == 'error')
53
+ {
54
+ alert('Error applying discount code [2]');
55
+ }
56
+ else
57
+ {
58
+ jQuery('#pmpro_message').html(responseHTML);
59
+ }
60
+
61
+ //enable invite button
62
+ jQuery('#other_discount_code_button').removeAttr('disabled');
63
+ }
64
+ });
65
+ }
66
+ });
67
+
68
+ // Bottom discount code field click handler.
69
+ jQuery('#discount_code_button').click(function() {
70
+ var code = jQuery('#discount_code').val();
71
+ var level_id = jQuery('#level').val();
72
+
73
+ if(code)
74
+ {
75
+ //hide any previous message
76
+ jQuery('.pmpro_discount_code_msg').hide();
77
+
78
+ //disable the apply button
79
+ jQuery('#discount_code_button').attr('disabled', 'disabled');
80
+
81
+ jQuery.ajax({
82
+ url: pmpro.ajaxurl,type:'GET',timeout: pmpro.ajax_timeout,
83
+ dataType: 'html',
84
+ data: "action=applydiscountcode&code=" + code + "&level=" + level_id + "&msgfield=discount_code_message",
85
+ error: function(xml){
86
+ alert('Error applying discount code [1]');
87
+
88
+ //enable apply button
89
+ jQuery('#discount_code_button').removeAttr('disabled');
90
+ },
91
+ success: function(responseHTML){
92
+ if (responseHTML == 'error')
93
+ {
94
+ alert('Error applying discount code [2]');
95
+ }
96
+ else
97
+ {
98
+ jQuery('#discount_code_message').html(responseHTML);
99
+ }
100
+
101
+ //enable invite button
102
+ jQuery('#discount_code_button').removeAttr('disabled');
103
+ }
104
+ });
105
+ }
106
+ });
107
+ }
108
+
109
+ // Validate credit card number and determine card type.
110
+ jQuery('#AccountNumber').validateCreditCard(function(result) {
111
+ var cardtypenames = {
112
+ "amex" : "American Express",
113
+ "diners_club_carte_blanche" : "Diners Club Carte Blanche",
114
+ "diners_club_international" : "Diners Club International",
115
+ "discover" : "Discover",
116
+ "jcb" : "JCB",
117
+ "laser" : "Laser",
118
+ "maestro" : "Maestro",
119
+ "mastercard" : "Mastercard",
120
+ "visa" : "Visa",
121
+ "visa_electron" : "Visa Electron"
122
+ };
123
+
124
+ if(result.card_type)
125
+ jQuery('#CardType').val(cardtypenames[result.card_type.name]);
126
+ else
127
+ jQuery('#CardType').val('Unknown Card Type');
128
+ });
129
+
130
+ // Find ALL <form> tags on your page
131
+ jQuery('form').submit(function(){
132
+ // On submit disable its submit button
133
+ jQuery('input[type=submit]', this).attr('disabled', 'disabled');
134
+ jQuery('input[type=image]', this).attr('disabled', 'disabled');
135
+ jQuery('#pmpro_processing_message').css('visibility', 'visible');
136
+ });
137
+
138
+ //iOS Safari fix (see: http://stackoverflow.com/questions/20210093/stop-safari-on-ios7-prompting-to-save-card-data)
139
+ var userAgent = window.navigator.userAgent;
140
+ if(userAgent.match(/iPad/i) || userAgent.match(/iPhone/i)) {
141
+ jQuery('input[type=submit]').click(function() {
142
+ try{
143
+ jQuery("input[type=password]").attr("type", "hidden");
144
+ } catch(ex){
145
+ try {
146
+ jQuery("input[type=password]").prop("type", "hidden");
147
+ } catch(ex) {}
148
+ }
149
+ });
150
+ }
151
+
152
+ //add required to required fields
153
+ if ( ! jQuery( '.pmpro_required' ).next().hasClass( "pmpro_asterisk" ) ) {
154
+ jQuery( '.pmpro_required' ).after( '<span class="pmpro_asterisk"> <abbr title="Required Field">*</abbr></span>' );
155
+ }
156
+
157
+ //unhighlight error fields when the user edits them
158
+ jQuery('.pmpro_error').bind("change keyup input", function() {
159
+ jQuery(this).removeClass('pmpro_error');
160
+ });
161
+
162
+ //click apply button on enter in discount code box
163
+ jQuery('#discount_code').keydown(function (e){
164
+ if(e.keyCode == 13){
165
+ e.preventDefault();
166
+ jQuery('#discount_code_button').click();
167
+ }
168
+ });
169
+
170
+ //hide apply button if a discount code was passed in
171
+ if( pmpro.discount_code_passed_in ) {
172
+ jQuery('#discount_code_button').hide();
173
+ jQuery('#discount_code').bind('change keyup', function() {
174
+ jQuery('#discount_code_button').show();
175
+ });
176
+ }
177
+
178
+ //click apply button on enter in *other* discount code box
179
+ jQuery('#other_discount_code').keydown(function (e){
180
+ if(e.keyCode == 13){
181
+ e.preventDefault();
182
+ jQuery('#other_discount_code_button').click();
183
+ }
184
+ });
185
+
186
+ //add javascriptok hidden field to checkout
187
+ jQuery("input[name=submit-checkout]").after('<input type="hidden" name="javascriptok" value="1" />');
188
+
189
+ // Keep bottom message box in sync with the top one.
190
+ jQuery('#pmpro_message').bind("DOMSubtreeModified",function(){
191
+ setTimeout( function(){ pmpro_copyMessageToBottom() }, 200);
192
+ });
193
+
194
+ function pmpro_copyMessageToBottom() {
195
+ jQuery('#pmpro_message_bottom').text(jQuery('#pmpro_message').text());
196
+ jQuery('#pmpro_message_bottom').attr('class', jQuery('#pmpro_message').attr('class'));
197
+ if(jQuery('#pmpro_message').is(":visible")) {
198
+ jQuery('#pmpro_message_bottom').show();
199
+ } else {
200
+ jQuery('#pmpro_message_bottom').hide();
201
+ }
202
+ }
203
+ });
js/pmpro-paypal.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Used by plugns that hide/show the billing fields.
2
+ pmpro_require_billing = true;
3
+
4
+ jQuery(document).ready(function() {
5
+ //choosing payment method
6
+ jQuery('input[name=gateway]').click(function() {
7
+ if(jQuery(this).val() == 'paypal') {
8
+ jQuery('#pmpro_paypalexpress_checkout').hide();
9
+ jQuery('#pmpro_billing_address_fields').show();
10
+ jQuery('#pmpro_payment_information_fields').show();
11
+ jQuery('#pmpro_submit_span').show();
12
+ } else {
13
+ jQuery('#pmpro_billing_address_fields').hide();
14
+ jQuery('#pmpro_payment_information_fields').hide();
15
+ jQuery('#pmpro_submit_span').hide();
16
+ jQuery('#pmpro_paypalexpress_checkout').show();
17
+ }
18
+ });
19
+
20
+ //select the radio button if the label is clicked on
21
+ jQuery('a.pmpro_radio').click(function() {
22
+ jQuery(this).prev().click();
23
+ });
24
+ });
js/pmpro-stripe.js ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Wire up the form for Stripe.
2
+ jQuery( document ).ready( function( $ ) {
3
+
4
+ var stripe, elements, cardNumber, cardExpiry, cardCvc;
5
+
6
+ // Identify with Stripe.
7
+ stripe = Stripe( pmproStripe.publishableKey );
8
+ elements = stripe.elements();
9
+
10
+ // Create Elements.
11
+ cardNumber = elements.create('cardNumber');
12
+ cardExpiry = elements.create('cardExpiry');
13
+ cardCvc = elements.create('cardCvc');
14
+
15
+ // Mount Elements.
16
+ cardNumber.mount('#AccountNumber');
17
+ cardExpiry.mount('#Expiry');
18
+ cardCvc.mount('#CVV');
19
+
20
+ // Handle authentication if required.
21
+ if ( 'undefined' !== typeof( pmproStripe.paymentIntent ) ) {
22
+ if ( 'requires_action' === pmproStripe.paymentIntent.status ) {
23
+ // On submit disable its submit button
24
+ $('input[type=submit]', this).attr('disabled', 'disabled');
25
+ $('input[type=image]', this).attr('disabled', 'disabled');
26
+ $('#pmpro_processing_message').css('visibility', 'visible');
27
+ stripe.handleCardAction( pmproStripe.paymentIntent.client_secret )
28
+ .then( stripeResponseHandler );
29
+ }
30
+ }
31
+
32
+ $( '.pmpro_form' ).submit( function( event ) {
33
+ var name, address;
34
+
35
+ // Prevent the form from submitting with the default action.
36
+ event.preventDefault();
37
+
38
+ // Double check in case a discount code made the level free.
39
+ if ( typeof pmpro_require_billing === 'undefined' || pmpro_require_billing ) {
40
+
41
+ if ( pmproStripe.verifyAddress ) {
42
+ address = {
43
+ line1: $( '#baddress1' ).val(),
44
+ line2: $( '#baddress2' ).val(),
45
+ city: $( '#bcity' ).val(),
46
+ state: $( '#bstate' ).val(),
47
+ postal_code: $( '#bzipcode' ).val(),
48
+ country: $( '#bcountry' ).val(),
49
+ }
50
+ }
51
+
52
+ //add first and last name if not blank
53
+ if ( $( '#bfirstname' ).length && $( '#blastname' ).length ) {
54
+ name = $.trim( $( '#bfirstname' ).val() + ' ' + $( '#blastname' ).val() );
55
+ }
56
+
57
+ stripe.createPaymentMethod( 'card', cardNumber, {
58
+ billing_details: {
59
+ address: address,
60
+ name: name,
61
+ }
62
+ }).then( stripeResponseHandler );
63
+
64
+ // Prevent the form from submitting with the default action.
65
+ return false;
66
+ } else {
67
+ this.submit();
68
+ return true; //not using Stripe anymore
69
+ }
70
+ });
71
+
72
+ // Handle the response from Stripe.
73
+ function stripeResponseHandler( response ) {
74
+
75
+ var form, data, card, paymentMethodId, customerId;
76
+
77
+ form = $('#pmpro_form, .pmpro_form');
78
+
79
+ if (response.error) {
80
+
81
+ // Re-enable the submit button.
82
+ $('.pmpro_btn-submit-checkout,.pmpro_btn-submit').removeAttr('disabled');
83
+
84
+ // Hide processing message.
85
+ $('#pmpro_processing_message').css('visibility', 'hidden');
86
+
87
+ // error message
88
+ $( '#pmpro_message' ).text( response.error.message ).addClass( 'pmpro_error' ).removeClass( 'pmpro_alert' ).removeClass( 'pmpro_success' ).show();
89
+
90
+ } else if ( response.paymentMethod ) {
91
+
92
+ paymentMethodId = response.paymentMethod.id;
93
+ card = response.paymentMethod.card;
94
+
95
+ // Insert the Source ID into the form so it gets submitted to the server.
96
+ form.append( '<input type="hidden" name="payment_method_id" value="' + paymentMethodId + '" />' );
97
+
98
+ // We need this for now to make sure user meta gets updated.
99
+ // Insert fields for other card fields.
100
+ if( $( '#CardType[name=CardType]' ).length ) {
101
+ $( '#CardType' ).val( card.brand );
102
+ } else {
103
+ form.append( '<input type="hidden" name="CardType" value="' + card.brand + '"/>' );
104
+ }
105
+
106
+ form.append( '<input type="hidden" name="AccountNumber" value="XXXXXXXXXXXX' + card.last4 + '"/>' );
107
+ form.append( '<input type="hidden" name="ExpirationMonth" value="' + ( '0' + card.exp_month ).slice( -2 ) + '"/>' );
108
+ form.append( '<input type="hidden" name="ExpirationYear" value="' + card.exp_year + '"/>' );
109
+
110
+ // and submit
111
+ form.get(0).submit();
112
+
113
+ } else if ( response.paymentIntent || response.setupIntent ) {
114
+
115
+ // success message
116
+ $( '#pmpro_message' ).text( pmproStripe.msgAuthenticationValidated ).addClass( 'pmpro_success' ).removeClass( 'pmpro_alert' ).removeClass( 'pmpro_error' ).show();
117
+
118
+ customerId = pmproStripe.paymentIntent
119
+ ? pmproStripe.paymentIntent.customer
120
+ : pmproStripe.setupIntent.customer;
121
+
122
+ paymentMethodId = pmproStripe.paymentIntent
123
+ ? pmproStripe.paymentIntent.payment_method.id
124
+ : pmproStripe.setupIntent.payment_method.id;
125
+
126
+ card = pmproStripe.paymentIntent
127
+ ? pmproStripe.paymentIntent.payment_method.card
128
+ : pmproStripe.setupIntent.payment_method.card;
129
+
130
+ if ( pmproStripe.paymentIntent ) {
131
+ form.append( '<input type="hidden" name="payment_intent_id" value="' + pmproStripe.paymentIntent.id + '" />' );
132
+ }
133
+ if ( pmproStripe.setupIntent ) {
134
+ form.append( '<input type="hidden" name="setup_intent_id" value="' + pmproStripe.setupIntent.id + '" />' );
135
+ form.append( '<input type="hidden" name="subscription_id" value="' + pmproStripe.subscription.id + '" />' );
136
+ }
137
+
138
+ // Insert the Customer ID into the form so it gets submitted to the server.
139
+ form.append( '<input type="hidden" name="customer_id" value="' + customerId + '" />' );
140
+
141
+ // Insert the PaymentMethod ID into the form so it gets submitted to the server.
142
+ form.append( '<input type="hidden" name="payment_method_id" value="' + paymentMethodId + '" />' );
143
+
144
+ // We need this for now to make sure user meta gets updated.
145
+ // Insert fields for other card fields.
146
+ if( $( '#CardType[name=CardType]' ).length ) {
147
+ $( '#CardType' ).val( card.brand );
148
+ } else {
149
+ form.append( '<input type="hidden" name="CardType" value="' + card.brand + '"/>' );
150
+ }
151
+
152
+ form.append( '<input type="hidden" name="AccountNumber" value="XXXXXXXXXXXX' + card.last4 + '"/>' );
153
+ form.append( '<input type="hidden" name="ExpirationMonth" value="' + ( '0' + card.exp_month ).slice( -2 ) + '"/>' );
154
+ form.append( '<input type="hidden" name="ExpirationYear" value="' + card.exp_year + '"/>' );
155
+ form.get(0).submit();
156
+ return true;
157
+ }
158
+ }
159
+ });
languages/paid-memberships-pro.mo CHANGED
Binary file
languages/paid-memberships-pro.po CHANGED
@@ -6,7 +6,7 @@ msgid ""
6
  msgstr ""
7
  "Project-Id-Version: paid-memberships-pro\n"
8
  "Report-Msgid-Bugs-To: info@paidmembershipspro.com\n"
9
- "POT-Creation-Date: 2019-04-25 14:30-0400\n"
10
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
11
  "Last-Translator: \n"
12
  "Language-Team: Stranger Studios <info@paidmembershipspro.com>\n"
@@ -59,7 +59,7 @@ msgstr ""
59
  msgid "Check Again"
60
  msgstr ""
61
 
62
- #: adminpages/addons.php:93 adminpages/orders.php:1039 adminpages/addons.php:76
63
  #: adminpages/addons.php:79 adminpages/addons.php:92 adminpages/addons.php:93
64
  #: adminpages/orders.php:605 adminpages/orders.php:712
65
  #: adminpages/orders.php:741 adminpages/orders.php:850
@@ -103,7 +103,7 @@ msgstr ""
103
  #: adminpages/addons.php:112 adminpages/membershiplevels.php:296
104
  #: adminpages/membershiplevels.php:298 adminpages/membershiplevels.php:300
105
  #: adminpages/membershiplevels.php:324 adminpages/membershiplevels.php:334
106
- #: adminpages/membershiplevels.php:356
107
  msgid "Description"
108
  msgstr ""
109
 
@@ -171,9 +171,10 @@ msgstr ""
171
  msgid "Activate %s"
172
  msgstr ""
173
 
174
- #: adminpages/addons.php:231 adminpages/addons.php:213
175
- #: adminpages/addons.php:216 adminpages/addons.php:229
176
- #: adminpages/addons.php:231
 
177
  msgid "Delete"
178
  msgstr ""
179
 
@@ -208,8 +209,8 @@ msgstr ""
208
  msgid "WordPress.org"
209
  msgstr ""
210
 
211
- #: adminpages/addons.php:249 adminpages/orders.php:910
212
- #: adminpages/orders.php:1462 adminpages/orders.php:1472
213
  #: includes/profile.php:186 shortcodes/pmpro_account.php:158
214
  #: adminpages/addons.php:231 adminpages/addons.php:234
215
  #: adminpages/addons.php:247 adminpages/addons.php:249
@@ -349,7 +350,7 @@ msgid ""
349
  msgstr ""
350
 
351
  #: adminpages/admin_header.php:135
352
- #: classes/gateways/class.pmprogateway_stripe.php:66
353
  #: adminpages/admin_header.php:125 adminpages/admin_header.php:135
354
  #: classes/gateways/class.pmprogateway_stripe.php:66
355
  #: classes/gateways/class.pmprogateway_stripe.php:68
@@ -399,18 +400,18 @@ msgstr ""
399
  msgid "Members"
400
  msgstr ""
401
 
402
- #: adminpages/admin_header.php:196 adminpages/orders.php:994
403
- #: includes/adminpages.php:52 includes/adminpages.php:156
404
- #: adminpages/admin_header.php:196 adminpages/orders.php:520
405
- #: adminpages/orders.php:570 adminpages/orders.php:677
406
- #: adminpages/orders.php:706 adminpages/orders.php:810
407
- #: adminpages/orders.php:841 adminpages/orders.php:852
408
- #: adminpages/orders.php:939 adminpages/orders.php:994
409
- #: includes/adminpages.php:17 includes/adminpages.php:52
410
- #: includes/adminpages.php:55 includes/adminpages.php:56
411
- #: includes/adminpages.php:84 includes/adminpages.php:156
412
- #: includes/adminpages.php:163 includes/adminpages.php:167
413
- #: includes/adminpages.php:172
414
  msgid "Orders"
415
  msgstr ""
416
 
@@ -439,7 +440,7 @@ msgstr ""
439
  msgid "Levels"
440
  msgstr ""
441
 
442
- #: adminpages/admin_header.php:215 adminpages/membershiplevels.php:702
443
  #: adminpages/pagesettings.php:85 includes/metaboxes.php:130
444
  #: adminpages/admin_header.php:128 adminpages/admin_header.php:149
445
  #: adminpages/admin_header.php:150 adminpages/admin_header.php:159
@@ -451,15 +452,15 @@ msgstr ""
451
  #: adminpages/membershiplevels.php:609 adminpages/membershiplevels.php:618
452
  #: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:631
453
  #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:700
454
- #: adminpages/pagesettings.php:69 adminpages/pagesettings.php:70
455
- #: adminpages/pagesettings.php:71 adminpages/pagesettings.php:85
456
- #: includes/adminpages.php:44 includes/adminpages.php:64
457
- #: includes/adminpages.php:65 includes/adminpages.php:69
458
- #: includes/adminpages.php:70 includes/adminpages.php:100
459
- #: includes/adminpages.php:107 includes/adminpages.php:111
460
- #: includes/adminpages.php:116 includes/metaboxes.php:126
461
- #: includes/metaboxes.php:130 includes/metaboxes.php:131
462
- #: includes/metaboxes.php:132
463
  msgid "Membership Levels"
464
  msgstr ""
465
 
@@ -503,6 +504,7 @@ msgid "Payment Gateway &amp; SSL Settings"
503
  msgstr ""
504
 
505
  #: adminpages/admin_header.php:231 adminpages/memberslist.php:168
 
506
  #: shortcodes/pmpro_account.php:111 adminpages/admin_header.php:131
507
  #: adminpages/admin_header.php:152 adminpages/admin_header.php:162
508
  #: adminpages/admin_header.php:171 adminpages/admin_header.php:183
@@ -518,11 +520,12 @@ msgstr ""
518
  #: adminpages/admin_header.php:231 adminpages/emailsettings.php:83
519
  #: includes/adminpages.php:61 adminpages/admin_header.php:231
520
  #: adminpages/emailsettings.php:60 adminpages/emailsettings.php:69
521
- #: adminpages/emailsettings.php:79 includes/adminpages.php:12
522
- #: includes/adminpages.php:50 includes/adminpages.php:51
523
- #: includes/adminpages.php:59 includes/adminpages.php:61
524
- #: includes/adminpages.php:121 includes/adminpages.php:128
525
- #: includes/adminpages.php:132 includes/adminpages.php:137
 
526
  msgid "Email Settings"
527
  msgstr ""
528
 
@@ -537,11 +540,12 @@ msgstr ""
537
  #: includes/adminpages.php:62 adminpages/admin_header.php:235
538
  #: adminpages/advancedsettings.php:79 adminpages/advancedsettings.php:86
539
  #: adminpages/advancedsettings.php:88 adminpages/advancedsettings.php:91
540
- #: adminpages/advancedsettings.php:107 includes/adminpages.php:13
541
- #: includes/adminpages.php:51 includes/adminpages.php:52
542
- #: includes/adminpages.php:62 includes/adminpages.php:64
543
- #: includes/adminpages.php:128 includes/adminpages.php:135
544
- #: includes/adminpages.php:139 includes/adminpages.php:144
 
545
  msgid "Advanced Settings"
546
  msgstr ""
547
 
@@ -560,12 +564,13 @@ msgstr ""
560
  #: adminpages/advancedsettings.php:61 adminpages/advancedsettings.php:35
561
  #: adminpages/advancedsettings.php:42 adminpages/advancedsettings.php:43
562
  #: adminpages/advancedsettings.php:46 adminpages/advancedsettings.php:60
 
563
  msgid "Your advanced settings have been updated."
564
  msgstr ""
565
 
566
  #: adminpages/advancedsettings.php:87 adminpages/advancedsettings.php:66
567
  #: adminpages/advancedsettings.php:68 adminpages/advancedsettings.php:71
568
- #: adminpages/advancedsettings.php:85
569
  #, php-format
570
  msgid ""
571
  "This content is for !!levels!! members only. <a href=\"%s\">Register here</"
@@ -574,7 +579,7 @@ msgstr ""
574
 
575
  #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:71
576
  #: adminpages/advancedsettings.php:73 adminpages/advancedsettings.php:76
577
- #: adminpages/advancedsettings.php:90
578
  #, php-format
579
  msgid ""
580
  "Please <a href=\"%s\">login</a> to view this content. (<a href=\"%s"
@@ -583,7 +588,7 @@ msgstr ""
583
 
584
  #: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:76
585
  #: adminpages/advancedsettings.php:78 adminpages/advancedsettings.php:81
586
- #: adminpages/advancedsettings.php:95
587
  msgid ""
588
  "This content is for members only. Visit the site and log in/register to read."
589
  msgstr ""
@@ -591,12 +596,14 @@ msgstr ""
591
  #: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:85
592
  #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:94
593
  #: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:113
 
594
  msgid "Message for Logged-in Non-members"
595
  msgstr ""
596
 
597
  #: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:89
598
  #: adminpages/advancedsettings.php:96 adminpages/advancedsettings.php:98
599
  #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:117
 
600
  msgid ""
601
  "This message replaces the post content for non-members. Available variables"
602
  msgstr ""
@@ -604,40 +611,47 @@ msgstr ""
604
  #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:94
605
  #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:103
606
  #: adminpages/advancedsettings.php:106 adminpages/advancedsettings.php:122
 
607
  msgid "Message for Logged-out Users"
608
  msgstr ""
609
 
610
  #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:98
611
  #: adminpages/advancedsettings.php:105 adminpages/advancedsettings.php:107
612
  #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:126
 
613
  msgid "This message replaces the post content for logged-out visitors."
614
  msgstr ""
615
 
616
  #: adminpages/advancedsettings.php:133 adminpages/advancedsettings.php:103
617
  #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:112
618
  #: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:131
 
619
  msgid "Message for RSS Feed"
620
  msgstr ""
621
 
622
  #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:107
623
  #: adminpages/advancedsettings.php:114 adminpages/advancedsettings.php:116
624
  #: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:135
 
625
  msgid "This message replaces the post content in RSS feeds."
626
  msgstr ""
627
 
628
  #: adminpages/advancedsettings.php:143 adminpages/advancedsettings.php:122
629
  #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:141
 
630
  msgid "Filter searches and archives?"
631
  msgstr ""
632
 
633
  #: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:126
634
  #: adminpages/advancedsettings.php:129 adminpages/advancedsettings.php:145
 
635
  msgid ""
636
  "No - Non-members will see restricted posts/pages in searches and archives."
637
  msgstr ""
638
 
639
  #: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:127
640
  #: adminpages/advancedsettings.php:130 adminpages/advancedsettings.php:146
 
641
  msgid ""
642
  "Yes - Only members will see restricted posts/pages in searches and archives."
643
  msgstr ""
@@ -645,45 +659,51 @@ msgstr ""
645
  #: adminpages/advancedsettings.php:154 adminpages/advancedsettings.php:113
646
  #: adminpages/advancedsettings.php:120 adminpages/advancedsettings.php:133
647
  #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:152
 
648
  msgid "Show Excerpts to Non-Members?"
649
  msgstr ""
650
 
651
  #: adminpages/advancedsettings.php:158 adminpages/advancedsettings.php:117
652
  #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:137
653
  #: adminpages/advancedsettings.php:140 adminpages/advancedsettings.php:156
 
654
  msgid "No - Hide excerpts."
655
  msgstr ""
656
 
657
  #: adminpages/advancedsettings.php:159 adminpages/advancedsettings.php:118
658
  #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:138
659
  #: adminpages/advancedsettings.php:141 adminpages/advancedsettings.php:157
 
660
  msgid "Yes - Show excerpts."
661
  msgstr ""
662
 
663
  #: adminpages/advancedsettings.php:165 adminpages/advancedsettings.php:144
664
  #: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:163
 
665
  msgid "Hide Ads From Members?"
666
  msgstr ""
667
 
668
  #: adminpages/advancedsettings.php:169 adminpages/advancedsettings.php:228
669
- #: adminpages/advancedsettings.php:240 adminpages/membershiplevels.php:746
670
- #: adminpages/paymentsettings.php:236
671
- #: classes/gateways/class.pmprogateway_stripe.php:283 includes/profile.php:125
672
  #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:135
673
  #: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:151
674
- #: adminpages/advancedsettings.php:167 adminpages/advancedsettings.php:187
675
- #: adminpages/advancedsettings.php:194 adminpages/advancedsettings.php:199
676
- #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:207
677
- #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:219
678
- #: adminpages/advancedsettings.php:222 adminpages/advancedsettings.php:226
679
- #: adminpages/advancedsettings.php:238 adminpages/membershiplevels.php:563
680
- #: adminpages/membershiplevels.php:569 adminpages/membershiplevels.php:571
681
- #: adminpages/membershiplevels.php:578 adminpages/membershiplevels.php:598
682
- #: adminpages/membershiplevels.php:658 adminpages/membershiplevels.php:660
683
- #: adminpages/membershiplevels.php:662 adminpages/membershiplevels.php:667
684
- #: adminpages/membershiplevels.php:668 adminpages/membershiplevels.php:672
685
- #: adminpages/membershiplevels.php:684 adminpages/membershiplevels.php:694
686
- #: adminpages/membershiplevels.php:744 adminpages/paymentsettings.php:210
 
 
687
  #: adminpages/paymentsettings.php:219 adminpages/paymentsettings.php:236
688
  #: adminpages/paymentsettings.php:414 adminpages/paymentsettings.php:429
689
  #: adminpages/paymentsettings.php:434 adminpages/paymentsettings.php:436
@@ -699,6 +719,7 @@ msgstr ""
699
  #: classes/gateways/class.pmprogateway_stripe.php:222
700
  #: classes/gateways/class.pmprogateway_stripe.php:249
701
  #: classes/gateways/class.pmprogateway_stripe.php:281
 
702
  #: classes/gateways/class.pmprogateway_stripe.php:289
703
  #: classes/gateways/class.pmprogateway_stripe.php:291
704
  #: classes/gateways/class.pmprogateway_stripe.php:297
@@ -711,58 +732,66 @@ msgstr ""
711
  #: adminpages/advancedsettings.php:170 adminpages/advancedsettings.php:129
712
  #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:149
713
  #: adminpages/advancedsettings.php:152 adminpages/advancedsettings.php:168
 
714
  msgid "Hide Ads From All Members"
715
  msgstr ""
716
 
717
  #: adminpages/advancedsettings.php:171 adminpages/advancedsettings.php:130
718
  #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:150
719
  #: adminpages/advancedsettings.php:153 adminpages/advancedsettings.php:169
 
720
  msgid "Hide Ads From Certain Members"
721
  msgstr ""
722
 
723
  #: adminpages/advancedsettings.php:178 adminpages/advancedsettings.php:137
724
  #: adminpages/advancedsettings.php:144 adminpages/advancedsettings.php:157
725
  #: adminpages/advancedsettings.php:160 adminpages/advancedsettings.php:176
 
726
  msgid "Ads from the following plugins will be automatically turned off"
727
  msgstr ""
728
 
729
  #: adminpages/advancedsettings.php:179 adminpages/advancedsettings.php:138
730
  #: adminpages/advancedsettings.php:145 adminpages/advancedsettings.php:158
731
  #: adminpages/advancedsettings.php:161 adminpages/advancedsettings.php:177
 
732
  msgid "To hide ads in your template code, use code like the following"
733
  msgstr ""
734
 
735
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:149
736
  #: adminpages/advancedsettings.php:156 adminpages/advancedsettings.php:169
737
  #: adminpages/advancedsettings.php:172 adminpages/advancedsettings.php:188
 
738
  msgid "Choose Levels to Hide Ads From"
739
  msgstr ""
740
 
741
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:183
742
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203
743
  #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:222
 
744
  msgid "Redirect all traffic from registration page to /susbcription/?"
745
  msgstr ""
746
 
747
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:183
748
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203
749
  #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:222
 
750
  msgid "multisite only"
751
  msgstr ""
752
 
753
- #: adminpages/advancedsettings.php:229 adminpages/membershiplevels.php:746
754
- #: adminpages/paymentsettings.php:237
755
- #: classes/gateways/class.pmprogateway_stripe.php:284 includes/profile.php:126
756
  #: adminpages/advancedsettings.php:188 adminpages/advancedsettings.php:195
757
  #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:211
758
- #: adminpages/advancedsettings.php:227 adminpages/membershiplevels.php:563
759
- #: adminpages/membershiplevels.php:569 adminpages/membershiplevels.php:571
760
- #: adminpages/membershiplevels.php:578 adminpages/membershiplevels.php:598
761
- #: adminpages/membershiplevels.php:658 adminpages/membershiplevels.php:660
762
- #: adminpages/membershiplevels.php:662 adminpages/membershiplevels.php:667
763
- #: adminpages/membershiplevels.php:668 adminpages/membershiplevels.php:672
764
- #: adminpages/membershiplevels.php:684 adminpages/membershiplevels.php:694
765
- #: adminpages/membershiplevels.php:744 adminpages/paymentsettings.php:211
 
766
  #: adminpages/paymentsettings.php:220 adminpages/paymentsettings.php:237
767
  #: adminpages/paymentsettings.php:415 adminpages/paymentsettings.php:424
768
  #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:435
@@ -778,6 +807,7 @@ msgstr ""
778
  #: classes/gateways/class.pmprogateway_stripe.php:223
779
  #: classes/gateways/class.pmprogateway_stripe.php:250
780
  #: classes/gateways/class.pmprogateway_stripe.php:282
 
781
  #: classes/gateways/class.pmprogateway_stripe.php:290
782
  #: classes/gateways/class.pmprogateway_stripe.php:292
783
  #: classes/gateways/class.pmprogateway_stripe.php:298
@@ -790,83 +820,92 @@ msgstr ""
790
  #: adminpages/advancedsettings.php:236 adminpages/advancedsettings.php:195
791
  #: adminpages/advancedsettings.php:202 adminpages/advancedsettings.php:215
792
  #: adminpages/advancedsettings.php:218 adminpages/advancedsettings.php:234
 
793
  msgid "Use reCAPTCHA?"
794
  msgstr ""
795
 
796
  #: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:200
797
  #: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:220
798
  #: adminpages/advancedsettings.php:223 adminpages/advancedsettings.php:239
 
799
  msgid "Yes - Free memberships only."
800
  msgstr ""
801
 
802
  #: adminpages/advancedsettings.php:242 adminpages/advancedsettings.php:201
803
  #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:221
804
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:240
 
805
  msgid "Yes - All memberships."
806
  msgstr ""
807
 
808
  #: adminpages/advancedsettings.php:244 adminpages/advancedsettings.php:203
809
  #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223
810
  #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:242
 
811
  msgid "A free reCAPTCHA key is required."
812
  msgstr ""
813
 
814
  #: adminpages/advancedsettings.php:244 adminpages/advancedsettings.php:203
815
  #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223
816
  #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:242
 
817
  msgid "Click here to signup for reCAPTCHA"
818
  msgstr ""
819
 
820
- #: adminpages/advancedsettings.php:250
821
  msgid "reCAPTCHA Version"
822
  msgstr ""
823
 
824
- #: adminpages/advancedsettings.php:252
825
  msgid " v2 - Checkbox"
826
  msgstr ""
827
 
828
- #: adminpages/advancedsettings.php:253
829
  msgid "v3 - Invisible"
830
  msgstr ""
831
 
832
- #: adminpages/advancedsettings.php:255
833
  msgid "Changing your version will require new API keys."
834
  msgstr ""
835
 
836
  #: adminpages/advancedsettings.php:257 adminpages/advancedsettings.php:248
 
837
  msgid "reCAPTCHA Site Key"
838
  msgstr ""
839
 
840
  #: adminpages/advancedsettings.php:260 adminpages/advancedsettings.php:251
 
841
  msgid "reCAPTCHA Secret Key"
842
  msgstr ""
843
 
844
  #: adminpages/advancedsettings.php:266 adminpages/advancedsettings.php:218
845
  #: adminpages/advancedsettings.php:225 adminpages/advancedsettings.php:238
846
  #: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:257
 
847
  msgid "Require Terms of Service on signups?"
848
  msgstr ""
849
 
850
  #: adminpages/advancedsettings.php:273 adminpages/advancedsettings.php:225
851
  #: adminpages/advancedsettings.php:232 adminpages/advancedsettings.php:245
852
  #: adminpages/advancedsettings.php:248 adminpages/advancedsettings.php:264
 
853
  msgid ""
854
  "If yes, create a WordPress page containing your TOS agreement and assign it "
855
  "using the dropdown above."
856
  msgstr ""
857
 
858
  #: adminpages/advancedsettings.php:384 adminpages/pagesettings.php:315
859
- #: adminpages/paymentsettings.php:267 adminpages/advancedsettings.php:284
860
  #: adminpages/advancedsettings.php:355 adminpages/advancedsettings.php:359
861
  #: adminpages/advancedsettings.php:368 adminpages/advancedsettings.php:375
862
- #: adminpages/pagesettings.php:209 adminpages/pagesettings.php:223
863
- #: adminpages/pagesettings.php:251 adminpages/pagesettings.php:254
864
- #: adminpages/pagesettings.php:294 adminpages/pagesettings.php:295
865
- #: adminpages/pagesettings.php:310 adminpages/pagesettings.php:315
866
- #: adminpages/paymentsettings.php:238 adminpages/paymentsettings.php:250
867
- #: adminpages/paymentsettings.php:267 adminpages/paymentsettings.php:485
868
- #: adminpages/paymentsettings.php:526 adminpages/paymentsettings.php:532
869
- #: adminpages/paymentsettings.php:534
870
  msgid "Save Settings"
871
  msgstr ""
872
 
@@ -954,7 +993,7 @@ msgid ""
954
  msgstr ""
955
 
956
  #: adminpages/dashboard.php:215 adminpages/memberslist.php:165
957
- #: pages/checkout.php:175 shortcodes/pmpro_account.php:110
958
  #: adminpages/dashboard.php:215 adminpages/dashboard.php:223
959
  #: adminpages/memberslist.php:112 adminpages/memberslist.php:145
960
  #: adminpages/memberslist.php:155 adminpages/memberslist.php:165
@@ -1024,8 +1063,8 @@ msgid "No members found."
1024
  msgstr ""
1025
 
1026
  #: adminpages/dashboard.php:282 adminpages/discountcodes.php:447
1027
- #: adminpages/discountcodes.php:747 adminpages/orders.php:419
1028
- #: adminpages/orders.php:1353 adminpages/dashboard.php:282
1029
  #: adminpages/dashboard.php:290 adminpages/discountcodes.php:311
1030
  #: adminpages/discountcodes.php:314 adminpages/discountcodes.php:315
1031
  #: adminpages/discountcodes.php:316 adminpages/discountcodes.php:321
@@ -1048,7 +1087,7 @@ msgstr ""
1048
  msgid "Code"
1049
  msgstr ""
1050
 
1051
- #: adminpages/dashboard.php:283 adminpages/orders.php:1354
1052
  #: adminpages/reports/login.php:179
1053
  #: classes/gateways/class.pmprogateway_payflowpro.php:116
1054
  #: adminpages/dashboard.php:283 adminpages/dashboard.php:291
@@ -1065,7 +1104,7 @@ msgstr ""
1065
  msgid "User"
1066
  msgstr ""
1067
 
1068
- #: adminpages/dashboard.php:284 includes/privacy.php:241 pages/billing.php:41
1069
  #: pages/cancel.php:60 pages/invoice.php:103 pages/levels.php:35
1070
  #: shortcodes/pmpro_account.php:44 shortcodes/pmpro_account.php:128
1071
  #: adminpages/dashboard.php:284 adminpages/dashboard.php:292
@@ -1074,16 +1113,16 @@ msgstr ""
1074
  #: pages/billing.php:27 pages/billing.php:28 pages/billing.php:30
1075
  #: pages/billing.php:41 pages/billing.php:44 pages/billing.php:45
1076
  #: pages/cancel.php:52 pages/cancel.php:60 pages/cancel.php:61
1077
- #: pages/invoice.php:89 pages/invoice.php:102 pages/invoice.php:109
1078
- #: pages/levels.php:13 pages/levels.php:35 shortcodes/pmpro_account.php:43
1079
- #: shortcodes/pmpro_account.php:44 shortcodes/pmpro_account.php:123
1080
- #: shortcodes/pmpro_account.php:125 shortcodes/pmpro_account.php:126
1081
- #: shortcodes/pmpro_account.php:128
1082
  msgid "Level"
1083
  msgstr ""
1084
 
1085
- #: adminpages/dashboard.php:285 adminpages/orders.php:637
1086
- #: adminpages/orders.php:1357 adminpages/templates/orders-email.php:64
1087
  #: adminpages/templates/orders-print.php:93 includes/privacy.php:285
1088
  #: pages/confirmation.php:96 pages/invoice.php:79 adminpages/dashboard.php:285
1089
  #: adminpages/dashboard.php:293 adminpages/orders.php:320
@@ -1098,13 +1137,13 @@ msgstr ""
1098
  #: adminpages/orders.php:1236 adminpages/orders.php:1357
1099
  #: adminpages/templates/orders-email.php:64
1100
  #: adminpages/templates/orders-print.php:93 includes/privacy.php:285
1101
- #: pages/confirmation.php:96 pages/invoice.php:78 pages/invoice.php:82
1102
- #: pages/invoice.php:84
1103
  msgid "Total"
1104
  msgstr ""
1105
 
1106
- #: adminpages/dashboard.php:286 adminpages/orders.php:722
1107
- #: adminpages/orders.php:1361 includes/privacy.php:202 includes/privacy.php:309
1108
  #: pages/invoice.php:29 shortcodes/pmpro_account.php:130
1109
  #: adminpages/dashboard.php:286 adminpages/dashboard.php:294
1110
  #: adminpages/orders.php:373 adminpages/orders.php:423
@@ -1117,12 +1156,12 @@ msgstr ""
1117
  #: adminpages/orders.php:1112 adminpages/orders.php:1143
1118
  #: adminpages/orders.php:1149 adminpages/orders.php:1240
1119
  #: adminpages/orders.php:1361 includes/privacy.php:202 includes/privacy.php:309
1120
- #: shortcodes/pmpro_account.php:130
1121
  msgid "Status"
1122
  msgstr ""
1123
 
1124
- #: adminpages/dashboard.php:287 adminpages/orders.php:825
1125
- #: adminpages/orders.php:1362 pages/invoice.php:101
1126
  #: shortcodes/pmpro_account.php:127 adminpages/dashboard.php:287
1127
  #: adminpages/dashboard.php:295 adminpages/orders.php:442
1128
  #: adminpages/orders.php:492 adminpages/orders.php:493
@@ -1135,13 +1174,14 @@ msgstr ""
1135
  #: adminpages/orders.php:1113 adminpages/orders.php:1144
1136
  #: adminpages/orders.php:1150 adminpages/orders.php:1241
1137
  #: adminpages/orders.php:1362 pages/account.php:91 pages/invoice.php:87
1138
- #: pages/invoice.php:100 pages/invoice.php:105 pages/invoice.php:107
1139
- #: shortcodes/pmpro_account.php:122 shortcodes/pmpro_account.php:124
1140
- #: shortcodes/pmpro_account.php:125 shortcodes/pmpro_account.php:127
 
1141
  msgid "Date"
1142
  msgstr ""
1143
 
1144
- #: adminpages/dashboard.php:294 adminpages/orders.php:1512
1145
  #: adminpages/dashboard.php:294 adminpages/dashboard.php:302
1146
  #: adminpages/orders.php:674 adminpages/orders.php:977
1147
  #: adminpages/orders.php:995 adminpages/orders.php:1005
@@ -1152,7 +1192,7 @@ msgstr ""
1152
  msgid "No orders found."
1153
  msgstr ""
1154
 
1155
- #: adminpages/dashboard.php:311 adminpages/orders.php:1395
1156
  #: adminpages/dashboard.php:311 adminpages/dashboard.php:319
1157
  #: adminpages/orders.php:630 adminpages/orders.php:933
1158
  #: adminpages/orders.php:943 adminpages/orders.php:972
@@ -1162,7 +1202,7 @@ msgstr ""
1162
  msgid "deleted"
1163
  msgstr ""
1164
 
1165
- #: adminpages/dashboard.php:313 adminpages/orders.php:1397
1166
  #: adminpages/dashboard.php:313 adminpages/dashboard.php:321
1167
  #: adminpages/orders.php:1275 adminpages/orders.php:1397
1168
  msgid "none"
@@ -1289,8 +1329,8 @@ msgid "Add New Discount Code"
1289
  msgstr ""
1290
 
1291
  #: adminpages/discountcodes.php:442 adminpages/discountcodes.php:746
1292
- #: adminpages/membershiplevels.php:346 adminpages/membershiplevels.php:715
1293
- #: adminpages/memberslist.php:164 adminpages/orders.php:1352
1294
  #: adminpages/reports/login.php:178 adminpages/templates/orders-email.php:46
1295
  #: adminpages/templates/orders-print.php:75 adminpages/discountcodes.php:306
1296
  #: adminpages/discountcodes.php:309 adminpages/discountcodes.php:310
@@ -1304,13 +1344,14 @@ msgstr ""
1304
  #: adminpages/membershiplevels.php:284 adminpages/membershiplevels.php:286
1305
  #: adminpages/membershiplevels.php:288 adminpages/membershiplevels.php:312
1306
  #: adminpages/membershiplevels.php:322 adminpages/membershiplevels.php:344
1307
- #: adminpages/membershiplevels.php:505 adminpages/membershiplevels.php:511
1308
- #: adminpages/membershiplevels.php:513 adminpages/membershiplevels.php:540
1309
- #: adminpages/membershiplevels.php:541 adminpages/membershiplevels.php:583
1310
- #: adminpages/membershiplevels.php:629 adminpages/membershiplevels.php:631
1311
- #: adminpages/membershiplevels.php:636 adminpages/membershiplevels.php:637
1312
- #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:653
1313
- #: adminpages/membershiplevels.php:663 adminpages/membershiplevels.php:713
 
1314
  #: adminpages/memberslist.php:111 adminpages/memberslist.php:144
1315
  #: adminpages/memberslist.php:154 adminpages/memberslist.php:164
1316
  #: adminpages/orders.php:597 adminpages/orders.php:900
@@ -1325,7 +1366,7 @@ msgstr ""
1325
  msgid "ID"
1326
  msgstr ""
1327
 
1328
- #: adminpages/discountcodes.php:443 adminpages/orders.php:412
1329
  #: adminpages/discountcodes.php:307 adminpages/discountcodes.php:310
1330
  #: adminpages/discountcodes.php:311 adminpages/discountcodes.php:312
1331
  #: adminpages/discountcodes.php:317 adminpages/discountcodes.php:382
@@ -1348,9 +1389,9 @@ msgid "Start Date"
1348
  msgstr ""
1349
 
1350
  #: adminpages/discountcodes.php:503
1351
- #: classes/gateways/class.pmprogateway_braintree.php:486
1352
- #: classes/gateways/class.pmprogateway_stripe.php:598 pages/billing.php:313
1353
- #: pages/checkout.php:471 adminpages/discountcodes.php:367
1354
  #: adminpages/discountcodes.php:370 adminpages/discountcodes.php:371
1355
  #: adminpages/discountcodes.php:372 adminpages/discountcodes.php:377
1356
  #: adminpages/discountcodes.php:442 adminpages/discountcodes.php:483
@@ -1378,6 +1419,7 @@ msgstr ""
1378
  #: classes/gateways/class.pmprogateway_stripe.php:532
1379
  #: classes/gateways/class.pmprogateway_stripe.php:570
1380
  #: classes/gateways/class.pmprogateway_stripe.php:597
 
1381
  #: classes/gateways/class.pmprogateway_stripe.php:613
1382
  #: classes/gateways/class.pmprogateway_stripe.php:621
1383
  #: classes/gateways/class.pmprogateway_stripe.php:628
@@ -1430,9 +1472,10 @@ msgstr ""
1430
  #: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:339
1431
  #: adminpages/membershiplevels.php:341 adminpages/membershiplevels.php:342
1432
  #: adminpages/membershiplevels.php:365 adminpages/membershiplevels.php:375
1433
- #: adminpages/membershiplevels.php:398 adminpages/membershiplevels.php:507
1434
- #: adminpages/membershiplevels.php:513 adminpages/membershiplevels.php:515
1435
- #: adminpages/membershiplevels.php:542 pages/levels.php:14
 
1436
  msgid "Initial Payment"
1437
  msgstr ""
1438
 
@@ -1445,7 +1488,7 @@ msgstr ""
1445
  #: adminpages/membershiplevels.php:340 adminpages/membershiplevels.php:350
1446
  #: adminpages/membershiplevels.php:352 adminpages/membershiplevels.php:353
1447
  #: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:386
1448
- #: adminpages/membershiplevels.php:409
1449
  msgid "The initial amount collected at registration."
1450
  msgstr ""
1451
 
@@ -1458,7 +1501,7 @@ msgstr ""
1458
  #: adminpages/membershiplevels.php:344 adminpages/membershiplevels.php:354
1459
  #: adminpages/membershiplevels.php:356 adminpages/membershiplevels.php:357
1460
  #: adminpages/membershiplevels.php:380 adminpages/membershiplevels.php:390
1461
- #: adminpages/membershiplevels.php:413
1462
  msgid "Recurring Subscription"
1463
  msgstr ""
1464
 
@@ -1471,7 +1514,7 @@ msgstr ""
1471
  #: adminpages/membershiplevels.php:345 adminpages/membershiplevels.php:355
1472
  #: adminpages/membershiplevels.php:357 adminpages/membershiplevels.php:358
1473
  #: adminpages/membershiplevels.php:381 adminpages/membershiplevels.php:391
1474
- #: adminpages/membershiplevels.php:414
1475
  msgid "Check if this level has a recurring subscription payment."
1476
  msgstr ""
1477
 
@@ -1484,12 +1527,13 @@ msgstr ""
1484
  #: adminpages/membershiplevels.php:359 adminpages/membershiplevels.php:361
1485
  #: adminpages/membershiplevels.php:362 adminpages/membershiplevels.php:385
1486
  #: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:418
 
1487
  msgid "Billing Amount"
1488
  msgstr ""
1489
 
1490
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1491
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1492
- #: classes/gateways/class.pmprogateway_stripe.php:655
1493
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1494
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1495
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
@@ -1502,10 +1546,11 @@ msgstr ""
1502
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1503
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1504
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1505
- #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476
1506
- #: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479
1507
- #: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501
1508
- #: adminpages/membershiplevels.php:511 adminpages/membershiplevels.php:535
 
1509
  #: classes/gateways/class.pmprogateway_stripe.php:521
1510
  #: classes/gateways/class.pmprogateway_stripe.php:522
1511
  #: classes/gateways/class.pmprogateway_stripe.php:532
@@ -1517,6 +1562,7 @@ msgstr ""
1517
  #: classes/gateways/class.pmprogateway_stripe.php:588
1518
  #: classes/gateways/class.pmprogateway_stripe.php:599
1519
  #: classes/gateways/class.pmprogateway_stripe.php:637
 
1520
  #: classes/gateways/class.pmprogateway_stripe.php:664
1521
  #: classes/gateways/class.pmprogateway_stripe.php:671
1522
  #: classes/gateways/class.pmprogateway_stripe.php:679
@@ -1528,7 +1574,7 @@ msgstr ""
1528
 
1529
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1530
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1531
- #: classes/gateways/class.pmprogateway_stripe.php:655
1532
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1533
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1534
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
@@ -1541,10 +1587,11 @@ msgstr ""
1541
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1542
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1543
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1544
- #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476
1545
- #: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479
1546
- #: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501
1547
- #: adminpages/membershiplevels.php:511 adminpages/membershiplevels.php:535
 
1548
  #: classes/gateways/class.pmprogateway_stripe.php:521
1549
  #: classes/gateways/class.pmprogateway_stripe.php:522
1550
  #: classes/gateways/class.pmprogateway_stripe.php:532
@@ -1556,6 +1603,7 @@ msgstr ""
1556
  #: classes/gateways/class.pmprogateway_stripe.php:588
1557
  #: classes/gateways/class.pmprogateway_stripe.php:599
1558
  #: classes/gateways/class.pmprogateway_stripe.php:637
 
1559
  #: classes/gateways/class.pmprogateway_stripe.php:664
1560
  #: classes/gateways/class.pmprogateway_stripe.php:671
1561
  #: classes/gateways/class.pmprogateway_stripe.php:679
@@ -1567,7 +1615,7 @@ msgstr ""
1567
 
1568
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1569
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1570
- #: classes/gateways/class.pmprogateway_stripe.php:655
1571
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1572
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1573
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
@@ -1580,10 +1628,11 @@ msgstr ""
1580
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1581
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1582
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1583
- #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476
1584
- #: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479
1585
- #: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501
1586
- #: adminpages/membershiplevels.php:511 adminpages/membershiplevels.php:535
 
1587
  #: classes/gateways/class.pmprogateway_stripe.php:521
1588
  #: classes/gateways/class.pmprogateway_stripe.php:522
1589
  #: classes/gateways/class.pmprogateway_stripe.php:532
@@ -1595,6 +1644,7 @@ msgstr ""
1595
  #: classes/gateways/class.pmprogateway_stripe.php:588
1596
  #: classes/gateways/class.pmprogateway_stripe.php:599
1597
  #: classes/gateways/class.pmprogateway_stripe.php:637
 
1598
  #: classes/gateways/class.pmprogateway_stripe.php:664
1599
  #: classes/gateways/class.pmprogateway_stripe.php:671
1600
  #: classes/gateways/class.pmprogateway_stripe.php:679
@@ -1606,7 +1656,7 @@ msgstr ""
1606
 
1607
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1608
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1609
- #: classes/gateways/class.pmprogateway_stripe.php:655
1610
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1611
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1612
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
@@ -1619,10 +1669,11 @@ msgstr ""
1619
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1620
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1621
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1622
- #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476
1623
- #: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479
1624
- #: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501
1625
- #: adminpages/membershiplevels.php:511 adminpages/membershiplevels.php:535
 
1626
  #: classes/gateways/class.pmprogateway_stripe.php:521
1627
  #: classes/gateways/class.pmprogateway_stripe.php:522
1628
  #: classes/gateways/class.pmprogateway_stripe.php:532
@@ -1634,6 +1685,7 @@ msgstr ""
1634
  #: classes/gateways/class.pmprogateway_stripe.php:588
1635
  #: classes/gateways/class.pmprogateway_stripe.php:599
1636
  #: classes/gateways/class.pmprogateway_stripe.php:637
 
1637
  #: classes/gateways/class.pmprogateway_stripe.php:664
1638
  #: classes/gateways/class.pmprogateway_stripe.php:671
1639
  #: classes/gateways/class.pmprogateway_stripe.php:679
@@ -1652,7 +1704,7 @@ msgstr ""
1652
  #: adminpages/membershiplevels.php:364 adminpages/membershiplevels.php:383
1653
  #: adminpages/membershiplevels.php:385 adminpages/membershiplevels.php:386
1654
  #: adminpages/membershiplevels.php:409 adminpages/membershiplevels.php:419
1655
- #: adminpages/membershiplevels.php:442
1656
  msgid "The amount to be billed one cycle after the initial payment."
1657
  msgstr ""
1658
 
@@ -1666,6 +1718,7 @@ msgstr ""
1666
  #: adminpages/membershiplevels.php:403 adminpages/membershiplevels.php:404
1667
  #: adminpages/membershiplevels.php:425 adminpages/membershiplevels.php:435
1668
  #: adminpages/membershiplevels.php:438 adminpages/membershiplevels.php:459
 
1669
  msgid "Billing Cycle Limit"
1670
  msgstr ""
1671
 
@@ -1679,6 +1732,7 @@ msgstr ""
1679
  #: adminpages/membershiplevels.php:407 adminpages/membershiplevels.php:408
1680
  #: adminpages/membershiplevels.php:429 adminpages/membershiplevels.php:439
1681
  #: adminpages/membershiplevels.php:442 adminpages/membershiplevels.php:463
 
1682
  msgid ""
1683
  "The <strong>total</strong> number of recurring billing cycles for this "
1684
  "level, including the trial period (if applicable) but not including the "
@@ -1694,7 +1748,7 @@ msgstr ""
1694
  #: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:414
1695
  #: adminpages/membershiplevels.php:416 adminpages/membershiplevels.php:417
1696
  #: adminpages/membershiplevels.php:438 adminpages/membershiplevels.php:448
1697
- #: adminpages/membershiplevels.php:472
1698
  msgid "Custom Trial"
1699
  msgstr ""
1700
 
@@ -1708,6 +1762,7 @@ msgstr ""
1708
  #: adminpages/membershiplevels.php:416 adminpages/membershiplevels.php:418
1709
  #: adminpages/membershiplevels.php:419 adminpages/membershiplevels.php:440
1710
  #: adminpages/membershiplevels.php:450 adminpages/membershiplevels.php:474
 
1711
  msgid "Check to add a custom trial period."
1712
  msgstr ""
1713
 
@@ -1721,6 +1776,7 @@ msgstr ""
1721
  #: adminpages/membershiplevels.php:425 adminpages/membershiplevels.php:427
1722
  #: adminpages/membershiplevels.php:428 adminpages/membershiplevels.php:449
1723
  #: adminpages/membershiplevels.php:459 adminpages/membershiplevels.php:483
 
1724
  msgid "Trial Billing Amount"
1725
  msgstr ""
1726
 
@@ -1734,6 +1790,7 @@ msgstr ""
1734
  #: adminpages/membershiplevels.php:436 adminpages/membershiplevels.php:438
1735
  #: adminpages/membershiplevels.php:439 adminpages/membershiplevels.php:460
1736
  #: adminpages/membershiplevels.php:470 adminpages/membershiplevels.php:494
 
1737
  msgid "for the first"
1738
  msgstr ""
1739
 
@@ -1747,6 +1804,7 @@ msgstr ""
1747
  #: adminpages/membershiplevels.php:438 adminpages/membershiplevels.php:440
1748
  #: adminpages/membershiplevels.php:441 adminpages/membershiplevels.php:462
1749
  #: adminpages/membershiplevels.php:472 adminpages/membershiplevels.php:496
 
1750
  msgid "subscription payments"
1751
  msgstr ""
1752
 
@@ -1760,7 +1818,7 @@ msgstr ""
1760
  #: adminpages/membershiplevels.php:466 adminpages/membershiplevels.php:467
1761
  #: adminpages/membershiplevels.php:469 adminpages/membershiplevels.php:470
1762
  #: adminpages/membershiplevels.php:491 adminpages/membershiplevels.php:501
1763
- #: adminpages/membershiplevels.php:525
1764
  msgid "Membership Expiration"
1765
  msgstr ""
1766
 
@@ -1774,6 +1832,7 @@ msgstr ""
1774
  #: adminpages/membershiplevels.php:468 adminpages/membershiplevels.php:470
1775
  #: adminpages/membershiplevels.php:471 adminpages/membershiplevels.php:492
1776
  #: adminpages/membershiplevels.php:502 adminpages/membershiplevels.php:526
 
1777
  msgid "Check this to set when membership access expires."
1778
  msgstr ""
1779
 
@@ -1787,7 +1846,7 @@ msgstr ""
1787
  #: adminpages/membershiplevels.php:471 adminpages/membershiplevels.php:472
1788
  #: adminpages/membershiplevels.php:474 adminpages/membershiplevels.php:475
1789
  #: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:506
1790
- #: adminpages/membershiplevels.php:530
1791
  msgid "Expires In"
1792
  msgstr ""
1793
 
@@ -1801,6 +1860,7 @@ msgstr ""
1801
  #: adminpages/membershiplevels.php:485 adminpages/membershiplevels.php:487
1802
  #: adminpages/membershiplevels.php:488 adminpages/membershiplevels.php:509
1803
  #: adminpages/membershiplevels.php:519 adminpages/membershiplevels.php:543
 
1804
  msgid ""
1805
  "Set the duration of membership access. Note that the any future payments "
1806
  "(recurring subscription, if any) will be cancelled when the membership "
@@ -1853,49 +1913,17 @@ msgstr ""
1853
  msgid "Starts"
1854
  msgstr ""
1855
 
1856
- #: adminpages/discountcodes.php:803 adminpages/membershiplevels.php:748
1857
- #: adminpages/orders.php:1483 adminpages/orders.php:1489
1858
- #: adminpages/discountcodes.php:614 adminpages/discountcodes.php:619
1859
- #: adminpages/discountcodes.php:647 adminpages/discountcodes.php:648
1860
- #: adminpages/discountcodes.php:649 adminpages/discountcodes.php:650
1861
- #: adminpages/discountcodes.php:655 adminpages/discountcodes.php:735
1862
- #: adminpages/discountcodes.php:789 adminpages/discountcodes.php:803
1863
- #: adminpages/membershiplevels.php:564 adminpages/membershiplevels.php:570
1864
- #: adminpages/membershiplevels.php:572 adminpages/membershiplevels.php:580
1865
- #: adminpages/membershiplevels.php:599 adminpages/membershiplevels.php:660
1866
- #: adminpages/membershiplevels.php:662 adminpages/membershiplevels.php:664
1867
- #: adminpages/membershiplevels.php:669 adminpages/membershiplevels.php:670
1868
- #: adminpages/membershiplevels.php:674 adminpages/membershiplevels.php:686
1869
- #: adminpages/membershiplevels.php:696 adminpages/membershiplevels.php:746
1870
- #: adminpages/orders.php:658 adminpages/orders.php:961
1871
- #: adminpages/orders.php:979 adminpages/orders.php:989
1872
- #: adminpages/orders.php:992 adminpages/orders.php:1021
1873
- #: adminpages/orders.php:1050 adminpages/orders.php:1205
1874
- #: adminpages/orders.php:1239 adminpages/orders.php:1245
1875
- #: adminpages/orders.php:1360 adminpages/orders.php:1483
1876
- #: adminpages/orders.php:1489
1877
- msgid "edit"
1878
  msgstr ""
1879
 
1880
- #: adminpages/discountcodes.php:804 adminpages/membershiplevels.php:748
1881
- #: adminpages/orders.php:1492 adminpages/discountcodes.php:804
1882
- #: adminpages/membershiplevels.php:565 adminpages/membershiplevels.php:571
1883
- #: adminpages/membershiplevels.php:573 adminpages/membershiplevels.php:580
1884
- #: adminpages/membershiplevels.php:600 adminpages/membershiplevels.php:660
1885
- #: adminpages/membershiplevels.php:662 adminpages/membershiplevels.php:664
1886
- #: adminpages/membershiplevels.php:669 adminpages/membershiplevels.php:670
1887
- #: adminpages/membershiplevels.php:674 adminpages/membershiplevels.php:686
1888
- #: adminpages/membershiplevels.php:696 adminpages/membershiplevels.php:746
1889
- #: adminpages/orders.php:661 adminpages/orders.php:964
1890
- #: adminpages/orders.php:982 adminpages/orders.php:992
1891
- #: adminpages/orders.php:995 adminpages/orders.php:1024
1892
- #: adminpages/orders.php:1053 adminpages/orders.php:1208
1893
- #: adminpages/orders.php:1242 adminpages/orders.php:1248
1894
- #: adminpages/orders.php:1363 adminpages/orders.php:1492
1895
- msgid "copy"
1896
  msgstr ""
1897
 
1898
- #: adminpages/discountcodes.php:805 adminpages/discountcodes.php:617
1899
  #: adminpages/discountcodes.php:622 adminpages/discountcodes.php:650
1900
  #: adminpages/discountcodes.php:651 adminpages/discountcodes.php:652
1901
  #: adminpages/discountcodes.php:653 adminpages/discountcodes.php:658
@@ -1908,44 +1936,13 @@ msgid ""
1908
  "code anymore."
1909
  msgstr ""
1910
 
1911
- #: adminpages/discountcodes.php:805 adminpages/membershiplevels.php:748
1912
- #: adminpages/orders.php:1495 adminpages/discountcodes.php:617
1913
- #: adminpages/discountcodes.php:622 adminpages/discountcodes.php:650
1914
- #: adminpages/discountcodes.php:651 adminpages/discountcodes.php:652
1915
- #: adminpages/discountcodes.php:653 adminpages/discountcodes.php:658
1916
- #: adminpages/discountcodes.php:738 adminpages/discountcodes.php:792
1917
- #: adminpages/discountcodes.php:805 adminpages/membershiplevels.php:566
1918
- #: adminpages/membershiplevels.php:572 adminpages/membershiplevels.php:574
1919
- #: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:601
1920
- #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
1921
- #: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:669
1922
- #: adminpages/membershiplevels.php:670 adminpages/membershiplevels.php:674
1923
- #: adminpages/membershiplevels.php:686 adminpages/membershiplevels.php:696
1924
- #: adminpages/membershiplevels.php:746 adminpages/orders.php:664
1925
- #: adminpages/orders.php:967 adminpages/orders.php:985
1926
- #: adminpages/orders.php:995 adminpages/orders.php:998
1927
- #: adminpages/orders.php:1027 adminpages/orders.php:1056
1928
- #: adminpages/orders.php:1211 adminpages/orders.php:1245
1929
- #: adminpages/orders.php:1251 adminpages/orders.php:1366
1930
- #: adminpages/orders.php:1495
1931
- msgid "delete"
1932
- msgstr ""
1933
-
1934
- #: adminpages/discountcodes.php:807 adminpages/discountcodes.php:809
1935
- #: adminpages/discountcodes.php:807 adminpages/discountcodes.php:809
1936
- msgid "orders"
1937
- msgstr ""
1938
-
1939
- #: adminpages/discountcodes.php:807 adminpages/discountcodes.php:807
1940
- msgid "view orders"
1941
- msgstr ""
1942
-
1943
- #: adminpages/discountcodes.php:809 adminpages/discountcodes.php:809
1944
- msgid "no orders"
1945
  msgstr ""
1946
 
1947
  #: adminpages/emailsettings.php:84 adminpages/emailsettings.php:61
1948
  #: adminpages/emailsettings.php:70 adminpages/emailsettings.php:80
 
1949
  msgid ""
1950
  "By default, system generated emails are sent from "
1951
  "<em><strong>wordpress@yourdomain.com</strong></em>. You can update this from "
@@ -1953,6 +1950,7 @@ msgid ""
1953
  msgstr ""
1954
 
1955
  #: adminpages/emailsettings.php:86 adminpages/emailsettings.php:82
 
1956
  msgid ""
1957
  "To modify the appearance of system generated emails, add the files "
1958
  "<em>email_header.html</em> and <em>email_footer.html</em> to your theme's "
@@ -1966,21 +1964,23 @@ msgstr ""
1966
 
1967
  #: adminpages/emailsettings.php:92 adminpages/emailsettings.php:69
1968
  #: adminpages/emailsettings.php:78 adminpages/emailsettings.php:88
 
1969
  msgid "From Email"
1970
  msgstr ""
1971
 
1972
  #: adminpages/emailsettings.php:100 adminpages/emailsettings.php:77
1973
  #: adminpages/emailsettings.php:86 adminpages/emailsettings.php:96
 
1974
  msgid "From Name"
1975
  msgstr ""
1976
 
1977
  #: adminpages/emailsettings.php:108 adminpages/emailsettings.php:94
1978
- #: adminpages/emailsettings.php:104
1979
  msgid "Only Filter PMPro Emails?"
1980
  msgstr ""
1981
 
1982
  #: adminpages/emailsettings.php:112 adminpages/emailsettings.php:98
1983
- #: adminpages/emailsettings.php:108
1984
  #, php-format
1985
  msgid ""
1986
  "If unchecked, all emails from \"WordPress &lt;%s&gt;\" will be filtered to "
@@ -1989,78 +1989,109 @@ msgstr ""
1989
 
1990
  #: adminpages/emailsettings.php:129 adminpages/emailsettings.php:86
1991
  #: adminpages/emailsettings.php:104 adminpages/emailsettings.php:115
1992
- #: adminpages/emailsettings.php:125
1993
  msgid "Send the site admin emails"
1994
  msgstr ""
1995
 
1996
  #: adminpages/emailsettings.php:135 adminpages/emailsettings.php:92
1997
  #: adminpages/emailsettings.php:110 adminpages/emailsettings.php:121
1998
- #: adminpages/emailsettings.php:131
1999
  msgid "Checkout"
2000
  msgstr ""
2001
 
2002
  #: adminpages/emailsettings.php:139 adminpages/emailsettings.php:96
2003
  #: adminpages/emailsettings.php:114 adminpages/emailsettings.php:125
2004
- #: adminpages/emailsettings.php:135
2005
  msgid "when a member checks out."
2006
  msgstr ""
2007
 
2008
  #: adminpages/emailsettings.php:144 adminpages/emailsettings.php:101
2009
  #: adminpages/emailsettings.php:119 adminpages/emailsettings.php:130
2010
- #: adminpages/emailsettings.php:140
2011
  msgid "Admin Changes"
2012
  msgstr ""
2013
 
2014
  #: adminpages/emailsettings.php:148 adminpages/emailsettings.php:105
2015
  #: adminpages/emailsettings.php:123 adminpages/emailsettings.php:134
2016
- #: adminpages/emailsettings.php:144
2017
  msgid "when an admin changes a user's membership level through the dashboard."
2018
  msgstr ""
2019
 
2020
  #: adminpages/emailsettings.php:153 adminpages/emailsettings.php:110
2021
  #: adminpages/emailsettings.php:128 adminpages/emailsettings.php:139
2022
- #: adminpages/emailsettings.php:149
2023
  msgid "Cancellation"
2024
  msgstr ""
2025
 
2026
  #: adminpages/emailsettings.php:157 adminpages/emailsettings.php:114
2027
  #: adminpages/emailsettings.php:132 adminpages/emailsettings.php:143
2028
- #: adminpages/emailsettings.php:153
2029
  msgid "when a user cancels his or her account."
2030
  msgstr ""
2031
 
2032
  #: adminpages/emailsettings.php:162 adminpages/emailsettings.php:119
2033
  #: adminpages/emailsettings.php:137 adminpages/emailsettings.php:148
2034
- #: adminpages/emailsettings.php:158
2035
  msgid "Bill Updates"
2036
  msgstr ""
2037
 
2038
  #: adminpages/emailsettings.php:166 adminpages/emailsettings.php:123
2039
  #: adminpages/emailsettings.php:141 adminpages/emailsettings.php:152
2040
- #: adminpages/emailsettings.php:162
2041
  msgid "when a user updates his or her billing information."
2042
  msgstr ""
2043
 
2044
  #: adminpages/emailsettings.php:172 adminpages/emailsettings.php:129
2045
  #: adminpages/emailsettings.php:147 adminpages/emailsettings.php:158
2046
- #: adminpages/emailsettings.php:168
2047
  msgid "Send members emails"
2048
  msgstr ""
2049
 
2050
  #: adminpages/emailsettings.php:178 adminpages/emailsettings.php:135
2051
  #: adminpages/emailsettings.php:153 adminpages/emailsettings.php:164
2052
- #: adminpages/emailsettings.php:174
2053
  msgid "New Users"
2054
  msgstr ""
2055
 
2056
  #: adminpages/emailsettings.php:182 adminpages/emailsettings.php:139
2057
  #: adminpages/emailsettings.php:157 adminpages/emailsettings.php:168
2058
- #: adminpages/emailsettings.php:178
2059
  msgid ""
2060
  "Default WP notification email. (Recommended: Leave unchecked. Members will "
2061
  "still get an email confirmation from PMPro after checkout.)"
2062
  msgstr ""
2063
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2064
  #: adminpages/membershiplevels.php:150 adminpages/membershiplevels.php:137
2065
  #: adminpages/membershiplevels.php:141 adminpages/membershiplevels.php:143
2066
  #: adminpages/membershiplevels.php:146 adminpages/membershiplevels.php:150
@@ -2134,18 +2165,19 @@ msgstr ""
2134
  msgid "Add New Membership Level"
2135
  msgstr ""
2136
 
2137
- #: adminpages/membershiplevels.php:353 adminpages/membershiplevels.php:716
2138
  #: adminpages/reports/login.php:180 adminpages/membershiplevels.php:291
2139
  #: adminpages/membershiplevels.php:293 adminpages/membershiplevels.php:295
2140
  #: adminpages/membershiplevels.php:319 adminpages/membershiplevels.php:329
2141
- #: adminpages/membershiplevels.php:351 adminpages/membershiplevels.php:506
2142
- #: adminpages/membershiplevels.php:512 adminpages/membershiplevels.php:514
2143
- #: adminpages/membershiplevels.php:541 adminpages/membershiplevels.php:542
2144
- #: adminpages/membershiplevels.php:584 adminpages/membershiplevels.php:630
2145
- #: adminpages/membershiplevels.php:632 adminpages/membershiplevels.php:637
2146
- #: adminpages/membershiplevels.php:638 adminpages/membershiplevels.php:642
2147
- #: adminpages/membershiplevels.php:654 adminpages/membershiplevels.php:664
2148
- #: adminpages/membershiplevels.php:714 adminpages/reports/login.php:142
 
2149
  #: adminpages/reports/login.php:144 adminpages/reports/login.php:160
2150
  #: adminpages/reports/login.php:164 adminpages/reports/login.php:180
2151
  msgid "Name"
@@ -2154,33 +2186,36 @@ msgstr ""
2154
  #: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:314
2155
  #: adminpages/membershiplevels.php:316 adminpages/membershiplevels.php:318
2156
  #: adminpages/membershiplevels.php:342 adminpages/membershiplevels.php:352
2157
- #: adminpages/membershiplevels.php:374
2158
  msgid "Confirmation Message"
2159
  msgstr ""
2160
 
2161
  #: adminpages/membershiplevels.php:390 adminpages/membershiplevels.php:388
 
2162
  msgid "Check to include this message in the membership confirmation email."
2163
  msgstr ""
2164
 
2165
- #: adminpages/membershiplevels.php:396 adminpages/membershiplevels.php:717
2166
  #: adminpages/membershiplevels.php:333 adminpages/membershiplevels.php:335
2167
  #: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:338
2168
  #: adminpages/membershiplevels.php:361 adminpages/membershiplevels.php:371
2169
- #: adminpages/membershiplevels.php:394 adminpages/membershiplevels.php:543
2170
- #: adminpages/membershiplevels.php:585 adminpages/membershiplevels.php:631
2171
- #: adminpages/membershiplevels.php:633 adminpages/membershiplevels.php:638
2172
- #: adminpages/membershiplevels.php:639 adminpages/membershiplevels.php:643
2173
- #: adminpages/membershiplevels.php:655 adminpages/membershiplevels.php:665
2174
- #: adminpages/membershiplevels.php:715
 
2175
  msgid "Billing Details"
2176
  msgstr ""
2177
 
2178
  #: adminpages/membershiplevels.php:431
2179
- #: classes/gateways/class.pmprogateway_stripe.php:750
2180
  #: adminpages/membershiplevels.php:349 adminpages/membershiplevels.php:351
2181
  #: adminpages/membershiplevels.php:370 adminpages/membershiplevels.php:372
2182
  #: adminpages/membershiplevels.php:373 adminpages/membershiplevels.php:396
2183
  #: adminpages/membershiplevels.php:406 adminpages/membershiplevels.php:429
 
2184
  #: classes/gateways/class.pmprogateway_stripe.php:619
2185
  #: classes/gateways/class.pmprogateway_stripe.php:620
2186
  #: classes/gateways/class.pmprogateway_stripe.php:630
@@ -2192,6 +2227,7 @@ msgstr ""
2192
  #: classes/gateways/class.pmprogateway_stripe.php:686
2193
  #: classes/gateways/class.pmprogateway_stripe.php:697
2194
  #: classes/gateways/class.pmprogateway_stripe.php:735
 
2195
  #: classes/gateways/class.pmprogateway_stripe.php:762
2196
  #: classes/gateways/class.pmprogateway_stripe.php:769
2197
  #: classes/gateways/class.pmprogateway_stripe.php:777
@@ -2205,7 +2241,7 @@ msgstr ""
2205
  #: adminpages/membershiplevels.php:368 adminpages/membershiplevels.php:387
2206
  #: adminpages/membershiplevels.php:389 adminpages/membershiplevels.php:390
2207
  #: adminpages/membershiplevels.php:413 adminpages/membershiplevels.php:423
2208
- #: adminpages/membershiplevels.php:444
2209
  msgid ""
2210
  "Braintree integration currently only supports billing periods of \"Month\" "
2211
  "or \"Year\"."
@@ -2215,7 +2251,7 @@ msgstr ""
2215
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:393
2216
  #: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:396
2217
  #: adminpages/membershiplevels.php:417 adminpages/membershiplevels.php:427
2218
- #: adminpages/membershiplevels.php:448
2219
  msgid ""
2220
  "After saving this level, make note of the ID and create a \"Plan\" in your "
2221
  "Braintree dashboard with the same settings and the \"Plan ID\" set to "
@@ -2223,8 +2259,8 @@ msgid ""
2223
  msgstr ""
2224
 
2225
  #: adminpages/membershiplevels.php:450 adminpages/membershiplevels.php:455
2226
- #: classes/gateways/class.pmprogateway_cybersource.php:101
2227
- #: classes/gateways/class.pmprogateway_paypal.php:130
2228
  #: classes/gateways/class.pmprogateway_paypalexpress.php:145
2229
  #: classes/gateways/class.pmprogateway_paypalstandard.php:137
2230
  #: adminpages/membershiplevels.php:372 adminpages/membershiplevels.php:374
@@ -2234,7 +2270,8 @@ msgstr ""
2234
  #: adminpages/membershiplevels.php:417 adminpages/membershiplevels.php:419
2235
  #: adminpages/membershiplevels.php:427 adminpages/membershiplevels.php:429
2236
  #: adminpages/membershiplevels.php:432 adminpages/membershiplevels.php:448
2237
- #: adminpages/membershiplevels.php:453 adminpages/paymentsettings.php:170
 
2238
  #: adminpages/paymentsettings.php:174 adminpages/paymentsettings.php:179
2239
  #: classes/gateways/class.pmprogateway_cybersource.php:101
2240
  #: classes/gateways/class.pmprogateway_paypal.php:118
@@ -2248,7 +2285,7 @@ msgid "Note"
2248
  msgstr ""
2249
 
2250
  #: adminpages/membershiplevels.php:455 adminpages/membershiplevels.php:432
2251
- #: adminpages/membershiplevels.php:453
2252
  #, php-format
2253
  msgid ""
2254
  "You will need to create a \"Plan\" in your Braintree dashboard with the same "
@@ -2259,7 +2296,7 @@ msgstr ""
2259
  #: adminpages/membershiplevels.php:388 adminpages/membershiplevels.php:407
2260
  #: adminpages/membershiplevels.php:409 adminpages/membershiplevels.php:410
2261
  #: adminpages/membershiplevels.php:431 adminpages/membershiplevels.php:441
2262
- #: adminpages/membershiplevels.php:465
2263
  msgid ""
2264
  "Stripe integration currently does not support billing limits. You can still "
2265
  "set an expiration date below."
@@ -2269,7 +2306,7 @@ msgstr ""
2269
  #: adminpages/membershiplevels.php:400 adminpages/membershiplevels.php:419
2270
  #: adminpages/membershiplevels.php:421 adminpages/membershiplevels.php:422
2271
  #: adminpages/membershiplevels.php:443 adminpages/membershiplevels.php:453
2272
- #: adminpages/membershiplevels.php:477
2273
  msgid ""
2274
  "2Checkout integration does not support custom trials. You can do one period "
2275
  "trials by setting an initial payment different from the billing amount."
@@ -2280,6 +2317,7 @@ msgstr ""
2280
  #: adminpages/membershiplevels.php:441 adminpages/membershiplevels.php:443
2281
  #: adminpages/membershiplevels.php:444 adminpages/membershiplevels.php:465
2282
  #: adminpages/membershiplevels.php:475 adminpages/membershiplevels.php:499
 
2283
  msgid ""
2284
  "Stripe integration currently does not support trial amounts greater than $0."
2285
  msgstr ""
@@ -2289,6 +2327,7 @@ msgstr ""
2289
  #: adminpages/membershiplevels.php:445 adminpages/membershiplevels.php:447
2290
  #: adminpages/membershiplevels.php:448 adminpages/membershiplevels.php:469
2291
  #: adminpages/membershiplevels.php:479 adminpages/membershiplevels.php:503
 
2292
  msgid ""
2293
  "Braintree integration currently does not support trial amounts greater than "
2294
  "$0."
@@ -2299,6 +2338,7 @@ msgstr ""
2299
  #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:451
2300
  #: adminpages/membershiplevels.php:452 adminpages/membershiplevels.php:473
2301
  #: adminpages/membershiplevels.php:483 adminpages/membershiplevels.php:507
 
2302
  msgid ""
2303
  "Payflow integration currently does not support trial amounts greater than $0."
2304
  msgstr ""
@@ -2308,7 +2348,7 @@ msgstr ""
2308
  #: adminpages/membershiplevels.php:457 adminpages/membershiplevels.php:458
2309
  #: adminpages/membershiplevels.php:460 adminpages/membershiplevels.php:461
2310
  #: adminpages/membershiplevels.php:482 adminpages/membershiplevels.php:492
2311
- #: adminpages/membershiplevels.php:516
2312
  msgid "Other Settings"
2313
  msgstr ""
2314
 
@@ -2317,7 +2357,7 @@ msgstr ""
2317
  #: adminpages/membershiplevels.php:461 adminpages/membershiplevels.php:462
2318
  #: adminpages/membershiplevels.php:464 adminpages/membershiplevels.php:465
2319
  #: adminpages/membershiplevels.php:486 adminpages/membershiplevels.php:496
2320
- #: adminpages/membershiplevels.php:520
2321
  msgid "Disable New Signups"
2322
  msgstr ""
2323
 
@@ -2326,13 +2366,14 @@ msgstr ""
2326
  #: adminpages/membershiplevels.php:462 adminpages/membershiplevels.php:463
2327
  #: adminpages/membershiplevels.php:465 adminpages/membershiplevels.php:466
2328
  #: adminpages/membershiplevels.php:487 adminpages/membershiplevels.php:497
2329
- #: adminpages/membershiplevels.php:521
2330
  msgid ""
2331
  "Check to hide this level from the membership levels page and disable "
2332
  "registration."
2333
  msgstr ""
2334
 
2335
  #: adminpages/membershiplevels.php:548 adminpages/membershiplevels.php:546
 
2336
  #, php-format
2337
  msgid ""
2338
  "WARNING: This level is set with both a recurring billing amount and an "
@@ -2346,48 +2387,72 @@ msgstr ""
2346
  #: adminpages/membershiplevels.php:492 adminpages/membershiplevels.php:493
2347
  #: adminpages/membershiplevels.php:495 adminpages/membershiplevels.php:496
2348
  #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:527
2349
- #: adminpages/membershiplevels.php:570
2350
  msgid "Content Settings"
2351
  msgstr ""
2352
 
2353
- #: adminpages/membershiplevels.php:576 adminpages/membershiplevels.php:461
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2354
  #: adminpages/membershiplevels.php:467 adminpages/membershiplevels.php:469
2355
  #: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:497
2356
  #: adminpages/membershiplevels.php:499 adminpages/membershiplevels.php:500
2357
  #: adminpages/membershiplevels.php:521 adminpages/membershiplevels.php:531
2358
- #: adminpages/membershiplevels.php:574
2359
  msgid "Categories"
2360
  msgstr ""
2361
 
2362
- #: adminpages/membershiplevels.php:584 adminpages/membershiplevels.php:505
2363
  #: adminpages/membershiplevels.php:507 adminpages/membershiplevels.php:516
2364
  #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:529
2365
  #: adminpages/membershiplevels.php:539 adminpages/membershiplevels.php:582
 
2366
  msgid "Save Level"
2367
  msgstr ""
2368
 
2369
- #: adminpages/membershiplevels.php:585 adminpages/orders.php:949
2370
- #: pages/billing.php:363 pages/cancel.php:83 shortcodes/pmpro_account.php:72
2371
  #: adminpages/membershiplevels.php:506 adminpages/membershiplevels.php:508
2372
  #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:518
2373
  #: adminpages/membershiplevels.php:530 adminpages/membershiplevels.php:540
2374
- #: adminpages/membershiplevels.php:583 adminpages/orders.php:511
2375
- #: adminpages/orders.php:561 adminpages/orders.php:633
2376
- #: adminpages/orders.php:662 adminpages/orders.php:765
2377
- #: adminpages/orders.php:796 adminpages/orders.php:807
2378
- #: adminpages/orders.php:894 adminpages/orders.php:949 pages/account.php:44
2379
- #: pages/billing.php:295 pages/billing.php:299 pages/billing.php:330
2380
- #: pages/billing.php:339 pages/billing.php:342 pages/billing.php:344
2381
- #: pages/billing.php:348 pages/billing.php:363 pages/billing.php:364
2382
- #: pages/billing.php:365 pages/billing.php:371 pages/billing.php:392
2383
- #: pages/billing.php:397 pages/billing.php:401 pages/billing.php:406
2384
- #: pages/cancel.php:71 pages/cancel.php:83 pages/cancel.php:84
2385
- #: shortcodes/pmpro_account.php:70 shortcodes/pmpro_account.php:72
2386
- #: shortcodes/pmpro_account.php:73
2387
  msgid "Cancel"
2388
  msgstr ""
2389
 
2390
- #: adminpages/membershiplevels.php:696 adminpages/membershiplevels.php:699
2391
  #: adminpages/membershiplevels.php:493 adminpages/membershiplevels.php:496
2392
  #: adminpages/membershiplevels.php:499 adminpages/membershiplevels.php:501
2393
  #: adminpages/membershiplevels.php:502 adminpages/membershiplevels.php:504
@@ -2400,29 +2465,31 @@ msgstr ""
2400
  #: adminpages/membershiplevels.php:624 adminpages/membershiplevels.php:625
2401
  #: adminpages/membershiplevels.php:634 adminpages/membershiplevels.php:637
2402
  #: adminpages/membershiplevels.php:644 adminpages/membershiplevels.php:647
2403
- #: adminpages/membershiplevels.php:694 adminpages/membershiplevels.php:697
 
2404
  msgid "Search Levels"
2405
  msgstr ""
2406
 
2407
- #: adminpages/membershiplevels.php:702 adminpages/membershiplevels.php:490
2408
  #: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:498
2409
  #: adminpages/membershiplevels.php:525 adminpages/membershiplevels.php:526
2410
  #: adminpages/membershiplevels.php:569 adminpages/membershiplevels.php:607
2411
  #: adminpages/membershiplevels.php:609 adminpages/membershiplevels.php:618
2412
  #: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:631
2413
  #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:700
 
2414
  msgid "Add New Level"
2415
  msgstr ""
2416
 
2417
- #: adminpages/membershiplevels.php:705 adminpages/membershiplevels.php:579
2418
  #: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:621
2419
  #: adminpages/membershiplevels.php:630 adminpages/membershiplevels.php:631
2420
  #: adminpages/membershiplevels.php:643 adminpages/membershiplevels.php:653
2421
- #: adminpages/membershiplevels.php:703
2422
  msgid "Drag and drop membership levels to reorder them on the Levels page."
2423
  msgstr ""
2424
 
2425
- #: adminpages/membershiplevels.php:718 pages/cancel.php:61
2426
  #: pages/confirmation.php:81 pages/invoice.php:64
2427
  #: shortcodes/pmpro_account.php:46 adminpages/membershiplevels.php:510
2428
  #: adminpages/membershiplevels.php:516 adminpages/membershiplevels.php:518
@@ -2431,62 +2498,62 @@ msgstr ""
2431
  #: adminpages/membershiplevels.php:634 adminpages/membershiplevels.php:639
2432
  #: adminpages/membershiplevels.php:640 adminpages/membershiplevels.php:644
2433
  #: adminpages/membershiplevels.php:656 adminpages/membershiplevels.php:666
2434
- #: adminpages/membershiplevels.php:716 pages/account.php:20 pages/cancel.php:53
2435
- #: pages/cancel.php:61 pages/cancel.php:62 pages/confirmation.php:81
2436
- #: pages/confirmation.php:83 pages/confirmation.php:84
2437
- #: pages/confirmation.php:89 pages/invoice.php:63 pages/invoice.php:68
2438
- #: pages/invoice.php:70 shortcodes/pmpro_account.php:45
2439
- #: shortcodes/pmpro_account.php:46
2440
  msgid "Expiration"
2441
  msgstr ""
2442
 
2443
- #: adminpages/membershiplevels.php:719 adminpages/membershiplevels.php:511
2444
  #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:519
2445
  #: adminpages/membershiplevels.php:545 adminpages/membershiplevels.php:546
2446
  #: adminpages/membershiplevels.php:587 adminpages/membershiplevels.php:633
2447
  #: adminpages/membershiplevels.php:635 adminpages/membershiplevels.php:640
2448
  #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:645
2449
  #: adminpages/membershiplevels.php:657 adminpages/membershiplevels.php:667
2450
- #: adminpages/membershiplevels.php:717
2451
  msgid "Allow Signups"
2452
  msgstr ""
2453
 
2454
- #: adminpages/membershiplevels.php:734 adminpages/membershiplevels.php:534
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2455
  #: adminpages/membershiplevels.php:540 adminpages/membershiplevels.php:542
2456
  #: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:569
2457
  #: adminpages/membershiplevels.php:646 adminpages/membershiplevels.php:648
2458
  #: adminpages/membershiplevels.php:650 adminpages/membershiplevels.php:655
2459
  #: adminpages/membershiplevels.php:656 adminpages/membershiplevels.php:660
2460
  #: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:682
2461
- #: adminpages/membershiplevels.php:732
2462
  msgid "FREE"
2463
  msgstr ""
2464
 
2465
- #: adminpages/membershiplevels.php:743 adminpages/membershiplevels.php:560
2466
  #: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:568
2467
  #: adminpages/membershiplevels.php:575 adminpages/membershiplevels.php:595
2468
  #: adminpages/membershiplevels.php:655 adminpages/membershiplevels.php:657
2469
  #: adminpages/membershiplevels.php:659 adminpages/membershiplevels.php:664
2470
  #: adminpages/membershiplevels.php:665 adminpages/membershiplevels.php:669
2471
  #: adminpages/membershiplevels.php:681 adminpages/membershiplevels.php:691
2472
- #: adminpages/membershiplevels.php:741
2473
  msgid "After"
2474
  msgstr ""
2475
 
2476
- #: adminpages/membershiplevels.php:748 adminpages/membershiplevels.php:566
2477
- #: adminpages/membershiplevels.php:572 adminpages/membershiplevels.php:574
2478
- #: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:601
2479
- #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
2480
- #: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:669
2481
- #: adminpages/membershiplevels.php:670 adminpages/membershiplevels.php:674
2482
- #: adminpages/membershiplevels.php:686 adminpages/membershiplevels.php:696
2483
- #: adminpages/membershiplevels.php:746
2484
- #, php-format
2485
- msgid ""
2486
- "Are you sure you want to delete membership level %s? All subscriptions will "
2487
- "be cancelled."
2488
- msgstr ""
2489
-
2490
  #: adminpages/memberslist.php:25 adminpages/memberslist.php:25
2491
  #: includes/adminpages.php:15 includes/adminpages.php:53
2492
  #: includes/adminpages.php:54 includes/adminpages.php:74
@@ -2495,7 +2562,7 @@ msgstr ""
2495
  msgid "Members List"
2496
  msgstr ""
2497
 
2498
- #: adminpages/memberslist.php:26 adminpages/orders.php:1018
2499
  #: adminpages/memberslist.php:26 adminpages/orders.php:522
2500
  #: adminpages/orders.php:591 adminpages/orders.php:698
2501
  #: adminpages/orders.php:727 adminpages/orders.php:833
@@ -2504,7 +2571,7 @@ msgstr ""
2504
  msgid "Export to CSV"
2505
  msgstr ""
2506
 
2507
- #: adminpages/memberslist.php:30 adminpages/orders.php:1037
2508
  #: adminpages/reports/login.php:103 adminpages/reports/memberships.php:349
2509
  #: adminpages/reports/sales.php:288 adminpages/memberslist.php:30
2510
  #: adminpages/orders.php:603 adminpages/orders.php:710
@@ -2528,7 +2595,7 @@ msgstr ""
2528
 
2529
  #: adminpages/memberslist.php:32 adminpages/reports/login.php:105
2530
  #: adminpages/reports/memberships.php:373 adminpages/reports/sales.php:311
2531
- #: classes/class.pmproemail.php:154 classes/class.pmproemail.php:199
2532
  #: adminpages/memberslist.php:32 adminpages/reports/login.php:67
2533
  #: adminpages/reports/login.php:69 adminpages/reports/login.php:85
2534
  #: adminpages/reports/login.php:89 adminpages/reports/login.php:105
@@ -2590,7 +2657,7 @@ msgstr ""
2590
  msgid "Last&nbsp;Name"
2591
  msgstr ""
2592
 
2593
- #: adminpages/memberslist.php:170 pages/billing.php:100 pages/checkout.php:283
2594
  #: pages/confirmation.php:66 pages/invoice.php:49
2595
  #: adminpages/memberslist.php:117 adminpages/memberslist.php:150
2596
  #: adminpages/memberslist.php:160 adminpages/memberslist.php:170
@@ -2605,6 +2672,7 @@ msgstr ""
2605
  #: pages/confirmation.php:59 pages/confirmation.php:61
2606
  #: pages/confirmation.php:66 pages/confirmation.php:67
2607
  #: pages/confirmation.php:69 pages/invoice.php:46 pages/invoice.php:48
 
2608
  msgid "Billing Address"
2609
  msgstr ""
2610
 
@@ -2648,29 +2716,19 @@ msgstr ""
2648
  msgid "All Users"
2649
  msgstr ""
2650
 
2651
- #: adminpages/orders.php:158 adminpages/orders.php:146
2652
- #: adminpages/orders.php:155 adminpages/orders.php:158
2653
- msgid "Invoice emailed successfully."
2654
- msgstr ""
2655
-
2656
- #: adminpages/orders.php:161 adminpages/orders.php:149
2657
- #: adminpages/orders.php:160 adminpages/orders.php:161
2658
- msgid "Error emailing invoice."
2659
- msgstr ""
2660
-
2661
- #: adminpages/orders.php:174 adminpages/orders.php:26 adminpages/orders.php:67
2662
  #: adminpages/orders.php:162 adminpages/orders.php:174
2663
  #: adminpages/orders.php:175
2664
  msgid "Order deleted successfully."
2665
  msgstr ""
2666
 
2667
- #: adminpages/orders.php:177 adminpages/orders.php:31 adminpages/orders.php:72
2668
  #: adminpages/orders.php:165 adminpages/orders.php:177
2669
  #: adminpages/orders.php:180
2670
  msgid "Error deleting order."
2671
  msgstr ""
2672
 
2673
- #: adminpages/orders.php:314 adminpages/orders.php:119
2674
  #: adminpages/orders.php:169 adminpages/orders.php:270
2675
  #: adminpages/orders.php:284 adminpages/orders.php:285
2676
  #: adminpages/orders.php:295 adminpages/orders.php:297
@@ -2678,7 +2736,7 @@ msgstr ""
2678
  msgid "Order saved successfully."
2679
  msgstr ""
2680
 
2681
- #: adminpages/orders.php:317 adminpages/orders.php:124
2682
  #: adminpages/orders.php:174 adminpages/orders.php:275
2683
  #: adminpages/orders.php:287 adminpages/orders.php:288
2684
  #: adminpages/orders.php:298 adminpages/orders.php:300
@@ -2686,7 +2744,7 @@ msgstr ""
2686
  msgid "Error updating order timestamp."
2687
  msgstr ""
2688
 
2689
- #: adminpages/orders.php:321 adminpages/orders.php:130
2690
  #: adminpages/orders.php:180 adminpages/orders.php:281
2691
  #: adminpages/orders.php:291 adminpages/orders.php:292
2692
  #: adminpages/orders.php:302 adminpages/orders.php:304
@@ -2694,7 +2752,7 @@ msgstr ""
2694
  msgid "Error saving order."
2695
  msgstr ""
2696
 
2697
- #: adminpages/orders.php:382 classes/class.memberorder.php:859
2698
  #: adminpages/orders.php:195 adminpages/orders.php:245
2699
  #: adminpages/orders.php:317 adminpages/orders.php:321
2700
  #: adminpages/orders.php:346 adminpages/orders.php:352
@@ -2705,7 +2763,13 @@ msgstr ""
2705
  msgid "Order"
2706
  msgstr ""
2707
 
2708
- #: adminpages/orders.php:384 adminpages/orders.php:197
 
 
 
 
 
 
2709
  #: adminpages/orders.php:247 adminpages/orders.php:319
2710
  #: adminpages/orders.php:323 adminpages/orders.php:348
2711
  #: adminpages/orders.php:354 adminpages/orders.php:364
@@ -2713,7 +2777,7 @@ msgstr ""
2713
  msgid "New Order"
2714
  msgstr ""
2715
 
2716
- #: adminpages/orders.php:431 adminpages/orders.php:220
2717
  #: adminpages/orders.php:270 adminpages/orders.php:342
2718
  #: adminpages/orders.php:359 adminpages/orders.php:371
2719
  #: adminpages/orders.php:390 adminpages/orders.php:401
@@ -2721,7 +2785,7 @@ msgstr ""
2721
  msgid "Randomly generated for you."
2722
  msgstr ""
2723
 
2724
- #: adminpages/orders.php:436 adminpages/orders.php:225
2725
  #: adminpages/orders.php:275 adminpages/orders.php:347
2726
  #: adminpages/orders.php:364 adminpages/orders.php:376
2727
  #: adminpages/orders.php:395 adminpages/orders.php:406
@@ -2729,7 +2793,7 @@ msgstr ""
2729
  msgid "User ID"
2730
  msgstr ""
2731
 
2732
- #: adminpages/orders.php:450 adminpages/orders.php:234
2733
  #: adminpages/orders.php:284 adminpages/orders.php:356
2734
  #: adminpages/orders.php:376 adminpages/orders.php:385
2735
  #: adminpages/orders.php:407 adminpages/orders.php:418
@@ -2737,7 +2801,7 @@ msgstr ""
2737
  msgid "Membership Level ID"
2738
  msgstr ""
2739
 
2740
- #: adminpages/orders.php:465 includes/privacy.php:245 adminpages/orders.php:243
2741
  #: adminpages/orders.php:293 adminpages/orders.php:365
2742
  #: adminpages/orders.php:389 adminpages/orders.php:394
2743
  #: adminpages/orders.php:420 adminpages/orders.php:431
@@ -2745,7 +2809,7 @@ msgstr ""
2745
  msgid "Billing Name"
2746
  msgstr ""
2747
 
2748
- #: adminpages/orders.php:479 includes/privacy.php:249 adminpages/orders.php:251
2749
  #: adminpages/orders.php:301 adminpages/orders.php:373
2750
  #: adminpages/orders.php:401 adminpages/orders.php:402
2751
  #: adminpages/orders.php:432 adminpages/orders.php:443
@@ -2753,7 +2817,7 @@ msgstr ""
2753
  msgid "Billing Street"
2754
  msgstr ""
2755
 
2756
- #: adminpages/orders.php:492 includes/privacy.php:253 includes/privacy.php:358
2757
  #: adminpages/orders.php:258 adminpages/orders.php:308
2758
  #: adminpages/orders.php:380 adminpages/orders.php:409
2759
  #: adminpages/orders.php:412 adminpages/orders.php:443
@@ -2762,7 +2826,7 @@ msgstr ""
2762
  msgid "Billing City"
2763
  msgstr ""
2764
 
2765
- #: adminpages/orders.php:505 includes/privacy.php:257 adminpages/orders.php:265
2766
  #: adminpages/orders.php:315 adminpages/orders.php:387
2767
  #: adminpages/orders.php:416 adminpages/orders.php:423
2768
  #: adminpages/orders.php:454 adminpages/orders.php:465
@@ -2770,7 +2834,7 @@ msgstr ""
2770
  msgid "Billing State"
2771
  msgstr ""
2772
 
2773
- #: adminpages/orders.php:518 includes/privacy.php:261 includes/privacy.php:360
2774
  #: adminpages/orders.php:272 adminpages/orders.php:322
2775
  #: adminpages/orders.php:394 adminpages/orders.php:423
2776
  #: adminpages/orders.php:434 adminpages/orders.php:465
@@ -2779,7 +2843,7 @@ msgstr ""
2779
  msgid "Billing Postal Code"
2780
  msgstr ""
2781
 
2782
- #: adminpages/orders.php:531 includes/privacy.php:265 includes/privacy.php:362
2783
  #: adminpages/orders.php:279 adminpages/orders.php:329
2784
  #: adminpages/orders.php:401 adminpages/orders.php:430
2785
  #: adminpages/orders.php:445 adminpages/orders.php:476
@@ -2788,7 +2852,7 @@ msgstr ""
2788
  msgid "Billing Country"
2789
  msgstr ""
2790
 
2791
- #: adminpages/orders.php:545 includes/privacy.php:269 adminpages/orders.php:287
2792
  #: adminpages/orders.php:337 adminpages/orders.php:409
2793
  #: adminpages/orders.php:438 adminpages/orders.php:457
2794
  #: adminpages/orders.php:488 adminpages/orders.php:499
@@ -2796,14 +2860,14 @@ msgstr ""
2796
  msgid "Billing Phone"
2797
  msgstr ""
2798
 
2799
- #: adminpages/orders.php:575 adminpages/orders.php:1363
2800
- #: classes/class.pmproemail.php:285 classes/class.pmproemail.php:294
2801
- #: classes/class.pmproemail.php:303 classes/class.pmproemail.php:385
2802
- #: classes/class.pmproemail.php:394 classes/class.pmproemail.php:712
2803
- #: classes/class.pmproemail.php:714
2804
- #: classes/gateways/class.pmprogateway_braintree.php:516
2805
- #: classes/gateways/class.pmprogateway_stripe.php:629 pages/checkout.php:75
2806
- #: pages/checkout.php:81 pages/checkout.php:506 pages/confirmation.php:58
2807
  #: pages/invoice.php:34 adminpages/orders.php:575 adminpages/orders.php:1363
2808
  #: classes/class.pmproemail.php:216 classes/class.pmproemail.php:218
2809
  #: classes/class.pmproemail.php:225 classes/class.pmproemail.php:227
@@ -2816,22 +2880,24 @@ msgstr ""
2816
  #: classes/class.pmproemail.php:278 classes/class.pmproemail.php:284
2817
  #: classes/class.pmproemail.php:285 classes/class.pmproemail.php:287
2818
  #: classes/class.pmproemail.php:293 classes/class.pmproemail.php:294
2819
- #: classes/class.pmproemail.php:302 classes/class.pmproemail.php:304
2820
- #: classes/class.pmproemail.php:307 classes/class.pmproemail.php:313
2821
- #: classes/class.pmproemail.php:316 classes/class.pmproemail.php:325
2822
- #: classes/class.pmproemail.php:328 classes/class.pmproemail.php:334
2823
- #: classes/class.pmproemail.php:337 classes/class.pmproemail.php:346
2824
- #: classes/class.pmproemail.php:357 classes/class.pmproemail.php:366
2825
- #: classes/class.pmproemail.php:369 classes/class.pmproemail.php:376
2826
- #: classes/class.pmproemail.php:378 classes/class.pmproemail.php:384
2827
- #: classes/class.pmproemail.php:385 classes/class.pmproemail.php:393
 
2828
  #: classes/class.pmproemail.php:532 classes/class.pmproemail.php:580
2829
  #: classes/class.pmproemail.php:645 classes/class.pmproemail.php:648
2830
  #: classes/class.pmproemail.php:657 classes/class.pmproemail.php:659
2831
  #: classes/class.pmproemail.php:679 classes/class.pmproemail.php:696
2832
  #: classes/class.pmproemail.php:698 classes/class.pmproemail.php:703
2833
  #: classes/class.pmproemail.php:705 classes/class.pmproemail.php:711
2834
- #: classes/class.pmproemail.php:713
 
2835
  #: classes/gateways/class.pmprogateway_braintree.php:349
2836
  #: classes/gateways/class.pmprogateway_braintree.php:362
2837
  #: classes/gateways/class.pmprogateway_braintree.php:364
@@ -2855,6 +2921,7 @@ msgstr ""
2855
  #: classes/gateways/class.pmprogateway_stripe.php:562
2856
  #: classes/gateways/class.pmprogateway_stripe.php:573
2857
  #: classes/gateways/class.pmprogateway_stripe.php:611
 
2858
  #: classes/gateways/class.pmprogateway_stripe.php:638
2859
  #: classes/gateways/class.pmprogateway_stripe.php:644
2860
  #: classes/gateways/class.pmprogateway_stripe.php:652
@@ -2871,23 +2938,24 @@ msgstr ""
2871
  #: pages/checkout.php:612 pages/checkout.php:616 pages/checkout.php:617
2872
  #: pages/checkout.php:619 pages/checkout.php:622 pages/confirmation.php:51
2873
  #: pages/confirmation.php:52 pages/confirmation.php:58 pages/invoice.php:32
2874
- #: pages/invoice.php:33
2875
  msgid "Discount Code"
2876
  msgstr ""
2877
 
2878
- #: adminpages/orders.php:586 classes/class.pmproemail.php:877
2879
- #: includes/init.php:264 includes/profile.php:48 adminpages/orders.php:586
2880
  #: classes/class.pmproemail.php:868 classes/class.pmproemail.php:876
2881
- #: includes/init.php:229 includes/init.php:232 includes/init.php:233
2882
- #: includes/init.php:235 includes/init.php:237 includes/init.php:245
2883
- #: includes/init.php:253 includes/init.php:258 includes/init.php:259
2884
- #: includes/init.php:265 includes/init.php:266 includes/init.php:280
2885
- #: includes/init.php:284 includes/profile.php:37 includes/profile.php:39
2886
- #: includes/profile.php:42 includes/profile.php:48
 
2887
  msgid "None"
2888
  msgstr ""
2889
 
2890
- #: adminpages/orders.php:597 includes/privacy.php:273 adminpages/orders.php:296
2891
  #: adminpages/orders.php:346 adminpages/orders.php:418
2892
  #: adminpages/orders.php:447 adminpages/orders.php:470
2893
  #: adminpages/orders.php:501 adminpages/orders.php:512
@@ -2895,7 +2963,7 @@ msgstr ""
2895
  msgid "Sub Total"
2896
  msgstr ""
2897
 
2898
- #: adminpages/orders.php:610 adminpages/templates/orders-email.php:60
2899
  #: adminpages/templates/orders-print.php:89 includes/privacy.php:277
2900
  #: pages/confirmation.php:92 pages/invoice.php:75 adminpages/orders.php:304
2901
  #: adminpages/orders.php:354 adminpages/orders.php:426
@@ -2904,12 +2972,12 @@ msgstr ""
2904
  #: adminpages/orders.php:555 adminpages/orders.php:610
2905
  #: adminpages/templates/orders-email.php:60
2906
  #: adminpages/templates/orders-print.php:89 includes/privacy.php:277
2907
- #: pages/confirmation.php:92 pages/invoice.php:74 pages/invoice.php:78
2908
- #: pages/invoice.php:80
2909
  msgid "Tax"
2910
  msgstr ""
2911
 
2912
- #: adminpages/orders.php:623 includes/privacy.php:281 adminpages/orders.php:312
2913
  #: adminpages/orders.php:362 adminpages/orders.php:434
2914
  #: adminpages/orders.php:463 adminpages/orders.php:492
2915
  #: adminpages/orders.php:523 adminpages/orders.php:534
@@ -2917,7 +2985,7 @@ msgstr ""
2917
  msgid "Coupon Amount"
2918
  msgstr ""
2919
 
2920
- #: adminpages/orders.php:648 adminpages/orders.php:325
2921
  #: adminpages/orders.php:375 adminpages/orders.php:447
2922
  #: adminpages/orders.php:476 adminpages/orders.php:513
2923
  #: adminpages/orders.php:544 adminpages/orders.php:555
@@ -2925,7 +2993,7 @@ msgstr ""
2925
  msgid "Should be subtotal + tax - couponamount."
2926
  msgstr ""
2927
 
2928
- #: adminpages/orders.php:653 includes/privacy.php:289 adminpages/orders.php:330
2929
  #: adminpages/orders.php:380 adminpages/orders.php:452
2930
  #: adminpages/orders.php:481 adminpages/orders.php:518
2931
  #: adminpages/orders.php:549 adminpages/orders.php:560
@@ -2933,7 +3001,7 @@ msgstr ""
2933
  msgid "Payment Type"
2934
  msgstr ""
2935
 
2936
- #: adminpages/orders.php:665 adminpages/orders.php:335
2937
  #: adminpages/orders.php:385 adminpages/orders.php:457
2938
  #: adminpages/orders.php:486 adminpages/orders.php:528
2939
  #: adminpages/orders.php:559 adminpages/orders.php:570
@@ -2941,10 +3009,10 @@ msgstr ""
2941
  msgid "e.g. PayPal Express, PayPal Standard, Credit Card."
2942
  msgstr ""
2943
 
2944
- #: adminpages/orders.php:669
2945
- #: classes/gateways/class.pmprogateway_braintree.php:473
2946
- #: classes/gateways/class.pmprogateway_stripe.php:558 includes/privacy.php:293
2947
- #: pages/billing.php:271 pages/checkout.php:431 adminpages/orders.php:339
2948
  #: adminpages/orders.php:389 adminpages/orders.php:461
2949
  #: adminpages/orders.php:490 adminpages/orders.php:532
2950
  #: adminpages/orders.php:563 adminpages/orders.php:574
@@ -2973,6 +3041,7 @@ msgstr ""
2973
  #: classes/gateways/class.pmprogateway_stripe.php:484
2974
  #: classes/gateways/class.pmprogateway_stripe.php:522
2975
  #: classes/gateways/class.pmprogateway_stripe.php:549
 
2976
  #: classes/gateways/class.pmprogateway_stripe.php:573
2977
  #: classes/gateways/class.pmprogateway_stripe.php:581
2978
  #: classes/gateways/class.pmprogateway_stripe.php:588
@@ -2989,7 +3058,7 @@ msgstr ""
2989
  msgid "Card Type"
2990
  msgstr ""
2991
 
2992
- #: adminpages/orders.php:679 adminpages/orders.php:344
2993
  #: adminpages/orders.php:394 adminpages/orders.php:466
2994
  #: adminpages/orders.php:495 adminpages/orders.php:540
2995
  #: adminpages/orders.php:571 adminpages/orders.php:582
@@ -2997,7 +3066,7 @@ msgstr ""
2997
  msgid "e.g. Visa, MasterCard, AMEX, etc"
2998
  msgstr ""
2999
 
3000
- #: adminpages/orders.php:683
3001
  #: classes/gateways/class.pmprogateway_twocheckout.php:137
3002
  #: includes/privacy.php:297 adminpages/orders.php:348 adminpages/orders.php:398
3003
  #: adminpages/orders.php:470 adminpages/orders.php:499
@@ -3012,7 +3081,7 @@ msgstr ""
3012
  msgid "Account Number"
3013
  msgstr ""
3014
 
3015
- #: adminpages/orders.php:694 adminpages/orders.php:353
3016
  #: adminpages/orders.php:403 adminpages/orders.php:475
3017
  #: adminpages/orders.php:504 adminpages/orders.php:553
3018
  #: adminpages/orders.php:584 adminpages/orders.php:595
@@ -3020,7 +3089,7 @@ msgstr ""
3020
  msgid "Obscure all but last 4 digits."
3021
  msgstr ""
3022
 
3023
- #: adminpages/orders.php:704 includes/privacy.php:301 adminpages/orders.php:358
3024
  #: adminpages/orders.php:408 adminpages/orders.php:480
3025
  #: adminpages/orders.php:509 adminpages/orders.php:561
3026
  #: adminpages/orders.php:592 adminpages/orders.php:603
@@ -3028,7 +3097,7 @@ msgstr ""
3028
  msgid "Expiration Month"
3029
  msgstr ""
3030
 
3031
- #: adminpages/orders.php:712 includes/privacy.php:305 adminpages/orders.php:365
3032
  #: adminpages/orders.php:415 adminpages/orders.php:487
3033
  #: adminpages/orders.php:516 adminpages/orders.php:569
3034
  #: adminpages/orders.php:600 adminpages/orders.php:611
@@ -3036,7 +3105,7 @@ msgstr ""
3036
  msgid "Expiration Year"
3037
  msgstr ""
3038
 
3039
- #: adminpages/orders.php:744 adminpages/orders.php:1359
3040
  #: classes/class.memberorder.php:860 includes/privacy.php:313
3041
  #: adminpages/orders.php:394 adminpages/orders.php:444
3042
  #: adminpages/orders.php:516 adminpages/orders.php:545
@@ -3054,7 +3123,7 @@ msgstr ""
3054
  msgid "Gateway"
3055
  msgstr ""
3056
 
3057
- #: adminpages/orders.php:767 adminpages/paymentsettings.php:141
3058
  #: includes/privacy.php:317 adminpages/orders.php:411 adminpages/orders.php:461
3059
  #: adminpages/orders.php:462 adminpages/orders.php:534
3060
  #: adminpages/orders.php:563 adminpages/orders.php:633
@@ -3066,7 +3135,7 @@ msgstr ""
3066
  msgid "Gateway Environment"
3067
  msgstr ""
3068
 
3069
- #: adminpages/orders.php:779 adminpages/paymentsettings.php:145
3070
  #: adminpages/orders.php:415 adminpages/orders.php:465
3071
  #: adminpages/orders.php:466 adminpages/orders.php:538
3072
  #: adminpages/orders.php:567 adminpages/orders.php:640
@@ -3078,7 +3147,7 @@ msgstr ""
3078
  msgid "Sandbox/Testing"
3079
  msgstr ""
3080
 
3081
- #: adminpages/orders.php:784 adminpages/paymentsettings.php:146
3082
  #: adminpages/orders.php:416 adminpages/orders.php:466
3083
  #: adminpages/orders.php:467 adminpages/orders.php:539
3084
  #: adminpages/orders.php:568 adminpages/orders.php:642
@@ -3090,7 +3159,7 @@ msgstr ""
3090
  msgid "Live/Production"
3091
  msgstr ""
3092
 
3093
- #: adminpages/orders.php:792 includes/privacy.php:321 adminpages/orders.php:423
3094
  #: adminpages/orders.php:473 adminpages/orders.php:474
3095
  #: adminpages/orders.php:546 adminpages/orders.php:575
3096
  #: adminpages/orders.php:650 adminpages/orders.php:681
@@ -3099,7 +3168,7 @@ msgstr ""
3099
  msgid "Payment Transaction ID"
3100
  msgstr ""
3101
 
3102
- #: adminpages/orders.php:803 adminpages/orders.php:428
3103
  #: adminpages/orders.php:478 adminpages/orders.php:479
3104
  #: adminpages/orders.php:551 adminpages/orders.php:580
3105
  #: adminpages/orders.php:659 adminpages/orders.php:690
@@ -3108,7 +3177,7 @@ msgstr ""
3108
  msgid "Generated by the gateway. Useful to cross reference orders."
3109
  msgstr ""
3110
 
3111
- #: adminpages/orders.php:808 classes/class.memberorder.php:861
3112
  #: includes/privacy.php:325 adminpages/orders.php:432 adminpages/orders.php:482
3113
  #: adminpages/orders.php:483 adminpages/orders.php:555
3114
  #: adminpages/orders.php:584 adminpages/orders.php:664
@@ -3120,7 +3189,7 @@ msgstr ""
3120
  msgid "Subscription Transaction ID"
3121
  msgstr ""
3122
 
3123
- #: adminpages/orders.php:820 adminpages/orders.php:437
3124
  #: adminpages/orders.php:487 adminpages/orders.php:488
3125
  #: adminpages/orders.php:560 adminpages/orders.php:589
3126
  #: adminpages/orders.php:674 adminpages/orders.php:705
@@ -3129,7 +3198,7 @@ msgstr ""
3129
  msgid "Generated by the gateway. Useful to cross reference subscriptions."
3130
  msgstr ""
3131
 
3132
- #: adminpages/orders.php:867 adminpages/orders.php:477
3133
  #: adminpages/orders.php:527 adminpages/orders.php:599
3134
  #: adminpages/orders.php:628 adminpages/orders.php:716
3135
  #: adminpages/orders.php:747 adminpages/orders.php:758
@@ -3137,7 +3206,7 @@ msgstr ""
3137
  msgid "Affiliate ID"
3138
  msgstr ""
3139
 
3140
- #: adminpages/orders.php:881 adminpages/orders.php:485
3141
  #: adminpages/orders.php:535 adminpages/orders.php:607
3142
  #: adminpages/orders.php:636 adminpages/orders.php:728
3143
  #: adminpages/orders.php:759 adminpages/orders.php:770
@@ -3145,12 +3214,12 @@ msgstr ""
3145
  msgid "Affiliate SubID"
3146
  msgstr ""
3147
 
3148
- #: adminpages/orders.php:903 adminpages/orders.php:848
3149
  #: adminpages/orders.php:903
3150
  msgid "TOS Consent"
3151
  msgstr ""
3152
 
3153
- #: adminpages/orders.php:920 adminpages/orders.php:495
3154
  #: adminpages/orders.php:545 adminpages/orders.php:617
3155
  #: adminpages/orders.php:646 adminpages/orders.php:742
3156
  #: adminpages/orders.php:773 adminpages/orders.php:784
@@ -3158,7 +3227,7 @@ msgstr ""
3158
  msgid "Notes"
3159
  msgstr ""
3160
 
3161
- #: adminpages/orders.php:948 adminpages/orders.php:510
3162
  #: adminpages/orders.php:560 adminpages/orders.php:632
3163
  #: adminpages/orders.php:661 adminpages/orders.php:764
3164
  #: adminpages/orders.php:795 adminpages/orders.php:806
@@ -3166,28 +3235,7 @@ msgstr ""
3166
  msgid "Save Order"
3167
  msgstr ""
3168
 
3169
- #: adminpages/orders.php:984 adminpages/orders.php:667
3170
- #: adminpages/orders.php:696 adminpages/orders.php:800
3171
- #: adminpages/orders.php:831 adminpages/orders.php:842
3172
- #: adminpages/orders.php:929 adminpages/orders.php:984
3173
- msgid "Email Invoice"
3174
- msgstr ""
3175
-
3176
- #: adminpages/orders.php:987 adminpages/orders.php:670
3177
- #: adminpages/orders.php:699 adminpages/orders.php:803
3178
- #: adminpages/orders.php:834 adminpages/orders.php:845
3179
- #: adminpages/orders.php:932 adminpages/orders.php:987
3180
- msgid "Send an invoice for this order to: "
3181
- msgstr ""
3182
-
3183
- #: adminpages/orders.php:989 adminpages/orders.php:672
3184
- #: adminpages/orders.php:701 adminpages/orders.php:805
3185
- #: adminpages/orders.php:836 adminpages/orders.php:847
3186
- #: adminpages/orders.php:934 adminpages/orders.php:989
3187
- msgid "Send Email"
3188
- msgstr ""
3189
-
3190
- #: adminpages/orders.php:996 adminpages/orders.php:521
3191
  #: adminpages/orders.php:571 adminpages/orders.php:678
3192
  #: adminpages/orders.php:707 adminpages/orders.php:812
3193
  #: adminpages/orders.php:843 adminpages/orders.php:854
@@ -3195,7 +3243,7 @@ msgstr ""
3195
  msgid "Add New Order"
3196
  msgstr ""
3197
 
3198
- #: adminpages/orders.php:1041 adminpages/orders.php:606
3199
  #: adminpages/orders.php:713 adminpages/orders.php:742
3200
  #: adminpages/orders.php:852 adminpages/orders.php:883
3201
  #: adminpages/orders.php:894 adminpages/orders.php:985
@@ -3203,7 +3251,7 @@ msgstr ""
3203
  msgid "Within a Date Range"
3204
  msgstr ""
3205
 
3206
- #: adminpages/orders.php:1043 adminpages/orders.php:607
3207
  #: adminpages/orders.php:714 adminpages/orders.php:743
3208
  #: adminpages/orders.php:854 adminpages/orders.php:885
3209
  #: adminpages/orders.php:896 adminpages/orders.php:987
@@ -3211,7 +3259,7 @@ msgstr ""
3211
  msgid "Predefined Date Range"
3212
  msgstr ""
3213
 
3214
- #: adminpages/orders.php:1045 adminpages/orders.php:608
3215
  #: adminpages/orders.php:715 adminpages/orders.php:744
3216
  #: adminpages/orders.php:856 adminpages/orders.php:887
3217
  #: adminpages/orders.php:898 adminpages/orders.php:989
@@ -3219,11 +3267,11 @@ msgstr ""
3219
  msgid "Within a Level"
3220
  msgstr ""
3221
 
3222
- #: adminpages/orders.php:1047 adminpages/orders.php:1047
3223
  msgid "With a Discount Code"
3224
  msgstr ""
3225
 
3226
- #: adminpages/orders.php:1049 adminpages/orders.php:609
3227
  #: adminpages/orders.php:716 adminpages/orders.php:745
3228
  #: adminpages/orders.php:858 adminpages/orders.php:889
3229
  #: adminpages/orders.php:900 adminpages/orders.php:991
@@ -3231,15 +3279,15 @@ msgstr ""
3231
  msgid "Within a Status"
3232
  msgstr ""
3233
 
3234
- #: adminpages/orders.php:1051 adminpages/orders.php:1051
3235
  msgid "Only Paid Orders"
3236
  msgstr ""
3237
 
3238
- #: adminpages/orders.php:1053 adminpages/orders.php:1053
3239
  msgid "Only Free Orders"
3240
  msgstr ""
3241
 
3242
- #: adminpages/orders.php:1056 adminpages/orders.php:612
3243
  #: adminpages/orders.php:719 adminpages/orders.php:748
3244
  #: adminpages/orders.php:861 adminpages/orders.php:892
3245
  #: adminpages/orders.php:903 adminpages/orders.php:994
@@ -3247,7 +3295,7 @@ msgstr ""
3247
  msgid "From"
3248
  msgstr ""
3249
 
3250
- #: adminpages/orders.php:1071 adminpages/orders.php:624
3251
  #: adminpages/orders.php:731 adminpages/orders.php:760
3252
  #: adminpages/orders.php:876 adminpages/orders.php:907
3253
  #: adminpages/orders.php:918 adminpages/orders.php:1009
@@ -3255,7 +3303,7 @@ msgstr ""
3255
  msgid "To"
3256
  msgstr ""
3257
 
3258
- #: adminpages/orders.php:1084 adminpages/orders.php:636
3259
  #: adminpages/orders.php:743 adminpages/orders.php:772
3260
  #: adminpages/orders.php:889 adminpages/orders.php:920
3261
  #: adminpages/orders.php:931 adminpages/orders.php:1022
@@ -3263,7 +3311,7 @@ msgstr ""
3263
  msgid "filter by "
3264
  msgstr ""
3265
 
3266
- #: adminpages/orders.php:1135 adminpages/orders.php:674
3267
  #: adminpages/orders.php:780 adminpages/orders.php:809
3268
  #: adminpages/orders.php:932 adminpages/orders.php:963
3269
  #: adminpages/orders.php:969 adminpages/orders.php:1060
@@ -3271,7 +3319,7 @@ msgstr ""
3271
  msgid "Filter"
3272
  msgstr ""
3273
 
3274
- #: adminpages/orders.php:1269 adminpages/orders.php:1272
3275
  #: adminpages/orders.php:535 adminpages/orders.php:538
3276
  #: adminpages/orders.php:777 adminpages/orders.php:780
3277
  #: adminpages/orders.php:883 adminpages/orders.php:886
@@ -3284,7 +3332,7 @@ msgstr ""
3284
  msgid "Search Orders"
3285
  msgstr ""
3286
 
3287
- #: adminpages/orders.php:1345 adminpages/orders.php:590
3288
  #: adminpages/orders.php:893 adminpages/orders.php:903
3289
  #: adminpages/orders.php:930 adminpages/orders.php:959
3290
  #: adminpages/orders.php:1096 adminpages/orders.php:1127
@@ -3294,8 +3342,8 @@ msgstr ""
3294
  msgid "%d orders found."
3295
  msgstr ""
3296
 
3297
- #: adminpages/orders.php:1356 includes/init.php:242 includes/profile.php:36
3298
- #: pages/checkout.php:39 pages/confirmation.php:53 pages/confirmation.php:124
3299
  #: pages/invoice.php:28 adminpages/orders.php:601 adminpages/orders.php:904
3300
  #: adminpages/orders.php:914 adminpages/orders.php:941
3301
  #: adminpages/orders.php:970 adminpages/orders.php:1107
@@ -3303,22 +3351,23 @@ msgstr ""
3303
  #: adminpages/orders.php:1235 adminpages/orders.php:1356 includes/init.php:214
3304
  #: includes/init.php:217 includes/init.php:218 includes/init.php:220
3305
  #: includes/init.php:222 includes/init.php:230 includes/init.php:238
3306
- #: includes/init.php:243 includes/init.php:244 includes/init.php:258
3307
- #: includes/init.php:262 includes/profile.php:25 includes/profile.php:27
3308
- #: includes/profile.php:30 includes/profile.php:36 pages/checkout.php:33
3309
- #: pages/checkout.php:34 pages/checkout.php:35 pages/checkout.php:39
3310
- #: pages/checkout.php:42 pages/checkout.php:45 pages/confirmation.php:46
3311
- #: pages/confirmation.php:47 pages/confirmation.php:53
3312
- #: pages/confirmation.php:62 pages/confirmation.php:64
3313
- #: pages/confirmation.php:70 pages/confirmation.php:91
3314
- #: pages/confirmation.php:103 pages/confirmation.php:105
3315
- #: pages/confirmation.php:113 pages/confirmation.php:116
3316
- #: pages/confirmation.php:124 pages/invoice.php:27 pages/invoice.php:28
3317
- #: pages/invoice.php:49 pages/invoice.php:51 pages/invoice.php:70
 
3318
  msgid "Membership Level"
3319
  msgstr ""
3320
 
3321
- #: adminpages/orders.php:1358 adminpages/orders.php:1457
3322
  #: adminpages/orders.php:603 adminpages/orders.php:651
3323
  #: adminpages/orders.php:906 adminpages/orders.php:916
3324
  #: adminpages/orders.php:943 adminpages/orders.php:954
@@ -3332,7 +3381,7 @@ msgstr ""
3332
  msgid "Payment"
3333
  msgstr ""
3334
 
3335
- #: adminpages/orders.php:1360 adminpages/orders.php:605
3336
  #: adminpages/orders.php:908 adminpages/orders.php:918
3337
  #: adminpages/orders.php:945 adminpages/orders.php:974
3338
  #: adminpages/orders.php:1111 adminpages/orders.php:1142
@@ -3341,16 +3390,7 @@ msgstr ""
3341
  msgid "Transaction IDs"
3342
  msgstr ""
3343
 
3344
- #: adminpages/orders.php:1466 adminpages/orders.php:653
3345
- #: adminpages/orders.php:956 adminpages/orders.php:974
3346
- #: adminpages/orders.php:984 adminpages/orders.php:1013
3347
- #: adminpages/orders.php:1042 adminpages/orders.php:1192
3348
- #: adminpages/orders.php:1226 adminpages/orders.php:1232
3349
- #: adminpages/orders.php:1344 adminpages/orders.php:1466
3350
- msgid "Subscription"
3351
- msgstr ""
3352
-
3353
- #: adminpages/orders.php:1495 adminpages/orders.php:664
3354
  #: adminpages/orders.php:967 adminpages/orders.php:985
3355
  #: adminpages/orders.php:995 adminpages/orders.php:998
3356
  #: adminpages/orders.php:1027 adminpages/orders.php:1056
@@ -3363,18 +3403,36 @@ msgid ""
3363
  "want to delete order %s?"
3364
  msgstr ""
3365
 
3366
- #: adminpages/orders.php:1499 adminpages/orders.php:1030
3367
- #: adminpages/orders.php:1059 adminpages/orders.php:1215
3368
- #: adminpages/orders.php:1249 adminpages/orders.php:1255
3369
- #: adminpages/orders.php:1370 adminpages/orders.php:1499
3370
- msgid "print"
 
 
3371
  msgstr ""
3372
 
3373
- #: adminpages/orders.php:1503 adminpages/orders.php:1033
3374
- #: adminpages/orders.php:1062 adminpages/orders.php:1219
3375
- #: adminpages/orders.php:1253 adminpages/orders.php:1259
3376
- #: adminpages/orders.php:1374 adminpages/orders.php:1503
3377
- msgid "email"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3378
  msgstr ""
3379
 
3380
  #: adminpages/pagesettings.php:62 adminpages/pagesettings.php:54
@@ -3645,7 +3703,7 @@ msgstr ""
3645
  msgid "Payment Gateway"
3646
  msgstr ""
3647
 
3648
- #: adminpages/paymentsettings.php:110 adminpages/paymentsettings.php:218
3649
  #: adminpages/paymentsettings.php:93 adminpages/paymentsettings.php:110
3650
  #: adminpages/paymentsettings.php:144 adminpages/paymentsettings.php:146
3651
  #: adminpages/paymentsettings.php:201 adminpages/paymentsettings.php:218
@@ -3667,19 +3725,30 @@ msgstr ""
3667
  msgid "Choose a Gateway"
3668
  msgstr ""
3669
 
3670
- #: adminpages/paymentsettings.php:165 adminpages/paymentsettings.php:148
 
 
 
 
 
 
 
 
 
 
 
3671
  #: adminpages/paymentsettings.php:165
3672
  msgid "Currency and Tax Settings"
3673
  msgstr ""
3674
 
3675
- #: adminpages/paymentsettings.php:170 adminpages/paymentsettings.php:153
3676
  #: adminpages/paymentsettings.php:170 adminpages/paymentsettings.php:327
3677
  #: adminpages/paymentsettings.php:337 adminpages/paymentsettings.php:356
3678
  #: adminpages/paymentsettings.php:381 adminpages/paymentsettings.php:386
3679
  msgid "Currency"
3680
  msgstr ""
3681
 
3682
- #: adminpages/paymentsettings.php:186 adminpages/paymentsettings.php:169
3683
  #: adminpages/paymentsettings.php:186 adminpages/paymentsettings.php:400
3684
  #: adminpages/paymentsettings.php:402
3685
  msgid ""
@@ -3687,21 +3756,21 @@ msgid ""
3687
  "your gateway."
3688
  msgstr ""
3689
 
3690
- #: adminpages/paymentsettings.php:191 adminpages/paymentsettings.php:174
3691
  #: adminpages/paymentsettings.php:191 adminpages/paymentsettings.php:375
3692
  #: adminpages/paymentsettings.php:401 adminpages/paymentsettings.php:406
3693
  #: adminpages/paymentsettings.php:408
3694
  msgid "Accepted Credit Card Types"
3695
  msgstr ""
3696
 
3697
- #: adminpages/paymentsettings.php:205 adminpages/paymentsettings.php:188
3698
  #: adminpages/paymentsettings.php:205 adminpages/paymentsettings.php:398
3699
  #: adminpages/paymentsettings.php:438 adminpages/paymentsettings.php:443
3700
  #: adminpages/paymentsettings.php:445
3701
  msgid "Sales Tax"
3702
  msgstr ""
3703
 
3704
- #: adminpages/paymentsettings.php:205 pages/billing.php:117
3705
  #: adminpages/paymentsettings.php:188 adminpages/paymentsettings.php:205
3706
  #: adminpages/paymentsettings.php:398 adminpages/paymentsettings.php:438
3707
  #: adminpages/paymentsettings.php:443 adminpages/paymentsettings.php:445
@@ -3712,33 +3781,33 @@ msgstr ""
3712
  msgid "optional"
3713
  msgstr ""
3714
 
3715
- #: adminpages/paymentsettings.php:208 adminpages/paymentsettings.php:191
3716
  #: adminpages/paymentsettings.php:208 adminpages/paymentsettings.php:401
3717
  #: adminpages/paymentsettings.php:441 adminpages/paymentsettings.php:446
3718
  #: adminpages/paymentsettings.php:448
3719
  msgid "Tax State"
3720
  msgstr ""
3721
 
3722
- #: adminpages/paymentsettings.php:209 adminpages/paymentsettings.php:192
3723
  #: adminpages/paymentsettings.php:209 adminpages/paymentsettings.php:402
3724
  #: adminpages/paymentsettings.php:442 adminpages/paymentsettings.php:447
3725
  #: adminpages/paymentsettings.php:449
3726
  msgid "abbreviation, e.g. \"PA\""
3727
  msgstr ""
3728
 
3729
- #: adminpages/paymentsettings.php:210 adminpages/paymentsettings.php:193
3730
  #: adminpages/paymentsettings.php:210
3731
  msgid "Tax Rate"
3732
  msgstr ""
3733
 
3734
- #: adminpages/paymentsettings.php:211 adminpages/paymentsettings.php:194
3735
  #: adminpages/paymentsettings.php:211 adminpages/paymentsettings.php:404
3736
  #: adminpages/paymentsettings.php:444 adminpages/paymentsettings.php:449
3737
  #: adminpages/paymentsettings.php:451
3738
  msgid "decimal, e.g. \"0.06\""
3739
  msgstr ""
3740
 
3741
- #: adminpages/paymentsettings.php:212 adminpages/paymentsettings.php:212
3742
  msgid ""
3743
  "US only. If values are given, tax will be applied for any members ordering "
3744
  "from the selected state.<br />For non-US or more complex tax rules, use the "
@@ -3748,41 +3817,41 @@ msgid ""
3748
  "\">pmpro_tax filter</a>."
3749
  msgstr ""
3750
 
3751
- #: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:206
3752
  #: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:450
3753
  #: adminpages/paymentsettings.php:455 adminpages/paymentsettings.php:457
3754
  msgid "Force SSL"
3755
  msgstr ""
3756
 
3757
- #: adminpages/paymentsettings.php:230 adminpages/paymentsettings.php:213
3758
  #: adminpages/paymentsettings.php:230
3759
  msgid ""
3760
  "Your Site URL starts with https:// and so PMPro will allow your entire site "
3761
  "to be served over HTTPS."
3762
  msgstr ""
3763
 
3764
- #: adminpages/paymentsettings.php:238 adminpages/paymentsettings.php:212
3765
  #: adminpages/paymentsettings.php:221 adminpages/paymentsettings.php:238
3766
  #: adminpages/paymentsettings.php:456 adminpages/paymentsettings.php:461
3767
  #: adminpages/paymentsettings.php:463
3768
  msgid "Yes (with JavaScript redirects)"
3769
  msgstr ""
3770
 
3771
- #: adminpages/paymentsettings.php:240 adminpages/paymentsettings.php:214
3772
  #: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:240
3773
  msgid ""
3774
  "Recommended: Yes. Try the JavaScript redirects setting if you are having "
3775
  "issues with infinite redirect loops."
3776
  msgstr ""
3777
 
3778
- #: adminpages/paymentsettings.php:248 adminpages/paymentsettings.php:219
3779
  #: adminpages/paymentsettings.php:231 adminpages/paymentsettings.php:248
3780
  #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:463
3781
  #: adminpages/paymentsettings.php:468 adminpages/paymentsettings.php:470
3782
  msgid "SSL Seal Code"
3783
  msgstr ""
3784
 
3785
- #: adminpages/paymentsettings.php:252 adminpages/paymentsettings.php:252
3786
  msgid ""
3787
  "Your <strong><a target=\"_blank\" href=\"http://www.paidmembershipspro.com/"
3788
  "documentation/initial-plugin-setup/ssl/?"
@@ -3792,12 +3861,12 @@ msgid ""
3792
  "can be pasted here."
3793
  msgstr ""
3794
 
3795
- #: adminpages/paymentsettings.php:257 adminpages/paymentsettings.php:228
3796
  #: adminpages/paymentsettings.php:240 adminpages/paymentsettings.php:257
3797
  msgid "Extra HTTPS URL Filter"
3798
  msgstr ""
3799
 
3800
- #: adminpages/paymentsettings.php:260 adminpages/paymentsettings.php:231
3801
  #: adminpages/paymentsettings.php:243 adminpages/paymentsettings.php:260
3802
  msgid ""
3803
  "Pass all generated HTML through a URL filter to add HTTPS to URLs used on "
@@ -4169,7 +4238,8 @@ msgstr ""
4169
  #: adminpages/templates/orders-print.php:85 pages/confirmation.php:91
4170
  #: pages/invoice.php:74 adminpages/templates/orders-email.php:56
4171
  #: adminpages/templates/orders-print.php:85 pages/confirmation.php:91
4172
- #: pages/invoice.php:73 pages/invoice.php:77 pages/invoice.php:79
 
4173
  msgid "Subtotal"
4174
  msgstr ""
4175
 
@@ -4239,7 +4309,7 @@ msgstr ""
4239
  msgid "An Email From %s"
4240
  msgstr ""
4241
 
4242
- #: classes/class.pmproemail.php:143 classes/class.pmproemail.php:120
4243
  #: classes/class.pmproemail.php:122 classes/class.pmproemail.php:125
4244
  #: classes/class.pmproemail.php:134 classes/class.pmproemail.php:136
4245
  #: classes/class.pmproemail.php:143
@@ -4247,7 +4317,7 @@ msgstr ""
4247
  msgid "Your membership at %s has been CANCELLED"
4248
  msgstr ""
4249
 
4250
- #: classes/class.pmproemail.php:176 classes/class.pmproemail.php:142
4251
  #: classes/class.pmproemail.php:144 classes/class.pmproemail.php:147
4252
  #: classes/class.pmproemail.php:156 classes/class.pmproemail.php:166
4253
  #: classes/class.pmproemail.php:169 classes/class.pmproemail.php:176
@@ -4255,7 +4325,7 @@ msgstr ""
4255
  msgid "Membership for %s at %s has been CANCELLED"
4256
  msgstr ""
4257
 
4258
- #: classes/class.pmproemail.php:226 classes/class.pmproemail.php:172
4259
  #: classes/class.pmproemail.php:173 classes/class.pmproemail.php:175
4260
  #: classes/class.pmproemail.php:178 classes/class.pmproemail.php:187
4261
  #: classes/class.pmproemail.php:207 classes/class.pmproemail.php:212
@@ -4264,149 +4334,156 @@ msgstr ""
4264
  msgid "Your membership confirmation for %s"
4265
  msgstr ""
4266
 
4267
- #: classes/class.pmproemail.php:310 classes/class.pmproemail.php:406
4268
- #: classes/class.pmproemail.php:721 classes/class.pmproemail.php:241
4269
  #: classes/class.pmproemail.php:243 classes/class.pmproemail.php:253
4270
  #: classes/class.pmproemail.php:256 classes/class.pmproemail.php:265
4271
  #: classes/class.pmproemail.php:285 classes/class.pmproemail.php:294
4272
  #: classes/class.pmproemail.php:301 classes/class.pmproemail.php:309
4273
- #: classes/class.pmproemail.php:325 classes/class.pmproemail.php:328
4274
- #: classes/class.pmproemail.php:346 classes/class.pmproemail.php:349
4275
- #: classes/class.pmproemail.php:358 classes/class.pmproemail.php:378
4276
- #: classes/class.pmproemail.php:390 classes/class.pmproemail.php:397
4277
- #: classes/class.pmproemail.php:405 classes/class.pmproemail.php:538
 
4278
  #: classes/class.pmproemail.php:586 classes/class.pmproemail.php:651
4279
  #: classes/class.pmproemail.php:654 classes/class.pmproemail.php:663
4280
  #: classes/class.pmproemail.php:665 classes/class.pmproemail.php:685
4281
  #: classes/class.pmproemail.php:705 classes/class.pmproemail.php:712
4282
- #: classes/class.pmproemail.php:720
4283
  #, php-format
4284
  msgid "This membership will expire on %s."
4285
  msgstr ""
4286
 
4287
- #: classes/class.pmproemail.php:332 classes/class.pmproemail.php:263
4288
  #: classes/class.pmproemail.php:265 classes/class.pmproemail.php:275
4289
  #: classes/class.pmproemail.php:278 classes/class.pmproemail.php:287
4290
  #: classes/class.pmproemail.php:307 classes/class.pmproemail.php:316
4291
  #: classes/class.pmproemail.php:323 classes/class.pmproemail.php:331
 
4292
  #, php-format
4293
  msgid "Member Checkout for %s at %s"
4294
  msgstr ""
4295
 
4296
- #: classes/class.pmproemail.php:423 classes/class.pmproemail.php:375
4297
  #: classes/class.pmproemail.php:395 classes/class.pmproemail.php:407
4298
  #: classes/class.pmproemail.php:414 classes/class.pmproemail.php:422
 
4299
  #, php-format
4300
  msgid "Your billing information has been updated at %s"
4301
  msgstr ""
4302
 
4303
- #: classes/class.pmproemail.php:477 classes/class.pmproemail.php:428
4304
  #: classes/class.pmproemail.php:448 classes/class.pmproemail.php:461
4305
  #: classes/class.pmproemail.php:468 classes/class.pmproemail.php:476
 
4306
  #, php-format
4307
  msgid "Billing information has been updated for %s at %s"
4308
  msgstr ""
4309
 
4310
- #: classes/class.pmproemail.php:526 classes/class.pmproemail.php:425
4311
  #: classes/class.pmproemail.php:430 classes/class.pmproemail.php:464
4312
  #: classes/class.pmproemail.php:467 classes/class.pmproemail.php:476
4313
  #: classes/class.pmproemail.php:496 classes/class.pmproemail.php:510
4314
  #: classes/class.pmproemail.php:517 classes/class.pmproemail.php:525
 
4315
  #, php-format
4316
  msgid "Membership Payment Failed at %s"
4317
  msgstr ""
4318
 
4319
- #: classes/class.pmproemail.php:573 classes/class.pmproemail.php:462
4320
  #: classes/class.pmproemail.php:468 classes/class.pmproemail.php:510
4321
  #: classes/class.pmproemail.php:513 classes/class.pmproemail.php:522
4322
  #: classes/class.pmproemail.php:542 classes/class.pmproemail.php:557
4323
  #: classes/class.pmproemail.php:564 classes/class.pmproemail.php:572
 
4324
  #, php-format
4325
  msgid "Membership Payment Failed For %s at %s"
4326
  msgstr ""
4327
 
4328
- #: classes/class.pmproemail.php:621 classes/class.pmproemail.php:508
4329
  #: classes/class.pmproemail.php:557 classes/class.pmproemail.php:560
4330
  #: classes/class.pmproemail.php:569 classes/class.pmproemail.php:589
4331
  #: classes/class.pmproemail.php:605 classes/class.pmproemail.php:612
4332
- #: classes/class.pmproemail.php:620
4333
  #, php-format
4334
  msgid "Credit Card on File Expiring Soon at %s"
4335
  msgstr ""
4336
 
4337
- #: classes/class.pmproemail.php:672 classes/class.pmproemail.php:501
4338
  #: classes/class.pmproemail.php:548 classes/class.pmproemail.php:605
4339
  #: classes/class.pmproemail.php:608 classes/class.pmproemail.php:617
4340
  #: classes/class.pmproemail.php:619 classes/class.pmproemail.php:639
4341
  #: classes/class.pmproemail.php:656 classes/class.pmproemail.php:663
4342
- #: classes/class.pmproemail.php:671
4343
  #, php-format
4344
  msgid "INVOICE for %s membership"
4345
  msgstr ""
4346
 
4347
- #: classes/class.pmproemail.php:749 classes/class.pmproemail.php:563
4348
  #: classes/class.pmproemail.php:611 classes/class.pmproemail.php:676
4349
  #: classes/class.pmproemail.php:679 classes/class.pmproemail.php:688
4350
  #: classes/class.pmproemail.php:690 classes/class.pmproemail.php:710
4351
  #: classes/class.pmproemail.php:733 classes/class.pmproemail.php:740
4352
- #: classes/class.pmproemail.php:748
4353
  #, php-format
4354
  msgid "Your trial at %s is ending soon"
4355
  msgstr ""
4356
 
4357
- #: classes/class.pmproemail.php:785 classes/class.pmproemail.php:596
4358
  #: classes/class.pmproemail.php:645 classes/class.pmproemail.php:710
4359
  #: classes/class.pmproemail.php:713 classes/class.pmproemail.php:722
4360
  #: classes/class.pmproemail.php:724 classes/class.pmproemail.php:744
4361
  #: classes/class.pmproemail.php:769 classes/class.pmproemail.php:776
4362
- #: classes/class.pmproemail.php:784
4363
  #, php-format
4364
  msgid "Your membership at %s has ended"
4365
  msgstr ""
4366
 
4367
- #: classes/class.pmproemail.php:812 classes/class.pmproemail.php:621
4368
  #: classes/class.pmproemail.php:670 classes/class.pmproemail.php:735
4369
  #: classes/class.pmproemail.php:738 classes/class.pmproemail.php:747
4370
  #: classes/class.pmproemail.php:749 classes/class.pmproemail.php:769
4371
  #: classes/class.pmproemail.php:796 classes/class.pmproemail.php:803
4372
- #: classes/class.pmproemail.php:811
4373
  #, php-format
4374
  msgid "Your membership at %s will end soon"
4375
  msgstr ""
4376
 
4377
- #: classes/class.pmproemail.php:834 classes/class.pmproemail.php:641
4378
  #: classes/class.pmproemail.php:690 classes/class.pmproemail.php:755
4379
  #: classes/class.pmproemail.php:758 classes/class.pmproemail.php:767
4380
  #: classes/class.pmproemail.php:769 classes/class.pmproemail.php:789
4381
  #: classes/class.pmproemail.php:818 classes/class.pmproemail.php:825
4382
- #: classes/class.pmproemail.php:833
4383
  #, php-format
4384
  msgid "Your membership at %s has been changed"
4385
  msgstr ""
4386
 
4387
- #: classes/class.pmproemail.php:839 classes/class.pmproemail.php:886
4388
  #: classes/class.pmproemail.php:759 classes/class.pmproemail.php:762
4389
  #: classes/class.pmproemail.php:771 classes/class.pmproemail.php:773
4390
  #: classes/class.pmproemail.php:793 classes/class.pmproemail.php:800
4391
  #: classes/class.pmproemail.php:809 classes/class.pmproemail.php:810
4392
  #: classes/class.pmproemail.php:811 classes/class.pmproemail.php:823
4393
  #: classes/class.pmproemail.php:830 classes/class.pmproemail.php:838
4394
- #: classes/class.pmproemail.php:863 classes/class.pmproemail.php:870
4395
- #: classes/class.pmproemail.php:877 classes/class.pmproemail.php:885
 
4396
  #, php-format
4397
  msgid "The new level is %s"
4398
  msgstr ""
4399
 
4400
- #: classes/class.pmproemail.php:841 classes/class.pmproemail.php:647
4401
  #: classes/class.pmproemail.php:696 classes/class.pmproemail.php:761
4402
  #: classes/class.pmproemail.php:764 classes/class.pmproemail.php:773
4403
  #: classes/class.pmproemail.php:775 classes/class.pmproemail.php:795
4404
  #: classes/class.pmproemail.php:825 classes/class.pmproemail.php:832
4405
- #: classes/class.pmproemail.php:840
4406
  msgid "Your membership has been cancelled"
4407
  msgstr ""
4408
 
4409
- #: classes/class.pmproemail.php:845 classes/class.pmproemail.php:893
4410
  #: classes/class.pmproemail.php:651 classes/class.pmproemail.php:689
4411
  #: classes/class.pmproemail.php:700 classes/class.pmproemail.php:738
4412
  #: classes/class.pmproemail.php:765 classes/class.pmproemail.php:768
@@ -4416,13 +4493,14 @@ msgstr ""
4416
  #: classes/class.pmproemail.php:815 classes/class.pmproemail.php:816
4417
  #: classes/class.pmproemail.php:817 classes/class.pmproemail.php:829
4418
  #: classes/class.pmproemail.php:836 classes/class.pmproemail.php:844
4419
- #: classes/class.pmproemail.php:869 classes/class.pmproemail.php:876
4420
- #: classes/class.pmproemail.php:884 classes/class.pmproemail.php:892
 
4421
  #, php-format
4422
  msgid "This membership will expire on %s"
4423
  msgstr ""
4424
 
4425
- #: classes/class.pmproemail.php:849 classes/class.pmproemail.php:897
4426
  #: classes/class.pmproemail.php:655 classes/class.pmproemail.php:693
4427
  #: classes/class.pmproemail.php:704 classes/class.pmproemail.php:742
4428
  #: classes/class.pmproemail.php:769 classes/class.pmproemail.php:772
@@ -4432,42 +4510,53 @@ msgstr ""
4432
  #: classes/class.pmproemail.php:819 classes/class.pmproemail.php:820
4433
  #: classes/class.pmproemail.php:821 classes/class.pmproemail.php:833
4434
  #: classes/class.pmproemail.php:840 classes/class.pmproemail.php:848
4435
- #: classes/class.pmproemail.php:873 classes/class.pmproemail.php:880
4436
- #: classes/class.pmproemail.php:888 classes/class.pmproemail.php:896
 
4437
  msgid "This membership does not expire"
4438
  msgstr ""
4439
 
4440
- #: classes/class.pmproemail.php:881 classes/class.pmproemail.php:679
4441
  #: classes/class.pmproemail.php:728 classes/class.pmproemail.php:793
4442
  #: classes/class.pmproemail.php:796 classes/class.pmproemail.php:805
4443
  #: classes/class.pmproemail.php:806 classes/class.pmproemail.php:807
4444
  #: classes/class.pmproemail.php:826 classes/class.pmproemail.php:859
4445
  #: classes/class.pmproemail.php:866 classes/class.pmproemail.php:872
4446
- #: classes/class.pmproemail.php:880
4447
  #, php-format
4448
  msgid "Membership for %s at %s has been changed"
4449
  msgstr ""
4450
 
4451
- #: classes/class.pmproemail.php:888 classes/class.pmproemail.php:799
4452
  #: classes/class.pmproemail.php:802 classes/class.pmproemail.php:811
4453
  #: classes/class.pmproemail.php:812 classes/class.pmproemail.php:813
4454
  #: classes/class.pmproemail.php:832 classes/class.pmproemail.php:865
4455
  #: classes/class.pmproemail.php:872 classes/class.pmproemail.php:879
4456
- #: classes/class.pmproemail.php:887
4457
  msgid "Membership has been cancelled"
4458
  msgstr ""
4459
 
4460
- #: classes/class.pmproemail.php:928 classes/class.pmproemail.php:848
4461
  #: classes/class.pmproemail.php:849 classes/class.pmproemail.php:850
4462
  #: classes/class.pmproemail.php:869 classes/class.pmproemail.php:904
4463
  #: classes/class.pmproemail.php:911 classes/class.pmproemail.php:919
4464
- #: classes/class.pmproemail.php:927
4465
  msgid "Invoice for Order #: "
4466
  msgstr ""
4467
 
4468
- #: classes/class.pmproemail.php:972 classes/class.pmproemail.php:948
 
 
 
 
 
 
 
 
 
 
4469
  #: classes/class.pmproemail.php:955 classes/class.pmproemail.php:963
4470
- #: classes/class.pmproemail.php:971
4471
  msgid ""
4472
  "<p>An administrator at !!sitename!! has changed your membership level.</p>\n"
4473
  "\n"
@@ -4482,9 +4571,9 @@ msgstr ""
4482
  #: classes/gateways/class.pmprogateway.php:55
4483
  #: classes/gateways/class.pmprogateway_authorizenet.php:171
4484
  #: classes/gateways/class.pmprogateway_check.php:210
4485
- #: classes/gateways/class.pmprogateway_cybersource.php:171
4486
  #: classes/gateways/class.pmprogateway_payflowpro.php:164
4487
- #: classes/gateways/class.pmprogateway_paypal.php:272
4488
  #: classes/gateways/class.pmprogateway.php:55
4489
  #: classes/gateways/class.pmprogateway_authorizenet.php:55
4490
  #: classes/gateways/class.pmprogateway_authorizenet.php:171
@@ -4511,12 +4600,12 @@ msgstr ""
4511
  #: classes/gateways/class.pmprogateway_check.php:262
4512
  #: classes/gateways/class.pmprogateway_check.php:267
4513
  #: classes/gateways/class.pmprogateway_check.php:285
4514
- #: classes/gateways/class.pmprogateway_cybersource.php:222
4515
- #: classes/gateways/class.pmprogateway_cybersource.php:227
4516
- #: classes/gateways/class.pmprogateway_cybersource.php:245
4517
  #: classes/gateways/class.pmprogateway_payflowpro.php:187
4518
  #: classes/gateways/class.pmprogateway_payflowpro.php:192
4519
- #: classes/gateways/class.pmprogateway_paypal.php:295
4520
  #: classes/gateways/class.pmprogateway.php:106
4521
  #: classes/gateways/class.pmprogateway.php:111
4522
  #: classes/gateways/class.pmprogateway.php:129
@@ -4557,7 +4646,7 @@ msgstr ""
4557
  #: classes/gateways/class.pmprogateway.php:113
4558
  #: classes/gateways/class.pmprogateway_authorizenet.php:228
4559
  #: classes/gateways/class.pmprogateway_check.php:269
4560
- #: classes/gateways/class.pmprogateway_cybersource.php:229
4561
  #: classes/gateways/class.pmprogateway.php:113
4562
  #: classes/gateways/class.pmprogateway_authorizenet.php:112
4563
  #: classes/gateways/class.pmprogateway_authorizenet.php:228
@@ -4573,7 +4662,7 @@ msgid ""
4573
  msgstr ""
4574
 
4575
  #: classes/gateways/class.pmprogateway_authorizenet.php:39
4576
- #: paid-memberships-pro.php:152
4577
  #: classes/gateways/class.pmprogateway_authorizenet.php:39
4578
  #: paid-memberships-pro.php:122 paid-memberships-pro.php:123
4579
  #: paid-memberships-pro.php:130 paid-memberships-pro.php:131
@@ -4581,6 +4670,7 @@ msgstr ""
4581
  #: paid-memberships-pro.php:134 paid-memberships-pro.php:135
4582
  #: paid-memberships-pro.php:136 paid-memberships-pro.php:137
4583
  #: paid-memberships-pro.php:142 paid-memberships-pro.php:147
 
4584
  msgid "Authorize.net"
4585
  msgstr ""
4586
 
@@ -4639,7 +4729,7 @@ msgid "Attempting to load Braintree gateway: %s"
4639
  msgstr ""
4640
 
4641
  #: classes/gateways/class.pmprogateway_braintree.php:87
4642
- #: classes/gateways/class.pmprogateway_stripe.php:81
4643
  #: classes/gateways/class.pmprogateway_braintree.php:49
4644
  #: classes/gateways/class.pmprogateway_braintree.php:62
4645
  #: classes/gateways/class.pmprogateway_braintree.php:84
@@ -4670,8 +4760,8 @@ msgid ""
4670
  "Settings (Keys, etc)."
4671
  msgstr ""
4672
 
4673
- #: classes/gateways/class.pmprogateway_braintree.php:247
4674
- #: paid-memberships-pro.php:153
4675
  #: classes/gateways/class.pmprogateway_braintree.php:63
4676
  #: classes/gateways/class.pmprogateway_braintree.php:76
4677
  #: classes/gateways/class.pmprogateway_braintree.php:77
@@ -4687,10 +4777,11 @@ msgstr ""
4687
  #: paid-memberships-pro.php:135 paid-memberships-pro.php:136
4688
  #: paid-memberships-pro.php:137 paid-memberships-pro.php:138
4689
  #: paid-memberships-pro.php:143 paid-memberships-pro.php:148
 
4690
  msgid "Braintree Payments"
4691
  msgstr ""
4692
 
4693
- #: classes/gateways/class.pmprogateway_braintree.php:303
4694
  #: classes/gateways/class.pmprogateway_braintree.php:119
4695
  #: classes/gateways/class.pmprogateway_braintree.php:132
4696
  #: classes/gateways/class.pmprogateway_braintree.php:133
@@ -4703,8 +4794,8 @@ msgstr ""
4703
  msgid "Braintree Settings"
4704
  msgstr ""
4705
 
4706
- #: classes/gateways/class.pmprogateway_braintree.php:308
4707
- #: classes/gateways/class.pmprogateway_cybersource.php:106
4708
  #: adminpages/paymentsettings.php:294 adminpages/paymentsettings.php:298
4709
  #: adminpages/paymentsettings.php:303 adminpages/paymentsettings.php:364
4710
  #: adminpages/paymentsettings.php:369
@@ -4721,7 +4812,7 @@ msgstr ""
4721
  msgid "Merchant ID"
4722
  msgstr ""
4723
 
4724
- #: classes/gateways/class.pmprogateway_braintree.php:316
4725
  #: adminpages/paymentsettings.php:302 adminpages/paymentsettings.php:306
4726
  #: adminpages/paymentsettings.php:311
4727
  #: classes/gateways/class.pmprogateway_braintree.php:132
@@ -4736,7 +4827,7 @@ msgstr ""
4736
  msgid "Public Key"
4737
  msgstr ""
4738
 
4739
- #: classes/gateways/class.pmprogateway_braintree.php:324
4740
  #: adminpages/paymentsettings.php:310 adminpages/paymentsettings.php:314
4741
  #: adminpages/paymentsettings.php:319
4742
  #: classes/gateways/class.pmprogateway_braintree.php:140
@@ -4751,7 +4842,7 @@ msgstr ""
4751
  msgid "Private Key"
4752
  msgstr ""
4753
 
4754
- #: classes/gateways/class.pmprogateway_braintree.php:332
4755
  #: adminpages/paymentsettings.php:318 adminpages/paymentsettings.php:322
4756
  #: adminpages/paymentsettings.php:327
4757
  #: classes/gateways/class.pmprogateway_braintree.php:148
@@ -4766,8 +4857,8 @@ msgstr ""
4766
  msgid "Client-Side Encryption Key"
4767
  msgstr ""
4768
 
4769
- #: classes/gateways/class.pmprogateway_braintree.php:340
4770
- #: classes/gateways/class.pmprogateway_stripe.php:291
4771
  #: adminpages/paymentsettings.php:462 adminpages/paymentsettings.php:470
4772
  #: adminpages/paymentsettings.php:503 adminpages/paymentsettings.php:509
4773
  #: adminpages/paymentsettings.php:511 adminpages/paymentsettings.php:517
@@ -4791,6 +4882,7 @@ msgstr ""
4791
  #: classes/gateways/class.pmprogateway_stripe.php:230
4792
  #: classes/gateways/class.pmprogateway_stripe.php:257
4793
  #: classes/gateways/class.pmprogateway_stripe.php:289
 
4794
  #: classes/gateways/class.pmprogateway_stripe.php:297
4795
  #: classes/gateways/class.pmprogateway_stripe.php:299
4796
  #: classes/gateways/class.pmprogateway_stripe.php:305
@@ -4798,7 +4890,7 @@ msgstr ""
4798
  msgid "Web Hook URL"
4799
  msgstr ""
4800
 
4801
- #: classes/gateways/class.pmprogateway_braintree.php:344
4802
  #: adminpages/paymentsettings.php:474 adminpages/paymentsettings.php:515
4803
  #: adminpages/paymentsettings.php:521 adminpages/paymentsettings.php:523
4804
  #: classes/gateways/class.pmprogateway_braintree.php:160
@@ -4813,8 +4905,8 @@ msgstr ""
4813
  msgid "To fully integrate with Braintree, be sure to set your Web Hook URL to"
4814
  msgstr ""
4815
 
4816
- #: classes/gateways/class.pmprogateway_braintree.php:461
4817
- #: classes/gateways/class.pmprogateway_stripe.php:546 pages/checkout.php:419
4818
  #: classes/gateways/class.pmprogateway_braintree.php:270
4819
  #: classes/gateways/class.pmprogateway_braintree.php:283
4820
  #: classes/gateways/class.pmprogateway_braintree.php:285
@@ -4839,6 +4931,7 @@ msgstr ""
4839
  #: classes/gateways/class.pmprogateway_stripe.php:461
4840
  #: classes/gateways/class.pmprogateway_stripe.php:499
4841
  #: classes/gateways/class.pmprogateway_stripe.php:526
 
4842
  #: classes/gateways/class.pmprogateway_stripe.php:561
4843
  #: classes/gateways/class.pmprogateway_stripe.php:569
4844
  #: classes/gateways/class.pmprogateway_stripe.php:576
@@ -4851,8 +4944,8 @@ msgstr ""
4851
  msgid "Payment Information"
4852
  msgstr ""
4853
 
4854
- #: classes/gateways/class.pmprogateway_braintree.php:462
4855
- #: classes/gateways/class.pmprogateway_stripe.php:547 pages/checkout.php:420
4856
  #: classes/gateways/class.pmprogateway_braintree.php:270
4857
  #: classes/gateways/class.pmprogateway_braintree.php:283
4858
  #: classes/gateways/class.pmprogateway_braintree.php:285
@@ -4877,6 +4970,7 @@ msgstr ""
4877
  #: classes/gateways/class.pmprogateway_stripe.php:462
4878
  #: classes/gateways/class.pmprogateway_stripe.php:500
4879
  #: classes/gateways/class.pmprogateway_stripe.php:527
 
4880
  #: classes/gateways/class.pmprogateway_stripe.php:562
4881
  #: classes/gateways/class.pmprogateway_stripe.php:570
4882
  #: classes/gateways/class.pmprogateway_stripe.php:577
@@ -4890,9 +4984,9 @@ msgstr ""
4890
  msgid "We Accept %s"
4891
  msgstr ""
4892
 
4893
- #: classes/gateways/class.pmprogateway_braintree.php:482
4894
- #: classes/gateways/class.pmprogateway_stripe.php:594 pages/billing.php:309
4895
- #: pages/checkout.php:467 classes/gateways/class.pmprogateway_braintree.php:303
4896
  #: classes/gateways/class.pmprogateway_braintree.php:316
4897
  #: classes/gateways/class.pmprogateway_braintree.php:318
4898
  #: classes/gateways/class.pmprogateway_braintree.php:321
@@ -4915,6 +5009,7 @@ msgstr ""
4915
  #: classes/gateways/class.pmprogateway_stripe.php:527
4916
  #: classes/gateways/class.pmprogateway_stripe.php:565
4917
  #: classes/gateways/class.pmprogateway_stripe.php:592
 
4918
  #: classes/gateways/class.pmprogateway_stripe.php:609
4919
  #: classes/gateways/class.pmprogateway_stripe.php:617
4920
  #: classes/gateways/class.pmprogateway_stripe.php:624
@@ -4931,7 +5026,7 @@ msgstr ""
4931
  msgid "Card Number"
4932
  msgstr ""
4933
 
4934
- #: classes/gateways/class.pmprogateway_braintree.php:510 pages/billing.php:348
4935
  #: classes/gateways/class.pmprogateway_braintree.php:340
4936
  #: classes/gateways/class.pmprogateway_braintree.php:353
4937
  #: classes/gateways/class.pmprogateway_braintree.php:355
@@ -4966,9 +5061,8 @@ msgstr ""
4966
  msgid "CVV"
4967
  msgstr ""
4968
 
4969
- #: classes/gateways/class.pmprogateway_braintree.php:511
4970
- #: classes/gateways/class.pmprogateway_stripe.php:624 pages/billing.php:349
4971
- #: pages/checkout.php:501 classes/gateways/class.pmprogateway_braintree.php:341
4972
  #: classes/gateways/class.pmprogateway_braintree.php:354
4973
  #: classes/gateways/class.pmprogateway_braintree.php:356
4974
  #: classes/gateways/class.pmprogateway_braintree.php:359
@@ -4990,6 +5084,7 @@ msgstr ""
4990
  #: classes/gateways/class.pmprogateway_stripe.php:554
4991
  #: classes/gateways/class.pmprogateway_stripe.php:565
4992
  #: classes/gateways/class.pmprogateway_stripe.php:603
 
4993
  #: classes/gateways/class.pmprogateway_stripe.php:630
4994
  #: classes/gateways/class.pmprogateway_stripe.php:639
4995
  #: classes/gateways/class.pmprogateway_stripe.php:647
@@ -5008,9 +5103,9 @@ msgstr ""
5008
  msgid "what's this?"
5009
  msgstr ""
5010
 
5011
- #: classes/gateways/class.pmprogateway_braintree.php:518
5012
- #: classes/gateways/class.pmprogateway_stripe.php:631 pages/checkout.php:83
5013
- #: pages/checkout.php:508 classes/gateways/class.pmprogateway_braintree.php:351
5014
  #: classes/gateways/class.pmprogateway_braintree.php:364
5015
  #: classes/gateways/class.pmprogateway_braintree.php:366
5016
  #: classes/gateways/class.pmprogateway_braintree.php:369
@@ -5033,6 +5128,7 @@ msgstr ""
5033
  #: classes/gateways/class.pmprogateway_stripe.php:564
5034
  #: classes/gateways/class.pmprogateway_stripe.php:575
5035
  #: classes/gateways/class.pmprogateway_stripe.php:613
 
5036
  #: classes/gateways/class.pmprogateway_stripe.php:640
5037
  #: classes/gateways/class.pmprogateway_stripe.php:646
5038
  #: classes/gateways/class.pmprogateway_stripe.php:654
@@ -5049,12 +5145,12 @@ msgstr ""
5049
  msgid "Apply"
5050
  msgstr ""
5051
 
5052
- #: classes/gateways/class.pmprogateway_braintree.php:577
5053
- #: classes/gateways/class.pmprogateway_braintree.php:594
5054
- #: classes/gateways/class.pmprogateway_braintree.php:684
5055
- #: classes/gateways/class.pmprogateway_braintree.php:856
5056
- #: classes/gateways/class.pmprogateway_braintree.php:964
5057
- #: classes/gateways/class.pmprogateway_braintree.php:991
5058
  #: classes/gateways/class.pmprogateway_braintree.php:509
5059
  #: classes/gateways/class.pmprogateway_braintree.php:524
5060
  #: classes/gateways/class.pmprogateway_braintree.php:526
@@ -5088,8 +5184,7 @@ msgstr ""
5088
  msgid "Payment error: Please contact the webmaster (braintree-load-error)"
5089
  msgstr ""
5090
 
5091
- #: classes/gateways/class.pmprogateway_braintree.php:581
5092
- #: classes/gateways/class.pmprogateway_stripe.php:1094
5093
  #: classes/gateways/class.pmprogateway_braintree.php:61
5094
  #: classes/gateways/class.pmprogateway_braintree.php:406
5095
  #: classes/gateways/class.pmprogateway_braintree.php:419
@@ -5126,7 +5221,7 @@ msgstr ""
5126
  msgid "Unknown error: Initial payment failed."
5127
  msgstr ""
5128
 
5129
- #: classes/gateways/class.pmprogateway_braintree.php:657
5130
  #: classes/gateways/class.pmprogateway_braintree.php:120
5131
  #: classes/gateways/class.pmprogateway_braintree.php:465
5132
  #: classes/gateways/class.pmprogateway_braintree.php:478
@@ -5143,7 +5238,7 @@ msgstr ""
5143
  msgid "Error during settlement:"
5144
  msgstr ""
5145
 
5146
- #: classes/gateways/class.pmprogateway_braintree.php:666
5147
  #: classes/gateways/class.pmprogateway_braintree.php:129
5148
  #: classes/gateways/class.pmprogateway_braintree.php:474
5149
  #: classes/gateways/class.pmprogateway_braintree.php:487
@@ -5160,7 +5255,7 @@ msgstr ""
5160
  msgid "Error during charge:"
5161
  msgstr ""
5162
 
5163
- #: classes/gateways/class.pmprogateway_braintree.php:758
5164
  #: classes/gateways/class.pmprogateway_braintree.php:690
5165
  #: classes/gateways/class.pmprogateway_braintree.php:731
5166
  #: classes/gateways/class.pmprogateway_braintree.php:757
@@ -5169,7 +5264,7 @@ msgstr ""
5169
  msgid "Failed to update customer: %s"
5170
  msgstr ""
5171
 
5172
- #: classes/gateways/class.pmprogateway_braintree.php:770
5173
  #: classes/gateways/class.pmprogateway_braintree.php:198
5174
  #: classes/gateways/class.pmprogateway_braintree.php:221
5175
  #: classes/gateways/class.pmprogateway_braintree.php:566
@@ -5187,7 +5282,7 @@ msgstr ""
5187
  msgid "Failed to update customer."
5188
  msgstr ""
5189
 
5190
- #: classes/gateways/class.pmprogateway_braintree.php:818
5191
  #: classes/gateways/class.pmprogateway_braintree.php:246
5192
  #: classes/gateways/class.pmprogateway_braintree.php:269
5193
  #: classes/gateways/class.pmprogateway_braintree.php:614
@@ -5205,7 +5300,7 @@ msgstr ""
5205
  msgid "Failed to create customer."
5206
  msgstr ""
5207
 
5208
- #: classes/gateways/class.pmprogateway_braintree.php:825
5209
  #: classes/gateways/class.pmprogateway_braintree.php:253
5210
  #: classes/gateways/class.pmprogateway_braintree.php:276
5211
  #: classes/gateways/class.pmprogateway_braintree.php:621
@@ -5223,27 +5318,27 @@ msgstr ""
5223
  msgid "Error creating customer record with Braintree:"
5224
  msgstr ""
5225
 
5226
- #: classes/gateways/class.pmprogateway_braintree.php:940
5227
  #: classes/gateways/class.pmprogateway_braintree.php:940
5228
  #, php-format
5229
  msgid "Error subscribing customer to plan with Braintree: %s (%s)"
5230
  msgstr ""
5231
 
5232
- #: classes/gateways/class.pmprogateway_braintree.php:955
5233
  #: classes/gateways/class.pmprogateway_braintree.php:955
5234
  #, php-format
5235
  msgid "Failed to subscribe with Braintree: %s"
5236
  msgstr ""
5237
 
5238
- #: classes/gateways/class.pmprogateway_braintree.php:1026
5239
- #: classes/gateways/class.pmprogateway_braintree.php:1037
5240
  #: classes/gateways/class.pmprogateway_braintree.php:1026
5241
  #: classes/gateways/class.pmprogateway_braintree.php:1037
5242
  #, php-format
5243
  msgid "Could not find the subscription. %s"
5244
  msgstr ""
5245
 
5246
- #: classes/gateways/class.pmprogateway_braintree.php:1044
5247
  #: classes/gateways/class.pmprogateway_braintree.php:397
5248
  #: classes/gateways/class.pmprogateway_braintree.php:398
5249
  #: classes/gateways/class.pmprogateway_braintree.php:410
@@ -5298,69 +5393,367 @@ msgstr ""
5298
  msgid "Could not find the subscription."
5299
  msgstr ""
5300
 
5301
- #: classes/gateways/class.pmprogateway_check.php:49
5302
- #: paid-memberships-pro.php:146 adminpages/orders.php:399
5303
- #: adminpages/orders.php:449 adminpages/paymentsettings.php:157
5304
- #: adminpages/paymentsettings.php:159
5305
- #: classes/gateways/class.pmprogateway_check.php:48
5306
- #: classes/gateways/class.pmprogateway_check.php:49
5307
- #: paid-memberships-pro.php:116 paid-memberships-pro.php:117
5308
- #: paid-memberships-pro.php:124 paid-memberships-pro.php:125
5309
- #: paid-memberships-pro.php:126 paid-memberships-pro.php:127
5310
- #: paid-memberships-pro.php:128 paid-memberships-pro.php:129
5311
- #: paid-memberships-pro.php:130 paid-memberships-pro.php:131
5312
- #: paid-memberships-pro.php:136 paid-memberships-pro.php:141
5313
- msgid "Pay by Check"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5314
  msgstr ""
5315
 
5316
- #: classes/gateways/class.pmprogateway_check.php:101
5317
- #: classes/gateways/class.pmprogateway_check.php:100
5318
- #: classes/gateways/class.pmprogateway_check.php:101
5319
- msgid "Pay by Check Settings"
5320
  msgstr ""
5321
 
5322
- #: classes/gateways/class.pmprogateway_check.php:106
5323
- #: adminpages/paymentsettings.php:389 adminpages/paymentsettings.php:415
5324
- #: adminpages/paymentsettings.php:420 adminpages/paymentsettings.php:422
5325
- #: classes/gateways/class.pmprogateway_check.php:105
5326
- #: classes/gateways/class.pmprogateway_check.php:106
5327
- msgid "Instructions"
5328
  msgstr ""
5329
 
5330
- #: classes/gateways/class.pmprogateway_check.php:110
5331
- #: adminpages/paymentsettings.php:393 adminpages/paymentsettings.php:419
5332
- #: adminpages/paymentsettings.php:424 adminpages/paymentsettings.php:426
5333
- #: classes/gateways/class.pmprogateway_check.php:109
5334
- #: classes/gateways/class.pmprogateway_check.php:110
5335
  msgid ""
5336
- "Who to write the check out to. Where to mail it. Shown on checkout, "
5337
- "confirmation, and invoice pages."
5338
  msgstr ""
5339
 
5340
- #: classes/gateways/class.pmprogateway_cybersource.php:42
5341
- #: classes/gateways/class.pmprogateway_cybersource.php:42
5342
- msgid "CyberSource"
 
5343
  msgstr ""
5344
 
5345
- #: classes/gateways/class.pmprogateway_cybersource.php:96
5346
- #: classes/gateways/class.pmprogateway_cybersource.php:96
5347
- msgid "CyberSource Settings"
5348
  msgstr ""
5349
 
5350
- #: classes/gateways/class.pmprogateway_cybersource.php:101
5351
- #: adminpages/paymentsettings.php:174
5352
- #: classes/gateways/class.pmprogateway_cybersource.php:101
5353
  msgid ""
5354
- "This gateway option is in beta. Some functionality may not be available. "
5355
- "Please contact Paid Memberships Pro with any issues you run into. "
5356
- "<strong>Please be sure to upgrade Paid Memberships Pro to the latest "
5357
- "versions when available.</strong>"
5358
  msgstr ""
5359
 
5360
- #: classes/gateways/class.pmprogateway_cybersource.php:114
5361
- #: adminpages/paymentsettings.php:372 adminpages/paymentsettings.php:377
5362
- #: classes/gateways/class.pmprogateway_cybersource.php:114
5363
- msgid "Transaction Security Key"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5364
  msgstr ""
5365
 
5366
  #: classes/gateways/class.pmprogateway_payflowpro.php:39
@@ -5388,7 +5781,7 @@ msgid "Vendor"
5388
  msgstr ""
5389
 
5390
  #: classes/gateways/class.pmprogateway_payflowpro.php:124
5391
- #: pages/checkout.php:184 adminpages/paymentsettings.php:219
5392
  #: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:228
5393
  #: classes/gateways/class.pmprogateway_payflowpro.php:124
5394
  #: pages/checkout.php:176 pages/checkout.php:177 pages/checkout.php:180
@@ -5412,7 +5805,7 @@ msgid ""
5412
  msgstr ""
5413
 
5414
  #: classes/gateways/class.pmprogateway_payflowpro.php:194
5415
- #: classes/gateways/class.pmprogateway_paypal.php:302
5416
  #: classes/gateways/class.pmprogateway_payflowpro.php:57
5417
  #: classes/gateways/class.pmprogateway_payflowpro.php:194
5418
  #: classes/gateways/class.pmprogateway_paypal.php:57
@@ -5425,7 +5818,7 @@ msgid ""
5425
  msgstr ""
5426
 
5427
  #: classes/gateways/class.pmprogateway_paypal.php:68
5428
- #: paid-memberships-pro.php:149
5429
  #: classes/gateways/class.pmprogateway_paypal.php:57
5430
  #: classes/gateways/class.pmprogateway_paypal.php:68
5431
  #: paid-memberships-pro.php:119 paid-memberships-pro.php:120
@@ -5434,10 +5827,11 @@ msgstr ""
5434
  #: paid-memberships-pro.php:131 paid-memberships-pro.php:132
5435
  #: paid-memberships-pro.php:133 paid-memberships-pro.php:134
5436
  #: paid-memberships-pro.php:139 paid-memberships-pro.php:144
 
5437
  msgid "PayPal Website Payments Pro"
5438
  msgstr ""
5439
 
5440
- #: classes/gateways/class.pmprogateway_paypal.php:125
5441
  #: classes/gateways/class.pmprogateway_paypalexpress.php:140
5442
  #: classes/gateways/class.pmprogateway_paypalstandard.php:132
5443
  #: classes/gateways/class.pmprogateway_paypal.php:113
@@ -5450,7 +5844,7 @@ msgstr ""
5450
  msgid "PayPal Settings"
5451
  msgstr ""
5452
 
5453
- #: classes/gateways/class.pmprogateway_paypal.php:130
5454
  #: classes/gateways/class.pmprogateway_paypalexpress.php:145
5455
  #: classes/gateways/class.pmprogateway_paypalstandard.php:137
5456
  #: adminpages/paymentsettings.php:179
@@ -5469,7 +5863,7 @@ msgid ""
5469
  "here.</a>"
5470
  msgstr ""
5471
 
5472
- #: classes/gateways/class.pmprogateway_paypal.php:135
5473
  #: classes/gateways/class.pmprogateway_paypalexpress.php:150
5474
  #: classes/gateways/class.pmprogateway_paypalstandard.php:142
5475
  #: adminpages/paymentsettings.php:227 adminpages/paymentsettings.php:231
@@ -5484,7 +5878,7 @@ msgstr ""
5484
  msgid "Gateway Account Email"
5485
  msgstr ""
5486
 
5487
- #: classes/gateways/class.pmprogateway_paypal.php:143
5488
  #: classes/gateways/class.pmprogateway_paypalexpress.php:158
5489
  #: classes/gateways/class.pmprogateway_paypalstandard.php:150
5490
  #: classes/gateways/class.pmprogateway_twocheckout.php:119
@@ -5504,7 +5898,7 @@ msgstr ""
5504
  msgid "API Username"
5505
  msgstr ""
5506
 
5507
- #: classes/gateways/class.pmprogateway_paypal.php:151
5508
  #: classes/gateways/class.pmprogateway_paypalexpress.php:166
5509
  #: classes/gateways/class.pmprogateway_paypalstandard.php:158
5510
  #: classes/gateways/class.pmprogateway_twocheckout.php:128
@@ -5524,7 +5918,7 @@ msgstr ""
5524
  msgid "API Password"
5525
  msgstr ""
5526
 
5527
- #: classes/gateways/class.pmprogateway_paypal.php:159
5528
  #: classes/gateways/class.pmprogateway_paypalexpress.php:174
5529
  #: classes/gateways/class.pmprogateway_paypalstandard.php:166
5530
  #: adminpages/paymentsettings.php:251 adminpages/paymentsettings.php:255
@@ -5539,14 +5933,14 @@ msgstr ""
5539
  msgid "API Signature"
5540
  msgstr ""
5541
 
5542
- #: classes/gateways/class.pmprogateway_paypal.php:167
5543
  #: classes/gateways/class.pmprogateway_paypalexpress.php:182
5544
  #: classes/gateways/class.pmprogateway_paypal.php:167
5545
  #: classes/gateways/class.pmprogateway_paypalexpress.php:182
5546
  msgid "Confirmation Step"
5547
  msgstr ""
5548
 
5549
- #: classes/gateways/class.pmprogateway_paypal.php:178
5550
  #: classes/gateways/class.pmprogateway_paypalexpress.php:193
5551
  #: classes/gateways/class.pmprogateway_paypalstandard.php:174
5552
  #: adminpages/paymentsettings.php:446 adminpages/paymentsettings.php:479
@@ -5561,7 +5955,7 @@ msgstr ""
5561
  msgid "IPN Handler URL"
5562
  msgstr ""
5563
 
5564
- #: classes/gateways/class.pmprogateway_paypal.php:181
5565
  #: classes/gateways/class.pmprogateway_paypal.php:158
5566
  #: classes/gateways/class.pmprogateway_paypal.php:181
5567
  msgid ""
@@ -5569,10 +5963,10 @@ msgid ""
5569
  "SHOULD NOT set this in your PayPal account settings."
5570
  msgstr ""
5571
 
5572
- #: classes/gateways/class.pmprogateway_paypal.php:201
5573
- #: classes/gateways/class.pmprogateway_paypalexpress.php:443
5574
  #: classes/gateways/class.pmprogateway_paypalstandard.php:229
5575
- #: pages/checkout.php:271 classes/gateways/class.pmprogateway_paypal.php:178
5576
  #: classes/gateways/class.pmprogateway_paypal.php:201
5577
  #: classes/gateways/class.pmprogateway_paypalexpress.php:402
5578
  #: classes/gateways/class.pmprogateway_paypalexpress.php:412
@@ -5590,10 +5984,10 @@ msgstr ""
5590
  msgid "Check Out with PayPal"
5591
  msgstr ""
5592
 
5593
- #: classes/gateways/class.pmprogateway_paypal.php:207
5594
- #: classes/gateways/class.pmprogateway_paypalexpress.php:448
5595
  #: classes/gateways/class.pmprogateway_paypalstandard.php:234
5596
- #: pages/checkout.php:606 classes/gateways/class.pmprogateway_paypal.php:184
5597
  #: classes/gateways/class.pmprogateway_paypal.php:207
5598
  #: classes/gateways/class.pmprogateway_paypalexpress.php:408
5599
  #: classes/gateways/class.pmprogateway_paypalexpress.php:418
@@ -5611,11 +6005,11 @@ msgstr ""
5611
  msgid "Submit and Check Out"
5612
  msgstr ""
5613
 
5614
- #: classes/gateways/class.pmprogateway_paypal.php:207
5615
- #: classes/gateways/class.pmprogateway_paypalexpress.php:448
5616
  #: classes/gateways/class.pmprogateway_paypalstandard.php:234
5617
  #: classes/gateways/class.pmprogateway_twocheckout.php:203
5618
- #: pages/checkout.php:606 classes/gateways/class.pmprogateway_paypal.php:184
5619
  #: classes/gateways/class.pmprogateway_paypal.php:207
5620
  #: classes/gateways/class.pmprogateway_paypalexpress.php:408
5621
  #: classes/gateways/class.pmprogateway_paypalexpress.php:418
@@ -5636,8 +6030,8 @@ msgstr ""
5636
  msgid "Submit and Confirm"
5637
  msgstr ""
5638
 
5639
- #: classes/gateways/class.pmprogateway_paypal.php:631
5640
- #: classes/gateways/class.pmprogateway_paypalexpress.php:785
5641
  #: classes/gateways/class.pmprogateway_paypalstandard.php:575
5642
  #: classes/gateways/class.pmprogateway_paypal.php:385
5643
  #: classes/gateways/class.pmprogateway_paypal.php:605
@@ -5668,7 +6062,7 @@ msgid ""
5668
  msgstr ""
5669
 
5670
  #: classes/gateways/class.pmprogateway_paypalexpress.php:84
5671
- #: paid-memberships-pro.php:148
5672
  #: classes/gateways/class.pmprogateway_paypalexpress.php:63
5673
  #: classes/gateways/class.pmprogateway_paypalexpress.php:73
5674
  #: classes/gateways/class.pmprogateway_paypalexpress.php:84
@@ -5678,6 +6072,7 @@ msgstr ""
5678
  #: paid-memberships-pro.php:130 paid-memberships-pro.php:131
5679
  #: paid-memberships-pro.php:132 paid-memberships-pro.php:133
5680
  #: paid-memberships-pro.php:138 paid-memberships-pro.php:143
 
5681
  msgid "PayPal Express"
5682
  msgstr ""
5683
 
@@ -5690,8 +6085,8 @@ msgstr ""
5690
  msgid "To fully integrate with PayPal, be sure to set your IPN Handler URL to "
5691
  msgstr ""
5692
 
5693
- #: classes/gateways/class.pmprogateway_paypalexpress.php:307
5694
- #: classes/gateways/class.pmprogateway_paypalexpress.php:362
5695
  #: classes/gateways/class.pmprogateway_paypalexpress.php:268
5696
  #: classes/gateways/class.pmprogateway_paypalexpress.php:278
5697
  #: classes/gateways/class.pmprogateway_paypalexpress.php:301
@@ -5711,7 +6106,7 @@ msgid "The PayPal Token was lost."
5711
  msgstr ""
5712
 
5713
  #: classes/gateways/class.pmprogateway_paypalstandard.php:71
5714
- #: paid-memberships-pro.php:151
5715
  #: classes/gateways/class.pmprogateway_paypalstandard.php:60
5716
  #: classes/gateways/class.pmprogateway_paypalstandard.php:71
5717
  #: paid-memberships-pro.php:121 paid-memberships-pro.php:122
@@ -5720,6 +6115,7 @@ msgstr ""
5720
  #: paid-memberships-pro.php:133 paid-memberships-pro.php:134
5721
  #: paid-memberships-pro.php:135 paid-memberships-pro.php:136
5722
  #: paid-memberships-pro.php:141 paid-memberships-pro.php:146
 
5723
  msgid "PayPal Standard"
5724
  msgstr ""
5725
 
@@ -5736,8 +6132,8 @@ msgstr ""
5736
  msgid "User requested cancellation"
5737
  msgstr ""
5738
 
5739
- #: classes/gateways/class.pmprogateway_stripe.php:198
5740
- #: paid-memberships-pro.php:147
5741
  #: classes/gateways/class.pmprogateway_stripe.php:93
5742
  #: classes/gateways/class.pmprogateway_stripe.php:94
5743
  #: classes/gateways/class.pmprogateway_stripe.php:104
@@ -5747,6 +6143,7 @@ msgstr ""
5747
  #: classes/gateways/class.pmprogateway_stripe.php:140
5748
  #: classes/gateways/class.pmprogateway_stripe.php:142
5749
  #: classes/gateways/class.pmprogateway_stripe.php:169
 
5750
  #: classes/gateways/class.pmprogateway_stripe.php:201
5751
  #: classes/gateways/class.pmprogateway_stripe.php:203
5752
  #: paid-memberships-pro.php:117 paid-memberships-pro.php:118
@@ -5755,10 +6152,11 @@ msgstr ""
5755
  #: paid-memberships-pro.php:129 paid-memberships-pro.php:130
5756
  #: paid-memberships-pro.php:131 paid-memberships-pro.php:132
5757
  #: paid-memberships-pro.php:137 paid-memberships-pro.php:142
 
5758
  msgid "Stripe"
5759
  msgstr ""
5760
 
5761
- #: classes/gateways/class.pmprogateway_stripe.php:250
5762
  #: classes/gateways/class.pmprogateway_stripe.php:148
5763
  #: classes/gateways/class.pmprogateway_stripe.php:149
5764
  #: classes/gateways/class.pmprogateway_stripe.php:159
@@ -5768,12 +6166,13 @@ msgstr ""
5768
  #: classes/gateways/class.pmprogateway_stripe.php:195
5769
  #: classes/gateways/class.pmprogateway_stripe.php:197
5770
  #: classes/gateways/class.pmprogateway_stripe.php:224
 
5771
  #: classes/gateways/class.pmprogateway_stripe.php:256
5772
  #: classes/gateways/class.pmprogateway_stripe.php:258
5773
  msgid "Stripe Settings"
5774
  msgstr ""
5775
 
5776
- #: classes/gateways/class.pmprogateway_stripe.php:255
5777
  #: adminpages/paymentsettings.php:285 adminpages/paymentsettings.php:289
5778
  #: adminpages/paymentsettings.php:294
5779
  #: classes/gateways/class.pmprogateway_stripe.php:161
@@ -5785,19 +6184,21 @@ msgstr ""
5785
  #: classes/gateways/class.pmprogateway_stripe.php:208
5786
  #: classes/gateways/class.pmprogateway_stripe.php:210
5787
  #: classes/gateways/class.pmprogateway_stripe.php:237
 
5788
  #: classes/gateways/class.pmprogateway_stripe.php:261
5789
  #: classes/gateways/class.pmprogateway_stripe.php:263
5790
  #: classes/gateways/class.pmprogateway_stripe.php:269
5791
  msgid "Publishable Key"
5792
  msgstr ""
5793
 
 
5794
  #: classes/gateways/class.pmprogateway_stripe.php:263
5795
  #: classes/gateways/class.pmprogateway_stripe.php:269
5796
  #: classes/gateways/class.pmprogateway_stripe.php:271
5797
  msgid "Your Publishable Key appears incorrect."
5798
  msgstr ""
5799
 
5800
- #: classes/gateways/class.pmprogateway_stripe.php:271
5801
  #: adminpages/paymentsettings.php:277 adminpages/paymentsettings.php:281
5802
  #: adminpages/paymentsettings.php:286
5803
  #: classes/gateways/class.pmprogateway_stripe.php:153
@@ -5810,12 +6211,13 @@ msgstr ""
5810
  #: classes/gateways/class.pmprogateway_stripe.php:202
5811
  #: classes/gateways/class.pmprogateway_stripe.php:229
5812
  #: classes/gateways/class.pmprogateway_stripe.php:261
 
5813
  #: classes/gateways/class.pmprogateway_stripe.php:277
5814
  #: classes/gateways/class.pmprogateway_stripe.php:279
5815
  msgid "Secret Key"
5816
  msgstr ""
5817
 
5818
- #: classes/gateways/class.pmprogateway_stripe.php:279
5819
  #: adminpages/paymentsettings.php:425 adminpages/paymentsettings.php:430
5820
  #: adminpages/paymentsettings.php:432
5821
  #: classes/gateways/class.pmprogateway_stripe.php:169
@@ -5828,6 +6230,7 @@ msgstr ""
5828
  #: classes/gateways/class.pmprogateway_stripe.php:218
5829
  #: classes/gateways/class.pmprogateway_stripe.php:245
5830
  #: classes/gateways/class.pmprogateway_stripe.php:277
 
5831
  #: classes/gateways/class.pmprogateway_stripe.php:285
5832
  #: classes/gateways/class.pmprogateway_stripe.php:287
5833
  #: classes/gateways/class.pmprogateway_stripe.php:293
@@ -5835,7 +6238,7 @@ msgstr ""
5835
  msgid "Show Billing Address Fields"
5836
  msgstr ""
5837
 
5838
- #: classes/gateways/class.pmprogateway_stripe.php:286
5839
  #: adminpages/paymentsettings.php:437 adminpages/paymentsettings.php:439
5840
  #: classes/gateways/class.pmprogateway_stripe.php:176
5841
  #: classes/gateways/class.pmprogateway_stripe.php:177
@@ -5847,6 +6250,7 @@ msgstr ""
5847
  #: classes/gateways/class.pmprogateway_stripe.php:225
5848
  #: classes/gateways/class.pmprogateway_stripe.php:252
5849
  #: classes/gateways/class.pmprogateway_stripe.php:284
 
5850
  #: classes/gateways/class.pmprogateway_stripe.php:292
5851
  #: classes/gateways/class.pmprogateway_stripe.php:294
5852
  #: classes/gateways/class.pmprogateway_stripe.php:300
@@ -5857,7 +6261,7 @@ msgid ""
5857
  "verification in the Stripe dashboard settings.</strong>"
5858
  msgstr ""
5859
 
5860
- #: classes/gateways/class.pmprogateway_stripe.php:294
5861
  #: adminpages/paymentsettings.php:465 adminpages/paymentsettings.php:506
5862
  #: adminpages/paymentsettings.php:512 adminpages/paymentsettings.php:514
5863
  #: classes/gateways/class.pmprogateway_stripe.php:184
@@ -5870,6 +6274,7 @@ msgstr ""
5870
  #: classes/gateways/class.pmprogateway_stripe.php:233
5871
  #: classes/gateways/class.pmprogateway_stripe.php:260
5872
  #: classes/gateways/class.pmprogateway_stripe.php:292
 
5873
  #: classes/gateways/class.pmprogateway_stripe.php:300
5874
  #: classes/gateways/class.pmprogateway_stripe.php:302
5875
  #: classes/gateways/class.pmprogateway_stripe.php:308
@@ -5877,21 +6282,21 @@ msgstr ""
5877
  msgid "To fully integrate with Stripe, be sure to set your Web Hook URL to"
5878
  msgstr ""
5879
 
 
5880
  #: classes/gateways/class.pmprogateway_stripe.php:299
5881
  #: classes/gateways/class.pmprogateway_stripe.php:307
5882
  msgid "Stripe API Version"
5883
  msgstr ""
5884
 
5885
- #: classes/gateways/class.pmprogateway_stripe.php:623 pages/checkout.php:500
5886
- #: classes/gateways/class.pmprogateway_stripe.php:638
5887
- #: classes/gateways/class.pmprogateway_stripe.php:646
5888
- #: classes/gateways/class.pmprogateway_stripe.php:653
5889
- #: classes/gateways/class.pmprogateway_stripe.php:654
5890
- #: classes/gateways/class.pmprogateway_stripe.php:655 pages/checkout.php:492
5891
- #: pages/checkout.php:500
5892
- msgid "Security Code (CVC)"
5893
  msgstr ""
5894
 
 
 
 
 
 
5895
  #: classes/gateways/class.pmprogateway_stripe.php:693
5896
  #: classes/gateways/class.pmprogateway_stripe.php:703
5897
  #: classes/gateways/class.pmprogateway_stripe.php:710
@@ -5905,7 +6310,7 @@ msgid ""
5905
  "have been deleted."
5906
  msgstr ""
5907
 
5908
- #: classes/gateways/class.pmprogateway_stripe.php:698
5909
  #: classes/gateways/class.pmprogateway_stripe.php:567
5910
  #: classes/gateways/class.pmprogateway_stripe.php:568
5911
  #: classes/gateways/class.pmprogateway_stripe.php:578
@@ -5917,6 +6322,7 @@ msgstr ""
5917
  #: classes/gateways/class.pmprogateway_stripe.php:634
5918
  #: classes/gateways/class.pmprogateway_stripe.php:645
5919
  #: classes/gateways/class.pmprogateway_stripe.php:683
 
5920
  #: classes/gateways/class.pmprogateway_stripe.php:710
5921
  #: classes/gateways/class.pmprogateway_stripe.php:717
5922
  #: classes/gateways/class.pmprogateway_stripe.php:725
@@ -5926,7 +6332,7 @@ msgstr ""
5926
  msgid "Subscription Updates"
5927
  msgstr ""
5928
 
5929
- #: classes/gateways/class.pmprogateway_stripe.php:702
5930
  #: classes/gateways/class.pmprogateway_stripe.php:571
5931
  #: classes/gateways/class.pmprogateway_stripe.php:572
5932
  #: classes/gateways/class.pmprogateway_stripe.php:582
@@ -5938,6 +6344,7 @@ msgstr ""
5938
  #: classes/gateways/class.pmprogateway_stripe.php:638
5939
  #: classes/gateways/class.pmprogateway_stripe.php:649
5940
  #: classes/gateways/class.pmprogateway_stripe.php:687
 
5941
  #: classes/gateways/class.pmprogateway_stripe.php:714
5942
  #: classes/gateways/class.pmprogateway_stripe.php:721
5943
  #: classes/gateways/class.pmprogateway_stripe.php:729
@@ -5949,7 +6356,7 @@ msgid ""
5949
  "at predefined times. Be sure to click Update Profile after making changes."
5950
  msgstr ""
5951
 
5952
- #: classes/gateways/class.pmprogateway_stripe.php:704
5953
  #: classes/gateways/class.pmprogateway_stripe.php:573
5954
  #: classes/gateways/class.pmprogateway_stripe.php:574
5955
  #: classes/gateways/class.pmprogateway_stripe.php:584
@@ -5961,6 +6368,7 @@ msgstr ""
5961
  #: classes/gateways/class.pmprogateway_stripe.php:640
5962
  #: classes/gateways/class.pmprogateway_stripe.php:651
5963
  #: classes/gateways/class.pmprogateway_stripe.php:689
 
5964
  #: classes/gateways/class.pmprogateway_stripe.php:716
5965
  #: classes/gateways/class.pmprogateway_stripe.php:723
5966
  #: classes/gateways/class.pmprogateway_stripe.php:731
@@ -5972,7 +6380,7 @@ msgid ""
5972
  "at predefined times. Be sure to click Update User after making changes."
5973
  msgstr ""
5974
 
5975
- #: classes/gateways/class.pmprogateway_stripe.php:709 pages/billing.php:362
5976
  #: classes/gateways/class.pmprogateway_stripe.php:578
5977
  #: classes/gateways/class.pmprogateway_stripe.php:579
5978
  #: classes/gateways/class.pmprogateway_stripe.php:589
@@ -5984,6 +6392,7 @@ msgstr ""
5984
  #: classes/gateways/class.pmprogateway_stripe.php:645
5985
  #: classes/gateways/class.pmprogateway_stripe.php:656
5986
  #: classes/gateways/class.pmprogateway_stripe.php:694
 
5987
  #: classes/gateways/class.pmprogateway_stripe.php:721
5988
  #: classes/gateways/class.pmprogateway_stripe.php:728
5989
  #: classes/gateways/class.pmprogateway_stripe.php:736
@@ -5998,17 +6407,8 @@ msgstr ""
5998
  msgid "Update"
5999
  msgstr ""
6000
 
6001
- #: classes/gateways/class.pmprogateway_stripe.php:1090
6002
- #: classes/gateways/class.pmprogateway_stripe.php:1119
6003
- #: classes/gateways/class.pmprogateway_stripe.php:1127
6004
- #: classes/gateways/class.pmprogateway_stripe.php:1134
6005
- #: classes/gateways/class.pmprogateway_stripe.php:1135
6006
- #: classes/gateways/class.pmprogateway_stripe.php:1136
6007
- #: classes/gateways/class.pmprogateway_stripe.php:1142
6008
- #: classes/gateways/class.pmprogateway_stripe.php:1172
6009
- msgid "Payment error: Please contact the webmaster (stripe-load-error)"
6010
- msgstr ""
6011
-
6012
  #: classes/gateways/class.pmprogateway_stripe.php:1236
6013
  #: classes/gateways/class.pmprogateway_stripe.php:1247
6014
  #: classes/gateways/class.pmprogateway_stripe.php:1289
@@ -6019,7 +6419,7 @@ msgstr ""
6019
  msgid "Error: %s"
6020
  msgstr ""
6021
 
6022
- #: classes/gateways/class.pmprogateway_stripe.php:1322
6023
  #: classes/gateways/class.pmprogateway_stripe.php:190
6024
  #: classes/gateways/class.pmprogateway_stripe.php:192
6025
  #: classes/gateways/class.pmprogateway_stripe.php:199
@@ -6036,6 +6436,7 @@ msgstr ""
6036
  #: classes/gateways/class.pmprogateway_stripe.php:1260
6037
  #: classes/gateways/class.pmprogateway_stripe.php:1300
6038
  #: classes/gateways/class.pmprogateway_stripe.php:1303
 
6039
  #: classes/gateways/class.pmprogateway_stripe.php:1325
6040
  #: classes/gateways/class.pmprogateway_stripe.php:1326
6041
  #: classes/gateways/class.pmprogateway_stripe.php:1336
@@ -6049,13 +6450,14 @@ msgstr ""
6049
  msgid "Error creating customer record with Stripe:"
6050
  msgstr ""
6051
 
6052
- #: classes/gateways/class.pmprogateway_stripe.php:1374
6053
  #: classes/gateways/class.pmprogateway_stripe.php:1275
6054
  #: classes/gateways/class.pmprogateway_stripe.php:1303
6055
  #: classes/gateways/class.pmprogateway_stripe.php:1313
6056
  #: classes/gateways/class.pmprogateway_stripe.php:1317
6057
  #: classes/gateways/class.pmprogateway_stripe.php:1357
6058
  #: classes/gateways/class.pmprogateway_stripe.php:1360
 
6059
  #: classes/gateways/class.pmprogateway_stripe.php:1384
6060
  #: classes/gateways/class.pmprogateway_stripe.php:1385
6061
  #: classes/gateways/class.pmprogateway_stripe.php:1395
@@ -6069,7 +6471,7 @@ msgstr ""
6069
  msgid "Error getting subscription with Stripe:"
6070
  msgstr ""
6071
 
6072
- #: classes/gateways/class.pmprogateway_stripe.php:1525
6073
  #: classes/gateways/class.pmprogateway_stripe.php:278
6074
  #: classes/gateways/class.pmprogateway_stripe.php:279
6075
  #: classes/gateways/class.pmprogateway_stripe.php:286
@@ -6094,6 +6496,7 @@ msgstr ""
6094
  #: classes/gateways/class.pmprogateway_stripe.php:1467
6095
  #: classes/gateways/class.pmprogateway_stripe.php:1507
6096
  #: classes/gateways/class.pmprogateway_stripe.php:1510
 
6097
  #: classes/gateways/class.pmprogateway_stripe.php:1540
6098
  #: classes/gateways/class.pmprogateway_stripe.php:1541
6099
  #: classes/gateways/class.pmprogateway_stripe.php:1551
@@ -6107,7 +6510,7 @@ msgstr ""
6107
  msgid "Error creating plan with Stripe:"
6108
  msgstr ""
6109
 
6110
- #: classes/gateways/class.pmprogateway_stripe.php:1554
6111
  #: classes/gateways/class.pmprogateway_stripe.php:294
6112
  #: classes/gateways/class.pmprogateway_stripe.php:295
6113
  #: classes/gateways/class.pmprogateway_stripe.php:302
@@ -6127,6 +6530,7 @@ msgstr ""
6127
  #: classes/gateways/class.pmprogateway_stripe.php:1498
6128
  #: classes/gateways/class.pmprogateway_stripe.php:1538
6129
  #: classes/gateways/class.pmprogateway_stripe.php:1541
 
6130
  #: classes/gateways/class.pmprogateway_stripe.php:1571
6131
  #: classes/gateways/class.pmprogateway_stripe.php:1572
6132
  #: classes/gateways/class.pmprogateway_stripe.php:1582
@@ -6140,7 +6544,7 @@ msgstr ""
6140
  msgid "Error subscribing customer to plan with Stripe:"
6141
  msgstr ""
6142
 
6143
- #: classes/gateways/class.pmprogateway_stripe.php:1643
6144
  #: classes/gateways/class.pmprogateway_stripe.php:769
6145
  #: classes/gateways/class.pmprogateway_stripe.php:770
6146
  #: classes/gateways/class.pmprogateway_stripe.php:780
@@ -6153,6 +6557,7 @@ msgstr ""
6153
  #: classes/gateways/class.pmprogateway_stripe.php:849
6154
  #: classes/gateways/class.pmprogateway_stripe.php:887
6155
  #: classes/gateways/class.pmprogateway_stripe.php:914
 
6156
  #: classes/gateways/class.pmprogateway_stripe.php:1698
6157
  #: classes/gateways/class.pmprogateway_stripe.php:1706
6158
  #: classes/gateways/class.pmprogateway_stripe.php:1714
@@ -6162,7 +6567,7 @@ msgstr ""
6162
  msgid "Could not cancel the old subscription. Updates have not been processed."
6163
  msgstr ""
6164
 
6165
- #: classes/gateways/class.pmprogateway_stripe.php:1744
6166
  #: classes/gateways/class.pmprogateway_stripe.php:383
6167
  #: classes/gateways/class.pmprogateway_stripe.php:389
6168
  #: classes/gateways/class.pmprogateway_stripe.php:410
@@ -6183,6 +6588,7 @@ msgstr ""
6183
  #: classes/gateways/class.pmprogateway_stripe.php:1668
6184
  #: classes/gateways/class.pmprogateway_stripe.php:1678
6185
  #: classes/gateways/class.pmprogateway_stripe.php:1716
 
6186
  #: classes/gateways/class.pmprogateway_stripe.php:1752
6187
  #: classes/gateways/class.pmprogateway_stripe.php:1801
6188
  #: classes/gateways/class.pmprogateway_stripe.php:1809
@@ -6193,7 +6599,7 @@ msgstr ""
6193
  msgid "Could not cancel old subscription."
6194
  msgstr ""
6195
 
6196
- #: classes/gateways/class.pmprogateway_stripe.php:1760
6197
  #: classes/gateways/class.pmprogateway_stripe.php:1533
6198
  #: classes/gateways/class.pmprogateway_stripe.php:1534
6199
  #: classes/gateways/class.pmprogateway_stripe.php:1535
@@ -6211,6 +6617,7 @@ msgstr ""
6211
  #: classes/gateways/class.pmprogateway_stripe.php:1685
6212
  #: classes/gateways/class.pmprogateway_stripe.php:1695
6213
  #: classes/gateways/class.pmprogateway_stripe.php:1733
 
6214
  #: classes/gateways/class.pmprogateway_stripe.php:1769
6215
  #: classes/gateways/class.pmprogateway_stripe.php:1818
6216
  #: classes/gateways/class.pmprogateway_stripe.php:1826
@@ -6221,11 +6628,12 @@ msgstr ""
6221
  msgid "Could not find the customer."
6222
  msgstr ""
6223
 
6224
- #: classes/gateways/class.pmprogateway_stripe.php:1920
6225
  #: classes/gateways/class.pmprogateway_stripe.php:1836
6226
  #: classes/gateways/class.pmprogateway_stripe.php:1837
6227
  #: classes/gateways/class.pmprogateway_stripe.php:1847
6228
  #: classes/gateways/class.pmprogateway_stripe.php:1885
 
6229
  #: classes/gateways/class.pmprogateway_stripe.php:1921
6230
  #: classes/gateways/class.pmprogateway_stripe.php:1978
6231
  #: classes/gateways/class.pmprogateway_stripe.php:1986
@@ -6236,11 +6644,12 @@ msgstr ""
6236
  msgid "Error: "
6237
  msgstr ""
6238
 
6239
- #: classes/gateways/class.pmprogateway_stripe.php:1933
6240
  #: classes/gateways/class.pmprogateway_stripe.php:1849
6241
  #: classes/gateways/class.pmprogateway_stripe.php:1850
6242
  #: classes/gateways/class.pmprogateway_stripe.php:1860
6243
  #: classes/gateways/class.pmprogateway_stripe.php:1898
 
6244
  #: classes/gateways/class.pmprogateway_stripe.php:1934
6245
  #: classes/gateways/class.pmprogateway_stripe.php:1991
6246
  #: classes/gateways/class.pmprogateway_stripe.php:1999
@@ -6252,8 +6661,20 @@ msgstr ""
6252
  msgid "Error: Unkown error while refunding charge #%s"
6253
  msgstr ""
6254
 
 
 
 
 
 
 
 
 
 
 
 
 
6255
  #: classes/gateways/class.pmprogateway_twocheckout.php:59
6256
- #: paid-memberships-pro.php:154
6257
  #: classes/gateways/class.pmprogateway_twocheckout.php:53
6258
  #: classes/gateways/class.pmprogateway_twocheckout.php:59
6259
  #: classes/gateways/class.pmprogateway_twocheckout.php:60
@@ -6263,6 +6684,7 @@ msgstr ""
6263
  #: paid-memberships-pro.php:136 paid-memberships-pro.php:137
6264
  #: paid-memberships-pro.php:138 paid-memberships-pro.php:139
6265
  #: paid-memberships-pro.php:144 paid-memberships-pro.php:149
 
6266
  msgid "2Checkout"
6267
  msgstr ""
6268
 
@@ -6462,6 +6884,20 @@ msgstr ""
6462
  msgid "Visit Customer Support Forum"
6463
  msgstr ""
6464
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6465
  #: includes/countries.php:7 includes/countries.php:7
6466
  msgid "Andorra"
6467
  msgstr ""
@@ -7451,8 +7887,8 @@ msgstr ""
7451
  msgid "US Armed Forces"
7452
  msgstr ""
7453
 
7454
- #: includes/currencies.php:7 includes/currencies.php:97
7455
- #: includes/currencies.php:124 includes/currencies.php:7
7456
  #: includes/currencies.php:17 includes/currencies.php:37
7457
  #: includes/currencies.php:44 includes/currencies.php:64
7458
  #: includes/currencies.php:68 includes/currencies.php:75
@@ -7463,7 +7899,7 @@ msgstr ""
7463
  msgid "US Dollars (&#36;)"
7464
  msgstr ""
7465
 
7466
- #: includes/currencies.php:9 includes/currencies.php:100
7467
  #: includes/currencies.php:8 includes/currencies.php:9
7468
  #: includes/currencies.php:19 includes/currencies.php:40
7469
  #: includes/currencies.php:47 includes/currencies.php:67
@@ -7474,7 +7910,7 @@ msgstr ""
7474
  msgid "Euros (&euro;)"
7475
  msgstr ""
7476
 
7477
- #: includes/currencies.php:14 includes/currencies.php:99
7478
  #: includes/currencies.php:9 includes/currencies.php:14
7479
  #: includes/currencies.php:24 includes/currencies.php:39
7480
  #: includes/currencies.php:46 includes/currencies.php:66
@@ -7502,7 +7938,7 @@ msgstr ""
7502
  msgid "Brazilian Real (R&#36;)"
7503
  msgstr ""
7504
 
7505
- #: includes/currencies.php:25 includes/currencies.php:98
7506
  #: includes/currencies.php:12 includes/currencies.php:24
7507
  #: includes/currencies.php:25 includes/currencies.php:34
7508
  #: includes/currencies.php:35 includes/currencies.php:38
@@ -7645,7 +8081,7 @@ msgstr ""
7645
  msgid "Russian Ruble (&#8381;)"
7646
  msgstr ""
7647
 
7648
- #: includes/currencies.php:68 includes/currencies.php:25
7649
  #: includes/currencies.php:28 includes/currencies.php:45
7650
  #: includes/currencies.php:52 includes/currencies.php:62
7651
  #: includes/currencies.php:64 includes/currencies.php:65
@@ -7654,7 +8090,7 @@ msgstr ""
7654
  msgid "Singapore Dollar (&#36;)"
7655
  msgstr ""
7656
 
7657
- #: includes/currencies.php:73 includes/currencies.php:50
7658
  #: includes/currencies.php:57 includes/currencies.php:67
7659
  #: includes/currencies.php:69 includes/currencies.php:70
7660
  #: includes/currencies.php:73 includes/currencies.php:75
@@ -7662,7 +8098,7 @@ msgstr ""
7662
  msgid "South African Rand (R)"
7663
  msgstr ""
7664
 
7665
- #: includes/currencies.php:78 includes/currencies.php:30
7666
  #: includes/currencies.php:50 includes/currencies.php:54
7667
  #: includes/currencies.php:61 includes/currencies.php:71
7668
  #: includes/currencies.php:73 includes/currencies.php:75
@@ -7671,7 +8107,7 @@ msgstr ""
7671
  msgid "South Korean Won"
7672
  msgstr ""
7673
 
7674
- #: includes/currencies.php:81 includes/currencies.php:26
7675
  #: includes/currencies.php:31 includes/currencies.php:51
7676
  #: includes/currencies.php:55 includes/currencies.php:62
7677
  #: includes/currencies.php:72 includes/currencies.php:74
@@ -7680,7 +8116,7 @@ msgstr ""
7680
  msgid "Swedish Krona"
7681
  msgstr ""
7682
 
7683
- #: includes/currencies.php:82 includes/currencies.php:27
7684
  #: includes/currencies.php:32 includes/currencies.php:52
7685
  #: includes/currencies.php:56 includes/currencies.php:63
7686
  #: includes/currencies.php:73 includes/currencies.php:75
@@ -7689,7 +8125,7 @@ msgstr ""
7689
  msgid "Swiss Franc"
7690
  msgstr ""
7691
 
7692
- #: includes/currencies.php:83 includes/currencies.php:28
7693
  #: includes/currencies.php:33 includes/currencies.php:53
7694
  #: includes/currencies.php:57 includes/currencies.php:64
7695
  #: includes/currencies.php:74 includes/currencies.php:76
@@ -7698,7 +8134,7 @@ msgstr ""
7698
  msgid "Taiwan New Dollars"
7699
  msgstr ""
7700
 
7701
- #: includes/currencies.php:84 includes/currencies.php:29
7702
  #: includes/currencies.php:34 includes/currencies.php:54
7703
  #: includes/currencies.php:58 includes/currencies.php:65
7704
  #: includes/currencies.php:75 includes/currencies.php:77
@@ -7707,7 +8143,7 @@ msgstr ""
7707
  msgid "Thai Baht"
7708
  msgstr ""
7709
 
7710
- #: includes/currencies.php:85 includes/currencies.php:35
7711
  #: includes/currencies.php:55 includes/currencies.php:59
7712
  #: includes/currencies.php:66 includes/currencies.php:76
7713
  #: includes/currencies.php:78 includes/currencies.php:82
@@ -7716,7 +8152,7 @@ msgstr ""
7716
  msgid "Turkish Lira"
7717
  msgstr ""
7718
 
7719
- #: includes/currencies.php:87 includes/currencies.php:36
7720
  #: includes/currencies.php:56 includes/currencies.php:60
7721
  #: includes/currencies.php:67 includes/currencies.php:77
7722
  #: includes/currencies.php:79 includes/currencies.php:84
@@ -7755,7 +8191,7 @@ msgstr ""
7755
  msgid "Profile Start Date Issue Detected and Fixed at %s"
7756
  msgstr ""
7757
 
7758
- #: includes/functions.php:321 includes/functions.php:433
7759
  #: includes/functions.php:160 includes/functions.php:196
7760
  #: includes/functions.php:200 includes/functions.php:202
7761
  #: includes/functions.php:203 includes/functions.php:204
@@ -7768,7 +8204,7 @@ msgstr ""
7768
  msgid "The price for membership is <strong>%s</strong> now"
7769
  msgstr ""
7770
 
7771
- #: includes/functions.php:323 includes/functions.php:435
7772
  #: includes/functions.php:202 includes/functions.php:204
7773
  #: includes/functions.php:205 includes/functions.php:206
7774
  #: includes/functions.php:209 includes/functions.php:245
@@ -7780,52 +8216,52 @@ msgstr ""
7780
  msgid "<strong>%s</strong> now"
7781
  msgstr ""
7782
 
7783
- #: includes/functions.php:330 includes/functions.php:330
7784
  #, php-format
7785
  msgid " and then <strong>%1$s per %2$s for %3$d more %4$s</strong>."
7786
  msgstr ""
7787
 
7788
- #: includes/functions.php:332 includes/functions.php:332
7789
  #, php-format
7790
  msgid " and then <strong>%1$s every %2$d %3$s for %4$d more payments</strong>."
7791
  msgstr ""
7792
 
7793
- #: includes/functions.php:335 includes/functions.php:335
7794
  #, php-format
7795
  msgid " and then <strong>%1$s after %2$d %3$s</strong>."
7796
  msgstr ""
7797
 
7798
- #: includes/functions.php:340 includes/functions.php:340
7799
  #, php-format
7800
  msgid "The price for membership is <strong>%1$s per %2$s</strong>."
7801
  msgstr ""
7802
 
7803
- #: includes/functions.php:342 includes/functions.php:342
7804
  #, php-format
7805
  msgid "<strong>%1$s per %2$s</strong>."
7806
  msgstr ""
7807
 
7808
- #: includes/functions.php:346 includes/functions.php:346
7809
  #, php-format
7810
  msgid "The price for membership is <strong>%1$s every %2$d %3$s</strong>."
7811
  msgstr ""
7812
 
7813
- #: includes/functions.php:348 includes/functions.php:348
7814
  #, php-format
7815
  msgid "<strong>%1$s every %2$d %3$s</strong>."
7816
  msgstr ""
7817
 
7818
- #: includes/functions.php:353 includes/functions.php:353
7819
  #, php-format
7820
  msgid " and then <strong>%1$s per %2$s</strong>."
7821
  msgstr ""
7822
 
7823
- #: includes/functions.php:355 includes/functions.php:355
7824
  #, php-format
7825
  msgid " and then <strong>%1$s every %2$d %3$s</strong>."
7826
  msgstr ""
7827
 
7828
- #: includes/functions.php:370 includes/functions.php:202
7829
  #: includes/functions.php:238 includes/functions.php:249
7830
  #: includes/functions.php:260 includes/functions.php:261
7831
  #: includes/functions.php:262 includes/functions.php:264
@@ -7836,7 +8272,7 @@ msgstr ""
7836
  msgid "After your initial payment, your first payment is Free."
7837
  msgstr ""
7838
 
7839
- #: includes/functions.php:372 includes/functions.php:206
7840
  #: includes/functions.php:242 includes/functions.php:253
7841
  #: includes/functions.php:264 includes/functions.php:265
7842
  #: includes/functions.php:266 includes/functions.php:268
@@ -7848,7 +8284,7 @@ msgstr ""
7848
  msgid "After your initial payment, your first %d payments are Free."
7849
  msgstr ""
7850
 
7851
- #: includes/functions.php:376 includes/functions.php:213
7852
  #: includes/functions.php:249 includes/functions.php:260
7853
  #: includes/functions.php:271 includes/functions.php:272
7854
  #: includes/functions.php:273 includes/functions.php:275
@@ -7860,64 +8296,64 @@ msgstr ""
7860
  msgid "After your initial payment, your first payment will cost %s."
7861
  msgstr ""
7862
 
7863
- #: includes/functions.php:378 includes/functions.php:378
7864
  #, php-format
7865
  msgid "After your initial payment, your first %1$d payments will cost %2$s."
7866
  msgstr ""
7867
 
7868
- #: includes/functions.php:388 includes/functions.php:489
7869
  #: includes/functions.php:388 includes/functions.php:489
7870
  #, php-format
7871
  msgid "Customers in %1$s will be charged %2$s%% tax."
7872
  msgstr ""
7873
 
7874
- #: includes/functions.php:446 includes/functions.php:446
7875
  #, php-format
7876
  msgid "<strong>%1$s per %2$s for %3$d more %4$s</strong>"
7877
  msgstr ""
7878
 
7879
- #: includes/functions.php:448 includes/functions.php:448
7880
  #, php-format
7881
  msgid "<strong>%1$s every %2$d %3$s for %4$d more payments</strong>"
7882
  msgstr ""
7883
 
7884
- #: includes/functions.php:451 includes/functions.php:451
7885
  #, php-format
7886
  msgid "<strong>%1$s after %2$d %3$s</strong>"
7887
  msgstr ""
7888
 
7889
- #: includes/functions.php:454 includes/functions.php:454
7890
  #, php-format
7891
  msgid "<strong>%1$s every %2$s</strong>"
7892
  msgstr ""
7893
 
7894
- #: includes/functions.php:456 includes/functions.php:456
7895
  #, php-format
7896
  msgid "<strong>%1$s every %2$d %3$s</strong>"
7897
  msgstr ""
7898
 
7899
- #: includes/functions.php:478 includes/functions.php:478
7900
  #: includes/functions.php:511 includes/functions.php:520
7901
  msgid "Trial pricing has been applied to the first payment."
7902
  msgstr ""
7903
 
7904
- #: includes/functions.php:480 includes/functions.php:480
7905
  #: includes/functions.php:513 includes/functions.php:522
7906
  #, php-format
7907
  msgid "Trial pricing has been applied to the first %d payments."
7908
  msgstr ""
7909
 
7910
- #: includes/functions.php:505 includes/functions.php:505
7911
  #, php-format
7912
  msgid "Membership expires after %1$d %2$s."
7913
  msgstr ""
7914
 
7915
- #: includes/functions.php:524 includes/functions.php:524
7916
  #, php-format
7917
  msgid "%1$s membership expires after %2$d %3$s"
7918
  msgstr ""
7919
 
7920
- #: includes/functions.php:882 includes/functions.php:491
7921
  #: includes/functions.php:514 includes/functions.php:525
7922
  #: includes/functions.php:536 includes/functions.php:537
7923
  #: includes/functions.php:538 includes/functions.php:545
@@ -7926,17 +8362,17 @@ msgstr ""
7926
  #: includes/functions.php:615 includes/functions.php:694
7927
  #: includes/functions.php:760 includes/functions.php:766
7928
  #: includes/functions.php:874 includes/functions.php:877
7929
- #: includes/functions.php:945 includes/functions.php:947
7930
- #: includes/functions.php:956
7931
  msgid "User ID not found."
7932
  msgstr ""
7933
 
7934
- #: includes/functions.php:894 includes/functions.php:886
7935
- #: includes/functions.php:889
7936
  msgid "No membership_id specified in pmpro_changeMembershipLevel."
7937
  msgstr ""
7938
 
7939
- #: includes/functions.php:900 includes/functions.php:908
7940
  #: includes/functions.php:508 includes/functions.php:531
7941
  #: includes/functions.php:542 includes/functions.php:553
7942
  #: includes/functions.php:554 includes/functions.php:555
@@ -7947,12 +8383,12 @@ msgstr ""
7947
  #: includes/functions.php:780 includes/functions.php:786
7948
  #: includes/functions.php:892 includes/functions.php:895
7949
  #: includes/functions.php:900 includes/functions.php:903
7950
- #: includes/functions.php:965 includes/functions.php:967
7951
- #: includes/functions.php:976
7952
  msgid "Invalid level."
7953
  msgstr ""
7954
 
7955
- #: includes/functions.php:919 includes/functions.php:520
7956
  #: includes/functions.php:542 includes/functions.php:553
7957
  #: includes/functions.php:564 includes/functions.php:565
7958
  #: includes/functions.php:566 includes/functions.php:573
@@ -7961,12 +8397,13 @@ msgstr ""
7961
  #: includes/functions.php:623 includes/functions.php:646
7962
  #: includes/functions.php:725 includes/functions.php:791
7963
  #: includes/functions.php:797 includes/functions.php:911
7964
- #: includes/functions.php:914 includes/functions.php:976
7965
- #: includes/functions.php:978 includes/functions.php:987
 
7966
  msgid "not changing?"
7967
  msgstr ""
7968
 
7969
- #: includes/functions.php:975 includes/functions.php:537
7970
  #: includes/functions.php:559 includes/functions.php:570
7971
  #: includes/functions.php:581 includes/functions.php:582
7972
  #: includes/functions.php:583 includes/functions.php:590
@@ -7990,20 +8427,21 @@ msgstr ""
7990
  #: includes/functions.php:881 includes/functions.php:887
7991
  #: includes/functions.php:905 includes/functions.php:911
7992
  #: includes/functions.php:967 includes/functions.php:970
7993
- #: includes/functions.php:1017 includes/functions.php:1037
7994
- #: includes/functions.php:1046
7995
  msgid "Error interacting with database"
7996
  msgstr ""
7997
 
7998
- #: includes/functions.php:1077 includes/functions.php:907
7999
  #: includes/functions.php:1064 includes/functions.php:1067
8000
- #: includes/functions.php:1123 includes/functions.php:1127
8001
- #: includes/functions.php:1129 includes/functions.php:1138
 
8002
  #, php-format
8003
  msgid "Error interacting with database: %s"
8004
  msgstr ""
8005
 
8006
- #: includes/functions.php:1155 includes/functions.php:1193
8007
  #: includes/functions.php:629 includes/functions.php:651
8008
  #: includes/functions.php:667 includes/functions.php:668
8009
  #: includes/functions.php:678 includes/functions.php:681
@@ -8022,8 +8460,9 @@ msgstr ""
8022
  #: includes/functions.php:948 includes/functions.php:953
8023
  #: includes/functions.php:986 includes/functions.php:987
8024
  #: includes/functions.php:992 includes/functions.php:1138
8025
- #: includes/functions.php:1141 includes/functions.php:1176
8026
- #: includes/functions.php:1179 includes/functions.php:1198
 
8027
  #: includes/functions.php:1202 includes/functions.php:1204
8028
  #: includes/functions.php:1213 includes/functions.php:1237
8029
  #: includes/functions.php:1241 includes/functions.php:1243
@@ -8031,7 +8470,7 @@ msgstr ""
8031
  msgid "Membership level not found."
8032
  msgstr ""
8033
 
8034
- #: includes/functions.php:1547 includes/functions.php:1100
8035
  #: includes/functions.php:1101 includes/functions.php:1118
8036
  #: includes/functions.php:1142 includes/functions.php:1143
8037
  #: includes/functions.php:1150 includes/functions.php:1157
@@ -8039,12 +8478,13 @@ msgstr ""
8039
  #: includes/functions.php:1290 includes/functions.php:1356
8040
  #: includes/functions.php:1357 includes/functions.php:1362
8041
  #: includes/functions.php:1530 includes/functions.php:1533
8042
- #: includes/functions.php:1605 includes/functions.php:1609
8043
- #: includes/functions.php:1611 includes/functions.php:1620
 
8044
  msgid "No code was given to check."
8045
  msgstr ""
8046
 
8047
- #: includes/functions.php:1556 includes/functions.php:1050
8048
  #: includes/functions.php:1072 includes/functions.php:1088
8049
  #: includes/functions.php:1099 includes/functions.php:1102
8050
  #: includes/functions.php:1109 includes/functions.php:1110
@@ -8055,13 +8495,13 @@ msgstr ""
8055
  #: includes/functions.php:1205 includes/functions.php:1299
8056
  #: includes/functions.php:1365 includes/functions.php:1366
8057
  #: includes/functions.php:1371 includes/functions.php:1539
8058
- #: includes/functions.php:1542 includes/functions.php:1614
8059
- #: includes/functions.php:1618 includes/functions.php:1620
8060
- #: includes/functions.php:1629
8061
  msgid "The discount code could not be found."
8062
  msgstr ""
8063
 
8064
- #: includes/functions.php:1571 includes/functions.php:1066
8065
  #: includes/functions.php:1088 includes/functions.php:1104
8066
  #: includes/functions.php:1115 includes/functions.php:1118
8067
  #: includes/functions.php:1124 includes/functions.php:1125
@@ -8072,14 +8512,14 @@ msgstr ""
8072
  #: includes/functions.php:1220 includes/functions.php:1314
8073
  #: includes/functions.php:1380 includes/functions.php:1381
8074
  #: includes/functions.php:1386 includes/functions.php:1554
8075
- #: includes/functions.php:1557 includes/functions.php:1629
8076
- #: includes/functions.php:1633 includes/functions.php:1635
8077
- #: includes/functions.php:1644
8078
  #, php-format
8079
  msgid "This discount code goes into effect on %s."
8080
  msgstr ""
8081
 
8082
- #: includes/functions.php:1578 includes/functions.php:1075
8083
  #: includes/functions.php:1097 includes/functions.php:1113
8084
  #: includes/functions.php:1124 includes/functions.php:1127
8085
  #: includes/functions.php:1131 includes/functions.php:1132
@@ -8090,14 +8530,14 @@ msgstr ""
8090
  #: includes/functions.php:1227 includes/functions.php:1321
8091
  #: includes/functions.php:1387 includes/functions.php:1388
8092
  #: includes/functions.php:1393 includes/functions.php:1561
8093
- #: includes/functions.php:1564 includes/functions.php:1636
8094
- #: includes/functions.php:1640 includes/functions.php:1642
8095
- #: includes/functions.php:1651
8096
  #, php-format
8097
  msgid "This discount code expired on %s."
8098
  msgstr ""
8099
 
8100
- #: includes/functions.php:1587 includes/functions.php:1087
8101
  #: includes/functions.php:1109 includes/functions.php:1125
8102
  #: includes/functions.php:1136 includes/functions.php:1139
8103
  #: includes/functions.php:1141 includes/functions.php:1142
@@ -8108,13 +8548,13 @@ msgstr ""
8108
  #: includes/functions.php:1237 includes/functions.php:1331
8109
  #: includes/functions.php:1397 includes/functions.php:1398
8110
  #: includes/functions.php:1403 includes/functions.php:1570
8111
- #: includes/functions.php:1573 includes/functions.php:1646
8112
- #: includes/functions.php:1650 includes/functions.php:1652
8113
- #: includes/functions.php:1661
8114
  msgid "This discount code is no longer valid."
8115
  msgstr ""
8116
 
8117
- #: includes/functions.php:1606 includes/functions.php:1102
8118
  #: includes/functions.php:1124 includes/functions.php:1140
8119
  #: includes/functions.php:1151 includes/functions.php:1154
8120
  #: includes/functions.php:1155 includes/functions.php:1164
@@ -8125,12 +8565,13 @@ msgstr ""
8125
  #: includes/functions.php:1344 includes/functions.php:1410
8126
  #: includes/functions.php:1411 includes/functions.php:1416
8127
  #: includes/functions.php:1589 includes/functions.php:1592
8128
- #: includes/functions.php:1666 includes/functions.php:1670
8129
- #: includes/functions.php:1672 includes/functions.php:1681
 
8130
  msgid "This discount code does not apply to this membership level."
8131
  msgstr ""
8132
 
8133
- #: includes/functions.php:1644 includes/functions.php:1110
8134
  #: includes/functions.php:1132 includes/functions.php:1148
8135
  #: includes/functions.php:1159 includes/functions.php:1162
8136
  #: includes/functions.php:1172 includes/functions.php:1180
@@ -8141,13 +8582,13 @@ msgstr ""
8141
  #: includes/functions.php:1276 includes/functions.php:1370
8142
  #: includes/functions.php:1436 includes/functions.php:1442
8143
  #: includes/functions.php:1448 includes/functions.php:1627
8144
- #: includes/functions.php:1630 includes/functions.php:1703
8145
- #: includes/functions.php:1707 includes/functions.php:1709
8146
- #: includes/functions.php:1718
8147
  msgid "This discount code is okay."
8148
  msgstr ""
8149
 
8150
- #: includes/functions.php:1672 includes/functions.php:1134
8151
  #: includes/functions.php:1156 includes/functions.php:1172
8152
  #: includes/functions.php:1183 includes/functions.php:1186
8153
  #: includes/functions.php:1196 includes/functions.php:1205
@@ -8158,13 +8599,13 @@ msgstr ""
8158
  #: includes/functions.php:1395 includes/functions.php:1397
8159
  #: includes/functions.php:1463 includes/functions.php:1469
8160
  #: includes/functions.php:1475 includes/functions.php:1655
8161
- #: includes/functions.php:1658 includes/functions.php:1730
8162
- #: includes/functions.php:1734 includes/functions.php:1736
8163
- #: includes/functions.php:1745
8164
  msgid "and"
8165
  msgstr ""
8166
 
8167
- #: includes/functions.php:2061 includes/functions.php:1319
8168
  #: includes/functions.php:1341 includes/functions.php:1361
8169
  #: includes/functions.php:1372 includes/functions.php:1375
8170
  #: includes/functions.php:1385 includes/functions.php:1394
@@ -8179,12 +8620,12 @@ msgstr ""
8179
  #: includes/functions.php:2015 includes/functions.php:2019
8180
  #: includes/functions.php:2022 includes/functions.php:2024
8181
  #: includes/functions.php:2030 includes/functions.php:2033
8182
- #: includes/functions.php:2034
8183
  msgid "Sign Up for !!name!! Now"
8184
  msgstr ""
8185
 
8186
- #: includes/functions.php:2085 includes/functions.php:2021
8187
- #: includes/functions.php:2054
8188
  msgid "Sign Up Now"
8189
  msgstr ""
8190
 
@@ -8334,7 +8775,7 @@ msgid ""
8334
  "\">Settings</a>."
8335
  msgstr ""
8336
 
8337
- #: includes/pointers.php:44 includes/pointers.php:45
8338
  msgid "Close"
8339
  msgstr ""
8340
 
@@ -8595,27 +9036,27 @@ msgid ""
8595
  "the issues</a>."
8596
  msgstr ""
8597
 
8598
- #: pages/billing.php:23 pages/billing.php:14 pages/billing.php:23
8599
- #: pages/billing.php:25 pages/billing.php:26 pages/billing.php:27
8600
- #: pages/billing.php:28
8601
  #, php-format
8602
  msgid "Logged in as <strong>%s</strong>."
8603
  msgstr ""
8604
 
8605
- #: pages/billing.php:23 pages/billing.php:14 pages/billing.php:23
8606
- #: pages/billing.php:25 pages/billing.php:26 pages/billing.php:27
8607
- #: pages/billing.php:28
8608
  msgid "logout"
8609
  msgstr ""
8610
 
8611
- #: pages/billing.php:43 pages/account.php:14 pages/billing.php:18
8612
  #: pages/billing.php:27 pages/billing.php:29 pages/billing.php:30
8613
  #: pages/billing.php:32 pages/billing.php:43 pages/billing.php:46
8614
  #: pages/billing.php:47
8615
  msgid "Membership Fee"
8616
  msgstr ""
8617
 
8618
- #: pages/billing.php:47 pages/account.php:18 pages/billing.php:22
8619
  #: pages/billing.php:31 pages/billing.php:33 pages/billing.php:34
8620
  #: pages/billing.php:36 pages/billing.php:47 pages/billing.php:50
8621
  #: pages/billing.php:51 pages/levels.php:70
@@ -8623,7 +9064,7 @@ msgstr ""
8623
  msgid "%s every %d %s."
8624
  msgstr ""
8625
 
8626
- #: pages/billing.php:49 pages/account.php:20 pages/billing.php:24
8627
  #: pages/billing.php:33 pages/billing.php:35 pages/billing.php:36
8628
  #: pages/billing.php:38 pages/billing.php:49 pages/billing.php:52
8629
  #: pages/billing.php:53 pages/levels.php:66
@@ -8631,14 +9072,14 @@ msgstr ""
8631
  msgid "%s per %s."
8632
  msgstr ""
8633
 
8634
- #: pages/billing.php:59 pages/account.php:25 pages/account.php:29
8635
  #: pages/billing.php:29 pages/billing.php:33 pages/billing.php:42
8636
  #: pages/billing.php:44 pages/billing.php:45 pages/billing.php:47
8637
  #: pages/billing.php:59 pages/billing.php:62 pages/billing.php:63
8638
  msgid "Duration"
8639
  msgstr ""
8640
 
8641
- #: pages/billing.php:77 pages/billing.php:39 pages/billing.php:43
8642
  #: pages/billing.php:52 pages/billing.php:54 pages/billing.php:55
8643
  #: pages/billing.php:57 pages/billing.php:77 pages/billing.php:80
8644
  #: pages/billing.php:81
@@ -8647,7 +9088,7 @@ msgid ""
8647
  "paypal.com\">login to PayPal here</a> to update your billing information."
8648
  msgstr ""
8649
 
8650
- #: pages/billing.php:104 pages/checkout.php:287 pages/billing.php:65
8651
  #: pages/billing.php:69 pages/billing.php:78 pages/billing.php:81
8652
  #: pages/billing.php:83 pages/billing.php:84 pages/billing.php:87
8653
  #: pages/billing.php:104 pages/billing.php:107 pages/billing.php:108
@@ -8659,7 +9100,7 @@ msgstr ""
8659
  msgid "First Name"
8660
  msgstr ""
8661
 
8662
- #: pages/billing.php:108 pages/checkout.php:291 pages/billing.php:69
8663
  #: pages/billing.php:73 pages/billing.php:82 pages/billing.php:85
8664
  #: pages/billing.php:87 pages/billing.php:88 pages/billing.php:91
8665
  #: pages/billing.php:108 pages/billing.php:111 pages/billing.php:112
@@ -8671,7 +9112,7 @@ msgstr ""
8671
  msgid "Last Name"
8672
  msgstr ""
8673
 
8674
- #: pages/billing.php:112 pages/checkout.php:295 pages/billing.php:73
8675
  #: pages/billing.php:77 pages/billing.php:86 pages/billing.php:89
8676
  #: pages/billing.php:91 pages/billing.php:92 pages/billing.php:95
8677
  #: pages/billing.php:112 pages/billing.php:115 pages/billing.php:116
@@ -8683,7 +9124,7 @@ msgstr ""
8683
  msgid "Address 1"
8684
  msgstr ""
8685
 
8686
- #: pages/billing.php:116 pages/checkout.php:299 pages/billing.php:77
8687
  #: pages/billing.php:81 pages/billing.php:90 pages/billing.php:93
8688
  #: pages/billing.php:95 pages/billing.php:96 pages/billing.php:99
8689
  #: pages/billing.php:116 pages/billing.php:119 pages/billing.php:120
@@ -8695,7 +9136,7 @@ msgstr ""
8695
  msgid "Address 2"
8696
  msgstr ""
8697
 
8698
- #: pages/billing.php:126 pages/checkout.php:306 pages/billing.php:87
8699
  #: pages/billing.php:91 pages/billing.php:100 pages/billing.php:103
8700
  #: pages/billing.php:105 pages/billing.php:106 pages/billing.php:109
8701
  #: pages/billing.php:126 pages/billing.php:129 pages/billing.php:130
@@ -8707,7 +9148,7 @@ msgstr ""
8707
  msgid "City"
8708
  msgstr ""
8709
 
8710
- #: pages/billing.php:130 pages/checkout.php:310 pages/billing.php:91
8711
  #: pages/billing.php:95 pages/billing.php:104 pages/billing.php:107
8712
  #: pages/billing.php:109 pages/billing.php:110 pages/billing.php:113
8713
  #: pages/billing.php:130 pages/billing.php:133 pages/billing.php:134
@@ -8719,7 +9160,7 @@ msgstr ""
8719
  msgid "State"
8720
  msgstr ""
8721
 
8722
- #: pages/billing.php:134 pages/checkout.php:314 pages/billing.php:95
8723
  #: pages/billing.php:99 pages/billing.php:108 pages/billing.php:111
8724
  #: pages/billing.php:113 pages/billing.php:114 pages/billing.php:117
8725
  #: pages/billing.php:134 pages/billing.php:137 pages/billing.php:138
@@ -8731,7 +9172,7 @@ msgstr ""
8731
  msgid "Postal Code"
8732
  msgstr ""
8733
 
8734
- #: pages/billing.php:143 pages/checkout.php:319 pages/billing.php:104
8735
  #: pages/billing.php:108 pages/billing.php:117 pages/billing.php:120
8736
  #: pages/billing.php:122 pages/billing.php:123 pages/billing.php:126
8737
  #: pages/billing.php:143 pages/billing.php:146 pages/billing.php:147
@@ -8743,7 +9184,7 @@ msgstr ""
8743
  msgid "City, State Zip"
8744
  msgstr ""
8745
 
8746
- #: pages/billing.php:196 pages/checkout.php:356 pages/billing.php:157
8747
  #: pages/billing.php:161 pages/billing.php:170 pages/billing.php:173
8748
  #: pages/billing.php:175 pages/billing.php:176 pages/billing.php:179
8749
  #: pages/billing.php:196 pages/billing.php:199 pages/billing.php:200
@@ -8755,7 +9196,7 @@ msgstr ""
8755
  msgid "Country"
8756
  msgstr ""
8757
 
8758
- #: pages/billing.php:221 pages/checkout.php:372 pages/billing.php:182
8759
  #: pages/billing.php:186 pages/billing.php:195 pages/billing.php:198
8760
  #: pages/billing.php:200 pages/billing.php:201 pages/billing.php:204
8761
  #: pages/billing.php:221 pages/billing.php:224 pages/billing.php:225
@@ -8767,7 +9208,7 @@ msgstr ""
8767
  msgid "Phone"
8768
  msgstr ""
8769
 
8770
- #: pages/billing.php:232 pages/checkout.php:205 pages/checkout.php:387
8771
  #: pages/billing.php:193 pages/billing.php:197 pages/billing.php:206
8772
  #: pages/billing.php:209 pages/billing.php:211 pages/billing.php:212
8773
  #: pages/billing.php:215 pages/billing.php:232 pages/billing.php:235
@@ -8782,7 +9223,7 @@ msgstr ""
8782
  msgid "E-mail Address"
8783
  msgstr ""
8784
 
8785
- #: pages/billing.php:236 pages/checkout.php:394 pages/billing.php:197
8786
  #: pages/billing.php:201 pages/billing.php:210 pages/billing.php:213
8787
  #: pages/billing.php:215 pages/billing.php:216 pages/billing.php:219
8788
  #: pages/billing.php:236 pages/billing.php:239 pages/billing.php:240
@@ -8794,7 +9235,7 @@ msgstr ""
8794
  msgid "Confirm E-mail"
8795
  msgstr ""
8796
 
8797
- #: pages/billing.php:259 pages/billing.php:217 pages/billing.php:221
8798
  #: pages/billing.php:230 pages/billing.php:231 pages/billing.php:234
8799
  #: pages/billing.php:238 pages/billing.php:244 pages/billing.php:247
8800
  #: pages/billing.php:259 pages/billing.php:262 pages/billing.php:263
@@ -8802,7 +9243,7 @@ msgstr ""
8802
  msgid "Credit Card Information"
8803
  msgstr ""
8804
 
8805
- #: pages/billing.php:260 pages/billing.php:217 pages/billing.php:221
8806
  #: pages/billing.php:230 pages/billing.php:232 pages/billing.php:235
8807
  #: pages/billing.php:239 pages/billing.php:245 pages/billing.php:248
8808
  #: pages/billing.php:260 pages/billing.php:263 pages/billing.php:264
@@ -8811,7 +9252,24 @@ msgstr ""
8811
  msgid "We accept %s"
8812
  msgstr ""
8813
 
8814
- #: pages/billing.php:378 pages/billing.php:309 pages/billing.php:313
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8815
  #: pages/billing.php:344 pages/billing.php:353 pages/billing.php:356
8816
  #: pages/billing.php:360 pages/billing.php:364 pages/billing.php:378
8817
  #: pages/billing.php:380 pages/billing.php:381 pages/billing.php:385
@@ -8857,7 +9315,7 @@ msgstr ""
8857
  msgid "Click here to go to the home page."
8858
  msgstr ""
8859
 
8860
- #: pages/checkout.php:30 pages/checkout.php:26 pages/checkout.php:27
8861
  #: pages/checkout.php:28 pages/checkout.php:30 pages/checkout.php:35
8862
  #: pages/checkout.php:38
8863
  msgid ""
@@ -8865,20 +9323,20 @@ msgid ""
8865
  "<strong>click the \"Complete Payment\" button</strong> to finish your order."
8866
  msgstr ""
8867
 
8868
- #: pages/checkout.php:40 pages/checkout.php:33 pages/checkout.php:34
8869
  #: pages/checkout.php:35 pages/checkout.php:40 pages/checkout.php:42
8870
  #: pages/checkout.php:43 pages/checkout.php:46
8871
  msgid "change"
8872
  msgstr ""
8873
 
8874
- #: pages/checkout.php:44 pages/checkout.php:39 pages/checkout.php:41
8875
  #: pages/checkout.php:42 pages/checkout.php:43 pages/checkout.php:44
8876
  #: pages/checkout.php:50 pages/checkout.php:51 pages/checkout.php:54
8877
  #, php-format
8878
  msgid "You have selected the <strong>%s</strong> membership level."
8879
  msgstr ""
8880
 
8881
- #: pages/checkout.php:61 pages/checkout.php:51 pages/checkout.php:53
8882
  #: pages/checkout.php:56 pages/checkout.php:60 pages/checkout.php:61
8883
  #: pages/checkout.php:68 pages/checkout.php:71
8884
  #, php-format
@@ -8887,72 +9345,72 @@ msgid ""
8887
  "been applied to your order.</p>"
8888
  msgstr ""
8889
 
8890
- #: pages/checkout.php:71 pages/checkout.php:66 pages/checkout.php:71
8891
  msgid "Click here to change your discount code."
8892
  msgstr ""
8893
 
8894
- #: pages/checkout.php:73 pages/checkout.php:64 pages/checkout.php:65
8895
  #: pages/checkout.php:66 pages/checkout.php:68 pages/checkout.php:73
8896
  #: pages/checkout.php:74 pages/checkout.php:81 pages/checkout.php:84
8897
  msgid "Click here to enter your discount code"
8898
  msgstr ""
8899
 
8900
- #: pages/checkout.php:73 pages/checkout.php:64 pages/checkout.php:65
8901
  #: pages/checkout.php:66 pages/checkout.php:68 pages/checkout.php:73
8902
  #: pages/checkout.php:74 pages/checkout.php:81 pages/checkout.php:84
8903
  msgid "Do you have a discount code?"
8904
  msgstr ""
8905
 
8906
- #: pages/checkout.php:170 pages/checkout.php:160 pages/checkout.php:162
8907
  #: pages/checkout.php:163 pages/checkout.php:165 pages/checkout.php:170
8908
  #: pages/checkout.php:172 pages/checkout.php:173 pages/checkout.php:175
8909
  #: pages/checkout.php:182 pages/checkout.php:185
8910
  msgid "Account Information"
8911
  msgstr ""
8912
 
8913
- #: pages/checkout.php:171 pages/checkout.php:160 pages/checkout.php:163
8914
  #: pages/checkout.php:165 pages/checkout.php:171 pages/checkout.php:172
8915
  #: pages/checkout.php:174 pages/checkout.php:176 pages/checkout.php:183
8916
  #: pages/checkout.php:186
8917
  msgid "Already have an account?"
8918
  msgstr ""
8919
 
8920
- #: pages/checkout.php:171 pages/checkout.php:160 pages/checkout.php:163
8921
  #: pages/checkout.php:165 pages/checkout.php:171 pages/checkout.php:172
8922
  #: pages/checkout.php:174 pages/checkout.php:176 pages/checkout.php:183
8923
  #: pages/checkout.php:186
8924
  msgid "Log in here"
8925
  msgstr ""
8926
 
8927
- #: pages/checkout.php:192 pages/checkout.php:184 pages/checkout.php:186
8928
  #: pages/checkout.php:189 pages/checkout.php:191 pages/checkout.php:192
8929
  #: pages/checkout.php:198 pages/checkout.php:200 pages/checkout.php:202
8930
  #: pages/checkout.php:209 pages/checkout.php:212
8931
  msgid "Confirm Password"
8932
  msgstr ""
8933
 
8934
- #: pages/checkout.php:213 pages/checkout.php:205 pages/checkout.php:213
8935
  #: pages/checkout.php:216 pages/checkout.php:218 pages/checkout.php:225
8936
  #: pages/checkout.php:227 pages/checkout.php:229 pages/checkout.php:236
8937
  #: pages/checkout.php:239
8938
  msgid "Confirm E-mail Address"
8939
  msgstr ""
8940
 
8941
- #: pages/checkout.php:226 pages/checkout.php:218 pages/checkout.php:226
8942
  #: pages/checkout.php:232 pages/checkout.php:235 pages/checkout.php:237
8943
  #: pages/checkout.php:244 pages/checkout.php:246 pages/checkout.php:248
8944
  #: pages/checkout.php:255 pages/checkout.php:258
8945
  msgid "Full Name"
8946
  msgstr ""
8947
 
8948
- #: pages/checkout.php:227 pages/checkout.php:219 pages/checkout.php:227
8949
  #: pages/checkout.php:233 pages/checkout.php:236 pages/checkout.php:238
8950
  #: pages/checkout.php:245 pages/checkout.php:247 pages/checkout.php:249
8951
  #: pages/checkout.php:256 pages/checkout.php:259
8952
  msgid "LEAVE THIS BLANK"
8953
  msgstr ""
8954
 
8955
- #: pages/checkout.php:246 pages/checkout.php:238 pages/checkout.php:246
8956
  #: pages/checkout.php:257 pages/checkout.php:260 pages/checkout.php:262
8957
  #: pages/checkout.php:269 pages/checkout.php:271 pages/checkout.php:273
8958
  #: pages/checkout.php:280 pages/checkout.php:283
@@ -8962,21 +9420,31 @@ msgid ""
8962
  "different account for this membership, <a href=\"%s\">log out now</a>."
8963
  msgstr ""
8964
 
8965
- #: pages/checkout.php:262 pages/checkout.php:254 pages/checkout.php:262
8966
  #: pages/checkout.php:276 pages/checkout.php:278 pages/checkout.php:285
8967
  #: pages/checkout.php:287 pages/checkout.php:289 pages/checkout.php:292
8968
  #: pages/checkout.php:296 pages/checkout.php:299
8969
  msgid "Choose your Payment Method"
8970
  msgstr ""
8971
 
8972
- #: pages/checkout.php:267 pages/checkout.php:259 pages/checkout.php:267
8973
  #: pages/checkout.php:284 pages/checkout.php:286 pages/checkout.php:293
8974
  #: pages/checkout.php:296 pages/checkout.php:298 pages/checkout.php:300
8975
  #: pages/checkout.php:305 pages/checkout.php:307 pages/checkout.php:308
8976
  msgid "Check Out with a Credit Card Here"
8977
  msgstr ""
8978
 
8979
- #: pages/checkout.php:575 pages/checkout.php:277 pages/checkout.php:284
 
 
 
 
 
 
 
 
 
 
8980
  #: pages/checkout.php:567 pages/checkout.php:575 pages/checkout.php:657
8981
  #: pages/checkout.php:672 pages/checkout.php:673 pages/checkout.php:681
8982
  #: pages/checkout.php:686 pages/checkout.php:690 pages/checkout.php:692
@@ -8985,7 +9453,7 @@ msgstr ""
8985
  msgid "I agree to the %s"
8986
  msgstr ""
8987
 
8988
- #: pages/checkout.php:594 pages/checkout.php:586 pages/checkout.php:594
8989
  #: pages/checkout.php:667 pages/checkout.php:674 pages/checkout.php:677
8990
  #: pages/checkout.php:692 pages/checkout.php:693 pages/checkout.php:701
8991
  #: pages/checkout.php:706 pages/checkout.php:710 pages/checkout.php:712
@@ -8993,7 +9461,7 @@ msgstr ""
8993
  msgid "Complete Payment"
8994
  msgstr ""
8995
 
8996
- #: pages/checkout.php:616 pages/checkout.php:608 pages/checkout.php:616
8997
  #: pages/checkout.php:687 pages/checkout.php:694 pages/checkout.php:697
8998
  #: pages/checkout.php:713 pages/checkout.php:714 pages/checkout.php:723
8999
  #: pages/checkout.php:728 pages/checkout.php:732 pages/checkout.php:734
@@ -9025,11 +9493,6 @@ msgstr ""
9025
  msgid "Invoice #%s on %s"
9026
  msgstr ""
9027
 
9028
- #: pages/confirmation.php:49 pages/invoice.php:24 pages/confirmation.php:43
9029
- #: pages/confirmation.php:49 pages/invoice.php:24
9030
- msgid "Print"
9031
- msgstr ""
9032
-
9033
  #: pages/confirmation.php:52 pages/confirmation.php:123 pages/invoice.php:27
9034
  #: pages/confirmation.php:45 pages/confirmation.php:46
9035
  #: pages/confirmation.php:52 pages/confirmation.php:102
@@ -9042,6 +9505,7 @@ msgstr ""
9042
  #: pages/confirmation.php:55 pages/invoice.php:31 pages/account.php:29
9043
  #: pages/account.php:33 pages/confirmation.php:48 pages/confirmation.php:49
9044
  #: pages/confirmation.php:55 pages/invoice.php:29 pages/invoice.php:30
 
9045
  msgid "Membership Expires"
9046
  msgstr ""
9047
 
@@ -9049,14 +9513,14 @@ msgstr ""
9049
  #: pages/account.php:109 pages/confirmation.php:61 pages/confirmation.php:63
9050
  #: pages/confirmation.php:69 pages/confirmation.php:79
9051
  #: pages/confirmation.php:82 pages/invoice.php:48 pages/invoice.php:50
9052
- #: pages/invoice.php:61
9053
  msgid "Payment Method"
9054
  msgstr ""
9055
 
9056
  #: pages/confirmation.php:80 pages/invoice.php:63 pages/confirmation.php:80
9057
  #: pages/confirmation.php:82 pages/confirmation.php:83
9058
- #: pages/confirmation.php:88 pages/invoice.php:62 pages/invoice.php:67
9059
- #: pages/invoice.php:69
9060
  msgid "ending in"
9061
  msgstr ""
9062
 
@@ -9064,13 +9528,15 @@ msgstr ""
9064
  #: pages/confirmation.php:61 pages/confirmation.php:63
9065
  #: pages/confirmation.php:65 pages/confirmation.php:71
9066
  #: pages/confirmation.php:88 pages/invoice.php:50 pages/invoice.php:52
9067
- #: pages/invoice.php:70 pages/invoice.php:90 pages/invoice.php:103
9068
- #: pages/invoice.php:107 pages/invoice.php:109 pages/invoice.php:110
 
9069
  msgid "Total Billed"
9070
  msgstr ""
9071
 
9072
  #: pages/confirmation.php:94 pages/invoice.php:77 pages/confirmation.php:94
9073
- #: pages/invoice.php:76 pages/invoice.php:80 pages/invoice.php:82
 
9074
  msgid "Coupon"
9075
  msgstr ""
9076
 
@@ -9093,7 +9559,8 @@ msgstr ""
9093
  #: pages/confirmation.php:132 pages/invoice.php:135 pages/confirmation.php:111
9094
  #: pages/confirmation.php:113 pages/confirmation.php:121
9095
  #: pages/confirmation.php:124 pages/confirmation.php:132 pages/invoice.php:121
9096
- #: pages/invoice.php:134 pages/invoice.php:139 pages/invoice.php:141
 
9097
  msgid "View Your Membership Account &rarr;"
9098
  msgstr ""
9099
 
@@ -9105,22 +9572,22 @@ msgid ""
9105
  "site owner."
9106
  msgstr ""
9107
 
9108
- #: pages/invoice.php:29
9109
  msgid "success"
9110
  msgstr ""
9111
 
9112
  #: pages/invoice.php:102 pages/invoice.php:88 pages/invoice.php:101
9113
- #: pages/invoice.php:106 pages/invoice.php:108
9114
  msgid "Invoice #"
9115
  msgstr ""
9116
 
9117
  #: pages/invoice.php:128 pages/invoice.php:114 pages/invoice.php:127
9118
- #: pages/invoice.php:132 pages/invoice.php:134
9119
  msgid "No invoices found."
9120
  msgstr ""
9121
 
9122
  #: pages/invoice.php:139 pages/invoice.php:125 pages/invoice.php:138
9123
- #: pages/invoice.php:143 pages/invoice.php:145
9124
  msgid "&larr; View All Invoices"
9125
  msgstr ""
9126
 
@@ -9157,42 +9624,46 @@ msgstr ""
9157
  msgid "&larr; Return to Home"
9158
  msgstr ""
9159
 
9160
- #: paid-memberships-pro.php:145 adminpages/orders.php:398
9161
  #: adminpages/orders.php:448 paid-memberships-pro.php:115
9162
  #: paid-memberships-pro.php:116 paid-memberships-pro.php:123
9163
  #: paid-memberships-pro.php:124 paid-memberships-pro.php:125
9164
  #: paid-memberships-pro.php:126 paid-memberships-pro.php:127
9165
  #: paid-memberships-pro.php:128 paid-memberships-pro.php:129
9166
  #: paid-memberships-pro.php:130 paid-memberships-pro.php:135
9167
- #: paid-memberships-pro.php:140
9168
  msgid "Testing Only"
9169
  msgstr ""
9170
 
9171
- #: paid-memberships-pro.php:150 paid-memberships-pro.php:120
9172
  #: paid-memberships-pro.php:121 paid-memberships-pro.php:128
9173
  #: paid-memberships-pro.php:129 paid-memberships-pro.php:130
9174
  #: paid-memberships-pro.php:131 paid-memberships-pro.php:132
9175
  #: paid-memberships-pro.php:133 paid-memberships-pro.php:134
9176
  #: paid-memberships-pro.php:135 paid-memberships-pro.php:140
9177
- #: paid-memberships-pro.php:145
9178
  msgid "PayPal Payflow Pro/PayPal Pro"
9179
  msgstr ""
9180
 
9181
- #: paid-memberships-pro.php:155 paid-memberships-pro.php:125
9182
  #: paid-memberships-pro.php:126 paid-memberships-pro.php:133
9183
  #: paid-memberships-pro.php:134 paid-memberships-pro.php:135
9184
  #: paid-memberships-pro.php:136 paid-memberships-pro.php:137
9185
  #: paid-memberships-pro.php:138 paid-memberships-pro.php:139
9186
  #: paid-memberships-pro.php:140 paid-memberships-pro.php:145
9187
- #: paid-memberships-pro.php:150
9188
  msgid "Cybersource"
9189
  msgstr ""
9190
 
9191
- #: paid-memberships-pro.php:176 paid-memberships-pro.php:156
 
 
 
 
9192
  #: paid-memberships-pro.php:157 paid-memberships-pro.php:158
9193
  #: paid-memberships-pro.php:159 paid-memberships-pro.php:160
9194
  #: paid-memberships-pro.php:161 paid-memberships-pro.php:166
9195
- #: paid-memberships-pro.php:171
9196
  msgid "Once a month"
9197
  msgstr ""
9198
 
@@ -9282,7 +9753,7 @@ msgstr ""
9282
  msgid "Your membership has been cancelled."
9283
  msgstr ""
9284
 
9285
- #: preheaders/checkout.php:34 preheaders/checkout.php:358
9286
  #: preheaders/checkout.php:28 preheaders/checkout.php:30
9287
  #: preheaders/checkout.php:31 preheaders/checkout.php:32
9288
  #: preheaders/checkout.php:34 preheaders/checkout.php:344
@@ -9294,22 +9765,23 @@ msgstr ""
9294
  msgid "Invalid gateway."
9295
  msgstr ""
9296
 
9297
- #: preheaders/checkout.php:68 preheaders/checkout.php:54
9298
- #: preheaders/checkout.php:88 preheaders/checkout.php:89
9299
- #: preheaders/checkout.php:91 preheaders/checkout.php:95
9300
- #: preheaders/checkout.php:96
9301
  msgid "Checkout: Payment Information"
9302
  msgstr ""
9303
 
9304
- #: preheaders/checkout.php:73 preheaders/checkout.php:59
9305
- #: preheaders/checkout.php:100 preheaders/checkout.php:101
 
9306
  msgid "Set Up Your Account"
9307
  msgstr ""
9308
 
9309
- #: preheaders/checkout.php:303 preheaders/checkout.php:289
9310
- #: preheaders/checkout.php:300 preheaders/checkout.php:304
9311
- #: preheaders/checkout.php:331 preheaders/checkout.php:416
9312
- #: preheaders/checkout.php:421
9313
  msgid "There are JavaScript errors on the page. Please contact the webmaster."
9314
  msgstr ""
9315
 
@@ -9341,69 +9813,71 @@ msgstr ""
9341
 
9342
  #: preheaders/checkout.php:382 preheaders/checkout.php:368
9343
  #: preheaders/checkout.php:377 preheaders/checkout.php:381
9344
- #: preheaders/checkout.php:410 preheaders/checkout.php:503
9345
- #: preheaders/checkout.php:510 preheaders/checkout.php:515
9346
- #: preheaders/checkout.php:518 preheaders/checkout.php:535
9347
- #: preheaders/checkout.php:536
9348
  msgid "That username is already taken. Please try another."
9349
  msgstr ""
9350
 
9351
  #: preheaders/checkout.php:387 preheaders/checkout.php:373
 
9352
  msgid ""
9353
  "That email address is already in use. Please log in, or use a different "
9354
  "email address."
9355
  msgstr ""
9356
 
9357
- #: preheaders/checkout.php:418 preheaders/checkout.php:397
9358
  #: preheaders/checkout.php:399 preheaders/checkout.php:404
9359
- #: preheaders/checkout.php:416 preheaders/checkout.php:420
9360
- #: preheaders/checkout.php:446 preheaders/checkout.php:525
9361
- #: preheaders/checkout.php:532 preheaders/checkout.php:537
9362
- #: preheaders/checkout.php:544 preheaders/checkout.php:561
9363
- #: preheaders/checkout.php:562
9364
  #, php-format
9365
  msgid "reCAPTCHA failed. (%s) Please try again."
9366
  msgstr ""
9367
 
9368
- #: preheaders/checkout.php:509 preheaders/checkout.php:482
9369
  #: preheaders/checkout.php:484 preheaders/checkout.php:491
9370
  #: preheaders/checkout.php:495 preheaders/checkout.php:496
9371
  #: preheaders/checkout.php:501 preheaders/checkout.php:505
9372
- #: preheaders/checkout.php:533 preheaders/checkout.php:647
9373
- #: preheaders/checkout.php:654 preheaders/checkout.php:659
9374
- #: preheaders/checkout.php:683 preheaders/checkout.php:701
9375
- #: preheaders/checkout.php:702
9376
  msgid "Payment accepted."
9377
  msgstr ""
9378
 
9379
- #: preheaders/checkout.php:515 preheaders/checkout.php:490
9380
  #: preheaders/checkout.php:492 preheaders/checkout.php:497
9381
  #: preheaders/checkout.php:501 preheaders/checkout.php:502
9382
  #: preheaders/checkout.php:509 preheaders/checkout.php:513
9383
- #: preheaders/checkout.php:539 preheaders/checkout.php:653
9384
- #: preheaders/checkout.php:660 preheaders/checkout.php:665
9385
- #: preheaders/checkout.php:691 preheaders/checkout.php:709
9386
- #: preheaders/checkout.php:710
9387
  msgid ""
9388
  "Unknown error generating account. Please contact us to set up your "
9389
  "membership."
9390
  msgstr ""
9391
 
9392
- #: preheaders/checkout.php:596 preheaders/checkout.php:550
9393
  #: preheaders/checkout.php:552 preheaders/checkout.php:569
9394
  #: preheaders/checkout.php:571 preheaders/checkout.php:572
9395
  #: preheaders/checkout.php:575 preheaders/checkout.php:576
9396
  #: preheaders/checkout.php:577 preheaders/checkout.php:581
9397
- #: preheaders/checkout.php:614 preheaders/checkout.php:785
9398
- #: preheaders/checkout.php:792 preheaders/checkout.php:797
9399
- #: preheaders/checkout.php:825 preheaders/checkout.php:844
9400
- #: preheaders/checkout.php:859 preheaders/checkout.php:860
 
9401
  msgid ""
9402
  "Your payment was accepted, but there was an error setting up your account. "
9403
  "Please contact us."
9404
  msgstr ""
9405
 
9406
- #: preheaders/checkout.php:826 preheaders/checkout.php:691
9407
  #: preheaders/checkout.php:693 preheaders/checkout.php:710
9408
  #: preheaders/checkout.php:712 preheaders/checkout.php:722
9409
  #: preheaders/checkout.php:730 preheaders/checkout.php:754
@@ -9419,7 +9893,7 @@ msgid ""
9419
  "submit this form again. Please contact the site owner to fix this issue."
9420
  msgstr ""
9421
 
9422
- #: preheaders/checkout.php:829 preheaders/checkout.php:694
9423
  #: preheaders/checkout.php:696 preheaders/checkout.php:713
9424
  #: preheaders/checkout.php:715 preheaders/checkout.php:725
9425
  #: preheaders/checkout.php:733 preheaders/checkout.php:757
@@ -9435,7 +9909,7 @@ msgid ""
9435
  "this form again. Please contact the site owner to fix this issue."
9436
  msgstr ""
9437
 
9438
- #: preheaders/checkout.php:840 preheaders/checkout.php:705
9439
  #: preheaders/checkout.php:707 preheaders/checkout.php:724
9440
  #: preheaders/checkout.php:726 preheaders/checkout.php:736
9441
  #: preheaders/checkout.php:744 preheaders/checkout.php:768
@@ -9451,7 +9925,7 @@ msgid ""
9451
  "will be processed."
9452
  msgstr ""
9453
 
9454
- #: preheaders/checkout.php:842 preheaders/checkout.php:707
9455
  #: preheaders/checkout.php:709 preheaders/checkout.php:726
9456
  #: preheaders/checkout.php:728 preheaders/checkout.php:738
9457
  #: preheaders/checkout.php:746 preheaders/checkout.php:770
@@ -9668,6 +10142,57 @@ msgid ""
9668
  "select customers."
9669
  msgstr ""
9670
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9671
  #: adminpages/emailsettings.php:63 adminpages/emailsettings.php:72
9672
  msgid ""
9673
  "To modify the appearance of system generated emails, add the files "
@@ -9736,6 +10261,20 @@ msgstr ""
9736
  msgid "every"
9737
  msgstr ""
9738
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9739
  #: adminpages/pagesettings.php:73
9740
  #, php-format
9741
  msgid "Membership %s"
@@ -9936,6 +10475,17 @@ msgstr ""
9936
  msgid "Your Secret Key appears incorrect."
9937
  msgstr ""
9938
 
 
 
 
 
 
 
 
 
 
 
 
9939
  #: classes/gateways/class.pmprogateway_twocheckout.php:139
9940
  msgid "API Private Key"
9941
  msgstr ""
6
  msgstr ""
7
  "Project-Id-Version: paid-memberships-pro\n"
8
  "Report-Msgid-Bugs-To: info@paidmembershipspro.com\n"
9
+ "POT-Creation-Date: 2019-09-13 12:49-0400\n"
10
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
11
  "Last-Translator: \n"
12
  "Language-Team: Stranger Studios <info@paidmembershipspro.com>\n"
59
  msgid "Check Again"
60
  msgstr ""
61
 
62
+ #: adminpages/addons.php:93 adminpages/orders.php:994 adminpages/addons.php:76
63
  #: adminpages/addons.php:79 adminpages/addons.php:92 adminpages/addons.php:93
64
  #: adminpages/orders.php:605 adminpages/orders.php:712
65
  #: adminpages/orders.php:741 adminpages/orders.php:850
103
  #: adminpages/addons.php:112 adminpages/membershiplevels.php:296
104
  #: adminpages/membershiplevels.php:298 adminpages/membershiplevels.php:300
105
  #: adminpages/membershiplevels.php:324 adminpages/membershiplevels.php:334
106
+ #: adminpages/membershiplevels.php:356 adminpages/membershiplevels.php:358
107
  msgid "Description"
108
  msgstr ""
109
 
171
  msgid "Activate %s"
172
  msgstr ""
173
 
174
+ #: adminpages/addons.php:231 adminpages/discountcodes.php:771
175
+ #: adminpages/membershiplevels.php:762 adminpages/orders.php:1358
176
+ #: adminpages/addons.php:213 adminpages/addons.php:216
177
+ #: adminpages/addons.php:229 adminpages/addons.php:231
178
  msgid "Delete"
179
  msgstr ""
180
 
209
  msgid "WordPress.org"
210
  msgstr ""
211
 
212
+ #: adminpages/addons.php:249 adminpages/orders.php:900
213
+ #: adminpages/orders.php:1429 adminpages/orders.php:1439
214
  #: includes/profile.php:186 shortcodes/pmpro_account.php:158
215
  #: adminpages/addons.php:231 adminpages/addons.php:234
216
  #: adminpages/addons.php:247 adminpages/addons.php:249
350
  msgstr ""
351
 
352
  #: adminpages/admin_header.php:135
353
+ #: classes/gateways/class.pmprogateway_stripe.php:71
354
  #: adminpages/admin_header.php:125 adminpages/admin_header.php:135
355
  #: classes/gateways/class.pmprogateway_stripe.php:66
356
  #: classes/gateways/class.pmprogateway_stripe.php:68
400
  msgid "Members"
401
  msgstr ""
402
 
403
+ #: adminpages/admin_header.php:196 adminpages/discountcodes.php:775
404
+ #: adminpages/orders.php:949 includes/adminpages.php:52
405
+ #: includes/adminpages.php:156 adminpages/admin_header.php:196
406
+ #: adminpages/orders.php:520 adminpages/orders.php:570
407
+ #: adminpages/orders.php:677 adminpages/orders.php:706
408
+ #: adminpages/orders.php:810 adminpages/orders.php:841
409
+ #: adminpages/orders.php:852 adminpages/orders.php:939
410
+ #: adminpages/orders.php:994 includes/adminpages.php:17
411
+ #: includes/adminpages.php:52 includes/adminpages.php:55
412
+ #: includes/adminpages.php:56 includes/adminpages.php:84
413
+ #: includes/adminpages.php:156 includes/adminpages.php:163
414
+ #: includes/adminpages.php:167 includes/adminpages.php:172
415
  msgid "Orders"
416
  msgstr ""
417
 
440
  msgid "Levels"
441
  msgstr ""
442
 
443
+ #: adminpages/admin_header.php:215 adminpages/membershiplevels.php:728
444
  #: adminpages/pagesettings.php:85 includes/metaboxes.php:130
445
  #: adminpages/admin_header.php:128 adminpages/admin_header.php:149
446
  #: adminpages/admin_header.php:150 adminpages/admin_header.php:159
452
  #: adminpages/membershiplevels.php:609 adminpages/membershiplevels.php:618
453
  #: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:631
454
  #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:700
455
+ #: adminpages/membershiplevels.php:702 adminpages/pagesettings.php:69
456
+ #: adminpages/pagesettings.php:70 adminpages/pagesettings.php:71
457
+ #: adminpages/pagesettings.php:85 includes/adminpages.php:44
458
+ #: includes/adminpages.php:64 includes/adminpages.php:65
459
+ #: includes/adminpages.php:69 includes/adminpages.php:70
460
+ #: includes/adminpages.php:100 includes/adminpages.php:107
461
+ #: includes/adminpages.php:111 includes/adminpages.php:116
462
+ #: includes/metaboxes.php:126 includes/metaboxes.php:130
463
+ #: includes/metaboxes.php:131 includes/metaboxes.php:132
464
  msgid "Membership Levels"
465
  msgstr ""
466
 
504
  msgstr ""
505
 
506
  #: adminpages/admin_header.php:231 adminpages/memberslist.php:168
507
+ #: adminpages/orders.php:372 adminpages/orders.php:1365
508
  #: shortcodes/pmpro_account.php:111 adminpages/admin_header.php:131
509
  #: adminpages/admin_header.php:152 adminpages/admin_header.php:162
510
  #: adminpages/admin_header.php:171 adminpages/admin_header.php:183
520
  #: adminpages/admin_header.php:231 adminpages/emailsettings.php:83
521
  #: includes/adminpages.php:61 adminpages/admin_header.php:231
522
  #: adminpages/emailsettings.php:60 adminpages/emailsettings.php:69
523
+ #: adminpages/emailsettings.php:79 adminpages/emailsettings.php:83
524
+ #: includes/adminpages.php:12 includes/adminpages.php:50
525
+ #: includes/adminpages.php:51 includes/adminpages.php:59
526
+ #: includes/adminpages.php:61 includes/adminpages.php:121
527
+ #: includes/adminpages.php:128 includes/adminpages.php:132
528
+ #: includes/adminpages.php:137
529
  msgid "Email Settings"
530
  msgstr ""
531
 
540
  #: includes/adminpages.php:62 adminpages/admin_header.php:235
541
  #: adminpages/advancedsettings.php:79 adminpages/advancedsettings.php:86
542
  #: adminpages/advancedsettings.php:88 adminpages/advancedsettings.php:91
543
+ #: adminpages/advancedsettings.php:107 adminpages/advancedsettings.php:109
544
+ #: includes/adminpages.php:13 includes/adminpages.php:51
545
+ #: includes/adminpages.php:52 includes/adminpages.php:62
546
+ #: includes/adminpages.php:64 includes/adminpages.php:128
547
+ #: includes/adminpages.php:135 includes/adminpages.php:139
548
+ #: includes/adminpages.php:144
549
  msgid "Advanced Settings"
550
  msgstr ""
551
 
564
  #: adminpages/advancedsettings.php:61 adminpages/advancedsettings.php:35
565
  #: adminpages/advancedsettings.php:42 adminpages/advancedsettings.php:43
566
  #: adminpages/advancedsettings.php:46 adminpages/advancedsettings.php:60
567
+ #: adminpages/advancedsettings.php:61
568
  msgid "Your advanced settings have been updated."
569
  msgstr ""
570
 
571
  #: adminpages/advancedsettings.php:87 adminpages/advancedsettings.php:66
572
  #: adminpages/advancedsettings.php:68 adminpages/advancedsettings.php:71
573
+ #: adminpages/advancedsettings.php:85 adminpages/advancedsettings.php:87
574
  #, php-format
575
  msgid ""
576
  "This content is for !!levels!! members only. <a href=\"%s\">Register here</"
579
 
580
  #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:71
581
  #: adminpages/advancedsettings.php:73 adminpages/advancedsettings.php:76
582
+ #: adminpages/advancedsettings.php:90 adminpages/advancedsettings.php:92
583
  #, php-format
584
  msgid ""
585
  "Please <a href=\"%s\">login</a> to view this content. (<a href=\"%s"
588
 
589
  #: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:76
590
  #: adminpages/advancedsettings.php:78 adminpages/advancedsettings.php:81
591
+ #: adminpages/advancedsettings.php:95 adminpages/advancedsettings.php:97
592
  msgid ""
593
  "This content is for members only. Visit the site and log in/register to read."
594
  msgstr ""
596
  #: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:85
597
  #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:94
598
  #: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:113
599
+ #: adminpages/advancedsettings.php:115
600
  msgid "Message for Logged-in Non-members"
601
  msgstr ""
602
 
603
  #: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:89
604
  #: adminpages/advancedsettings.php:96 adminpages/advancedsettings.php:98
605
  #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:117
606
+ #: adminpages/advancedsettings.php:119
607
  msgid ""
608
  "This message replaces the post content for non-members. Available variables"
609
  msgstr ""
611
  #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:94
612
  #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:103
613
  #: adminpages/advancedsettings.php:106 adminpages/advancedsettings.php:122
614
+ #: adminpages/advancedsettings.php:124
615
  msgid "Message for Logged-out Users"
616
  msgstr ""
617
 
618
  #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:98
619
  #: adminpages/advancedsettings.php:105 adminpages/advancedsettings.php:107
620
  #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:126
621
+ #: adminpages/advancedsettings.php:128
622
  msgid "This message replaces the post content for logged-out visitors."
623
  msgstr ""
624
 
625
  #: adminpages/advancedsettings.php:133 adminpages/advancedsettings.php:103
626
  #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:112
627
  #: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:131
628
+ #: adminpages/advancedsettings.php:133
629
  msgid "Message for RSS Feed"
630
  msgstr ""
631
 
632
  #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:107
633
  #: adminpages/advancedsettings.php:114 adminpages/advancedsettings.php:116
634
  #: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:135
635
+ #: adminpages/advancedsettings.php:137
636
  msgid "This message replaces the post content in RSS feeds."
637
  msgstr ""
638
 
639
  #: adminpages/advancedsettings.php:143 adminpages/advancedsettings.php:122
640
  #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:141
641
+ #: adminpages/advancedsettings.php:143
642
  msgid "Filter searches and archives?"
643
  msgstr ""
644
 
645
  #: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:126
646
  #: adminpages/advancedsettings.php:129 adminpages/advancedsettings.php:145
647
+ #: adminpages/advancedsettings.php:147
648
  msgid ""
649
  "No - Non-members will see restricted posts/pages in searches and archives."
650
  msgstr ""
651
 
652
  #: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:127
653
  #: adminpages/advancedsettings.php:130 adminpages/advancedsettings.php:146
654
+ #: adminpages/advancedsettings.php:148
655
  msgid ""
656
  "Yes - Only members will see restricted posts/pages in searches and archives."
657
  msgstr ""
659
  #: adminpages/advancedsettings.php:154 adminpages/advancedsettings.php:113
660
  #: adminpages/advancedsettings.php:120 adminpages/advancedsettings.php:133
661
  #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:152
662
+ #: adminpages/advancedsettings.php:154
663
  msgid "Show Excerpts to Non-Members?"
664
  msgstr ""
665
 
666
  #: adminpages/advancedsettings.php:158 adminpages/advancedsettings.php:117
667
  #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:137
668
  #: adminpages/advancedsettings.php:140 adminpages/advancedsettings.php:156
669
+ #: adminpages/advancedsettings.php:158
670
  msgid "No - Hide excerpts."
671
  msgstr ""
672
 
673
  #: adminpages/advancedsettings.php:159 adminpages/advancedsettings.php:118
674
  #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:138
675
  #: adminpages/advancedsettings.php:141 adminpages/advancedsettings.php:157
676
+ #: adminpages/advancedsettings.php:159
677
  msgid "Yes - Show excerpts."
678
  msgstr ""
679
 
680
  #: adminpages/advancedsettings.php:165 adminpages/advancedsettings.php:144
681
  #: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:163
682
+ #: adminpages/advancedsettings.php:165
683
  msgid "Hide Ads From Members?"
684
  msgstr ""
685
 
686
  #: adminpages/advancedsettings.php:169 adminpages/advancedsettings.php:228
687
+ #: adminpages/advancedsettings.php:240 adminpages/membershiplevels.php:779
688
+ #: adminpages/paymentsettings.php:253
689
+ #: classes/gateways/class.pmprogateway_stripe.php:321 includes/profile.php:125
690
  #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:135
691
  #: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:151
692
+ #: adminpages/advancedsettings.php:167 adminpages/advancedsettings.php:169
693
+ #: adminpages/advancedsettings.php:187 adminpages/advancedsettings.php:194
694
+ #: adminpages/advancedsettings.php:199 adminpages/advancedsettings.php:206
695
+ #: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:210
696
+ #: adminpages/advancedsettings.php:219 adminpages/advancedsettings.php:222
697
+ #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:228
698
+ #: adminpages/advancedsettings.php:238 adminpages/advancedsettings.php:240
699
+ #: adminpages/membershiplevels.php:563 adminpages/membershiplevels.php:569
700
+ #: adminpages/membershiplevels.php:571 adminpages/membershiplevels.php:578
701
+ #: adminpages/membershiplevels.php:598 adminpages/membershiplevels.php:658
702
+ #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
703
+ #: adminpages/membershiplevels.php:667 adminpages/membershiplevels.php:668
704
+ #: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:684
705
+ #: adminpages/membershiplevels.php:694 adminpages/membershiplevels.php:744
706
+ #: adminpages/membershiplevels.php:746 adminpages/paymentsettings.php:210
707
  #: adminpages/paymentsettings.php:219 adminpages/paymentsettings.php:236
708
  #: adminpages/paymentsettings.php:414 adminpages/paymentsettings.php:429
709
  #: adminpages/paymentsettings.php:434 adminpages/paymentsettings.php:436
719
  #: classes/gateways/class.pmprogateway_stripe.php:222
720
  #: classes/gateways/class.pmprogateway_stripe.php:249
721
  #: classes/gateways/class.pmprogateway_stripe.php:281
722
+ #: classes/gateways/class.pmprogateway_stripe.php:283
723
  #: classes/gateways/class.pmprogateway_stripe.php:289
724
  #: classes/gateways/class.pmprogateway_stripe.php:291
725
  #: classes/gateways/class.pmprogateway_stripe.php:297
732
  #: adminpages/advancedsettings.php:170 adminpages/advancedsettings.php:129
733
  #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:149
734
  #: adminpages/advancedsettings.php:152 adminpages/advancedsettings.php:168
735
+ #: adminpages/advancedsettings.php:170
736
  msgid "Hide Ads From All Members"
737
  msgstr ""
738
 
739
  #: adminpages/advancedsettings.php:171 adminpages/advancedsettings.php:130
740
  #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:150
741
  #: adminpages/advancedsettings.php:153 adminpages/advancedsettings.php:169
742
+ #: adminpages/advancedsettings.php:171
743
  msgid "Hide Ads From Certain Members"
744
  msgstr ""
745
 
746
  #: adminpages/advancedsettings.php:178 adminpages/advancedsettings.php:137
747
  #: adminpages/advancedsettings.php:144 adminpages/advancedsettings.php:157
748
  #: adminpages/advancedsettings.php:160 adminpages/advancedsettings.php:176
749
+ #: adminpages/advancedsettings.php:178
750
  msgid "Ads from the following plugins will be automatically turned off"
751
  msgstr ""
752
 
753
  #: adminpages/advancedsettings.php:179 adminpages/advancedsettings.php:138
754
  #: adminpages/advancedsettings.php:145 adminpages/advancedsettings.php:158
755
  #: adminpages/advancedsettings.php:161 adminpages/advancedsettings.php:177
756
+ #: adminpages/advancedsettings.php:179
757
  msgid "To hide ads in your template code, use code like the following"
758
  msgstr ""
759
 
760
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:149
761
  #: adminpages/advancedsettings.php:156 adminpages/advancedsettings.php:169
762
  #: adminpages/advancedsettings.php:172 adminpages/advancedsettings.php:188
763
+ #: adminpages/advancedsettings.php:190
764
  msgid "Choose Levels to Hide Ads From"
765
  msgstr ""
766
 
767
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:183
768
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203
769
  #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:222
770
+ #: adminpages/advancedsettings.php:224
771
  msgid "Redirect all traffic from registration page to /susbcription/?"
772
  msgstr ""
773
 
774
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:183
775
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203
776
  #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:222
777
+ #: adminpages/advancedsettings.php:224
778
  msgid "multisite only"
779
  msgstr ""
780
 
781
+ #: adminpages/advancedsettings.php:229 adminpages/membershiplevels.php:779
782
+ #: adminpages/paymentsettings.php:254
783
+ #: classes/gateways/class.pmprogateway_stripe.php:323 includes/profile.php:126
784
  #: adminpages/advancedsettings.php:188 adminpages/advancedsettings.php:195
785
  #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:211
786
+ #: adminpages/advancedsettings.php:227 adminpages/advancedsettings.php:229
787
+ #: adminpages/membershiplevels.php:563 adminpages/membershiplevels.php:569
788
+ #: adminpages/membershiplevels.php:571 adminpages/membershiplevels.php:578
789
+ #: adminpages/membershiplevels.php:598 adminpages/membershiplevels.php:658
790
+ #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
791
+ #: adminpages/membershiplevels.php:667 adminpages/membershiplevels.php:668
792
+ #: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:684
793
+ #: adminpages/membershiplevels.php:694 adminpages/membershiplevels.php:744
794
+ #: adminpages/membershiplevels.php:746 adminpages/paymentsettings.php:211
795
  #: adminpages/paymentsettings.php:220 adminpages/paymentsettings.php:237
796
  #: adminpages/paymentsettings.php:415 adminpages/paymentsettings.php:424
797
  #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:435
807
  #: classes/gateways/class.pmprogateway_stripe.php:223
808
  #: classes/gateways/class.pmprogateway_stripe.php:250
809
  #: classes/gateways/class.pmprogateway_stripe.php:282
810
+ #: classes/gateways/class.pmprogateway_stripe.php:284
811
  #: classes/gateways/class.pmprogateway_stripe.php:290
812
  #: classes/gateways/class.pmprogateway_stripe.php:292
813
  #: classes/gateways/class.pmprogateway_stripe.php:298
820
  #: adminpages/advancedsettings.php:236 adminpages/advancedsettings.php:195
821
  #: adminpages/advancedsettings.php:202 adminpages/advancedsettings.php:215
822
  #: adminpages/advancedsettings.php:218 adminpages/advancedsettings.php:234
823
+ #: adminpages/advancedsettings.php:236
824
  msgid "Use reCAPTCHA?"
825
  msgstr ""
826
 
827
  #: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:200
828
  #: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:220
829
  #: adminpages/advancedsettings.php:223 adminpages/advancedsettings.php:239
830
+ #: adminpages/advancedsettings.php:241
831
  msgid "Yes - Free memberships only."
832
  msgstr ""
833
 
834
  #: adminpages/advancedsettings.php:242 adminpages/advancedsettings.php:201
835
  #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:221
836
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:240
837
+ #: adminpages/advancedsettings.php:242
838
  msgid "Yes - All memberships."
839
  msgstr ""
840
 
841
  #: adminpages/advancedsettings.php:244 adminpages/advancedsettings.php:203
842
  #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223
843
  #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:242
844
+ #: adminpages/advancedsettings.php:244
845
  msgid "A free reCAPTCHA key is required."
846
  msgstr ""
847
 
848
  #: adminpages/advancedsettings.php:244 adminpages/advancedsettings.php:203
849
  #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223
850
  #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:242
851
+ #: adminpages/advancedsettings.php:244
852
  msgid "Click here to signup for reCAPTCHA"
853
  msgstr ""
854
 
855
+ #: adminpages/advancedsettings.php:250 adminpages/advancedsettings.php:250
856
  msgid "reCAPTCHA Version"
857
  msgstr ""
858
 
859
+ #: adminpages/advancedsettings.php:252 adminpages/advancedsettings.php:252
860
  msgid " v2 - Checkbox"
861
  msgstr ""
862
 
863
+ #: adminpages/advancedsettings.php:253 adminpages/advancedsettings.php:253
864
  msgid "v3 - Invisible"
865
  msgstr ""
866
 
867
+ #: adminpages/advancedsettings.php:255 adminpages/advancedsettings.php:255
868
  msgid "Changing your version will require new API keys."
869
  msgstr ""
870
 
871
  #: adminpages/advancedsettings.php:257 adminpages/advancedsettings.php:248
872
+ #: adminpages/advancedsettings.php:257
873
  msgid "reCAPTCHA Site Key"
874
  msgstr ""
875
 
876
  #: adminpages/advancedsettings.php:260 adminpages/advancedsettings.php:251
877
+ #: adminpages/advancedsettings.php:260
878
  msgid "reCAPTCHA Secret Key"
879
  msgstr ""
880
 
881
  #: adminpages/advancedsettings.php:266 adminpages/advancedsettings.php:218
882
  #: adminpages/advancedsettings.php:225 adminpages/advancedsettings.php:238
883
  #: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:257
884
+ #: adminpages/advancedsettings.php:266
885
  msgid "Require Terms of Service on signups?"
886
  msgstr ""
887
 
888
  #: adminpages/advancedsettings.php:273 adminpages/advancedsettings.php:225
889
  #: adminpages/advancedsettings.php:232 adminpages/advancedsettings.php:245
890
  #: adminpages/advancedsettings.php:248 adminpages/advancedsettings.php:264
891
+ #: adminpages/advancedsettings.php:273
892
  msgid ""
893
  "If yes, create a WordPress page containing your TOS agreement and assign it "
894
  "using the dropdown above."
895
  msgstr ""
896
 
897
  #: adminpages/advancedsettings.php:384 adminpages/pagesettings.php:315
898
+ #: adminpages/paymentsettings.php:284 adminpages/advancedsettings.php:284
899
  #: adminpages/advancedsettings.php:355 adminpages/advancedsettings.php:359
900
  #: adminpages/advancedsettings.php:368 adminpages/advancedsettings.php:375
901
+ #: adminpages/advancedsettings.php:384 adminpages/pagesettings.php:209
902
+ #: adminpages/pagesettings.php:223 adminpages/pagesettings.php:251
903
+ #: adminpages/pagesettings.php:254 adminpages/pagesettings.php:294
904
+ #: adminpages/pagesettings.php:295 adminpages/pagesettings.php:310
905
+ #: adminpages/pagesettings.php:315 adminpages/paymentsettings.php:238
906
+ #: adminpages/paymentsettings.php:250 adminpages/paymentsettings.php:267
907
+ #: adminpages/paymentsettings.php:485 adminpages/paymentsettings.php:526
908
+ #: adminpages/paymentsettings.php:532 adminpages/paymentsettings.php:534
909
  msgid "Save Settings"
910
  msgstr ""
911
 
993
  msgstr ""
994
 
995
  #: adminpages/dashboard.php:215 adminpages/memberslist.php:165
996
+ #: pages/checkout.php:118 shortcodes/pmpro_account.php:110
997
  #: adminpages/dashboard.php:215 adminpages/dashboard.php:223
998
  #: adminpages/memberslist.php:112 adminpages/memberslist.php:145
999
  #: adminpages/memberslist.php:155 adminpages/memberslist.php:165
1063
  msgstr ""
1064
 
1065
  #: adminpages/dashboard.php:282 adminpages/discountcodes.php:447
1066
+ #: adminpages/discountcodes.php:747 adminpages/orders.php:409
1067
+ #: adminpages/orders.php:1308 adminpages/dashboard.php:282
1068
  #: adminpages/dashboard.php:290 adminpages/discountcodes.php:311
1069
  #: adminpages/discountcodes.php:314 adminpages/discountcodes.php:315
1070
  #: adminpages/discountcodes.php:316 adminpages/discountcodes.php:321
1087
  msgid "Code"
1088
  msgstr ""
1089
 
1090
+ #: adminpages/dashboard.php:283 adminpages/orders.php:1309
1091
  #: adminpages/reports/login.php:179
1092
  #: classes/gateways/class.pmprogateway_payflowpro.php:116
1093
  #: adminpages/dashboard.php:283 adminpages/dashboard.php:291
1104
  msgid "User"
1105
  msgstr ""
1106
 
1107
+ #: adminpages/dashboard.php:284 includes/privacy.php:241 pages/billing.php:49
1108
  #: pages/cancel.php:60 pages/invoice.php:103 pages/levels.php:35
1109
  #: shortcodes/pmpro_account.php:44 shortcodes/pmpro_account.php:128
1110
  #: adminpages/dashboard.php:284 adminpages/dashboard.php:292
1113
  #: pages/billing.php:27 pages/billing.php:28 pages/billing.php:30
1114
  #: pages/billing.php:41 pages/billing.php:44 pages/billing.php:45
1115
  #: pages/cancel.php:52 pages/cancel.php:60 pages/cancel.php:61
1116
+ #: pages/invoice.php:89 pages/invoice.php:102 pages/invoice.php:103
1117
+ #: pages/invoice.php:109 pages/levels.php:13 pages/levels.php:35
1118
+ #: shortcodes/pmpro_account.php:43 shortcodes/pmpro_account.php:44
1119
+ #: shortcodes/pmpro_account.php:123 shortcodes/pmpro_account.php:125
1120
+ #: shortcodes/pmpro_account.php:126 shortcodes/pmpro_account.php:128
1121
  msgid "Level"
1122
  msgstr ""
1123
 
1124
+ #: adminpages/dashboard.php:285 adminpages/orders.php:627
1125
+ #: adminpages/orders.php:1312 adminpages/templates/orders-email.php:64
1126
  #: adminpages/templates/orders-print.php:93 includes/privacy.php:285
1127
  #: pages/confirmation.php:96 pages/invoice.php:79 adminpages/dashboard.php:285
1128
  #: adminpages/dashboard.php:293 adminpages/orders.php:320
1137
  #: adminpages/orders.php:1236 adminpages/orders.php:1357
1138
  #: adminpages/templates/orders-email.php:64
1139
  #: adminpages/templates/orders-print.php:93 includes/privacy.php:285
1140
+ #: pages/confirmation.php:96 pages/invoice.php:78 pages/invoice.php:79
1141
+ #: pages/invoice.php:82 pages/invoice.php:84
1142
  msgid "Total"
1143
  msgstr ""
1144
 
1145
+ #: adminpages/dashboard.php:286 adminpages/orders.php:712
1146
+ #: adminpages/orders.php:1316 includes/privacy.php:202 includes/privacy.php:309
1147
  #: pages/invoice.php:29 shortcodes/pmpro_account.php:130
1148
  #: adminpages/dashboard.php:286 adminpages/dashboard.php:294
1149
  #: adminpages/orders.php:373 adminpages/orders.php:423
1156
  #: adminpages/orders.php:1112 adminpages/orders.php:1143
1157
  #: adminpages/orders.php:1149 adminpages/orders.php:1240
1158
  #: adminpages/orders.php:1361 includes/privacy.php:202 includes/privacy.php:309
1159
+ #: pages/invoice.php:29 shortcodes/pmpro_account.php:130
1160
  msgid "Status"
1161
  msgstr ""
1162
 
1163
+ #: adminpages/dashboard.php:287 adminpages/orders.php:815
1164
+ #: adminpages/orders.php:1317 pages/invoice.php:101
1165
  #: shortcodes/pmpro_account.php:127 adminpages/dashboard.php:287
1166
  #: adminpages/dashboard.php:295 adminpages/orders.php:442
1167
  #: adminpages/orders.php:492 adminpages/orders.php:493
1174
  #: adminpages/orders.php:1113 adminpages/orders.php:1144
1175
  #: adminpages/orders.php:1150 adminpages/orders.php:1241
1176
  #: adminpages/orders.php:1362 pages/account.php:91 pages/invoice.php:87
1177
+ #: pages/invoice.php:100 pages/invoice.php:101 pages/invoice.php:105
1178
+ #: pages/invoice.php:107 shortcodes/pmpro_account.php:122
1179
+ #: shortcodes/pmpro_account.php:124 shortcodes/pmpro_account.php:125
1180
+ #: shortcodes/pmpro_account.php:127
1181
  msgid "Date"
1182
  msgstr ""
1183
 
1184
+ #: adminpages/dashboard.php:294 adminpages/orders.php:1462
1185
  #: adminpages/dashboard.php:294 adminpages/dashboard.php:302
1186
  #: adminpages/orders.php:674 adminpages/orders.php:977
1187
  #: adminpages/orders.php:995 adminpages/orders.php:1005
1192
  msgid "No orders found."
1193
  msgstr ""
1194
 
1195
+ #: adminpages/dashboard.php:311 adminpages/orders.php:1345
1196
  #: adminpages/dashboard.php:311 adminpages/dashboard.php:319
1197
  #: adminpages/orders.php:630 adminpages/orders.php:933
1198
  #: adminpages/orders.php:943 adminpages/orders.php:972
1202
  msgid "deleted"
1203
  msgstr ""
1204
 
1205
+ #: adminpages/dashboard.php:313 adminpages/orders.php:1347
1206
  #: adminpages/dashboard.php:313 adminpages/dashboard.php:321
1207
  #: adminpages/orders.php:1275 adminpages/orders.php:1397
1208
  msgid "none"
1329
  msgstr ""
1330
 
1331
  #: adminpages/discountcodes.php:442 adminpages/discountcodes.php:746
1332
+ #: adminpages/membershiplevels.php:346 adminpages/membershiplevels.php:741
1333
+ #: adminpages/memberslist.php:164 adminpages/orders.php:1307
1334
  #: adminpages/reports/login.php:178 adminpages/templates/orders-email.php:46
1335
  #: adminpages/templates/orders-print.php:75 adminpages/discountcodes.php:306
1336
  #: adminpages/discountcodes.php:309 adminpages/discountcodes.php:310
1344
  #: adminpages/membershiplevels.php:284 adminpages/membershiplevels.php:286
1345
  #: adminpages/membershiplevels.php:288 adminpages/membershiplevels.php:312
1346
  #: adminpages/membershiplevels.php:322 adminpages/membershiplevels.php:344
1347
+ #: adminpages/membershiplevels.php:346 adminpages/membershiplevels.php:505
1348
+ #: adminpages/membershiplevels.php:511 adminpages/membershiplevels.php:513
1349
+ #: adminpages/membershiplevels.php:540 adminpages/membershiplevels.php:541
1350
+ #: adminpages/membershiplevels.php:583 adminpages/membershiplevels.php:629
1351
+ #: adminpages/membershiplevels.php:631 adminpages/membershiplevels.php:636
1352
+ #: adminpages/membershiplevels.php:637 adminpages/membershiplevels.php:641
1353
+ #: adminpages/membershiplevels.php:653 adminpages/membershiplevels.php:663
1354
+ #: adminpages/membershiplevels.php:713 adminpages/membershiplevels.php:715
1355
  #: adminpages/memberslist.php:111 adminpages/memberslist.php:144
1356
  #: adminpages/memberslist.php:154 adminpages/memberslist.php:164
1357
  #: adminpages/orders.php:597 adminpages/orders.php:900
1366
  msgid "ID"
1367
  msgstr ""
1368
 
1369
+ #: adminpages/discountcodes.php:443 adminpages/orders.php:402
1370
  #: adminpages/discountcodes.php:307 adminpages/discountcodes.php:310
1371
  #: adminpages/discountcodes.php:311 adminpages/discountcodes.php:312
1372
  #: adminpages/discountcodes.php:317 adminpages/discountcodes.php:382
1389
  msgstr ""
1390
 
1391
  #: adminpages/discountcodes.php:503
1392
+ #: classes/gateways/class.pmprogateway_braintree.php:479
1393
+ #: classes/gateways/class.pmprogateway_stripe.php:565 pages/billing.php:321
1394
+ #: pages/checkout.php:389 adminpages/discountcodes.php:367
1395
  #: adminpages/discountcodes.php:370 adminpages/discountcodes.php:371
1396
  #: adminpages/discountcodes.php:372 adminpages/discountcodes.php:377
1397
  #: adminpages/discountcodes.php:442 adminpages/discountcodes.php:483
1419
  #: classes/gateways/class.pmprogateway_stripe.php:532
1420
  #: classes/gateways/class.pmprogateway_stripe.php:570
1421
  #: classes/gateways/class.pmprogateway_stripe.php:597
1422
+ #: classes/gateways/class.pmprogateway_stripe.php:598
1423
  #: classes/gateways/class.pmprogateway_stripe.php:613
1424
  #: classes/gateways/class.pmprogateway_stripe.php:621
1425
  #: classes/gateways/class.pmprogateway_stripe.php:628
1472
  #: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:339
1473
  #: adminpages/membershiplevels.php:341 adminpages/membershiplevels.php:342
1474
  #: adminpages/membershiplevels.php:365 adminpages/membershiplevels.php:375
1475
+ #: adminpages/membershiplevels.php:398 adminpages/membershiplevels.php:400
1476
+ #: adminpages/membershiplevels.php:507 adminpages/membershiplevels.php:513
1477
+ #: adminpages/membershiplevels.php:515 adminpages/membershiplevels.php:542
1478
+ #: pages/levels.php:14
1479
  msgid "Initial Payment"
1480
  msgstr ""
1481
 
1488
  #: adminpages/membershiplevels.php:340 adminpages/membershiplevels.php:350
1489
  #: adminpages/membershiplevels.php:352 adminpages/membershiplevels.php:353
1490
  #: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:386
1491
+ #: adminpages/membershiplevels.php:409 adminpages/membershiplevels.php:411
1492
  msgid "The initial amount collected at registration."
1493
  msgstr ""
1494
 
1501
  #: adminpages/membershiplevels.php:344 adminpages/membershiplevels.php:354
1502
  #: adminpages/membershiplevels.php:356 adminpages/membershiplevels.php:357
1503
  #: adminpages/membershiplevels.php:380 adminpages/membershiplevels.php:390
1504
+ #: adminpages/membershiplevels.php:413 adminpages/membershiplevels.php:415
1505
  msgid "Recurring Subscription"
1506
  msgstr ""
1507
 
1514
  #: adminpages/membershiplevels.php:345 adminpages/membershiplevels.php:355
1515
  #: adminpages/membershiplevels.php:357 adminpages/membershiplevels.php:358
1516
  #: adminpages/membershiplevels.php:381 adminpages/membershiplevels.php:391
1517
+ #: adminpages/membershiplevels.php:414 adminpages/membershiplevels.php:416
1518
  msgid "Check if this level has a recurring subscription payment."
1519
  msgstr ""
1520
 
1527
  #: adminpages/membershiplevels.php:359 adminpages/membershiplevels.php:361
1528
  #: adminpages/membershiplevels.php:362 adminpages/membershiplevels.php:385
1529
  #: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:418
1530
+ #: adminpages/membershiplevels.php:420
1531
  msgid "Billing Amount"
1532
  msgstr ""
1533
 
1534
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1535
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1536
+ #: classes/gateways/class.pmprogateway_stripe.php:608
1537
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1538
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1539
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
1546
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1547
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1548
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1549
+ #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:449
1550
+ #: adminpages/membershiplevels.php:476 adminpages/membershiplevels.php:477
1551
+ #: adminpages/membershiplevels.php:479 adminpages/membershiplevels.php:480
1552
+ #: adminpages/membershiplevels.php:501 adminpages/membershiplevels.php:511
1553
+ #: adminpages/membershiplevels.php:535 adminpages/membershiplevels.php:537
1554
  #: classes/gateways/class.pmprogateway_stripe.php:521
1555
  #: classes/gateways/class.pmprogateway_stripe.php:522
1556
  #: classes/gateways/class.pmprogateway_stripe.php:532
1562
  #: classes/gateways/class.pmprogateway_stripe.php:588
1563
  #: classes/gateways/class.pmprogateway_stripe.php:599
1564
  #: classes/gateways/class.pmprogateway_stripe.php:637
1565
+ #: classes/gateways/class.pmprogateway_stripe.php:655
1566
  #: classes/gateways/class.pmprogateway_stripe.php:664
1567
  #: classes/gateways/class.pmprogateway_stripe.php:671
1568
  #: classes/gateways/class.pmprogateway_stripe.php:679
1574
 
1575
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1576
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1577
+ #: classes/gateways/class.pmprogateway_stripe.php:610
1578
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1579
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1580
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
1587
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1588
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1589
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1590
+ #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:449
1591
+ #: adminpages/membershiplevels.php:476 adminpages/membershiplevels.php:477
1592
+ #: adminpages/membershiplevels.php:479 adminpages/membershiplevels.php:480
1593
+ #: adminpages/membershiplevels.php:501 adminpages/membershiplevels.php:511
1594
+ #: adminpages/membershiplevels.php:535 adminpages/membershiplevels.php:537
1595
  #: classes/gateways/class.pmprogateway_stripe.php:521
1596
  #: classes/gateways/class.pmprogateway_stripe.php:522
1597
  #: classes/gateways/class.pmprogateway_stripe.php:532
1603
  #: classes/gateways/class.pmprogateway_stripe.php:588
1604
  #: classes/gateways/class.pmprogateway_stripe.php:599
1605
  #: classes/gateways/class.pmprogateway_stripe.php:637
1606
+ #: classes/gateways/class.pmprogateway_stripe.php:655
1607
  #: classes/gateways/class.pmprogateway_stripe.php:664
1608
  #: classes/gateways/class.pmprogateway_stripe.php:671
1609
  #: classes/gateways/class.pmprogateway_stripe.php:679
1615
 
1616
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1617
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1618
+ #: classes/gateways/class.pmprogateway_stripe.php:609
1619
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1620
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1621
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
1628
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1629
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1630
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1631
+ #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:449
1632
+ #: adminpages/membershiplevels.php:476 adminpages/membershiplevels.php:477
1633
+ #: adminpages/membershiplevels.php:479 adminpages/membershiplevels.php:480
1634
+ #: adminpages/membershiplevels.php:501 adminpages/membershiplevels.php:511
1635
+ #: adminpages/membershiplevels.php:535 adminpages/membershiplevels.php:537
1636
  #: classes/gateways/class.pmprogateway_stripe.php:521
1637
  #: classes/gateways/class.pmprogateway_stripe.php:522
1638
  #: classes/gateways/class.pmprogateway_stripe.php:532
1644
  #: classes/gateways/class.pmprogateway_stripe.php:588
1645
  #: classes/gateways/class.pmprogateway_stripe.php:599
1646
  #: classes/gateways/class.pmprogateway_stripe.php:637
1647
+ #: classes/gateways/class.pmprogateway_stripe.php:655
1648
  #: classes/gateways/class.pmprogateway_stripe.php:664
1649
  #: classes/gateways/class.pmprogateway_stripe.php:671
1650
  #: classes/gateways/class.pmprogateway_stripe.php:679
1656
 
1657
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1658
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1659
+ #: classes/gateways/class.pmprogateway_stripe.php:611
1660
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1661
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1662
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
1669
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1670
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1671
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1672
+ #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:449
1673
+ #: adminpages/membershiplevels.php:476 adminpages/membershiplevels.php:477
1674
+ #: adminpages/membershiplevels.php:479 adminpages/membershiplevels.php:480
1675
+ #: adminpages/membershiplevels.php:501 adminpages/membershiplevels.php:511
1676
+ #: adminpages/membershiplevels.php:535 adminpages/membershiplevels.php:537
1677
  #: classes/gateways/class.pmprogateway_stripe.php:521
1678
  #: classes/gateways/class.pmprogateway_stripe.php:522
1679
  #: classes/gateways/class.pmprogateway_stripe.php:532
1685
  #: classes/gateways/class.pmprogateway_stripe.php:588
1686
  #: classes/gateways/class.pmprogateway_stripe.php:599
1687
  #: classes/gateways/class.pmprogateway_stripe.php:637
1688
+ #: classes/gateways/class.pmprogateway_stripe.php:655
1689
  #: classes/gateways/class.pmprogateway_stripe.php:664
1690
  #: classes/gateways/class.pmprogateway_stripe.php:671
1691
  #: classes/gateways/class.pmprogateway_stripe.php:679
1704
  #: adminpages/membershiplevels.php:364 adminpages/membershiplevels.php:383
1705
  #: adminpages/membershiplevels.php:385 adminpages/membershiplevels.php:386
1706
  #: adminpages/membershiplevels.php:409 adminpages/membershiplevels.php:419
1707
+ #: adminpages/membershiplevels.php:442 adminpages/membershiplevels.php:444
1708
  msgid "The amount to be billed one cycle after the initial payment."
1709
  msgstr ""
1710
 
1718
  #: adminpages/membershiplevels.php:403 adminpages/membershiplevels.php:404
1719
  #: adminpages/membershiplevels.php:425 adminpages/membershiplevels.php:435
1720
  #: adminpages/membershiplevels.php:438 adminpages/membershiplevels.php:459
1721
+ #: adminpages/membershiplevels.php:461
1722
  msgid "Billing Cycle Limit"
1723
  msgstr ""
1724
 
1732
  #: adminpages/membershiplevels.php:407 adminpages/membershiplevels.php:408
1733
  #: adminpages/membershiplevels.php:429 adminpages/membershiplevels.php:439
1734
  #: adminpages/membershiplevels.php:442 adminpages/membershiplevels.php:463
1735
+ #: adminpages/membershiplevels.php:465
1736
  msgid ""
1737
  "The <strong>total</strong> number of recurring billing cycles for this "
1738
  "level, including the trial period (if applicable) but not including the "
1748
  #: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:414
1749
  #: adminpages/membershiplevels.php:416 adminpages/membershiplevels.php:417
1750
  #: adminpages/membershiplevels.php:438 adminpages/membershiplevels.php:448
1751
+ #: adminpages/membershiplevels.php:472 adminpages/membershiplevels.php:474
1752
  msgid "Custom Trial"
1753
  msgstr ""
1754
 
1762
  #: adminpages/membershiplevels.php:416 adminpages/membershiplevels.php:418
1763
  #: adminpages/membershiplevels.php:419 adminpages/membershiplevels.php:440
1764
  #: adminpages/membershiplevels.php:450 adminpages/membershiplevels.php:474
1765
+ #: adminpages/membershiplevels.php:476
1766
  msgid "Check to add a custom trial period."
1767
  msgstr ""
1768
 
1776
  #: adminpages/membershiplevels.php:425 adminpages/membershiplevels.php:427
1777
  #: adminpages/membershiplevels.php:428 adminpages/membershiplevels.php:449
1778
  #: adminpages/membershiplevels.php:459 adminpages/membershiplevels.php:483
1779
+ #: adminpages/membershiplevels.php:485
1780
  msgid "Trial Billing Amount"
1781
  msgstr ""
1782
 
1790
  #: adminpages/membershiplevels.php:436 adminpages/membershiplevels.php:438
1791
  #: adminpages/membershiplevels.php:439 adminpages/membershiplevels.php:460
1792
  #: adminpages/membershiplevels.php:470 adminpages/membershiplevels.php:494
1793
+ #: adminpages/membershiplevels.php:496
1794
  msgid "for the first"
1795
  msgstr ""
1796
 
1804
  #: adminpages/membershiplevels.php:438 adminpages/membershiplevels.php:440
1805
  #: adminpages/membershiplevels.php:441 adminpages/membershiplevels.php:462
1806
  #: adminpages/membershiplevels.php:472 adminpages/membershiplevels.php:496
1807
+ #: adminpages/membershiplevels.php:498
1808
  msgid "subscription payments"
1809
  msgstr ""
1810
 
1818
  #: adminpages/membershiplevels.php:466 adminpages/membershiplevels.php:467
1819
  #: adminpages/membershiplevels.php:469 adminpages/membershiplevels.php:470
1820
  #: adminpages/membershiplevels.php:491 adminpages/membershiplevels.php:501
1821
+ #: adminpages/membershiplevels.php:525 adminpages/membershiplevels.php:527
1822
  msgid "Membership Expiration"
1823
  msgstr ""
1824
 
1832
  #: adminpages/membershiplevels.php:468 adminpages/membershiplevels.php:470
1833
  #: adminpages/membershiplevels.php:471 adminpages/membershiplevels.php:492
1834
  #: adminpages/membershiplevels.php:502 adminpages/membershiplevels.php:526
1835
+ #: adminpages/membershiplevels.php:528
1836
  msgid "Check this to set when membership access expires."
1837
  msgstr ""
1838
 
1846
  #: adminpages/membershiplevels.php:471 adminpages/membershiplevels.php:472
1847
  #: adminpages/membershiplevels.php:474 adminpages/membershiplevels.php:475
1848
  #: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:506
1849
+ #: adminpages/membershiplevels.php:530 adminpages/membershiplevels.php:532
1850
  msgid "Expires In"
1851
  msgstr ""
1852
 
1860
  #: adminpages/membershiplevels.php:485 adminpages/membershiplevels.php:487
1861
  #: adminpages/membershiplevels.php:488 adminpages/membershiplevels.php:509
1862
  #: adminpages/membershiplevels.php:519 adminpages/membershiplevels.php:543
1863
+ #: adminpages/membershiplevels.php:545
1864
  msgid ""
1865
  "Set the duration of membership access. Note that the any future payments "
1866
  "(recurring subscription, if any) will be cancelled when the membership "
1913
  msgid "Starts"
1914
  msgstr ""
1915
 
1916
+ #: adminpages/discountcodes.php:765 adminpages/membershiplevels.php:760
1917
+ #: adminpages/orders.php:1352
1918
+ msgid "Edit"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1919
  msgstr ""
1920
 
1921
+ #: adminpages/discountcodes.php:768 adminpages/membershiplevels.php:761
1922
+ #: adminpages/orders.php:1355
1923
+ msgid "Copy"
 
 
 
 
 
 
 
 
 
 
 
 
 
1924
  msgstr ""
1925
 
1926
+ #: adminpages/discountcodes.php:771 adminpages/discountcodes.php:617
1927
  #: adminpages/discountcodes.php:622 adminpages/discountcodes.php:650
1928
  #: adminpages/discountcodes.php:651 adminpages/discountcodes.php:652
1929
  #: adminpages/discountcodes.php:653 adminpages/discountcodes.php:658
1936
  "code anymore."
1937
  msgstr ""
1938
 
1939
+ #: adminpages/discountcodes.php:775
1940
+ msgid " View Orders"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1941
  msgstr ""
1942
 
1943
  #: adminpages/emailsettings.php:84 adminpages/emailsettings.php:61
1944
  #: adminpages/emailsettings.php:70 adminpages/emailsettings.php:80
1945
+ #: adminpages/emailsettings.php:84
1946
  msgid ""
1947
  "By default, system generated emails are sent from "
1948
  "<em><strong>wordpress@yourdomain.com</strong></em>. You can update this from "
1950
  msgstr ""
1951
 
1952
  #: adminpages/emailsettings.php:86 adminpages/emailsettings.php:82
1953
+ #: adminpages/emailsettings.php:86
1954
  msgid ""
1955
  "To modify the appearance of system generated emails, add the files "
1956
  "<em>email_header.html</em> and <em>email_footer.html</em> to your theme's "
1964
 
1965
  #: adminpages/emailsettings.php:92 adminpages/emailsettings.php:69
1966
  #: adminpages/emailsettings.php:78 adminpages/emailsettings.php:88
1967
+ #: adminpages/emailsettings.php:92
1968
  msgid "From Email"
1969
  msgstr ""
1970
 
1971
  #: adminpages/emailsettings.php:100 adminpages/emailsettings.php:77
1972
  #: adminpages/emailsettings.php:86 adminpages/emailsettings.php:96
1973
+ #: adminpages/emailsettings.php:100
1974
  msgid "From Name"
1975
  msgstr ""
1976
 
1977
  #: adminpages/emailsettings.php:108 adminpages/emailsettings.php:94
1978
+ #: adminpages/emailsettings.php:104 adminpages/emailsettings.php:108
1979
  msgid "Only Filter PMPro Emails?"
1980
  msgstr ""
1981
 
1982
  #: adminpages/emailsettings.php:112 adminpages/emailsettings.php:98
1983
+ #: adminpages/emailsettings.php:108 adminpages/emailsettings.php:112
1984
  #, php-format
1985
  msgid ""
1986
  "If unchecked, all emails from \"WordPress &lt;%s&gt;\" will be filtered to "
1989
 
1990
  #: adminpages/emailsettings.php:129 adminpages/emailsettings.php:86
1991
  #: adminpages/emailsettings.php:104 adminpages/emailsettings.php:115
1992
+ #: adminpages/emailsettings.php:125 adminpages/emailsettings.php:129
1993
  msgid "Send the site admin emails"
1994
  msgstr ""
1995
 
1996
  #: adminpages/emailsettings.php:135 adminpages/emailsettings.php:92
1997
  #: adminpages/emailsettings.php:110 adminpages/emailsettings.php:121
1998
+ #: adminpages/emailsettings.php:131 adminpages/emailsettings.php:135
1999
  msgid "Checkout"
2000
  msgstr ""
2001
 
2002
  #: adminpages/emailsettings.php:139 adminpages/emailsettings.php:96
2003
  #: adminpages/emailsettings.php:114 adminpages/emailsettings.php:125
2004
+ #: adminpages/emailsettings.php:135 adminpages/emailsettings.php:139
2005
  msgid "when a member checks out."
2006
  msgstr ""
2007
 
2008
  #: adminpages/emailsettings.php:144 adminpages/emailsettings.php:101
2009
  #: adminpages/emailsettings.php:119 adminpages/emailsettings.php:130
2010
+ #: adminpages/emailsettings.php:140 adminpages/emailsettings.php:144
2011
  msgid "Admin Changes"
2012
  msgstr ""
2013
 
2014
  #: adminpages/emailsettings.php:148 adminpages/emailsettings.php:105
2015
  #: adminpages/emailsettings.php:123 adminpages/emailsettings.php:134
2016
+ #: adminpages/emailsettings.php:144 adminpages/emailsettings.php:148
2017
  msgid "when an admin changes a user's membership level through the dashboard."
2018
  msgstr ""
2019
 
2020
  #: adminpages/emailsettings.php:153 adminpages/emailsettings.php:110
2021
  #: adminpages/emailsettings.php:128 adminpages/emailsettings.php:139
2022
+ #: adminpages/emailsettings.php:149 adminpages/emailsettings.php:153
2023
  msgid "Cancellation"
2024
  msgstr ""
2025
 
2026
  #: adminpages/emailsettings.php:157 adminpages/emailsettings.php:114
2027
  #: adminpages/emailsettings.php:132 adminpages/emailsettings.php:143
2028
+ #: adminpages/emailsettings.php:153 adminpages/emailsettings.php:157
2029
  msgid "when a user cancels his or her account."
2030
  msgstr ""
2031
 
2032
  #: adminpages/emailsettings.php:162 adminpages/emailsettings.php:119
2033
  #: adminpages/emailsettings.php:137 adminpages/emailsettings.php:148
2034
+ #: adminpages/emailsettings.php:158 adminpages/emailsettings.php:162
2035
  msgid "Bill Updates"
2036
  msgstr ""
2037
 
2038
  #: adminpages/emailsettings.php:166 adminpages/emailsettings.php:123
2039
  #: adminpages/emailsettings.php:141 adminpages/emailsettings.php:152
2040
+ #: adminpages/emailsettings.php:162 adminpages/emailsettings.php:166
2041
  msgid "when a user updates his or her billing information."
2042
  msgstr ""
2043
 
2044
  #: adminpages/emailsettings.php:172 adminpages/emailsettings.php:129
2045
  #: adminpages/emailsettings.php:147 adminpages/emailsettings.php:158
2046
+ #: adminpages/emailsettings.php:168 adminpages/emailsettings.php:172
2047
  msgid "Send members emails"
2048
  msgstr ""
2049
 
2050
  #: adminpages/emailsettings.php:178 adminpages/emailsettings.php:135
2051
  #: adminpages/emailsettings.php:153 adminpages/emailsettings.php:164
2052
+ #: adminpages/emailsettings.php:174 adminpages/emailsettings.php:178
2053
  msgid "New Users"
2054
  msgstr ""
2055
 
2056
  #: adminpages/emailsettings.php:182 adminpages/emailsettings.php:139
2057
  #: adminpages/emailsettings.php:157 adminpages/emailsettings.php:168
2058
+ #: adminpages/emailsettings.php:178 adminpages/emailsettings.php:182
2059
  msgid ""
2060
  "Default WP notification email. (Recommended: Leave unchecked. Members will "
2061
  "still get an email confirmation from PMPro after checkout.)"
2062
  msgstr ""
2063
 
2064
+ #: adminpages/functions.php:270 adminpages/orders.php:146
2065
+ #: adminpages/orders.php:155 adminpages/orders.php:158
2066
+ msgid "Invoice emailed successfully."
2067
+ msgstr ""
2068
+
2069
+ #: adminpages/functions.php:274 adminpages/orders.php:149
2070
+ #: adminpages/orders.php:160 adminpages/orders.php:161
2071
+ msgid "Error emailing invoice."
2072
+ msgstr ""
2073
+
2074
+ #: adminpages/functions.php:301 adminpages/orders.php:667
2075
+ #: adminpages/orders.php:696 adminpages/orders.php:800
2076
+ #: adminpages/orders.php:831 adminpages/orders.php:842
2077
+ #: adminpages/orders.php:929 adminpages/orders.php:984
2078
+ msgid "Email Invoice"
2079
+ msgstr ""
2080
+
2081
+ #: adminpages/functions.php:304 adminpages/orders.php:670
2082
+ #: adminpages/orders.php:699 adminpages/orders.php:803
2083
+ #: adminpages/orders.php:834 adminpages/orders.php:845
2084
+ #: adminpages/orders.php:932 adminpages/orders.php:987
2085
+ msgid "Send an invoice for this order to: "
2086
+ msgstr ""
2087
+
2088
+ #: adminpages/functions.php:306 adminpages/orders.php:672
2089
+ #: adminpages/orders.php:701 adminpages/orders.php:805
2090
+ #: adminpages/orders.php:836 adminpages/orders.php:847
2091
+ #: adminpages/orders.php:934 adminpages/orders.php:989
2092
+ msgid "Send Email"
2093
+ msgstr ""
2094
+
2095
  #: adminpages/membershiplevels.php:150 adminpages/membershiplevels.php:137
2096
  #: adminpages/membershiplevels.php:141 adminpages/membershiplevels.php:143
2097
  #: adminpages/membershiplevels.php:146 adminpages/membershiplevels.php:150
2165
  msgid "Add New Membership Level"
2166
  msgstr ""
2167
 
2168
+ #: adminpages/membershiplevels.php:353 adminpages/membershiplevels.php:742
2169
  #: adminpages/reports/login.php:180 adminpages/membershiplevels.php:291
2170
  #: adminpages/membershiplevels.php:293 adminpages/membershiplevels.php:295
2171
  #: adminpages/membershiplevels.php:319 adminpages/membershiplevels.php:329
2172
+ #: adminpages/membershiplevels.php:351 adminpages/membershiplevels.php:353
2173
+ #: adminpages/membershiplevels.php:506 adminpages/membershiplevels.php:512
2174
+ #: adminpages/membershiplevels.php:514 adminpages/membershiplevels.php:541
2175
+ #: adminpages/membershiplevels.php:542 adminpages/membershiplevels.php:584
2176
+ #: adminpages/membershiplevels.php:630 adminpages/membershiplevels.php:632
2177
+ #: adminpages/membershiplevels.php:637 adminpages/membershiplevels.php:638
2178
+ #: adminpages/membershiplevels.php:642 adminpages/membershiplevels.php:654
2179
+ #: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:714
2180
+ #: adminpages/membershiplevels.php:716 adminpages/reports/login.php:142
2181
  #: adminpages/reports/login.php:144 adminpages/reports/login.php:160
2182
  #: adminpages/reports/login.php:164 adminpages/reports/login.php:180
2183
  msgid "Name"
2186
  #: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:314
2187
  #: adminpages/membershiplevels.php:316 adminpages/membershiplevels.php:318
2188
  #: adminpages/membershiplevels.php:342 adminpages/membershiplevels.php:352
2189
+ #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
2190
  msgid "Confirmation Message"
2191
  msgstr ""
2192
 
2193
  #: adminpages/membershiplevels.php:390 adminpages/membershiplevels.php:388
2194
+ #: adminpages/membershiplevels.php:390
2195
  msgid "Check to include this message in the membership confirmation email."
2196
  msgstr ""
2197
 
2198
+ #: adminpages/membershiplevels.php:396 adminpages/membershiplevels.php:743
2199
  #: adminpages/membershiplevels.php:333 adminpages/membershiplevels.php:335
2200
  #: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:338
2201
  #: adminpages/membershiplevels.php:361 adminpages/membershiplevels.php:371
2202
+ #: adminpages/membershiplevels.php:394 adminpages/membershiplevels.php:396
2203
+ #: adminpages/membershiplevels.php:543 adminpages/membershiplevels.php:585
2204
+ #: adminpages/membershiplevels.php:631 adminpages/membershiplevels.php:633
2205
+ #: adminpages/membershiplevels.php:638 adminpages/membershiplevels.php:639
2206
+ #: adminpages/membershiplevels.php:643 adminpages/membershiplevels.php:655
2207
+ #: adminpages/membershiplevels.php:665 adminpages/membershiplevels.php:715
2208
+ #: adminpages/membershiplevels.php:717
2209
  msgid "Billing Details"
2210
  msgstr ""
2211
 
2212
  #: adminpages/membershiplevels.php:431
2213
+ #: classes/gateways/class.pmprogateway_stripe.php:742
2214
  #: adminpages/membershiplevels.php:349 adminpages/membershiplevels.php:351
2215
  #: adminpages/membershiplevels.php:370 adminpages/membershiplevels.php:372
2216
  #: adminpages/membershiplevels.php:373 adminpages/membershiplevels.php:396
2217
  #: adminpages/membershiplevels.php:406 adminpages/membershiplevels.php:429
2218
+ #: adminpages/membershiplevels.php:431
2219
  #: classes/gateways/class.pmprogateway_stripe.php:619
2220
  #: classes/gateways/class.pmprogateway_stripe.php:620
2221
  #: classes/gateways/class.pmprogateway_stripe.php:630
2227
  #: classes/gateways/class.pmprogateway_stripe.php:686
2228
  #: classes/gateways/class.pmprogateway_stripe.php:697
2229
  #: classes/gateways/class.pmprogateway_stripe.php:735
2230
+ #: classes/gateways/class.pmprogateway_stripe.php:750
2231
  #: classes/gateways/class.pmprogateway_stripe.php:762
2232
  #: classes/gateways/class.pmprogateway_stripe.php:769
2233
  #: classes/gateways/class.pmprogateway_stripe.php:777
2241
  #: adminpages/membershiplevels.php:368 adminpages/membershiplevels.php:387
2242
  #: adminpages/membershiplevels.php:389 adminpages/membershiplevels.php:390
2243
  #: adminpages/membershiplevels.php:413 adminpages/membershiplevels.php:423
2244
+ #: adminpages/membershiplevels.php:444 adminpages/membershiplevels.php:446
2245
  msgid ""
2246
  "Braintree integration currently only supports billing periods of \"Month\" "
2247
  "or \"Year\"."
2251
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:393
2252
  #: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:396
2253
  #: adminpages/membershiplevels.php:417 adminpages/membershiplevels.php:427
2254
+ #: adminpages/membershiplevels.php:448 adminpages/membershiplevels.php:450
2255
  msgid ""
2256
  "After saving this level, make note of the ID and create a \"Plan\" in your "
2257
  "Braintree dashboard with the same settings and the \"Plan ID\" set to "
2259
  msgstr ""
2260
 
2261
  #: adminpages/membershiplevels.php:450 adminpages/membershiplevels.php:455
2262
+ #: classes/gateways/class.pmprogateway_cybersource.php:88
2263
+ #: classes/gateways/class.pmprogateway_paypal.php:136
2264
  #: classes/gateways/class.pmprogateway_paypalexpress.php:145
2265
  #: classes/gateways/class.pmprogateway_paypalstandard.php:137
2266
  #: adminpages/membershiplevels.php:372 adminpages/membershiplevels.php:374
2270
  #: adminpages/membershiplevels.php:417 adminpages/membershiplevels.php:419
2271
  #: adminpages/membershiplevels.php:427 adminpages/membershiplevels.php:429
2272
  #: adminpages/membershiplevels.php:432 adminpages/membershiplevels.php:448
2273
+ #: adminpages/membershiplevels.php:450 adminpages/membershiplevels.php:453
2274
+ #: adminpages/membershiplevels.php:455 adminpages/paymentsettings.php:170
2275
  #: adminpages/paymentsettings.php:174 adminpages/paymentsettings.php:179
2276
  #: classes/gateways/class.pmprogateway_cybersource.php:101
2277
  #: classes/gateways/class.pmprogateway_paypal.php:118
2285
  msgstr ""
2286
 
2287
  #: adminpages/membershiplevels.php:455 adminpages/membershiplevels.php:432
2288
+ #: adminpages/membershiplevels.php:453 adminpages/membershiplevels.php:455
2289
  #, php-format
2290
  msgid ""
2291
  "You will need to create a \"Plan\" in your Braintree dashboard with the same "
2296
  #: adminpages/membershiplevels.php:388 adminpages/membershiplevels.php:407
2297
  #: adminpages/membershiplevels.php:409 adminpages/membershiplevels.php:410
2298
  #: adminpages/membershiplevels.php:431 adminpages/membershiplevels.php:441
2299
+ #: adminpages/membershiplevels.php:465 adminpages/membershiplevels.php:467
2300
  msgid ""
2301
  "Stripe integration currently does not support billing limits. You can still "
2302
  "set an expiration date below."
2306
  #: adminpages/membershiplevels.php:400 adminpages/membershiplevels.php:419
2307
  #: adminpages/membershiplevels.php:421 adminpages/membershiplevels.php:422
2308
  #: adminpages/membershiplevels.php:443 adminpages/membershiplevels.php:453
2309
+ #: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479
2310
  msgid ""
2311
  "2Checkout integration does not support custom trials. You can do one period "
2312
  "trials by setting an initial payment different from the billing amount."
2317
  #: adminpages/membershiplevels.php:441 adminpages/membershiplevels.php:443
2318
  #: adminpages/membershiplevels.php:444 adminpages/membershiplevels.php:465
2319
  #: adminpages/membershiplevels.php:475 adminpages/membershiplevels.php:499
2320
+ #: adminpages/membershiplevels.php:501
2321
  msgid ""
2322
  "Stripe integration currently does not support trial amounts greater than $0."
2323
  msgstr ""
2327
  #: adminpages/membershiplevels.php:445 adminpages/membershiplevels.php:447
2328
  #: adminpages/membershiplevels.php:448 adminpages/membershiplevels.php:469
2329
  #: adminpages/membershiplevels.php:479 adminpages/membershiplevels.php:503
2330
+ #: adminpages/membershiplevels.php:505
2331
  msgid ""
2332
  "Braintree integration currently does not support trial amounts greater than "
2333
  "$0."
2338
  #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:451
2339
  #: adminpages/membershiplevels.php:452 adminpages/membershiplevels.php:473
2340
  #: adminpages/membershiplevels.php:483 adminpages/membershiplevels.php:507
2341
+ #: adminpages/membershiplevels.php:509
2342
  msgid ""
2343
  "Payflow integration currently does not support trial amounts greater than $0."
2344
  msgstr ""
2348
  #: adminpages/membershiplevels.php:457 adminpages/membershiplevels.php:458
2349
  #: adminpages/membershiplevels.php:460 adminpages/membershiplevels.php:461
2350
  #: adminpages/membershiplevels.php:482 adminpages/membershiplevels.php:492
2351
+ #: adminpages/membershiplevels.php:516 adminpages/membershiplevels.php:518
2352
  msgid "Other Settings"
2353
  msgstr ""
2354
 
2357
  #: adminpages/membershiplevels.php:461 adminpages/membershiplevels.php:462
2358
  #: adminpages/membershiplevels.php:464 adminpages/membershiplevels.php:465
2359
  #: adminpages/membershiplevels.php:486 adminpages/membershiplevels.php:496
2360
+ #: adminpages/membershiplevels.php:520 adminpages/membershiplevels.php:522
2361
  msgid "Disable New Signups"
2362
  msgstr ""
2363
 
2366
  #: adminpages/membershiplevels.php:462 adminpages/membershiplevels.php:463
2367
  #: adminpages/membershiplevels.php:465 adminpages/membershiplevels.php:466
2368
  #: adminpages/membershiplevels.php:487 adminpages/membershiplevels.php:497
2369
+ #: adminpages/membershiplevels.php:521 adminpages/membershiplevels.php:523
2370
  msgid ""
2371
  "Check to hide this level from the membership levels page and disable "
2372
  "registration."
2373
  msgstr ""
2374
 
2375
  #: adminpages/membershiplevels.php:548 adminpages/membershiplevels.php:546
2376
+ #: adminpages/membershiplevels.php:548
2377
  #, php-format
2378
  msgid ""
2379
  "WARNING: This level is set with both a recurring billing amount and an "
2387
  #: adminpages/membershiplevels.php:492 adminpages/membershiplevels.php:493
2388
  #: adminpages/membershiplevels.php:495 adminpages/membershiplevels.php:496
2389
  #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:527
2390
+ #: adminpages/membershiplevels.php:570 adminpages/membershiplevels.php:572
2391
  msgid "Content Settings"
2392
  msgstr ""
2393
 
2394
+ #: adminpages/membershiplevels.php:588
2395
+ #, php-format
2396
+ msgid ""
2397
+ "Non-members will not see posts in these categories. You can <a href=\"%s\" "
2398
+ "title=\"Advanced Settings\" target=\"_blank\">update this setting here</a>."
2399
+ msgstr ""
2400
+
2401
+ #: adminpages/membershiplevels.php:592
2402
+ #, php-format
2403
+ msgid ""
2404
+ "Non-members will see the title and excerpt for posts in these categories. "
2405
+ "You can <a href=\"%s\" title=\"Advanced Settings\" target=\"_blank\">update "
2406
+ "this setting here</a>."
2407
+ msgstr ""
2408
+
2409
+ #: adminpages/membershiplevels.php:595
2410
+ #, php-format
2411
+ msgid ""
2412
+ "Non-members will see the title only for posts in these categories. You can "
2413
+ "<a href=\"%s\" title=\"Advanced Settings\" target=\"_blank\">update this "
2414
+ "setting here</a>."
2415
+ msgstr ""
2416
+
2417
+ #: adminpages/membershiplevels.php:602 adminpages/membershiplevels.php:461
2418
  #: adminpages/membershiplevels.php:467 adminpages/membershiplevels.php:469
2419
  #: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:497
2420
  #: adminpages/membershiplevels.php:499 adminpages/membershiplevels.php:500
2421
  #: adminpages/membershiplevels.php:521 adminpages/membershiplevels.php:531
2422
+ #: adminpages/membershiplevels.php:574 adminpages/membershiplevels.php:576
2423
  msgid "Categories"
2424
  msgstr ""
2425
 
2426
+ #: adminpages/membershiplevels.php:610 adminpages/membershiplevels.php:505
2427
  #: adminpages/membershiplevels.php:507 adminpages/membershiplevels.php:516
2428
  #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:529
2429
  #: adminpages/membershiplevels.php:539 adminpages/membershiplevels.php:582
2430
+ #: adminpages/membershiplevels.php:584
2431
  msgid "Save Level"
2432
  msgstr ""
2433
 
2434
+ #: adminpages/membershiplevels.php:611 adminpages/orders.php:939
2435
+ #: pages/billing.php:371 pages/cancel.php:83 shortcodes/pmpro_account.php:72
2436
  #: adminpages/membershiplevels.php:506 adminpages/membershiplevels.php:508
2437
  #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:518
2438
  #: adminpages/membershiplevels.php:530 adminpages/membershiplevels.php:540
2439
+ #: adminpages/membershiplevels.php:583 adminpages/membershiplevels.php:585
2440
+ #: adminpages/orders.php:511 adminpages/orders.php:561
2441
+ #: adminpages/orders.php:633 adminpages/orders.php:662
2442
+ #: adminpages/orders.php:765 adminpages/orders.php:796
2443
+ #: adminpages/orders.php:807 adminpages/orders.php:894
2444
+ #: adminpages/orders.php:949 pages/account.php:44 pages/billing.php:295
2445
+ #: pages/billing.php:299 pages/billing.php:330 pages/billing.php:339
2446
+ #: pages/billing.php:342 pages/billing.php:344 pages/billing.php:348
2447
+ #: pages/billing.php:363 pages/billing.php:364 pages/billing.php:365
2448
+ #: pages/billing.php:371 pages/billing.php:392 pages/billing.php:397
2449
+ #: pages/billing.php:401 pages/billing.php:406 pages/cancel.php:71
2450
+ #: pages/cancel.php:83 pages/cancel.php:84 shortcodes/pmpro_account.php:70
2451
+ #: shortcodes/pmpro_account.php:72 shortcodes/pmpro_account.php:73
2452
  msgid "Cancel"
2453
  msgstr ""
2454
 
2455
+ #: adminpages/membershiplevels.php:722 adminpages/membershiplevels.php:725
2456
  #: adminpages/membershiplevels.php:493 adminpages/membershiplevels.php:496
2457
  #: adminpages/membershiplevels.php:499 adminpages/membershiplevels.php:501
2458
  #: adminpages/membershiplevels.php:502 adminpages/membershiplevels.php:504
2465
  #: adminpages/membershiplevels.php:624 adminpages/membershiplevels.php:625
2466
  #: adminpages/membershiplevels.php:634 adminpages/membershiplevels.php:637
2467
  #: adminpages/membershiplevels.php:644 adminpages/membershiplevels.php:647
2468
+ #: adminpages/membershiplevels.php:694 adminpages/membershiplevels.php:696
2469
+ #: adminpages/membershiplevels.php:697 adminpages/membershiplevels.php:699
2470
  msgid "Search Levels"
2471
  msgstr ""
2472
 
2473
+ #: adminpages/membershiplevels.php:728 adminpages/membershiplevels.php:490
2474
  #: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:498
2475
  #: adminpages/membershiplevels.php:525 adminpages/membershiplevels.php:526
2476
  #: adminpages/membershiplevels.php:569 adminpages/membershiplevels.php:607
2477
  #: adminpages/membershiplevels.php:609 adminpages/membershiplevels.php:618
2478
  #: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:631
2479
  #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:700
2480
+ #: adminpages/membershiplevels.php:702
2481
  msgid "Add New Level"
2482
  msgstr ""
2483
 
2484
+ #: adminpages/membershiplevels.php:731 adminpages/membershiplevels.php:579
2485
  #: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:621
2486
  #: adminpages/membershiplevels.php:630 adminpages/membershiplevels.php:631
2487
  #: adminpages/membershiplevels.php:643 adminpages/membershiplevels.php:653
2488
+ #: adminpages/membershiplevels.php:703 adminpages/membershiplevels.php:705
2489
  msgid "Drag and drop membership levels to reorder them on the Levels page."
2490
  msgstr ""
2491
 
2492
+ #: adminpages/membershiplevels.php:744 pages/cancel.php:61
2493
  #: pages/confirmation.php:81 pages/invoice.php:64
2494
  #: shortcodes/pmpro_account.php:46 adminpages/membershiplevels.php:510
2495
  #: adminpages/membershiplevels.php:516 adminpages/membershiplevels.php:518
2498
  #: adminpages/membershiplevels.php:634 adminpages/membershiplevels.php:639
2499
  #: adminpages/membershiplevels.php:640 adminpages/membershiplevels.php:644
2500
  #: adminpages/membershiplevels.php:656 adminpages/membershiplevels.php:666
2501
+ #: adminpages/membershiplevels.php:716 adminpages/membershiplevels.php:718
2502
+ #: pages/account.php:20 pages/cancel.php:53 pages/cancel.php:61
2503
+ #: pages/cancel.php:62 pages/confirmation.php:81 pages/confirmation.php:83
2504
+ #: pages/confirmation.php:84 pages/confirmation.php:89 pages/invoice.php:63
2505
+ #: pages/invoice.php:64 pages/invoice.php:68 pages/invoice.php:70
2506
+ #: shortcodes/pmpro_account.php:45 shortcodes/pmpro_account.php:46
2507
  msgid "Expiration"
2508
  msgstr ""
2509
 
2510
+ #: adminpages/membershiplevels.php:745 adminpages/membershiplevels.php:511
2511
  #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:519
2512
  #: adminpages/membershiplevels.php:545 adminpages/membershiplevels.php:546
2513
  #: adminpages/membershiplevels.php:587 adminpages/membershiplevels.php:633
2514
  #: adminpages/membershiplevels.php:635 adminpages/membershiplevels.php:640
2515
  #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:645
2516
  #: adminpages/membershiplevels.php:657 adminpages/membershiplevels.php:667
2517
+ #: adminpages/membershiplevels.php:717 adminpages/membershiplevels.php:719
2518
  msgid "Allow Signups"
2519
  msgstr ""
2520
 
2521
+ #: adminpages/membershiplevels.php:762 adminpages/membershiplevels.php:566
2522
+ #: adminpages/membershiplevels.php:572 adminpages/membershiplevels.php:574
2523
+ #: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:601
2524
+ #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
2525
+ #: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:669
2526
+ #: adminpages/membershiplevels.php:670 adminpages/membershiplevels.php:674
2527
+ #: adminpages/membershiplevels.php:686 adminpages/membershiplevels.php:696
2528
+ #: adminpages/membershiplevels.php:746 adminpages/membershiplevels.php:748
2529
+ #, php-format
2530
+ msgid ""
2531
+ "Are you sure you want to delete membership level %s? All subscriptions will "
2532
+ "be cancelled."
2533
+ msgstr ""
2534
+
2535
+ #: adminpages/membershiplevels.php:767 adminpages/membershiplevels.php:534
2536
  #: adminpages/membershiplevels.php:540 adminpages/membershiplevels.php:542
2537
  #: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:569
2538
  #: adminpages/membershiplevels.php:646 adminpages/membershiplevels.php:648
2539
  #: adminpages/membershiplevels.php:650 adminpages/membershiplevels.php:655
2540
  #: adminpages/membershiplevels.php:656 adminpages/membershiplevels.php:660
2541
  #: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:682
2542
+ #: adminpages/membershiplevels.php:732 adminpages/membershiplevels.php:734
2543
  msgid "FREE"
2544
  msgstr ""
2545
 
2546
+ #: adminpages/membershiplevels.php:776 adminpages/membershiplevels.php:560
2547
  #: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:568
2548
  #: adminpages/membershiplevels.php:575 adminpages/membershiplevels.php:595
2549
  #: adminpages/membershiplevels.php:655 adminpages/membershiplevels.php:657
2550
  #: adminpages/membershiplevels.php:659 adminpages/membershiplevels.php:664
2551
  #: adminpages/membershiplevels.php:665 adminpages/membershiplevels.php:669
2552
  #: adminpages/membershiplevels.php:681 adminpages/membershiplevels.php:691
2553
+ #: adminpages/membershiplevels.php:741 adminpages/membershiplevels.php:743
2554
  msgid "After"
2555
  msgstr ""
2556
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2557
  #: adminpages/memberslist.php:25 adminpages/memberslist.php:25
2558
  #: includes/adminpages.php:15 includes/adminpages.php:53
2559
  #: includes/adminpages.php:54 includes/adminpages.php:74
2562
  msgid "Members List"
2563
  msgstr ""
2564
 
2565
+ #: adminpages/memberslist.php:26 adminpages/orders.php:973
2566
  #: adminpages/memberslist.php:26 adminpages/orders.php:522
2567
  #: adminpages/orders.php:591 adminpages/orders.php:698
2568
  #: adminpages/orders.php:727 adminpages/orders.php:833
2571
  msgid "Export to CSV"
2572
  msgstr ""
2573
 
2574
+ #: adminpages/memberslist.php:30 adminpages/orders.php:992
2575
  #: adminpages/reports/login.php:103 adminpages/reports/memberships.php:349
2576
  #: adminpages/reports/sales.php:288 adminpages/memberslist.php:30
2577
  #: adminpages/orders.php:603 adminpages/orders.php:710
2595
 
2596
  #: adminpages/memberslist.php:32 adminpages/reports/login.php:105
2597
  #: adminpages/reports/memberships.php:373 adminpages/reports/sales.php:311
2598
+ #: classes/class.pmproemail.php:182 classes/class.pmproemail.php:227
2599
  #: adminpages/memberslist.php:32 adminpages/reports/login.php:67
2600
  #: adminpages/reports/login.php:69 adminpages/reports/login.php:85
2601
  #: adminpages/reports/login.php:89 adminpages/reports/login.php:105
2657
  msgid "Last&nbsp;Name"
2658
  msgstr ""
2659
 
2660
+ #: adminpages/memberslist.php:170 pages/billing.php:108 pages/checkout.php:226
2661
  #: pages/confirmation.php:66 pages/invoice.php:49
2662
  #: adminpages/memberslist.php:117 adminpages/memberslist.php:150
2663
  #: adminpages/memberslist.php:160 adminpages/memberslist.php:170
2672
  #: pages/confirmation.php:59 pages/confirmation.php:61
2673
  #: pages/confirmation.php:66 pages/confirmation.php:67
2674
  #: pages/confirmation.php:69 pages/invoice.php:46 pages/invoice.php:48
2675
+ #: pages/invoice.php:49
2676
  msgid "Billing Address"
2677
  msgstr ""
2678
 
2716
  msgid "All Users"
2717
  msgstr ""
2718
 
2719
+ #: adminpages/orders.php:156 adminpages/orders.php:26 adminpages/orders.php:67
 
 
 
 
 
 
 
 
 
 
2720
  #: adminpages/orders.php:162 adminpages/orders.php:174
2721
  #: adminpages/orders.php:175
2722
  msgid "Order deleted successfully."
2723
  msgstr ""
2724
 
2725
+ #: adminpages/orders.php:159 adminpages/orders.php:31 adminpages/orders.php:72
2726
  #: adminpages/orders.php:165 adminpages/orders.php:177
2727
  #: adminpages/orders.php:180
2728
  msgid "Error deleting order."
2729
  msgstr ""
2730
 
2731
+ #: adminpages/orders.php:296 adminpages/orders.php:119
2732
  #: adminpages/orders.php:169 adminpages/orders.php:270
2733
  #: adminpages/orders.php:284 adminpages/orders.php:285
2734
  #: adminpages/orders.php:295 adminpages/orders.php:297
2736
  msgid "Order saved successfully."
2737
  msgstr ""
2738
 
2739
+ #: adminpages/orders.php:299 adminpages/orders.php:124
2740
  #: adminpages/orders.php:174 adminpages/orders.php:275
2741
  #: adminpages/orders.php:287 adminpages/orders.php:288
2742
  #: adminpages/orders.php:298 adminpages/orders.php:300
2744
  msgid "Error updating order timestamp."
2745
  msgstr ""
2746
 
2747
+ #: adminpages/orders.php:303 adminpages/orders.php:130
2748
  #: adminpages/orders.php:180 adminpages/orders.php:281
2749
  #: adminpages/orders.php:291 adminpages/orders.php:292
2750
  #: adminpages/orders.php:302 adminpages/orders.php:304
2752
  msgid "Error saving order."
2753
  msgstr ""
2754
 
2755
+ #: adminpages/orders.php:370 classes/class.memberorder.php:859
2756
  #: adminpages/orders.php:195 adminpages/orders.php:245
2757
  #: adminpages/orders.php:317 adminpages/orders.php:321
2758
  #: adminpages/orders.php:346 adminpages/orders.php:352
2763
  msgid "Order"
2764
  msgstr ""
2765
 
2766
+ #: adminpages/orders.php:371 adminpages/orders.php:1361
2767
+ #: pages/confirmation.php:49 pages/invoice.php:24 pages/confirmation.php:43
2768
+ #: pages/confirmation.php:49 pages/invoice.php:24
2769
+ msgid "Print"
2770
+ msgstr ""
2771
+
2772
+ #: adminpages/orders.php:374 adminpages/orders.php:197
2773
  #: adminpages/orders.php:247 adminpages/orders.php:319
2774
  #: adminpages/orders.php:323 adminpages/orders.php:348
2775
  #: adminpages/orders.php:354 adminpages/orders.php:364
2777
  msgid "New Order"
2778
  msgstr ""
2779
 
2780
+ #: adminpages/orders.php:421 adminpages/orders.php:220
2781
  #: adminpages/orders.php:270 adminpages/orders.php:342
2782
  #: adminpages/orders.php:359 adminpages/orders.php:371
2783
  #: adminpages/orders.php:390 adminpages/orders.php:401
2785
  msgid "Randomly generated for you."
2786
  msgstr ""
2787
 
2788
+ #: adminpages/orders.php:426 adminpages/orders.php:225
2789
  #: adminpages/orders.php:275 adminpages/orders.php:347
2790
  #: adminpages/orders.php:364 adminpages/orders.php:376
2791
  #: adminpages/orders.php:395 adminpages/orders.php:406
2793
  msgid "User ID"
2794
  msgstr ""
2795
 
2796
+ #: adminpages/orders.php:440 adminpages/orders.php:234
2797
  #: adminpages/orders.php:284 adminpages/orders.php:356
2798
  #: adminpages/orders.php:376 adminpages/orders.php:385
2799
  #: adminpages/orders.php:407 adminpages/orders.php:418
2801
  msgid "Membership Level ID"
2802
  msgstr ""
2803
 
2804
+ #: adminpages/orders.php:455 includes/privacy.php:245 adminpages/orders.php:243
2805
  #: adminpages/orders.php:293 adminpages/orders.php:365
2806
  #: adminpages/orders.php:389 adminpages/orders.php:394
2807
  #: adminpages/orders.php:420 adminpages/orders.php:431
2809
  msgid "Billing Name"
2810
  msgstr ""
2811
 
2812
+ #: adminpages/orders.php:469 includes/privacy.php:249 adminpages/orders.php:251
2813
  #: adminpages/orders.php:301 adminpages/orders.php:373
2814
  #: adminpages/orders.php:401 adminpages/orders.php:402
2815
  #: adminpages/orders.php:432 adminpages/orders.php:443
2817
  msgid "Billing Street"
2818
  msgstr ""
2819
 
2820
+ #: adminpages/orders.php:482 includes/privacy.php:253 includes/privacy.php:358
2821
  #: adminpages/orders.php:258 adminpages/orders.php:308
2822
  #: adminpages/orders.php:380 adminpages/orders.php:409
2823
  #: adminpages/orders.php:412 adminpages/orders.php:443
2826
  msgid "Billing City"
2827
  msgstr ""
2828
 
2829
+ #: adminpages/orders.php:495 includes/privacy.php:257 adminpages/orders.php:265
2830
  #: adminpages/orders.php:315 adminpages/orders.php:387
2831
  #: adminpages/orders.php:416 adminpages/orders.php:423
2832
  #: adminpages/orders.php:454 adminpages/orders.php:465
2834
  msgid "Billing State"
2835
  msgstr ""
2836
 
2837
+ #: adminpages/orders.php:508 includes/privacy.php:261 includes/privacy.php:360
2838
  #: adminpages/orders.php:272 adminpages/orders.php:322
2839
  #: adminpages/orders.php:394 adminpages/orders.php:423
2840
  #: adminpages/orders.php:434 adminpages/orders.php:465
2843
  msgid "Billing Postal Code"
2844
  msgstr ""
2845
 
2846
+ #: adminpages/orders.php:521 includes/privacy.php:265 includes/privacy.php:362
2847
  #: adminpages/orders.php:279 adminpages/orders.php:329
2848
  #: adminpages/orders.php:401 adminpages/orders.php:430
2849
  #: adminpages/orders.php:445 adminpages/orders.php:476
2852
  msgid "Billing Country"
2853
  msgstr ""
2854
 
2855
+ #: adminpages/orders.php:535 includes/privacy.php:269 adminpages/orders.php:287
2856
  #: adminpages/orders.php:337 adminpages/orders.php:409
2857
  #: adminpages/orders.php:438 adminpages/orders.php:457
2858
  #: adminpages/orders.php:488 adminpages/orders.php:499
2860
  msgid "Billing Phone"
2861
  msgstr ""
2862
 
2863
+ #: adminpages/orders.php:565 adminpages/orders.php:1318
2864
+ #: classes/class.pmproemail.php:313 classes/class.pmproemail.php:322
2865
+ #: classes/class.pmproemail.php:331 classes/class.pmproemail.php:413
2866
+ #: classes/class.pmproemail.php:422 classes/class.pmproemail.php:740
2867
+ #: classes/class.pmproemail.php:742
2868
+ #: classes/gateways/class.pmprogateway_braintree.php:509
2869
+ #: classes/gateways/class.pmprogateway_stripe.php:578 pages/checkout.php:83
2870
+ #: pages/checkout.php:89 pages/checkout.php:426 pages/confirmation.php:58
2871
  #: pages/invoice.php:34 adminpages/orders.php:575 adminpages/orders.php:1363
2872
  #: classes/class.pmproemail.php:216 classes/class.pmproemail.php:218
2873
  #: classes/class.pmproemail.php:225 classes/class.pmproemail.php:227
2880
  #: classes/class.pmproemail.php:278 classes/class.pmproemail.php:284
2881
  #: classes/class.pmproemail.php:285 classes/class.pmproemail.php:287
2882
  #: classes/class.pmproemail.php:293 classes/class.pmproemail.php:294
2883
+ #: classes/class.pmproemail.php:302 classes/class.pmproemail.php:303
2884
+ #: classes/class.pmproemail.php:304 classes/class.pmproemail.php:307
2885
+ #: classes/class.pmproemail.php:313 classes/class.pmproemail.php:316
2886
+ #: classes/class.pmproemail.php:325 classes/class.pmproemail.php:328
2887
+ #: classes/class.pmproemail.php:334 classes/class.pmproemail.php:337
2888
+ #: classes/class.pmproemail.php:346 classes/class.pmproemail.php:357
2889
+ #: classes/class.pmproemail.php:366 classes/class.pmproemail.php:369
2890
+ #: classes/class.pmproemail.php:376 classes/class.pmproemail.php:378
2891
+ #: classes/class.pmproemail.php:384 classes/class.pmproemail.php:385
2892
+ #: classes/class.pmproemail.php:393 classes/class.pmproemail.php:394
2893
  #: classes/class.pmproemail.php:532 classes/class.pmproemail.php:580
2894
  #: classes/class.pmproemail.php:645 classes/class.pmproemail.php:648
2895
  #: classes/class.pmproemail.php:657 classes/class.pmproemail.php:659
2896
  #: classes/class.pmproemail.php:679 classes/class.pmproemail.php:696
2897
  #: classes/class.pmproemail.php:698 classes/class.pmproemail.php:703
2898
  #: classes/class.pmproemail.php:705 classes/class.pmproemail.php:711
2899
+ #: classes/class.pmproemail.php:712 classes/class.pmproemail.php:713
2900
+ #: classes/class.pmproemail.php:714
2901
  #: classes/gateways/class.pmprogateway_braintree.php:349
2902
  #: classes/gateways/class.pmprogateway_braintree.php:362
2903
  #: classes/gateways/class.pmprogateway_braintree.php:364
2921
  #: classes/gateways/class.pmprogateway_stripe.php:562
2922
  #: classes/gateways/class.pmprogateway_stripe.php:573
2923
  #: classes/gateways/class.pmprogateway_stripe.php:611
2924
+ #: classes/gateways/class.pmprogateway_stripe.php:629
2925
  #: classes/gateways/class.pmprogateway_stripe.php:638
2926
  #: classes/gateways/class.pmprogateway_stripe.php:644
2927
  #: classes/gateways/class.pmprogateway_stripe.php:652
2938
  #: pages/checkout.php:612 pages/checkout.php:616 pages/checkout.php:617
2939
  #: pages/checkout.php:619 pages/checkout.php:622 pages/confirmation.php:51
2940
  #: pages/confirmation.php:52 pages/confirmation.php:58 pages/invoice.php:32
2941
+ #: pages/invoice.php:33 pages/invoice.php:34
2942
  msgid "Discount Code"
2943
  msgstr ""
2944
 
2945
+ #: adminpages/orders.php:576 classes/class.pmproemail.php:905
2946
+ #: includes/init.php:193 includes/profile.php:48 adminpages/orders.php:586
2947
  #: classes/class.pmproemail.php:868 classes/class.pmproemail.php:876
2948
+ #: classes/class.pmproemail.php:877 includes/init.php:229 includes/init.php:232
2949
+ #: includes/init.php:233 includes/init.php:235 includes/init.php:237
2950
+ #: includes/init.php:245 includes/init.php:253 includes/init.php:258
2951
+ #: includes/init.php:259 includes/init.php:264 includes/init.php:265
2952
+ #: includes/init.php:266 includes/init.php:280 includes/init.php:284
2953
+ #: includes/profile.php:37 includes/profile.php:39 includes/profile.php:42
2954
+ #: includes/profile.php:48
2955
  msgid "None"
2956
  msgstr ""
2957
 
2958
+ #: adminpages/orders.php:587 includes/privacy.php:273 adminpages/orders.php:296
2959
  #: adminpages/orders.php:346 adminpages/orders.php:418
2960
  #: adminpages/orders.php:447 adminpages/orders.php:470
2961
  #: adminpages/orders.php:501 adminpages/orders.php:512
2963
  msgid "Sub Total"
2964
  msgstr ""
2965
 
2966
+ #: adminpages/orders.php:600 adminpages/templates/orders-email.php:60
2967
  #: adminpages/templates/orders-print.php:89 includes/privacy.php:277
2968
  #: pages/confirmation.php:92 pages/invoice.php:75 adminpages/orders.php:304
2969
  #: adminpages/orders.php:354 adminpages/orders.php:426
2972
  #: adminpages/orders.php:555 adminpages/orders.php:610
2973
  #: adminpages/templates/orders-email.php:60
2974
  #: adminpages/templates/orders-print.php:89 includes/privacy.php:277
2975
+ #: pages/confirmation.php:92 pages/invoice.php:74 pages/invoice.php:75
2976
+ #: pages/invoice.php:78 pages/invoice.php:80
2977
  msgid "Tax"
2978
  msgstr ""
2979
 
2980
+ #: adminpages/orders.php:613 includes/privacy.php:281 adminpages/orders.php:312
2981
  #: adminpages/orders.php:362 adminpages/orders.php:434
2982
  #: adminpages/orders.php:463 adminpages/orders.php:492
2983
  #: adminpages/orders.php:523 adminpages/orders.php:534
2985
  msgid "Coupon Amount"
2986
  msgstr ""
2987
 
2988
+ #: adminpages/orders.php:638 adminpages/orders.php:325
2989
  #: adminpages/orders.php:375 adminpages/orders.php:447
2990
  #: adminpages/orders.php:476 adminpages/orders.php:513
2991
  #: adminpages/orders.php:544 adminpages/orders.php:555
2993
  msgid "Should be subtotal + tax - couponamount."
2994
  msgstr ""
2995
 
2996
+ #: adminpages/orders.php:643 includes/privacy.php:289 adminpages/orders.php:330
2997
  #: adminpages/orders.php:380 adminpages/orders.php:452
2998
  #: adminpages/orders.php:481 adminpages/orders.php:518
2999
  #: adminpages/orders.php:549 adminpages/orders.php:560
3001
  msgid "Payment Type"
3002
  msgstr ""
3003
 
3004
+ #: adminpages/orders.php:655 adminpages/orders.php:335
3005
  #: adminpages/orders.php:385 adminpages/orders.php:457
3006
  #: adminpages/orders.php:486 adminpages/orders.php:528
3007
  #: adminpages/orders.php:559 adminpages/orders.php:570
3009
  msgid "e.g. PayPal Express, PayPal Standard, Credit Card."
3010
  msgstr ""
3011
 
3012
+ #: adminpages/orders.php:659
3013
+ #: classes/gateways/class.pmprogateway_braintree.php:466
3014
+ #: classes/gateways/class.pmprogateway_stripe.php:548 includes/privacy.php:293
3015
+ #: pages/billing.php:279 pages/checkout.php:374 adminpages/orders.php:339
3016
  #: adminpages/orders.php:389 adminpages/orders.php:461
3017
  #: adminpages/orders.php:490 adminpages/orders.php:532
3018
  #: adminpages/orders.php:563 adminpages/orders.php:574
3041
  #: classes/gateways/class.pmprogateway_stripe.php:484
3042
  #: classes/gateways/class.pmprogateway_stripe.php:522
3043
  #: classes/gateways/class.pmprogateway_stripe.php:549
3044
+ #: classes/gateways/class.pmprogateway_stripe.php:558
3045
  #: classes/gateways/class.pmprogateway_stripe.php:573
3046
  #: classes/gateways/class.pmprogateway_stripe.php:581
3047
  #: classes/gateways/class.pmprogateway_stripe.php:588
3058
  msgid "Card Type"
3059
  msgstr ""
3060
 
3061
+ #: adminpages/orders.php:669 adminpages/orders.php:344
3062
  #: adminpages/orders.php:394 adminpages/orders.php:466
3063
  #: adminpages/orders.php:495 adminpages/orders.php:540
3064
  #: adminpages/orders.php:571 adminpages/orders.php:582
3066
  msgid "e.g. Visa, MasterCard, AMEX, etc"
3067
  msgstr ""
3068
 
3069
+ #: adminpages/orders.php:673
3070
  #: classes/gateways/class.pmprogateway_twocheckout.php:137
3071
  #: includes/privacy.php:297 adminpages/orders.php:348 adminpages/orders.php:398
3072
  #: adminpages/orders.php:470 adminpages/orders.php:499
3081
  msgid "Account Number"
3082
  msgstr ""
3083
 
3084
+ #: adminpages/orders.php:684 adminpages/orders.php:353
3085
  #: adminpages/orders.php:403 adminpages/orders.php:475
3086
  #: adminpages/orders.php:504 adminpages/orders.php:553
3087
  #: adminpages/orders.php:584 adminpages/orders.php:595
3089
  msgid "Obscure all but last 4 digits."
3090
  msgstr ""
3091
 
3092
+ #: adminpages/orders.php:694 includes/privacy.php:301 adminpages/orders.php:358
3093
  #: adminpages/orders.php:408 adminpages/orders.php:480
3094
  #: adminpages/orders.php:509 adminpages/orders.php:561
3095
  #: adminpages/orders.php:592 adminpages/orders.php:603
3097
  msgid "Expiration Month"
3098
  msgstr ""
3099
 
3100
+ #: adminpages/orders.php:702 includes/privacy.php:305 adminpages/orders.php:365
3101
  #: adminpages/orders.php:415 adminpages/orders.php:487
3102
  #: adminpages/orders.php:516 adminpages/orders.php:569
3103
  #: adminpages/orders.php:600 adminpages/orders.php:611
3105
  msgid "Expiration Year"
3106
  msgstr ""
3107
 
3108
+ #: adminpages/orders.php:734 adminpages/orders.php:1314
3109
  #: classes/class.memberorder.php:860 includes/privacy.php:313
3110
  #: adminpages/orders.php:394 adminpages/orders.php:444
3111
  #: adminpages/orders.php:516 adminpages/orders.php:545
3123
  msgid "Gateway"
3124
  msgstr ""
3125
 
3126
+ #: adminpages/orders.php:757 adminpages/paymentsettings.php:144
3127
  #: includes/privacy.php:317 adminpages/orders.php:411 adminpages/orders.php:461
3128
  #: adminpages/orders.php:462 adminpages/orders.php:534
3129
  #: adminpages/orders.php:563 adminpages/orders.php:633
3135
  msgid "Gateway Environment"
3136
  msgstr ""
3137
 
3138
+ #: adminpages/orders.php:769 adminpages/paymentsettings.php:148
3139
  #: adminpages/orders.php:415 adminpages/orders.php:465
3140
  #: adminpages/orders.php:466 adminpages/orders.php:538
3141
  #: adminpages/orders.php:567 adminpages/orders.php:640
3147
  msgid "Sandbox/Testing"
3148
  msgstr ""
3149
 
3150
+ #: adminpages/orders.php:774 adminpages/paymentsettings.php:149
3151
  #: adminpages/orders.php:416 adminpages/orders.php:466
3152
  #: adminpages/orders.php:467 adminpages/orders.php:539
3153
  #: adminpages/orders.php:568 adminpages/orders.php:642
3159
  msgid "Live/Production"
3160
  msgstr ""
3161
 
3162
+ #: adminpages/orders.php:782 includes/privacy.php:321 adminpages/orders.php:423
3163
  #: adminpages/orders.php:473 adminpages/orders.php:474
3164
  #: adminpages/orders.php:546 adminpages/orders.php:575
3165
  #: adminpages/orders.php:650 adminpages/orders.php:681
3168
  msgid "Payment Transaction ID"
3169
  msgstr ""
3170
 
3171
+ #: adminpages/orders.php:793 adminpages/orders.php:428
3172
  #: adminpages/orders.php:478 adminpages/orders.php:479
3173
  #: adminpages/orders.php:551 adminpages/orders.php:580
3174
  #: adminpages/orders.php:659 adminpages/orders.php:690
3177
  msgid "Generated by the gateway. Useful to cross reference orders."
3178
  msgstr ""
3179
 
3180
+ #: adminpages/orders.php:798 classes/class.memberorder.php:861
3181
  #: includes/privacy.php:325 adminpages/orders.php:432 adminpages/orders.php:482
3182
  #: adminpages/orders.php:483 adminpages/orders.php:555
3183
  #: adminpages/orders.php:584 adminpages/orders.php:664
3189
  msgid "Subscription Transaction ID"
3190
  msgstr ""
3191
 
3192
+ #: adminpages/orders.php:810 adminpages/orders.php:437
3193
  #: adminpages/orders.php:487 adminpages/orders.php:488
3194
  #: adminpages/orders.php:560 adminpages/orders.php:589
3195
  #: adminpages/orders.php:674 adminpages/orders.php:705
3198
  msgid "Generated by the gateway. Useful to cross reference subscriptions."
3199
  msgstr ""
3200
 
3201
+ #: adminpages/orders.php:857 adminpages/orders.php:477
3202
  #: adminpages/orders.php:527 adminpages/orders.php:599
3203
  #: adminpages/orders.php:628 adminpages/orders.php:716
3204
  #: adminpages/orders.php:747 adminpages/orders.php:758
3206
  msgid "Affiliate ID"
3207
  msgstr ""
3208
 
3209
+ #: adminpages/orders.php:871 adminpages/orders.php:485
3210
  #: adminpages/orders.php:535 adminpages/orders.php:607
3211
  #: adminpages/orders.php:636 adminpages/orders.php:728
3212
  #: adminpages/orders.php:759 adminpages/orders.php:770
3214
  msgid "Affiliate SubID"
3215
  msgstr ""
3216
 
3217
+ #: adminpages/orders.php:893 adminpages/orders.php:848
3218
  #: adminpages/orders.php:903
3219
  msgid "TOS Consent"
3220
  msgstr ""
3221
 
3222
+ #: adminpages/orders.php:910 adminpages/orders.php:495
3223
  #: adminpages/orders.php:545 adminpages/orders.php:617
3224
  #: adminpages/orders.php:646 adminpages/orders.php:742
3225
  #: adminpages/orders.php:773 adminpages/orders.php:784
3227
  msgid "Notes"
3228
  msgstr ""
3229
 
3230
+ #: adminpages/orders.php:938 adminpages/orders.php:510
3231
  #: adminpages/orders.php:560 adminpages/orders.php:632
3232
  #: adminpages/orders.php:661 adminpages/orders.php:764
3233
  #: adminpages/orders.php:795 adminpages/orders.php:806
3235
  msgid "Save Order"
3236
  msgstr ""
3237
 
3238
+ #: adminpages/orders.php:951 adminpages/orders.php:521
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3239
  #: adminpages/orders.php:571 adminpages/orders.php:678
3240
  #: adminpages/orders.php:707 adminpages/orders.php:812
3241
  #: adminpages/orders.php:843 adminpages/orders.php:854
3243
  msgid "Add New Order"
3244
  msgstr ""
3245
 
3246
+ #: adminpages/orders.php:996 adminpages/orders.php:606
3247
  #: adminpages/orders.php:713 adminpages/orders.php:742
3248
  #: adminpages/orders.php:852 adminpages/orders.php:883
3249
  #: adminpages/orders.php:894 adminpages/orders.php:985
3251
  msgid "Within a Date Range"
3252
  msgstr ""
3253
 
3254
+ #: adminpages/orders.php:998 adminpages/orders.php:607
3255
  #: adminpages/orders.php:714 adminpages/orders.php:743
3256
  #: adminpages/orders.php:854 adminpages/orders.php:885
3257
  #: adminpages/orders.php:896 adminpages/orders.php:987
3259
  msgid "Predefined Date Range"
3260
  msgstr ""
3261
 
3262
+ #: adminpages/orders.php:1000 adminpages/orders.php:608
3263
  #: adminpages/orders.php:715 adminpages/orders.php:744
3264
  #: adminpages/orders.php:856 adminpages/orders.php:887
3265
  #: adminpages/orders.php:898 adminpages/orders.php:989
3267
  msgid "Within a Level"
3268
  msgstr ""
3269
 
3270
+ #: adminpages/orders.php:1002 adminpages/orders.php:1047
3271
  msgid "With a Discount Code"
3272
  msgstr ""
3273
 
3274
+ #: adminpages/orders.php:1004 adminpages/orders.php:609
3275
  #: adminpages/orders.php:716 adminpages/orders.php:745
3276
  #: adminpages/orders.php:858 adminpages/orders.php:889
3277
  #: adminpages/orders.php:900 adminpages/orders.php:991
3279
  msgid "Within a Status"
3280
  msgstr ""
3281
 
3282
+ #: adminpages/orders.php:1006 adminpages/orders.php:1051
3283
  msgid "Only Paid Orders"
3284
  msgstr ""
3285
 
3286
+ #: adminpages/orders.php:1008 adminpages/orders.php:1053
3287
  msgid "Only Free Orders"
3288
  msgstr ""
3289
 
3290
+ #: adminpages/orders.php:1011 adminpages/orders.php:612
3291
  #: adminpages/orders.php:719 adminpages/orders.php:748
3292
  #: adminpages/orders.php:861 adminpages/orders.php:892
3293
  #: adminpages/orders.php:903 adminpages/orders.php:994
3295
  msgid "From"
3296
  msgstr ""
3297
 
3298
+ #: adminpages/orders.php:1026 adminpages/orders.php:624
3299
  #: adminpages/orders.php:731 adminpages/orders.php:760
3300
  #: adminpages/orders.php:876 adminpages/orders.php:907
3301
  #: adminpages/orders.php:918 adminpages/orders.php:1009
3303
  msgid "To"
3304
  msgstr ""
3305
 
3306
+ #: adminpages/orders.php:1039 adminpages/orders.php:636
3307
  #: adminpages/orders.php:743 adminpages/orders.php:772
3308
  #: adminpages/orders.php:889 adminpages/orders.php:920
3309
  #: adminpages/orders.php:931 adminpages/orders.php:1022
3311
  msgid "filter by "
3312
  msgstr ""
3313
 
3314
+ #: adminpages/orders.php:1090 adminpages/orders.php:674
3315
  #: adminpages/orders.php:780 adminpages/orders.php:809
3316
  #: adminpages/orders.php:932 adminpages/orders.php:963
3317
  #: adminpages/orders.php:969 adminpages/orders.php:1060
3319
  msgid "Filter"
3320
  msgstr ""
3321
 
3322
+ #: adminpages/orders.php:1224 adminpages/orders.php:1227
3323
  #: adminpages/orders.php:535 adminpages/orders.php:538
3324
  #: adminpages/orders.php:777 adminpages/orders.php:780
3325
  #: adminpages/orders.php:883 adminpages/orders.php:886
3332
  msgid "Search Orders"
3333
  msgstr ""
3334
 
3335
+ #: adminpages/orders.php:1300 adminpages/orders.php:590
3336
  #: adminpages/orders.php:893 adminpages/orders.php:903
3337
  #: adminpages/orders.php:930 adminpages/orders.php:959
3338
  #: adminpages/orders.php:1096 adminpages/orders.php:1127
3342
  msgid "%d orders found."
3343
  msgstr ""
3344
 
3345
+ #: adminpages/orders.php:1311 includes/init.php:171 includes/profile.php:36
3346
+ #: pages/checkout.php:47 pages/confirmation.php:53 pages/confirmation.php:124
3347
  #: pages/invoice.php:28 adminpages/orders.php:601 adminpages/orders.php:904
3348
  #: adminpages/orders.php:914 adminpages/orders.php:941
3349
  #: adminpages/orders.php:970 adminpages/orders.php:1107
3351
  #: adminpages/orders.php:1235 adminpages/orders.php:1356 includes/init.php:214
3352
  #: includes/init.php:217 includes/init.php:218 includes/init.php:220
3353
  #: includes/init.php:222 includes/init.php:230 includes/init.php:238
3354
+ #: includes/init.php:242 includes/init.php:243 includes/init.php:244
3355
+ #: includes/init.php:258 includes/init.php:262 includes/profile.php:25
3356
+ #: includes/profile.php:27 includes/profile.php:30 includes/profile.php:36
3357
+ #: pages/checkout.php:33 pages/checkout.php:34 pages/checkout.php:35
3358
+ #: pages/checkout.php:39 pages/checkout.php:42 pages/checkout.php:45
3359
+ #: pages/confirmation.php:46 pages/confirmation.php:47
3360
+ #: pages/confirmation.php:53 pages/confirmation.php:62
3361
+ #: pages/confirmation.php:64 pages/confirmation.php:70
3362
+ #: pages/confirmation.php:91 pages/confirmation.php:103
3363
+ #: pages/confirmation.php:105 pages/confirmation.php:113
3364
+ #: pages/confirmation.php:116 pages/confirmation.php:124 pages/invoice.php:27
3365
+ #: pages/invoice.php:28 pages/invoice.php:49 pages/invoice.php:51
3366
+ #: pages/invoice.php:70
3367
  msgid "Membership Level"
3368
  msgstr ""
3369
 
3370
+ #: adminpages/orders.php:1313 adminpages/orders.php:1424
3371
  #: adminpages/orders.php:603 adminpages/orders.php:651
3372
  #: adminpages/orders.php:906 adminpages/orders.php:916
3373
  #: adminpages/orders.php:943 adminpages/orders.php:954
3381
  msgid "Payment"
3382
  msgstr ""
3383
 
3384
+ #: adminpages/orders.php:1315 adminpages/orders.php:605
3385
  #: adminpages/orders.php:908 adminpages/orders.php:918
3386
  #: adminpages/orders.php:945 adminpages/orders.php:974
3387
  #: adminpages/orders.php:1111 adminpages/orders.php:1142
3390
  msgid "Transaction IDs"
3391
  msgstr ""
3392
 
3393
+ #: adminpages/orders.php:1358 adminpages/orders.php:664
 
 
 
 
 
 
 
 
 
3394
  #: adminpages/orders.php:967 adminpages/orders.php:985
3395
  #: adminpages/orders.php:995 adminpages/orders.php:998
3396
  #: adminpages/orders.php:1027 adminpages/orders.php:1056
3403
  "want to delete order %s?"
3404
  msgstr ""
3405
 
3406
+ #: adminpages/orders.php:1433 adminpages/orders.php:653
3407
+ #: adminpages/orders.php:956 adminpages/orders.php:974
3408
+ #: adminpages/orders.php:984 adminpages/orders.php:1013
3409
+ #: adminpages/orders.php:1042 adminpages/orders.php:1192
3410
+ #: adminpages/orders.php:1226 adminpages/orders.php:1232
3411
+ #: adminpages/orders.php:1344 adminpages/orders.php:1466
3412
+ msgid "Subscription"
3413
  msgstr ""
3414
 
3415
+ #: adminpages/orders.php:1450 adminpages/discountcodes.php:614
3416
+ #: adminpages/discountcodes.php:619 adminpages/discountcodes.php:647
3417
+ #: adminpages/discountcodes.php:648 adminpages/discountcodes.php:649
3418
+ #: adminpages/discountcodes.php:650 adminpages/discountcodes.php:655
3419
+ #: adminpages/discountcodes.php:735 adminpages/discountcodes.php:789
3420
+ #: adminpages/discountcodes.php:803 adminpages/membershiplevels.php:564
3421
+ #: adminpages/membershiplevels.php:570 adminpages/membershiplevels.php:572
3422
+ #: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:599
3423
+ #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
3424
+ #: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:669
3425
+ #: adminpages/membershiplevels.php:670 adminpages/membershiplevels.php:674
3426
+ #: adminpages/membershiplevels.php:686 adminpages/membershiplevels.php:696
3427
+ #: adminpages/membershiplevels.php:746 adminpages/membershiplevels.php:748
3428
+ #: adminpages/orders.php:658 adminpages/orders.php:961
3429
+ #: adminpages/orders.php:979 adminpages/orders.php:989
3430
+ #: adminpages/orders.php:992 adminpages/orders.php:1021
3431
+ #: adminpages/orders.php:1050 adminpages/orders.php:1205
3432
+ #: adminpages/orders.php:1239 adminpages/orders.php:1245
3433
+ #: adminpages/orders.php:1360 adminpages/orders.php:1483
3434
+ #: adminpages/orders.php:1489
3435
+ msgid "edit"
3436
  msgstr ""
3437
 
3438
  #: adminpages/pagesettings.php:62 adminpages/pagesettings.php:54
3703
  msgid "Payment Gateway"
3704
  msgstr ""
3705
 
3706
+ #: adminpages/paymentsettings.php:110 adminpages/paymentsettings.php:235
3707
  #: adminpages/paymentsettings.php:93 adminpages/paymentsettings.php:110
3708
  #: adminpages/paymentsettings.php:144 adminpages/paymentsettings.php:146
3709
  #: adminpages/paymentsettings.php:201 adminpages/paymentsettings.php:218
3725
  msgid "Choose a Gateway"
3726
  msgstr ""
3727
 
3728
+ #: adminpages/paymentsettings.php:138
3729
+ msgid ""
3730
+ "It is not connected to a live gateway environment and cannot accept payments."
3731
+ msgstr ""
3732
+
3733
+ #: adminpages/paymentsettings.php:138
3734
+ msgid ""
3735
+ "This gateway is for membership sites with Free levels or for sites that "
3736
+ "accept payment offline."
3737
+ msgstr ""
3738
+
3739
+ #: adminpages/paymentsettings.php:182 adminpages/paymentsettings.php:148
3740
  #: adminpages/paymentsettings.php:165
3741
  msgid "Currency and Tax Settings"
3742
  msgstr ""
3743
 
3744
+ #: adminpages/paymentsettings.php:187 adminpages/paymentsettings.php:153
3745
  #: adminpages/paymentsettings.php:170 adminpages/paymentsettings.php:327
3746
  #: adminpages/paymentsettings.php:337 adminpages/paymentsettings.php:356
3747
  #: adminpages/paymentsettings.php:381 adminpages/paymentsettings.php:386
3748
  msgid "Currency"
3749
  msgstr ""
3750
 
3751
+ #: adminpages/paymentsettings.php:203 adminpages/paymentsettings.php:169
3752
  #: adminpages/paymentsettings.php:186 adminpages/paymentsettings.php:400
3753
  #: adminpages/paymentsettings.php:402
3754
  msgid ""
3756
  "your gateway."
3757
  msgstr ""
3758
 
3759
+ #: adminpages/paymentsettings.php:208 adminpages/paymentsettings.php:174
3760
  #: adminpages/paymentsettings.php:191 adminpages/paymentsettings.php:375
3761
  #: adminpages/paymentsettings.php:401 adminpages/paymentsettings.php:406
3762
  #: adminpages/paymentsettings.php:408
3763
  msgid "Accepted Credit Card Types"
3764
  msgstr ""
3765
 
3766
+ #: adminpages/paymentsettings.php:222 adminpages/paymentsettings.php:188
3767
  #: adminpages/paymentsettings.php:205 adminpages/paymentsettings.php:398
3768
  #: adminpages/paymentsettings.php:438 adminpages/paymentsettings.php:443
3769
  #: adminpages/paymentsettings.php:445
3770
  msgid "Sales Tax"
3771
  msgstr ""
3772
 
3773
+ #: adminpages/paymentsettings.php:222 pages/billing.php:125
3774
  #: adminpages/paymentsettings.php:188 adminpages/paymentsettings.php:205
3775
  #: adminpages/paymentsettings.php:398 adminpages/paymentsettings.php:438
3776
  #: adminpages/paymentsettings.php:443 adminpages/paymentsettings.php:445
3781
  msgid "optional"
3782
  msgstr ""
3783
 
3784
+ #: adminpages/paymentsettings.php:225 adminpages/paymentsettings.php:191
3785
  #: adminpages/paymentsettings.php:208 adminpages/paymentsettings.php:401
3786
  #: adminpages/paymentsettings.php:441 adminpages/paymentsettings.php:446
3787
  #: adminpages/paymentsettings.php:448
3788
  msgid "Tax State"
3789
  msgstr ""
3790
 
3791
+ #: adminpages/paymentsettings.php:226 adminpages/paymentsettings.php:192
3792
  #: adminpages/paymentsettings.php:209 adminpages/paymentsettings.php:402
3793
  #: adminpages/paymentsettings.php:442 adminpages/paymentsettings.php:447
3794
  #: adminpages/paymentsettings.php:449
3795
  msgid "abbreviation, e.g. \"PA\""
3796
  msgstr ""
3797
 
3798
+ #: adminpages/paymentsettings.php:227 adminpages/paymentsettings.php:193
3799
  #: adminpages/paymentsettings.php:210
3800
  msgid "Tax Rate"
3801
  msgstr ""
3802
 
3803
+ #: adminpages/paymentsettings.php:228 adminpages/paymentsettings.php:194
3804
  #: adminpages/paymentsettings.php:211 adminpages/paymentsettings.php:404
3805
  #: adminpages/paymentsettings.php:444 adminpages/paymentsettings.php:449
3806
  #: adminpages/paymentsettings.php:451
3807
  msgid "decimal, e.g. \"0.06\""
3808
  msgstr ""
3809
 
3810
+ #: adminpages/paymentsettings.php:229 adminpages/paymentsettings.php:212
3811
  msgid ""
3812
  "US only. If values are given, tax will be applied for any members ordering "
3813
  "from the selected state.<br />For non-US or more complex tax rules, use the "
3817
  "\">pmpro_tax filter</a>."
3818
  msgstr ""
3819
 
3820
+ #: adminpages/paymentsettings.php:240 adminpages/paymentsettings.php:206
3821
  #: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:450
3822
  #: adminpages/paymentsettings.php:455 adminpages/paymentsettings.php:457
3823
  msgid "Force SSL"
3824
  msgstr ""
3825
 
3826
+ #: adminpages/paymentsettings.php:247 adminpages/paymentsettings.php:213
3827
  #: adminpages/paymentsettings.php:230
3828
  msgid ""
3829
  "Your Site URL starts with https:// and so PMPro will allow your entire site "
3830
  "to be served over HTTPS."
3831
  msgstr ""
3832
 
3833
+ #: adminpages/paymentsettings.php:255 adminpages/paymentsettings.php:212
3834
  #: adminpages/paymentsettings.php:221 adminpages/paymentsettings.php:238
3835
  #: adminpages/paymentsettings.php:456 adminpages/paymentsettings.php:461
3836
  #: adminpages/paymentsettings.php:463
3837
  msgid "Yes (with JavaScript redirects)"
3838
  msgstr ""
3839
 
3840
+ #: adminpages/paymentsettings.php:257 adminpages/paymentsettings.php:214
3841
  #: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:240
3842
  msgid ""
3843
  "Recommended: Yes. Try the JavaScript redirects setting if you are having "
3844
  "issues with infinite redirect loops."
3845
  msgstr ""
3846
 
3847
+ #: adminpages/paymentsettings.php:265 adminpages/paymentsettings.php:219
3848
  #: adminpages/paymentsettings.php:231 adminpages/paymentsettings.php:248
3849
  #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:463
3850
  #: adminpages/paymentsettings.php:468 adminpages/paymentsettings.php:470
3851
  msgid "SSL Seal Code"
3852
  msgstr ""
3853
 
3854
+ #: adminpages/paymentsettings.php:269 adminpages/paymentsettings.php:252
3855
  msgid ""
3856
  "Your <strong><a target=\"_blank\" href=\"http://www.paidmembershipspro.com/"
3857
  "documentation/initial-plugin-setup/ssl/?"
3861
  "can be pasted here."
3862
  msgstr ""
3863
 
3864
+ #: adminpages/paymentsettings.php:274 adminpages/paymentsettings.php:228
3865
  #: adminpages/paymentsettings.php:240 adminpages/paymentsettings.php:257
3866
  msgid "Extra HTTPS URL Filter"
3867
  msgstr ""
3868
 
3869
+ #: adminpages/paymentsettings.php:277 adminpages/paymentsettings.php:231
3870
  #: adminpages/paymentsettings.php:243 adminpages/paymentsettings.php:260
3871
  msgid ""
3872
  "Pass all generated HTML through a URL filter to add HTTPS to URLs used on "
4238
  #: adminpages/templates/orders-print.php:85 pages/confirmation.php:91
4239
  #: pages/invoice.php:74 adminpages/templates/orders-email.php:56
4240
  #: adminpages/templates/orders-print.php:85 pages/confirmation.php:91
4241
+ #: pages/invoice.php:73 pages/invoice.php:74 pages/invoice.php:77
4242
+ #: pages/invoice.php:79
4243
  msgid "Subtotal"
4244
  msgstr ""
4245
 
4309
  msgid "An Email From %s"
4310
  msgstr ""
4311
 
4312
+ #: classes/class.pmproemail.php:171 classes/class.pmproemail.php:120
4313
  #: classes/class.pmproemail.php:122 classes/class.pmproemail.php:125
4314
  #: classes/class.pmproemail.php:134 classes/class.pmproemail.php:136
4315
  #: classes/class.pmproemail.php:143
4317
  msgid "Your membership at %s has been CANCELLED"
4318
  msgstr ""
4319
 
4320
+ #: classes/class.pmproemail.php:204 classes/class.pmproemail.php:142
4321
  #: classes/class.pmproemail.php:144 classes/class.pmproemail.php:147
4322
  #: classes/class.pmproemail.php:156 classes/class.pmproemail.php:166
4323
  #: classes/class.pmproemail.php:169 classes/class.pmproemail.php:176
4325
  msgid "Membership for %s at %s has been CANCELLED"
4326
  msgstr ""
4327
 
4328
+ #: classes/class.pmproemail.php:254 classes/class.pmproemail.php:172
4329
  #: classes/class.pmproemail.php:173 classes/class.pmproemail.php:175
4330
  #: classes/class.pmproemail.php:178 classes/class.pmproemail.php:187
4331
  #: classes/class.pmproemail.php:207 classes/class.pmproemail.php:212
4334
  msgid "Your membership confirmation for %s"
4335
  msgstr ""
4336
 
4337
+ #: classes/class.pmproemail.php:338 classes/class.pmproemail.php:434
4338
+ #: classes/class.pmproemail.php:749 classes/class.pmproemail.php:241
4339
  #: classes/class.pmproemail.php:243 classes/class.pmproemail.php:253
4340
  #: classes/class.pmproemail.php:256 classes/class.pmproemail.php:265
4341
  #: classes/class.pmproemail.php:285 classes/class.pmproemail.php:294
4342
  #: classes/class.pmproemail.php:301 classes/class.pmproemail.php:309
4343
+ #: classes/class.pmproemail.php:310 classes/class.pmproemail.php:325
4344
+ #: classes/class.pmproemail.php:328 classes/class.pmproemail.php:346
4345
+ #: classes/class.pmproemail.php:349 classes/class.pmproemail.php:358
4346
+ #: classes/class.pmproemail.php:378 classes/class.pmproemail.php:390
4347
+ #: classes/class.pmproemail.php:397 classes/class.pmproemail.php:405
4348
+ #: classes/class.pmproemail.php:406 classes/class.pmproemail.php:538
4349
  #: classes/class.pmproemail.php:586 classes/class.pmproemail.php:651
4350
  #: classes/class.pmproemail.php:654 classes/class.pmproemail.php:663
4351
  #: classes/class.pmproemail.php:665 classes/class.pmproemail.php:685
4352
  #: classes/class.pmproemail.php:705 classes/class.pmproemail.php:712
4353
+ #: classes/class.pmproemail.php:720 classes/class.pmproemail.php:721
4354
  #, php-format
4355
  msgid "This membership will expire on %s."
4356
  msgstr ""
4357
 
4358
+ #: classes/class.pmproemail.php:360 classes/class.pmproemail.php:263
4359
  #: classes/class.pmproemail.php:265 classes/class.pmproemail.php:275
4360
  #: classes/class.pmproemail.php:278 classes/class.pmproemail.php:287
4361
  #: classes/class.pmproemail.php:307 classes/class.pmproemail.php:316
4362
  #: classes/class.pmproemail.php:323 classes/class.pmproemail.php:331
4363
+ #: classes/class.pmproemail.php:332
4364
  #, php-format
4365
  msgid "Member Checkout for %s at %s"
4366
  msgstr ""
4367
 
4368
+ #: classes/class.pmproemail.php:451 classes/class.pmproemail.php:375
4369
  #: classes/class.pmproemail.php:395 classes/class.pmproemail.php:407
4370
  #: classes/class.pmproemail.php:414 classes/class.pmproemail.php:422
4371
+ #: classes/class.pmproemail.php:423
4372
  #, php-format
4373
  msgid "Your billing information has been updated at %s"
4374
  msgstr ""
4375
 
4376
+ #: classes/class.pmproemail.php:505 classes/class.pmproemail.php:428
4377
  #: classes/class.pmproemail.php:448 classes/class.pmproemail.php:461
4378
  #: classes/class.pmproemail.php:468 classes/class.pmproemail.php:476
4379
+ #: classes/class.pmproemail.php:477
4380
  #, php-format
4381
  msgid "Billing information has been updated for %s at %s"
4382
  msgstr ""
4383
 
4384
+ #: classes/class.pmproemail.php:554 classes/class.pmproemail.php:425
4385
  #: classes/class.pmproemail.php:430 classes/class.pmproemail.php:464
4386
  #: classes/class.pmproemail.php:467 classes/class.pmproemail.php:476
4387
  #: classes/class.pmproemail.php:496 classes/class.pmproemail.php:510
4388
  #: classes/class.pmproemail.php:517 classes/class.pmproemail.php:525
4389
+ #: classes/class.pmproemail.php:526
4390
  #, php-format
4391
  msgid "Membership Payment Failed at %s"
4392
  msgstr ""
4393
 
4394
+ #: classes/class.pmproemail.php:601 classes/class.pmproemail.php:462
4395
  #: classes/class.pmproemail.php:468 classes/class.pmproemail.php:510
4396
  #: classes/class.pmproemail.php:513 classes/class.pmproemail.php:522
4397
  #: classes/class.pmproemail.php:542 classes/class.pmproemail.php:557
4398
  #: classes/class.pmproemail.php:564 classes/class.pmproemail.php:572
4399
+ #: classes/class.pmproemail.php:573
4400
  #, php-format
4401
  msgid "Membership Payment Failed For %s at %s"
4402
  msgstr ""
4403
 
4404
+ #: classes/class.pmproemail.php:649 classes/class.pmproemail.php:508
4405
  #: classes/class.pmproemail.php:557 classes/class.pmproemail.php:560
4406
  #: classes/class.pmproemail.php:569 classes/class.pmproemail.php:589
4407
  #: classes/class.pmproemail.php:605 classes/class.pmproemail.php:612
4408
+ #: classes/class.pmproemail.php:620 classes/class.pmproemail.php:621
4409
  #, php-format
4410
  msgid "Credit Card on File Expiring Soon at %s"
4411
  msgstr ""
4412
 
4413
+ #: classes/class.pmproemail.php:700 classes/class.pmproemail.php:501
4414
  #: classes/class.pmproemail.php:548 classes/class.pmproemail.php:605
4415
  #: classes/class.pmproemail.php:608 classes/class.pmproemail.php:617
4416
  #: classes/class.pmproemail.php:619 classes/class.pmproemail.php:639
4417
  #: classes/class.pmproemail.php:656 classes/class.pmproemail.php:663
4418
+ #: classes/class.pmproemail.php:671 classes/class.pmproemail.php:672
4419
  #, php-format
4420
  msgid "INVOICE for %s membership"
4421
  msgstr ""
4422
 
4423
+ #: classes/class.pmproemail.php:777 classes/class.pmproemail.php:563
4424
  #: classes/class.pmproemail.php:611 classes/class.pmproemail.php:676
4425
  #: classes/class.pmproemail.php:679 classes/class.pmproemail.php:688
4426
  #: classes/class.pmproemail.php:690 classes/class.pmproemail.php:710
4427
  #: classes/class.pmproemail.php:733 classes/class.pmproemail.php:740
4428
+ #: classes/class.pmproemail.php:748 classes/class.pmproemail.php:749
4429
  #, php-format
4430
  msgid "Your trial at %s is ending soon"
4431
  msgstr ""
4432
 
4433
+ #: classes/class.pmproemail.php:813 classes/class.pmproemail.php:596
4434
  #: classes/class.pmproemail.php:645 classes/class.pmproemail.php:710
4435
  #: classes/class.pmproemail.php:713 classes/class.pmproemail.php:722
4436
  #: classes/class.pmproemail.php:724 classes/class.pmproemail.php:744
4437
  #: classes/class.pmproemail.php:769 classes/class.pmproemail.php:776
4438
+ #: classes/class.pmproemail.php:784 classes/class.pmproemail.php:785
4439
  #, php-format
4440
  msgid "Your membership at %s has ended"
4441
  msgstr ""
4442
 
4443
+ #: classes/class.pmproemail.php:840 classes/class.pmproemail.php:621
4444
  #: classes/class.pmproemail.php:670 classes/class.pmproemail.php:735
4445
  #: classes/class.pmproemail.php:738 classes/class.pmproemail.php:747
4446
  #: classes/class.pmproemail.php:749 classes/class.pmproemail.php:769
4447
  #: classes/class.pmproemail.php:796 classes/class.pmproemail.php:803
4448
+ #: classes/class.pmproemail.php:811 classes/class.pmproemail.php:812
4449
  #, php-format
4450
  msgid "Your membership at %s will end soon"
4451
  msgstr ""
4452
 
4453
+ #: classes/class.pmproemail.php:862 classes/class.pmproemail.php:641
4454
  #: classes/class.pmproemail.php:690 classes/class.pmproemail.php:755
4455
  #: classes/class.pmproemail.php:758 classes/class.pmproemail.php:767
4456
  #: classes/class.pmproemail.php:769 classes/class.pmproemail.php:789
4457
  #: classes/class.pmproemail.php:818 classes/class.pmproemail.php:825
4458
+ #: classes/class.pmproemail.php:833 classes/class.pmproemail.php:834
4459
  #, php-format
4460
  msgid "Your membership at %s has been changed"
4461
  msgstr ""
4462
 
4463
+ #: classes/class.pmproemail.php:867 classes/class.pmproemail.php:914
4464
  #: classes/class.pmproemail.php:759 classes/class.pmproemail.php:762
4465
  #: classes/class.pmproemail.php:771 classes/class.pmproemail.php:773
4466
  #: classes/class.pmproemail.php:793 classes/class.pmproemail.php:800
4467
  #: classes/class.pmproemail.php:809 classes/class.pmproemail.php:810
4468
  #: classes/class.pmproemail.php:811 classes/class.pmproemail.php:823
4469
  #: classes/class.pmproemail.php:830 classes/class.pmproemail.php:838
4470
+ #: classes/class.pmproemail.php:839 classes/class.pmproemail.php:863
4471
+ #: classes/class.pmproemail.php:870 classes/class.pmproemail.php:877
4472
+ #: classes/class.pmproemail.php:885 classes/class.pmproemail.php:886
4473
  #, php-format
4474
  msgid "The new level is %s"
4475
  msgstr ""
4476
 
4477
+ #: classes/class.pmproemail.php:869 classes/class.pmproemail.php:647
4478
  #: classes/class.pmproemail.php:696 classes/class.pmproemail.php:761
4479
  #: classes/class.pmproemail.php:764 classes/class.pmproemail.php:773
4480
  #: classes/class.pmproemail.php:775 classes/class.pmproemail.php:795
4481
  #: classes/class.pmproemail.php:825 classes/class.pmproemail.php:832
4482
+ #: classes/class.pmproemail.php:840 classes/class.pmproemail.php:841
4483
  msgid "Your membership has been cancelled"
4484
  msgstr ""
4485
 
4486
+ #: classes/class.pmproemail.php:873 classes/class.pmproemail.php:921
4487
  #: classes/class.pmproemail.php:651 classes/class.pmproemail.php:689
4488
  #: classes/class.pmproemail.php:700 classes/class.pmproemail.php:738
4489
  #: classes/class.pmproemail.php:765 classes/class.pmproemail.php:768
4493
  #: classes/class.pmproemail.php:815 classes/class.pmproemail.php:816
4494
  #: classes/class.pmproemail.php:817 classes/class.pmproemail.php:829
4495
  #: classes/class.pmproemail.php:836 classes/class.pmproemail.php:844
4496
+ #: classes/class.pmproemail.php:845 classes/class.pmproemail.php:869
4497
+ #: classes/class.pmproemail.php:876 classes/class.pmproemail.php:884
4498
+ #: classes/class.pmproemail.php:892 classes/class.pmproemail.php:893
4499
  #, php-format
4500
  msgid "This membership will expire on %s"
4501
  msgstr ""
4502
 
4503
+ #: classes/class.pmproemail.php:877 classes/class.pmproemail.php:925
4504
  #: classes/class.pmproemail.php:655 classes/class.pmproemail.php:693
4505
  #: classes/class.pmproemail.php:704 classes/class.pmproemail.php:742
4506
  #: classes/class.pmproemail.php:769 classes/class.pmproemail.php:772
4510
  #: classes/class.pmproemail.php:819 classes/class.pmproemail.php:820
4511
  #: classes/class.pmproemail.php:821 classes/class.pmproemail.php:833
4512
  #: classes/class.pmproemail.php:840 classes/class.pmproemail.php:848
4513
+ #: classes/class.pmproemail.php:849 classes/class.pmproemail.php:873
4514
+ #: classes/class.pmproemail.php:880 classes/class.pmproemail.php:888
4515
+ #: classes/class.pmproemail.php:896 classes/class.pmproemail.php:897
4516
  msgid "This membership does not expire"
4517
  msgstr ""
4518
 
4519
+ #: classes/class.pmproemail.php:909 classes/class.pmproemail.php:679
4520
  #: classes/class.pmproemail.php:728 classes/class.pmproemail.php:793
4521
  #: classes/class.pmproemail.php:796 classes/class.pmproemail.php:805
4522
  #: classes/class.pmproemail.php:806 classes/class.pmproemail.php:807
4523
  #: classes/class.pmproemail.php:826 classes/class.pmproemail.php:859
4524
  #: classes/class.pmproemail.php:866 classes/class.pmproemail.php:872
4525
+ #: classes/class.pmproemail.php:880 classes/class.pmproemail.php:881
4526
  #, php-format
4527
  msgid "Membership for %s at %s has been changed"
4528
  msgstr ""
4529
 
4530
+ #: classes/class.pmproemail.php:916 classes/class.pmproemail.php:799
4531
  #: classes/class.pmproemail.php:802 classes/class.pmproemail.php:811
4532
  #: classes/class.pmproemail.php:812 classes/class.pmproemail.php:813
4533
  #: classes/class.pmproemail.php:832 classes/class.pmproemail.php:865
4534
  #: classes/class.pmproemail.php:872 classes/class.pmproemail.php:879
4535
+ #: classes/class.pmproemail.php:887 classes/class.pmproemail.php:888
4536
  msgid "Membership has been cancelled"
4537
  msgstr ""
4538
 
4539
+ #: classes/class.pmproemail.php:956 classes/class.pmproemail.php:848
4540
  #: classes/class.pmproemail.php:849 classes/class.pmproemail.php:850
4541
  #: classes/class.pmproemail.php:869 classes/class.pmproemail.php:904
4542
  #: classes/class.pmproemail.php:911 classes/class.pmproemail.php:919
4543
+ #: classes/class.pmproemail.php:927 classes/class.pmproemail.php:928
4544
  msgid "Invoice for Order #: "
4545
  msgstr ""
4546
 
4547
+ #: classes/class.pmproemail.php:1003
4548
+ #, php-format
4549
+ msgid "Payment action required for your %s membership"
4550
+ msgstr ""
4551
+
4552
+ #: classes/class.pmproemail.php:1040
4553
+ #, php-format
4554
+ msgid "Payment action required: membership for %s at %s"
4555
+ msgstr ""
4556
+
4557
+ #: classes/class.pmproemail.php:1076 classes/class.pmproemail.php:948
4558
  #: classes/class.pmproemail.php:955 classes/class.pmproemail.php:963
4559
+ #: classes/class.pmproemail.php:971 classes/class.pmproemail.php:972
4560
  msgid ""
4561
  "<p>An administrator at !!sitename!! has changed your membership level.</p>\n"
4562
  "\n"
4571
  #: classes/gateways/class.pmprogateway.php:55
4572
  #: classes/gateways/class.pmprogateway_authorizenet.php:171
4573
  #: classes/gateways/class.pmprogateway_check.php:210
4574
+ #: classes/gateways/class.pmprogateway_cybersource.php:154
4575
  #: classes/gateways/class.pmprogateway_payflowpro.php:164
4576
+ #: classes/gateways/class.pmprogateway_paypal.php:302
4577
  #: classes/gateways/class.pmprogateway.php:55
4578
  #: classes/gateways/class.pmprogateway_authorizenet.php:55
4579
  #: classes/gateways/class.pmprogateway_authorizenet.php:171
4600
  #: classes/gateways/class.pmprogateway_check.php:262
4601
  #: classes/gateways/class.pmprogateway_check.php:267
4602
  #: classes/gateways/class.pmprogateway_check.php:285
4603
+ #: classes/gateways/class.pmprogateway_cybersource.php:202
4604
+ #: classes/gateways/class.pmprogateway_cybersource.php:207
4605
+ #: classes/gateways/class.pmprogateway_cybersource.php:223
4606
  #: classes/gateways/class.pmprogateway_payflowpro.php:187
4607
  #: classes/gateways/class.pmprogateway_payflowpro.php:192
4608
+ #: classes/gateways/class.pmprogateway_paypal.php:325
4609
  #: classes/gateways/class.pmprogateway.php:106
4610
  #: classes/gateways/class.pmprogateway.php:111
4611
  #: classes/gateways/class.pmprogateway.php:129
4646
  #: classes/gateways/class.pmprogateway.php:113
4647
  #: classes/gateways/class.pmprogateway_authorizenet.php:228
4648
  #: classes/gateways/class.pmprogateway_check.php:269
4649
+ #: classes/gateways/class.pmprogateway_cybersource.php:208
4650
  #: classes/gateways/class.pmprogateway.php:113
4651
  #: classes/gateways/class.pmprogateway_authorizenet.php:112
4652
  #: classes/gateways/class.pmprogateway_authorizenet.php:228
4662
  msgstr ""
4663
 
4664
  #: classes/gateways/class.pmprogateway_authorizenet.php:39
4665
+ #: paid-memberships-pro.php:154
4666
  #: classes/gateways/class.pmprogateway_authorizenet.php:39
4667
  #: paid-memberships-pro.php:122 paid-memberships-pro.php:123
4668
  #: paid-memberships-pro.php:130 paid-memberships-pro.php:131
4670
  #: paid-memberships-pro.php:134 paid-memberships-pro.php:135
4671
  #: paid-memberships-pro.php:136 paid-memberships-pro.php:137
4672
  #: paid-memberships-pro.php:142 paid-memberships-pro.php:147
4673
+ #: paid-memberships-pro.php:152
4674
  msgid "Authorize.net"
4675
  msgstr ""
4676
 
4729
  msgstr ""
4730
 
4731
  #: classes/gateways/class.pmprogateway_braintree.php:87
4732
+ #: classes/gateways/class.pmprogateway_stripe.php:86
4733
  #: classes/gateways/class.pmprogateway_braintree.php:49
4734
  #: classes/gateways/class.pmprogateway_braintree.php:62
4735
  #: classes/gateways/class.pmprogateway_braintree.php:84
4760
  "Settings (Keys, etc)."
4761
  msgstr ""
4762
 
4763
+ #: classes/gateways/class.pmprogateway_braintree.php:250
4764
+ #: paid-memberships-pro.php:155
4765
  #: classes/gateways/class.pmprogateway_braintree.php:63
4766
  #: classes/gateways/class.pmprogateway_braintree.php:76
4767
  #: classes/gateways/class.pmprogateway_braintree.php:77
4777
  #: paid-memberships-pro.php:135 paid-memberships-pro.php:136
4778
  #: paid-memberships-pro.php:137 paid-memberships-pro.php:138
4779
  #: paid-memberships-pro.php:143 paid-memberships-pro.php:148
4780
+ #: paid-memberships-pro.php:153
4781
  msgid "Braintree Payments"
4782
  msgstr ""
4783
 
4784
+ #: classes/gateways/class.pmprogateway_braintree.php:306
4785
  #: classes/gateways/class.pmprogateway_braintree.php:119
4786
  #: classes/gateways/class.pmprogateway_braintree.php:132
4787
  #: classes/gateways/class.pmprogateway_braintree.php:133
4794
  msgid "Braintree Settings"
4795
  msgstr ""
4796
 
4797
+ #: classes/gateways/class.pmprogateway_braintree.php:311
4798
+ #: classes/gateways/class.pmprogateway_cybersource.php:93
4799
  #: adminpages/paymentsettings.php:294 adminpages/paymentsettings.php:298
4800
  #: adminpages/paymentsettings.php:303 adminpages/paymentsettings.php:364
4801
  #: adminpages/paymentsettings.php:369
4812
  msgid "Merchant ID"
4813
  msgstr ""
4814
 
4815
+ #: classes/gateways/class.pmprogateway_braintree.php:319
4816
  #: adminpages/paymentsettings.php:302 adminpages/paymentsettings.php:306
4817
  #: adminpages/paymentsettings.php:311
4818
  #: classes/gateways/class.pmprogateway_braintree.php:132
4827
  msgid "Public Key"
4828
  msgstr ""
4829
 
4830
+ #: classes/gateways/class.pmprogateway_braintree.php:327
4831
  #: adminpages/paymentsettings.php:310 adminpages/paymentsettings.php:314
4832
  #: adminpages/paymentsettings.php:319
4833
  #: classes/gateways/class.pmprogateway_braintree.php:140
4842
  msgid "Private Key"
4843
  msgstr ""
4844
 
4845
+ #: classes/gateways/class.pmprogateway_braintree.php:335
4846
  #: adminpages/paymentsettings.php:318 adminpages/paymentsettings.php:322
4847
  #: adminpages/paymentsettings.php:327
4848
  #: classes/gateways/class.pmprogateway_braintree.php:148
4857
  msgid "Client-Side Encryption Key"
4858
  msgstr ""
4859
 
4860
+ #: classes/gateways/class.pmprogateway_braintree.php:343
4861
+ #: classes/gateways/class.pmprogateway_stripe.php:330
4862
  #: adminpages/paymentsettings.php:462 adminpages/paymentsettings.php:470
4863
  #: adminpages/paymentsettings.php:503 adminpages/paymentsettings.php:509
4864
  #: adminpages/paymentsettings.php:511 adminpages/paymentsettings.php:517
4882
  #: classes/gateways/class.pmprogateway_stripe.php:230
4883
  #: classes/gateways/class.pmprogateway_stripe.php:257
4884
  #: classes/gateways/class.pmprogateway_stripe.php:289
4885
+ #: classes/gateways/class.pmprogateway_stripe.php:291
4886
  #: classes/gateways/class.pmprogateway_stripe.php:297
4887
  #: classes/gateways/class.pmprogateway_stripe.php:299
4888
  #: classes/gateways/class.pmprogateway_stripe.php:305
4890
  msgid "Web Hook URL"
4891
  msgstr ""
4892
 
4893
+ #: classes/gateways/class.pmprogateway_braintree.php:347
4894
  #: adminpages/paymentsettings.php:474 adminpages/paymentsettings.php:515
4895
  #: adminpages/paymentsettings.php:521 adminpages/paymentsettings.php:523
4896
  #: classes/gateways/class.pmprogateway_braintree.php:160
4905
  msgid "To fully integrate with Braintree, be sure to set your Web Hook URL to"
4906
  msgstr ""
4907
 
4908
+ #: classes/gateways/class.pmprogateway_braintree.php:454
4909
+ #: classes/gateways/class.pmprogateway_stripe.php:536 pages/checkout.php:362
4910
  #: classes/gateways/class.pmprogateway_braintree.php:270
4911
  #: classes/gateways/class.pmprogateway_braintree.php:283
4912
  #: classes/gateways/class.pmprogateway_braintree.php:285
4931
  #: classes/gateways/class.pmprogateway_stripe.php:461
4932
  #: classes/gateways/class.pmprogateway_stripe.php:499
4933
  #: classes/gateways/class.pmprogateway_stripe.php:526
4934
+ #: classes/gateways/class.pmprogateway_stripe.php:546
4935
  #: classes/gateways/class.pmprogateway_stripe.php:561
4936
  #: classes/gateways/class.pmprogateway_stripe.php:569
4937
  #: classes/gateways/class.pmprogateway_stripe.php:576
4944
  msgid "Payment Information"
4945
  msgstr ""
4946
 
4947
+ #: classes/gateways/class.pmprogateway_braintree.php:455
4948
+ #: classes/gateways/class.pmprogateway_stripe.php:537 pages/checkout.php:363
4949
  #: classes/gateways/class.pmprogateway_braintree.php:270
4950
  #: classes/gateways/class.pmprogateway_braintree.php:283
4951
  #: classes/gateways/class.pmprogateway_braintree.php:285
4970
  #: classes/gateways/class.pmprogateway_stripe.php:462
4971
  #: classes/gateways/class.pmprogateway_stripe.php:500
4972
  #: classes/gateways/class.pmprogateway_stripe.php:527
4973
+ #: classes/gateways/class.pmprogateway_stripe.php:547
4974
  #: classes/gateways/class.pmprogateway_stripe.php:562
4975
  #: classes/gateways/class.pmprogateway_stripe.php:570
4976
  #: classes/gateways/class.pmprogateway_stripe.php:577
4984
  msgid "We Accept %s"
4985
  msgstr ""
4986
 
4987
+ #: classes/gateways/class.pmprogateway_braintree.php:475
4988
+ #: classes/gateways/class.pmprogateway_stripe.php:561 pages/billing.php:317
4989
+ #: pages/checkout.php:385 classes/gateways/class.pmprogateway_braintree.php:303
4990
  #: classes/gateways/class.pmprogateway_braintree.php:316
4991
  #: classes/gateways/class.pmprogateway_braintree.php:318
4992
  #: classes/gateways/class.pmprogateway_braintree.php:321
5009
  #: classes/gateways/class.pmprogateway_stripe.php:527
5010
  #: classes/gateways/class.pmprogateway_stripe.php:565
5011
  #: classes/gateways/class.pmprogateway_stripe.php:592
5012
+ #: classes/gateways/class.pmprogateway_stripe.php:594
5013
  #: classes/gateways/class.pmprogateway_stripe.php:609
5014
  #: classes/gateways/class.pmprogateway_stripe.php:617
5015
  #: classes/gateways/class.pmprogateway_stripe.php:624
5026
  msgid "Card Number"
5027
  msgstr ""
5028
 
5029
+ #: classes/gateways/class.pmprogateway_braintree.php:503 pages/billing.php:356
5030
  #: classes/gateways/class.pmprogateway_braintree.php:340
5031
  #: classes/gateways/class.pmprogateway_braintree.php:353
5032
  #: classes/gateways/class.pmprogateway_braintree.php:355
5061
  msgid "CVV"
5062
  msgstr ""
5063
 
5064
+ #: classes/gateways/class.pmprogateway_braintree.php:504 pages/billing.php:357
5065
+ #: pages/checkout.php:421 classes/gateways/class.pmprogateway_braintree.php:341
 
5066
  #: classes/gateways/class.pmprogateway_braintree.php:354
5067
  #: classes/gateways/class.pmprogateway_braintree.php:356
5068
  #: classes/gateways/class.pmprogateway_braintree.php:359
5084
  #: classes/gateways/class.pmprogateway_stripe.php:554
5085
  #: classes/gateways/class.pmprogateway_stripe.php:565
5086
  #: classes/gateways/class.pmprogateway_stripe.php:603
5087
+ #: classes/gateways/class.pmprogateway_stripe.php:624
5088
  #: classes/gateways/class.pmprogateway_stripe.php:630
5089
  #: classes/gateways/class.pmprogateway_stripe.php:639
5090
  #: classes/gateways/class.pmprogateway_stripe.php:647
5103
  msgid "what's this?"
5104
  msgstr ""
5105
 
5106
+ #: classes/gateways/class.pmprogateway_braintree.php:511
5107
+ #: classes/gateways/class.pmprogateway_stripe.php:583 pages/checkout.php:91
5108
+ #: pages/checkout.php:428 classes/gateways/class.pmprogateway_braintree.php:351
5109
  #: classes/gateways/class.pmprogateway_braintree.php:364
5110
  #: classes/gateways/class.pmprogateway_braintree.php:366
5111
  #: classes/gateways/class.pmprogateway_braintree.php:369
5128
  #: classes/gateways/class.pmprogateway_stripe.php:564
5129
  #: classes/gateways/class.pmprogateway_stripe.php:575
5130
  #: classes/gateways/class.pmprogateway_stripe.php:613
5131
+ #: classes/gateways/class.pmprogateway_stripe.php:631
5132
  #: classes/gateways/class.pmprogateway_stripe.php:640
5133
  #: classes/gateways/class.pmprogateway_stripe.php:646
5134
  #: classes/gateways/class.pmprogateway_stripe.php:654
5145
  msgid "Apply"
5146
  msgstr ""
5147
 
5148
+ #: classes/gateways/class.pmprogateway_braintree.php:570
5149
+ #: classes/gateways/class.pmprogateway_braintree.php:587
5150
+ #: classes/gateways/class.pmprogateway_braintree.php:677
5151
+ #: classes/gateways/class.pmprogateway_braintree.php:849
5152
+ #: classes/gateways/class.pmprogateway_braintree.php:958
5153
+ #: classes/gateways/class.pmprogateway_braintree.php:985
5154
  #: classes/gateways/class.pmprogateway_braintree.php:509
5155
  #: classes/gateways/class.pmprogateway_braintree.php:524
5156
  #: classes/gateways/class.pmprogateway_braintree.php:526
5184
  msgid "Payment error: Please contact the webmaster (braintree-load-error)"
5185
  msgstr ""
5186
 
5187
+ #: classes/gateways/class.pmprogateway_braintree.php:574
 
5188
  #: classes/gateways/class.pmprogateway_braintree.php:61
5189
  #: classes/gateways/class.pmprogateway_braintree.php:406
5190
  #: classes/gateways/class.pmprogateway_braintree.php:419
5221
  msgid "Unknown error: Initial payment failed."
5222
  msgstr ""
5223
 
5224
+ #: classes/gateways/class.pmprogateway_braintree.php:650
5225
  #: classes/gateways/class.pmprogateway_braintree.php:120
5226
  #: classes/gateways/class.pmprogateway_braintree.php:465
5227
  #: classes/gateways/class.pmprogateway_braintree.php:478
5238
  msgid "Error during settlement:"
5239
  msgstr ""
5240
 
5241
+ #: classes/gateways/class.pmprogateway_braintree.php:659
5242
  #: classes/gateways/class.pmprogateway_braintree.php:129
5243
  #: classes/gateways/class.pmprogateway_braintree.php:474
5244
  #: classes/gateways/class.pmprogateway_braintree.php:487
5255
  msgid "Error during charge:"
5256
  msgstr ""
5257
 
5258
+ #: classes/gateways/class.pmprogateway_braintree.php:751
5259
  #: classes/gateways/class.pmprogateway_braintree.php:690
5260
  #: classes/gateways/class.pmprogateway_braintree.php:731
5261
  #: classes/gateways/class.pmprogateway_braintree.php:757
5264
  msgid "Failed to update customer: %s"
5265
  msgstr ""
5266
 
5267
+ #: classes/gateways/class.pmprogateway_braintree.php:763
5268
  #: classes/gateways/class.pmprogateway_braintree.php:198
5269
  #: classes/gateways/class.pmprogateway_braintree.php:221
5270
  #: classes/gateways/class.pmprogateway_braintree.php:566
5282
  msgid "Failed to update customer."
5283
  msgstr ""
5284
 
5285
+ #: classes/gateways/class.pmprogateway_braintree.php:811
5286
  #: classes/gateways/class.pmprogateway_braintree.php:246
5287
  #: classes/gateways/class.pmprogateway_braintree.php:269
5288
  #: classes/gateways/class.pmprogateway_braintree.php:614
5300
  msgid "Failed to create customer."
5301
  msgstr ""
5302
 
5303
+ #: classes/gateways/class.pmprogateway_braintree.php:818
5304
  #: classes/gateways/class.pmprogateway_braintree.php:253
5305
  #: classes/gateways/class.pmprogateway_braintree.php:276
5306
  #: classes/gateways/class.pmprogateway_braintree.php:621
5318
  msgid "Error creating customer record with Braintree:"
5319
  msgstr ""
5320
 
5321
+ #: classes/gateways/class.pmprogateway_braintree.php:934
5322
  #: classes/gateways/class.pmprogateway_braintree.php:940
5323
  #, php-format
5324
  msgid "Error subscribing customer to plan with Braintree: %s (%s)"
5325
  msgstr ""
5326
 
5327
+ #: classes/gateways/class.pmprogateway_braintree.php:949
5328
  #: classes/gateways/class.pmprogateway_braintree.php:955
5329
  #, php-format
5330
  msgid "Failed to subscribe with Braintree: %s"
5331
  msgstr ""
5332
 
5333
+ #: classes/gateways/class.pmprogateway_braintree.php:1020
5334
+ #: classes/gateways/class.pmprogateway_braintree.php:1031
5335
  #: classes/gateways/class.pmprogateway_braintree.php:1026
5336
  #: classes/gateways/class.pmprogateway_braintree.php:1037
5337
  #, php-format
5338
  msgid "Could not find the subscription. %s"
5339
  msgstr ""
5340
 
5341
+ #: classes/gateways/class.pmprogateway_braintree.php:1038
5342
  #: classes/gateways/class.pmprogateway_braintree.php:397
5343
  #: classes/gateways/class.pmprogateway_braintree.php:398
5344
  #: classes/gateways/class.pmprogateway_braintree.php:410
5393
  msgid "Could not find the subscription."
5394
  msgstr ""
5395
 
5396
+ #: classes/gateways/class.pmprogateway_check.php:49
5397
+ #: paid-memberships-pro.php:148 adminpages/orders.php:399
5398
+ #: adminpages/orders.php:449 adminpages/paymentsettings.php:157
5399
+ #: adminpages/paymentsettings.php:159
5400
+ #: classes/gateways/class.pmprogateway_check.php:48
5401
+ #: classes/gateways/class.pmprogateway_check.php:49
5402
+ #: paid-memberships-pro.php:116 paid-memberships-pro.php:117
5403
+ #: paid-memberships-pro.php:124 paid-memberships-pro.php:125
5404
+ #: paid-memberships-pro.php:126 paid-memberships-pro.php:127
5405
+ #: paid-memberships-pro.php:128 paid-memberships-pro.php:129
5406
+ #: paid-memberships-pro.php:130 paid-memberships-pro.php:131
5407
+ #: paid-memberships-pro.php:136 paid-memberships-pro.php:141
5408
+ #: paid-memberships-pro.php:146
5409
+ msgid "Pay by Check"
5410
+ msgstr ""
5411
+
5412
+ #: classes/gateways/class.pmprogateway_check.php:101
5413
+ #: classes/gateways/class.pmprogateway_check.php:100
5414
+ #: classes/gateways/class.pmprogateway_check.php:101
5415
+ msgid "Pay by Check Settings"
5416
+ msgstr ""
5417
+
5418
+ #: classes/gateways/class.pmprogateway_check.php:106
5419
+ #: adminpages/paymentsettings.php:389 adminpages/paymentsettings.php:415
5420
+ #: adminpages/paymentsettings.php:420 adminpages/paymentsettings.php:422
5421
+ #: classes/gateways/class.pmprogateway_check.php:105
5422
+ #: classes/gateways/class.pmprogateway_check.php:106
5423
+ msgid "Instructions"
5424
+ msgstr ""
5425
+
5426
+ #: classes/gateways/class.pmprogateway_check.php:110
5427
+ #: adminpages/paymentsettings.php:393 adminpages/paymentsettings.php:419
5428
+ #: adminpages/paymentsettings.php:424 adminpages/paymentsettings.php:426
5429
+ #: classes/gateways/class.pmprogateway_check.php:109
5430
+ #: classes/gateways/class.pmprogateway_check.php:110
5431
+ msgid ""
5432
+ "Who to write the check out to. Where to mail it. Shown on checkout, "
5433
+ "confirmation, and invoice pages."
5434
+ msgstr ""
5435
+
5436
+ #: classes/gateways/class.pmprogateway_cybersource.php:36
5437
+ #: classes/gateways/class.pmprogateway_cybersource.php:42
5438
+ msgid "CyberSource"
5439
+ msgstr ""
5440
+
5441
+ #: classes/gateways/class.pmprogateway_cybersource.php:83
5442
+ #: classes/gateways/class.pmprogateway_cybersource.php:96
5443
+ msgid "CyberSource Settings"
5444
+ msgstr ""
5445
+
5446
+ #: classes/gateways/class.pmprogateway_cybersource.php:88
5447
+ #: adminpages/paymentsettings.php:174
5448
+ #: classes/gateways/class.pmprogateway_cybersource.php:101
5449
+ msgid ""
5450
+ "This gateway option is in beta. Some functionality may not be available. "
5451
+ "Please contact Paid Memberships Pro with any issues you run into. "
5452
+ "<strong>Please be sure to upgrade Paid Memberships Pro to the latest "
5453
+ "versions when available.</strong>"
5454
+ msgstr ""
5455
+
5456
+ #: classes/gateways/class.pmprogateway_cybersource.php:101
5457
+ #: adminpages/paymentsettings.php:372 adminpages/paymentsettings.php:377
5458
+ #: classes/gateways/class.pmprogateway_cybersource.php:114
5459
+ msgid "Transaction Security Key"
5460
+ msgstr ""
5461
+
5462
+ #: classes/gateways/class.pmprogateway_cybersource.php:316
5463
+ #: classes/gateways/class.pmprogateway_cybersource.php:317
5464
+ #: classes/gateways/class.pmprogateway_cybersource.php:480
5465
+ #: classes/gateways/class.pmprogateway_cybersource.php:481
5466
+ #: classes/gateways/class.pmprogateway_cybersource.php:767
5467
+ #: classes/gateways/class.pmprogateway_cybersource.php:768
5468
+ msgid ""
5469
+ "Error validating credit card type. Make sure your credit card number is "
5470
+ "correct and try again."
5471
+ msgstr ""
5472
+
5473
+ #: classes/gateways/class.pmprogateway_cybersource.php:343
5474
+ #: classes/gateways/class.pmprogateway_cybersource.php:349
5475
+ #: classes/gateways/class.pmprogateway_cybersource.php:395
5476
+ #: classes/gateways/class.pmprogateway_cybersource.php:401
5477
+ #: classes/gateways/class.pmprogateway_cybersource.php:505
5478
+ #: classes/gateways/class.pmprogateway_cybersource.php:511
5479
+ #: classes/gateways/class.pmprogateway_cybersource.php:695
5480
+ #: classes/gateways/class.pmprogateway_cybersource.php:701
5481
+ #: classes/gateways/class.pmprogateway_cybersource.php:779
5482
+ #: classes/gateways/class.pmprogateway_cybersource.php:785
5483
+ #: classes/gateways/class.pmprogateway_cybersource.php:833
5484
+ #: classes/gateways/class.pmprogateway_cybersource.php:839
5485
+ msgid "Error communicating with Cybersource: %"
5486
+ msgstr ""
5487
+
5488
+ #: classes/gateways/class.pmprogateway_cybersource.php:344
5489
+ #: classes/gateways/class.pmprogateway_cybersource.php:350
5490
+ #: classes/gateways/class.pmprogateway_cybersource.php:396
5491
+ #: classes/gateways/class.pmprogateway_cybersource.php:402
5492
+ #: classes/gateways/class.pmprogateway_cybersource.php:506
5493
+ #: classes/gateways/class.pmprogateway_cybersource.php:512
5494
+ #: classes/gateways/class.pmprogateway_cybersource.php:696
5495
+ #: classes/gateways/class.pmprogateway_cybersource.php:702
5496
+ #: classes/gateways/class.pmprogateway_cybersource.php:780
5497
+ #: classes/gateways/class.pmprogateway_cybersource.php:786
5498
+ #: classes/gateways/class.pmprogateway_cybersource.php:834
5499
+ #: classes/gateways/class.pmprogateway_cybersource.php:840
5500
+ msgid "Error communicating with Cybersource."
5501
+ msgstr ""
5502
+
5503
+ #: classes/gateways/class.pmprogateway_cybersource.php:678
5504
+ msgid "The payment gateway doesn't support this credit/debit card type."
5505
+ msgstr ""
5506
+
5507
+ #: classes/gateways/class.pmprogateway_cybersource.php:863
5508
+ msgid "Successful transaction."
5509
+ msgstr ""
5510
+
5511
+ #: classes/gateways/class.pmprogateway_cybersource.php:864
5512
+ msgid "The request is missing one or more required fields."
5513
+ msgstr ""
5514
+
5515
+ #: classes/gateways/class.pmprogateway_cybersource.php:865
5516
+ msgid ""
5517
+ "One or more fields in the request contains invalid data. Check that your "
5518
+ "billing address is valid."
5519
+ msgstr ""
5520
+
5521
+ #: classes/gateways/class.pmprogateway_cybersource.php:866
5522
+ msgid "Duplicate order detected."
5523
+ msgstr ""
5524
+
5525
+ #: classes/gateways/class.pmprogateway_cybersource.php:867
5526
+ msgid "Only partial amount was approved."
5527
+ msgstr ""
5528
+
5529
+ #: classes/gateways/class.pmprogateway_cybersource.php:868
5530
+ msgid "Error: General system failure."
5531
+ msgstr ""
5532
+
5533
+ #: classes/gateways/class.pmprogateway_cybersource.php:869
5534
+ msgid "Error: The request was received but there was a server timeout."
5535
+ msgstr ""
5536
+
5537
+ #: classes/gateways/class.pmprogateway_cybersource.php:870
5538
+ msgid ""
5539
+ "Error: The request was received, but a service did not finish running in "
5540
+ "time. "
5541
+ msgstr ""
5542
+
5543
+ #: classes/gateways/class.pmprogateway_cybersource.php:871
5544
+ msgid "Address Verification Service (AVS) failure."
5545
+ msgstr ""
5546
+
5547
+ #: classes/gateways/class.pmprogateway_cybersource.php:872
5548
+ msgid "Authorization failed."
5549
+ msgstr ""
5550
+
5551
+ #: classes/gateways/class.pmprogateway_cybersource.php:873
5552
+ msgid "Expired card or invalid expiration date."
5553
+ msgstr ""
5554
+
5555
+ #: classes/gateways/class.pmprogateway_cybersource.php:874
5556
+ msgid "The card was declined."
5557
+ msgstr ""
5558
+
5559
+ #: classes/gateways/class.pmprogateway_cybersource.php:875
5560
+ msgid "Insufficient funds in the account."
5561
+ msgstr ""
5562
+
5563
+ #: classes/gateways/class.pmprogateway_cybersource.php:876
5564
+ msgid "Stolen or lost card."
5565
+ msgstr ""
5566
+
5567
+ #: classes/gateways/class.pmprogateway_cybersource.php:877
5568
+ msgid "Issuing bank unavailable."
5569
+ msgstr ""
5570
+
5571
+ #: classes/gateways/class.pmprogateway_cybersource.php:878
5572
+ msgid "Inactive card or card not authorized for card-not-present transactions."
5573
+ msgstr ""
5574
+
5575
+ #: classes/gateways/class.pmprogateway_cybersource.php:879
5576
+ msgid "American Express Card Identification Digits (CID) did not match."
5577
+ msgstr ""
5578
+
5579
+ #: classes/gateways/class.pmprogateway_cybersource.php:880
5580
+ msgid "The card has reached the credit limit. "
5581
+ msgstr ""
5582
+
5583
+ #: classes/gateways/class.pmprogateway_cybersource.php:881
5584
+ msgid "Invalid card verification number."
5585
+ msgstr ""
5586
+
5587
+ #: classes/gateways/class.pmprogateway_cybersource.php:882
5588
+ msgid "The customer matched an entry on the processors negative file. "
5589
+ msgstr ""
5590
+
5591
+ #: classes/gateways/class.pmprogateway_cybersource.php:883
5592
+ msgid "Card verification (CV) check failed."
5593
+ msgstr ""
5594
+
5595
+ #: classes/gateways/class.pmprogateway_cybersource.php:884
5596
+ msgid "Invalid account number."
5597
+ msgstr ""
5598
+
5599
+ #: classes/gateways/class.pmprogateway_cybersource.php:885
5600
+ msgid "The card type is not accepted by the payment processor."
5601
+ msgstr ""
5602
+
5603
+ #: classes/gateways/class.pmprogateway_cybersource.php:886
5604
+ msgid "General decline by the processor."
5605
+ msgstr ""
5606
+
5607
+ #: classes/gateways/class.pmprogateway_cybersource.php:887
5608
+ msgid "There is a problem with your CyberSource merchant configuration."
5609
+ msgstr ""
5610
+
5611
+ #: classes/gateways/class.pmprogateway_cybersource.php:888
5612
+ msgid "The requested amount exceeds the originally authorized amount."
5613
+ msgstr ""
5614
+
5615
+ #: classes/gateways/class.pmprogateway_cybersource.php:889
5616
+ msgid "Processor failure."
5617
+ msgstr ""
5618
+
5619
+ #: classes/gateways/class.pmprogateway_cybersource.php:890
5620
+ msgid "The authorization has already been reversed."
5621
+ msgstr ""
5622
+
5623
+ #: classes/gateways/class.pmprogateway_cybersource.php:891
5624
+ msgid "The authorization has already been captured."
5625
+ msgstr ""
5626
+
5627
+ #: classes/gateways/class.pmprogateway_cybersource.php:892
5628
+ msgid ""
5629
+ "The requested transaction amount must match the previous transaction amount."
5630
+ msgstr ""
5631
+
5632
+ #: classes/gateways/class.pmprogateway_cybersource.php:893
5633
+ msgid ""
5634
+ "The card type sent is invalid or does not correlate with the credit card "
5635
+ "number."
5636
+ msgstr ""
5637
+
5638
+ #: classes/gateways/class.pmprogateway_cybersource.php:894
5639
+ msgid "The referenced request id is invalid for all follow-on transactions."
5640
+ msgstr ""
5641
+
5642
+ #: classes/gateways/class.pmprogateway_cybersource.php:895
5643
+ msgid "The request ID is invalid."
5644
+ msgstr ""
5645
+
5646
+ #: classes/gateways/class.pmprogateway_cybersource.php:896
5647
+ msgid "The transaction has already been settled or reversed."
5648
+ msgstr ""
5649
+
5650
+ #: classes/gateways/class.pmprogateway_cybersource.php:897
5651
+ msgid ""
5652
+ "The capture or credit is not voidable because the capture or credit "
5653
+ "information has already been submitted to your processor. Or, you requested "
5654
+ "a void for a type of transaction that cannot be voided."
5655
+ msgstr ""
5656
+
5657
+ #: classes/gateways/class.pmprogateway_cybersource.php:898
5658
+ msgid "You requested a credit for a capture that was previously voided."
5659
+ msgstr ""
5660
+
5661
+ #: classes/gateways/class.pmprogateway_cybersource.php:899
5662
+ msgid ""
5663
+ "Error: The request was received, but there was a timeout at the payment "
5664
+ "processor."
5665
+ msgstr ""
5666
+
5667
+ #: classes/gateways/class.pmprogateway_cybersource.php:900
5668
+ msgid "Stand-alone credits are not allowed with this processor."
5669
+ msgstr ""
5670
+
5671
+ #: classes/gateways/class.pmprogateway_cybersource.php:901
5672
+ msgid ""
5673
+ "Apartment number missing or not found. Check that your billing address is "
5674
+ "valid."
5675
+ msgstr ""
5676
+
5677
+ #: classes/gateways/class.pmprogateway_cybersource.php:902
5678
+ msgid ""
5679
+ "Insufficient address information. Check that your billing address is valid."
5680
+ msgstr ""
5681
+
5682
+ #: classes/gateways/class.pmprogateway_cybersource.php:903
5683
+ msgid ""
5684
+ "House/Box number not found on street. Check that your billing address is "
5685
+ "valid."
5686
+ msgstr ""
5687
+
5688
+ #: classes/gateways/class.pmprogateway_cybersource.php:904
5689
+ msgid ""
5690
+ "Multiple address matches were found. Check that your billing address is "
5691
+ "valid."
5692
+ msgstr ""
5693
+
5694
+ #: classes/gateways/class.pmprogateway_cybersource.php:905
5695
+ msgid ""
5696
+ "P.O. Box identifier not found or out of range.. Check that your billing "
5697
+ "address is valid."
5698
+ msgstr ""
5699
+
5700
+ #: classes/gateways/class.pmprogateway_cybersource.php:906
5701
+ msgid ""
5702
+ "Route service identifier not found or out of range. Check that your billing "
5703
+ "address is valid."
5704
  msgstr ""
5705
 
5706
+ #: classes/gateways/class.pmprogateway_cybersource.php:907
5707
+ msgid ""
5708
+ "Street name not found in Postal code. Check that your billing address is "
5709
+ "valid."
5710
  msgstr ""
5711
 
5712
+ #: classes/gateways/class.pmprogateway_cybersource.php:908
5713
+ msgid ""
5714
+ "Postal code not found in database. Check that your billing address is valid."
 
 
 
5715
  msgstr ""
5716
 
5717
+ #: classes/gateways/class.pmprogateway_cybersource.php:909
 
 
 
 
5718
  msgid ""
5719
+ "Unable to verify or correct address. Check that your billing address is "
5720
+ "valid."
5721
  msgstr ""
5722
 
5723
+ #: classes/gateways/class.pmprogateway_cybersource.php:910
5724
+ msgid ""
5725
+ "Multiple address matches were found (international). Check that your billing "
5726
+ "address is valid."
5727
  msgstr ""
5728
 
5729
+ #: classes/gateways/class.pmprogateway_cybersource.php:911
5730
+ msgid "Address match not found. Check that your billing address is valid."
 
5731
  msgstr ""
5732
 
5733
+ #: classes/gateways/class.pmprogateway_cybersource.php:912
 
 
5734
  msgid ""
5735
+ "Unsupported character set. Verify the character set that you are using to "
5736
+ "process transactions."
 
 
5737
  msgstr ""
5738
 
5739
+ #: classes/gateways/class.pmprogateway_cybersource.php:913
5740
+ msgid "Order has been rejected by Decision Manager."
5741
+ msgstr ""
5742
+
5743
+ #: classes/gateways/class.pmprogateway_cybersource.php:914
5744
+ msgid "Smart Authorization failed."
5745
+ msgstr ""
5746
+
5747
+ #: classes/gateways/class.pmprogateway_cybersource.php:915
5748
+ msgid "Your order has been refused."
5749
+ msgstr ""
5750
+
5751
+ #: classes/gateways/class.pmprogateway_cybersource.php:921
5752
+ msgid "Unknown error."
5753
+ msgstr ""
5754
+
5755
+ #: classes/gateways/class.pmprogateway_cybersource.php:926
5756
+ msgid " Invalid fields:"
5757
  msgstr ""
5758
 
5759
  #: classes/gateways/class.pmprogateway_payflowpro.php:39
5781
  msgstr ""
5782
 
5783
  #: classes/gateways/class.pmprogateway_payflowpro.php:124
5784
+ #: pages/checkout.php:127 adminpages/paymentsettings.php:219
5785
  #: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:228
5786
  #: classes/gateways/class.pmprogateway_payflowpro.php:124
5787
  #: pages/checkout.php:176 pages/checkout.php:177 pages/checkout.php:180
5805
  msgstr ""
5806
 
5807
  #: classes/gateways/class.pmprogateway_payflowpro.php:194
5808
+ #: classes/gateways/class.pmprogateway_paypal.php:332
5809
  #: classes/gateways/class.pmprogateway_payflowpro.php:57
5810
  #: classes/gateways/class.pmprogateway_payflowpro.php:194
5811
  #: classes/gateways/class.pmprogateway_paypal.php:57
5818
  msgstr ""
5819
 
5820
  #: classes/gateways/class.pmprogateway_paypal.php:68
5821
+ #: paid-memberships-pro.php:151
5822
  #: classes/gateways/class.pmprogateway_paypal.php:57
5823
  #: classes/gateways/class.pmprogateway_paypal.php:68
5824
  #: paid-memberships-pro.php:119 paid-memberships-pro.php:120
5827
  #: paid-memberships-pro.php:131 paid-memberships-pro.php:132
5828
  #: paid-memberships-pro.php:133 paid-memberships-pro.php:134
5829
  #: paid-memberships-pro.php:139 paid-memberships-pro.php:144
5830
+ #: paid-memberships-pro.php:149
5831
  msgid "PayPal Website Payments Pro"
5832
  msgstr ""
5833
 
5834
+ #: classes/gateways/class.pmprogateway_paypal.php:131
5835
  #: classes/gateways/class.pmprogateway_paypalexpress.php:140
5836
  #: classes/gateways/class.pmprogateway_paypalstandard.php:132
5837
  #: classes/gateways/class.pmprogateway_paypal.php:113
5844
  msgid "PayPal Settings"
5845
  msgstr ""
5846
 
5847
+ #: classes/gateways/class.pmprogateway_paypal.php:136
5848
  #: classes/gateways/class.pmprogateway_paypalexpress.php:145
5849
  #: classes/gateways/class.pmprogateway_paypalstandard.php:137
5850
  #: adminpages/paymentsettings.php:179
5863
  "here.</a>"
5864
  msgstr ""
5865
 
5866
+ #: classes/gateways/class.pmprogateway_paypal.php:141
5867
  #: classes/gateways/class.pmprogateway_paypalexpress.php:150
5868
  #: classes/gateways/class.pmprogateway_paypalstandard.php:142
5869
  #: adminpages/paymentsettings.php:227 adminpages/paymentsettings.php:231
5878
  msgid "Gateway Account Email"
5879
  msgstr ""
5880
 
5881
+ #: classes/gateways/class.pmprogateway_paypal.php:149
5882
  #: classes/gateways/class.pmprogateway_paypalexpress.php:158
5883
  #: classes/gateways/class.pmprogateway_paypalstandard.php:150
5884
  #: classes/gateways/class.pmprogateway_twocheckout.php:119
5898
  msgid "API Username"
5899
  msgstr ""
5900
 
5901
+ #: classes/gateways/class.pmprogateway_paypal.php:157
5902
  #: classes/gateways/class.pmprogateway_paypalexpress.php:166
5903
  #: classes/gateways/class.pmprogateway_paypalstandard.php:158
5904
  #: classes/gateways/class.pmprogateway_twocheckout.php:128
5918
  msgid "API Password"
5919
  msgstr ""
5920
 
5921
+ #: classes/gateways/class.pmprogateway_paypal.php:165
5922
  #: classes/gateways/class.pmprogateway_paypalexpress.php:174
5923
  #: classes/gateways/class.pmprogateway_paypalstandard.php:166
5924
  #: adminpages/paymentsettings.php:251 adminpages/paymentsettings.php:255
5933
  msgid "API Signature"
5934
  msgstr ""
5935
 
5936
+ #: classes/gateways/class.pmprogateway_paypal.php:173
5937
  #: classes/gateways/class.pmprogateway_paypalexpress.php:182
5938
  #: classes/gateways/class.pmprogateway_paypal.php:167
5939
  #: classes/gateways/class.pmprogateway_paypalexpress.php:182
5940
  msgid "Confirmation Step"
5941
  msgstr ""
5942
 
5943
+ #: classes/gateways/class.pmprogateway_paypal.php:184
5944
  #: classes/gateways/class.pmprogateway_paypalexpress.php:193
5945
  #: classes/gateways/class.pmprogateway_paypalstandard.php:174
5946
  #: adminpages/paymentsettings.php:446 adminpages/paymentsettings.php:479
5955
  msgid "IPN Handler URL"
5956
  msgstr ""
5957
 
5958
+ #: classes/gateways/class.pmprogateway_paypal.php:187
5959
  #: classes/gateways/class.pmprogateway_paypal.php:158
5960
  #: classes/gateways/class.pmprogateway_paypal.php:181
5961
  msgid ""
5963
  "SHOULD NOT set this in your PayPal account settings."
5964
  msgstr ""
5965
 
5966
+ #: classes/gateways/class.pmprogateway_paypal.php:268
5967
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:463
5968
  #: classes/gateways/class.pmprogateway_paypalstandard.php:229
5969
+ #: pages/checkout.php:214 classes/gateways/class.pmprogateway_paypal.php:178
5970
  #: classes/gateways/class.pmprogateway_paypal.php:201
5971
  #: classes/gateways/class.pmprogateway_paypalexpress.php:402
5972
  #: classes/gateways/class.pmprogateway_paypalexpress.php:412
5984
  msgid "Check Out with PayPal"
5985
  msgstr ""
5986
 
5987
+ #: classes/gateways/class.pmprogateway_paypal.php:274
5988
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:468
5989
  #: classes/gateways/class.pmprogateway_paypalstandard.php:234
5990
+ #: pages/checkout.php:496 classes/gateways/class.pmprogateway_paypal.php:184
5991
  #: classes/gateways/class.pmprogateway_paypal.php:207
5992
  #: classes/gateways/class.pmprogateway_paypalexpress.php:408
5993
  #: classes/gateways/class.pmprogateway_paypalexpress.php:418
6005
  msgid "Submit and Check Out"
6006
  msgstr ""
6007
 
6008
+ #: classes/gateways/class.pmprogateway_paypal.php:274
6009
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:468
6010
  #: classes/gateways/class.pmprogateway_paypalstandard.php:234
6011
  #: classes/gateways/class.pmprogateway_twocheckout.php:203
6012
+ #: pages/checkout.php:496 classes/gateways/class.pmprogateway_paypal.php:184
6013
  #: classes/gateways/class.pmprogateway_paypal.php:207
6014
  #: classes/gateways/class.pmprogateway_paypalexpress.php:408
6015
  #: classes/gateways/class.pmprogateway_paypalexpress.php:418
6030
  msgid "Submit and Confirm"
6031
  msgstr ""
6032
 
6033
+ #: classes/gateways/class.pmprogateway_paypal.php:681
6034
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:768
6035
  #: classes/gateways/class.pmprogateway_paypalstandard.php:575
6036
  #: classes/gateways/class.pmprogateway_paypal.php:385
6037
  #: classes/gateways/class.pmprogateway_paypal.php:605
6062
  msgstr ""
6063
 
6064
  #: classes/gateways/class.pmprogateway_paypalexpress.php:84
6065
+ #: paid-memberships-pro.php:150
6066
  #: classes/gateways/class.pmprogateway_paypalexpress.php:63
6067
  #: classes/gateways/class.pmprogateway_paypalexpress.php:73
6068
  #: classes/gateways/class.pmprogateway_paypalexpress.php:84
6072
  #: paid-memberships-pro.php:130 paid-memberships-pro.php:131
6073
  #: paid-memberships-pro.php:132 paid-memberships-pro.php:133
6074
  #: paid-memberships-pro.php:138 paid-memberships-pro.php:143
6075
+ #: paid-memberships-pro.php:148
6076
  msgid "PayPal Express"
6077
  msgstr ""
6078
 
6085
  msgid "To fully integrate with PayPal, be sure to set your IPN Handler URL to "
6086
  msgstr ""
6087
 
6088
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:327
6089
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:382
6090
  #: classes/gateways/class.pmprogateway_paypalexpress.php:268
6091
  #: classes/gateways/class.pmprogateway_paypalexpress.php:278
6092
  #: classes/gateways/class.pmprogateway_paypalexpress.php:301
6106
  msgstr ""
6107
 
6108
  #: classes/gateways/class.pmprogateway_paypalstandard.php:71
6109
+ #: paid-memberships-pro.php:153
6110
  #: classes/gateways/class.pmprogateway_paypalstandard.php:60
6111
  #: classes/gateways/class.pmprogateway_paypalstandard.php:71
6112
  #: paid-memberships-pro.php:121 paid-memberships-pro.php:122
6115
  #: paid-memberships-pro.php:133 paid-memberships-pro.php:134
6116
  #: paid-memberships-pro.php:135 paid-memberships-pro.php:136
6117
  #: paid-memberships-pro.php:141 paid-memberships-pro.php:146
6118
+ #: paid-memberships-pro.php:151
6119
  msgid "PayPal Standard"
6120
  msgstr ""
6121
 
6132
  msgid "User requested cancellation"
6133
  msgstr ""
6134
 
6135
+ #: classes/gateways/class.pmprogateway_stripe.php:229
6136
+ #: paid-memberships-pro.php:149
6137
  #: classes/gateways/class.pmprogateway_stripe.php:93
6138
  #: classes/gateways/class.pmprogateway_stripe.php:94
6139
  #: classes/gateways/class.pmprogateway_stripe.php:104
6143
  #: classes/gateways/class.pmprogateway_stripe.php:140
6144
  #: classes/gateways/class.pmprogateway_stripe.php:142
6145
  #: classes/gateways/class.pmprogateway_stripe.php:169
6146
+ #: classes/gateways/class.pmprogateway_stripe.php:198
6147
  #: classes/gateways/class.pmprogateway_stripe.php:201
6148
  #: classes/gateways/class.pmprogateway_stripe.php:203
6149
  #: paid-memberships-pro.php:117 paid-memberships-pro.php:118
6152
  #: paid-memberships-pro.php:129 paid-memberships-pro.php:130
6153
  #: paid-memberships-pro.php:131 paid-memberships-pro.php:132
6154
  #: paid-memberships-pro.php:137 paid-memberships-pro.php:142
6155
+ #: paid-memberships-pro.php:147
6156
  msgid "Stripe"
6157
  msgstr ""
6158
 
6159
+ #: classes/gateways/class.pmprogateway_stripe.php:283
6160
  #: classes/gateways/class.pmprogateway_stripe.php:148
6161
  #: classes/gateways/class.pmprogateway_stripe.php:149
6162
  #: classes/gateways/class.pmprogateway_stripe.php:159
6166
  #: classes/gateways/class.pmprogateway_stripe.php:195
6167
  #: classes/gateways/class.pmprogateway_stripe.php:197
6168
  #: classes/gateways/class.pmprogateway_stripe.php:224
6169
+ #: classes/gateways/class.pmprogateway_stripe.php:250
6170
  #: classes/gateways/class.pmprogateway_stripe.php:256
6171
  #: classes/gateways/class.pmprogateway_stripe.php:258
6172
  msgid "Stripe Settings"
6173
  msgstr ""
6174
 
6175
+ #: classes/gateways/class.pmprogateway_stripe.php:288
6176
  #: adminpages/paymentsettings.php:285 adminpages/paymentsettings.php:289
6177
  #: adminpages/paymentsettings.php:294
6178
  #: classes/gateways/class.pmprogateway_stripe.php:161
6184
  #: classes/gateways/class.pmprogateway_stripe.php:208
6185
  #: classes/gateways/class.pmprogateway_stripe.php:210
6186
  #: classes/gateways/class.pmprogateway_stripe.php:237
6187
+ #: classes/gateways/class.pmprogateway_stripe.php:255
6188
  #: classes/gateways/class.pmprogateway_stripe.php:261
6189
  #: classes/gateways/class.pmprogateway_stripe.php:263
6190
  #: classes/gateways/class.pmprogateway_stripe.php:269
6191
  msgid "Publishable Key"
6192
  msgstr ""
6193
 
6194
+ #: classes/gateways/class.pmprogateway_stripe.php:298
6195
  #: classes/gateways/class.pmprogateway_stripe.php:263
6196
  #: classes/gateways/class.pmprogateway_stripe.php:269
6197
  #: classes/gateways/class.pmprogateway_stripe.php:271
6198
  msgid "Your Publishable Key appears incorrect."
6199
  msgstr ""
6200
 
6201
+ #: classes/gateways/class.pmprogateway_stripe.php:306
6202
  #: adminpages/paymentsettings.php:277 adminpages/paymentsettings.php:281
6203
  #: adminpages/paymentsettings.php:286
6204
  #: classes/gateways/class.pmprogateway_stripe.php:153
6211
  #: classes/gateways/class.pmprogateway_stripe.php:202
6212
  #: classes/gateways/class.pmprogateway_stripe.php:229
6213
  #: classes/gateways/class.pmprogateway_stripe.php:261
6214
+ #: classes/gateways/class.pmprogateway_stripe.php:271
6215
  #: classes/gateways/class.pmprogateway_stripe.php:277
6216
  #: classes/gateways/class.pmprogateway_stripe.php:279
6217
  msgid "Secret Key"
6218
  msgstr ""
6219
 
6220
+ #: classes/gateways/class.pmprogateway_stripe.php:315
6221
  #: adminpages/paymentsettings.php:425 adminpages/paymentsettings.php:430
6222
  #: adminpages/paymentsettings.php:432
6223
  #: classes/gateways/class.pmprogateway_stripe.php:169
6230
  #: classes/gateways/class.pmprogateway_stripe.php:218
6231
  #: classes/gateways/class.pmprogateway_stripe.php:245
6232
  #: classes/gateways/class.pmprogateway_stripe.php:277
6233
+ #: classes/gateways/class.pmprogateway_stripe.php:279
6234
  #: classes/gateways/class.pmprogateway_stripe.php:285
6235
  #: classes/gateways/class.pmprogateway_stripe.php:287
6236
  #: classes/gateways/class.pmprogateway_stripe.php:293
6238
  msgid "Show Billing Address Fields"
6239
  msgstr ""
6240
 
6241
+ #: classes/gateways/class.pmprogateway_stripe.php:325
6242
  #: adminpages/paymentsettings.php:437 adminpages/paymentsettings.php:439
6243
  #: classes/gateways/class.pmprogateway_stripe.php:176
6244
  #: classes/gateways/class.pmprogateway_stripe.php:177
6250
  #: classes/gateways/class.pmprogateway_stripe.php:225
6251
  #: classes/gateways/class.pmprogateway_stripe.php:252
6252
  #: classes/gateways/class.pmprogateway_stripe.php:284
6253
+ #: classes/gateways/class.pmprogateway_stripe.php:286
6254
  #: classes/gateways/class.pmprogateway_stripe.php:292
6255
  #: classes/gateways/class.pmprogateway_stripe.php:294
6256
  #: classes/gateways/class.pmprogateway_stripe.php:300
6261
  "verification in the Stripe dashboard settings.</strong>"
6262
  msgstr ""
6263
 
6264
+ #: classes/gateways/class.pmprogateway_stripe.php:333
6265
  #: adminpages/paymentsettings.php:465 adminpages/paymentsettings.php:506
6266
  #: adminpages/paymentsettings.php:512 adminpages/paymentsettings.php:514
6267
  #: classes/gateways/class.pmprogateway_stripe.php:184
6274
  #: classes/gateways/class.pmprogateway_stripe.php:233
6275
  #: classes/gateways/class.pmprogateway_stripe.php:260
6276
  #: classes/gateways/class.pmprogateway_stripe.php:292
6277
+ #: classes/gateways/class.pmprogateway_stripe.php:294
6278
  #: classes/gateways/class.pmprogateway_stripe.php:300
6279
  #: classes/gateways/class.pmprogateway_stripe.php:302
6280
  #: classes/gateways/class.pmprogateway_stripe.php:308
6282
  msgid "To fully integrate with Stripe, be sure to set your Web Hook URL to"
6283
  msgstr ""
6284
 
6285
+ #: classes/gateways/class.pmprogateway_stripe.php:340
6286
  #: classes/gateways/class.pmprogateway_stripe.php:299
6287
  #: classes/gateways/class.pmprogateway_stripe.php:307
6288
  msgid "Stripe API Version"
6289
  msgstr ""
6290
 
6291
+ #: classes/gateways/class.pmprogateway_stripe.php:368
6292
+ msgid "Verification steps confirmed. Your payment is processing."
 
 
 
 
 
 
6293
  msgstr ""
6294
 
6295
+ #: classes/gateways/class.pmprogateway_stripe.php:572
6296
+ msgid "CVC"
6297
+ msgstr ""
6298
+
6299
+ #: classes/gateways/class.pmprogateway_stripe.php:650
6300
  #: classes/gateways/class.pmprogateway_stripe.php:693
6301
  #: classes/gateways/class.pmprogateway_stripe.php:703
6302
  #: classes/gateways/class.pmprogateway_stripe.php:710
6310
  "have been deleted."
6311
  msgstr ""
6312
 
6313
+ #: classes/gateways/class.pmprogateway_stripe.php:655
6314
  #: classes/gateways/class.pmprogateway_stripe.php:567
6315
  #: classes/gateways/class.pmprogateway_stripe.php:568
6316
  #: classes/gateways/class.pmprogateway_stripe.php:578
6322
  #: classes/gateways/class.pmprogateway_stripe.php:634
6323
  #: classes/gateways/class.pmprogateway_stripe.php:645
6324
  #: classes/gateways/class.pmprogateway_stripe.php:683
6325
+ #: classes/gateways/class.pmprogateway_stripe.php:698
6326
  #: classes/gateways/class.pmprogateway_stripe.php:710
6327
  #: classes/gateways/class.pmprogateway_stripe.php:717
6328
  #: classes/gateways/class.pmprogateway_stripe.php:725
6332
  msgid "Subscription Updates"
6333
  msgstr ""
6334
 
6335
+ #: classes/gateways/class.pmprogateway_stripe.php:659
6336
  #: classes/gateways/class.pmprogateway_stripe.php:571
6337
  #: classes/gateways/class.pmprogateway_stripe.php:572
6338
  #: classes/gateways/class.pmprogateway_stripe.php:582
6344
  #: classes/gateways/class.pmprogateway_stripe.php:638
6345
  #: classes/gateways/class.pmprogateway_stripe.php:649
6346
  #: classes/gateways/class.pmprogateway_stripe.php:687
6347
+ #: classes/gateways/class.pmprogateway_stripe.php:702
6348
  #: classes/gateways/class.pmprogateway_stripe.php:714
6349
  #: classes/gateways/class.pmprogateway_stripe.php:721
6350
  #: classes/gateways/class.pmprogateway_stripe.php:729
6356
  "at predefined times. Be sure to click Update Profile after making changes."
6357
  msgstr ""
6358
 
6359
+ #: classes/gateways/class.pmprogateway_stripe.php:661
6360
  #: classes/gateways/class.pmprogateway_stripe.php:573
6361
  #: classes/gateways/class.pmprogateway_stripe.php:574
6362
  #: classes/gateways/class.pmprogateway_stripe.php:584
6368
  #: classes/gateways/class.pmprogateway_stripe.php:640
6369
  #: classes/gateways/class.pmprogateway_stripe.php:651
6370
  #: classes/gateways/class.pmprogateway_stripe.php:689
6371
+ #: classes/gateways/class.pmprogateway_stripe.php:704
6372
  #: classes/gateways/class.pmprogateway_stripe.php:716
6373
  #: classes/gateways/class.pmprogateway_stripe.php:723
6374
  #: classes/gateways/class.pmprogateway_stripe.php:731
6380
  "at predefined times. Be sure to click Update User after making changes."
6381
  msgstr ""
6382
 
6383
+ #: classes/gateways/class.pmprogateway_stripe.php:667 pages/billing.php:370
6384
  #: classes/gateways/class.pmprogateway_stripe.php:578
6385
  #: classes/gateways/class.pmprogateway_stripe.php:579
6386
  #: classes/gateways/class.pmprogateway_stripe.php:589
6392
  #: classes/gateways/class.pmprogateway_stripe.php:645
6393
  #: classes/gateways/class.pmprogateway_stripe.php:656
6394
  #: classes/gateways/class.pmprogateway_stripe.php:694
6395
+ #: classes/gateways/class.pmprogateway_stripe.php:709
6396
  #: classes/gateways/class.pmprogateway_stripe.php:721
6397
  #: classes/gateways/class.pmprogateway_stripe.php:728
6398
  #: classes/gateways/class.pmprogateway_stripe.php:736
6407
  msgid "Update"
6408
  msgstr ""
6409
 
6410
+ #: classes/gateways/class.pmprogateway_stripe.php:1243
6411
+ #: classes/gateways/class.pmprogateway_stripe.php:1256
 
 
 
 
 
 
 
 
 
6412
  #: classes/gateways/class.pmprogateway_stripe.php:1236
6413
  #: classes/gateways/class.pmprogateway_stripe.php:1247
6414
  #: classes/gateways/class.pmprogateway_stripe.php:1289
6419
  msgid "Error: %s"
6420
  msgstr ""
6421
 
6422
+ #: classes/gateways/class.pmprogateway_stripe.php:1349
6423
  #: classes/gateways/class.pmprogateway_stripe.php:190
6424
  #: classes/gateways/class.pmprogateway_stripe.php:192
6425
  #: classes/gateways/class.pmprogateway_stripe.php:199
6436
  #: classes/gateways/class.pmprogateway_stripe.php:1260
6437
  #: classes/gateways/class.pmprogateway_stripe.php:1300
6438
  #: classes/gateways/class.pmprogateway_stripe.php:1303
6439
+ #: classes/gateways/class.pmprogateway_stripe.php:1322
6440
  #: classes/gateways/class.pmprogateway_stripe.php:1325
6441
  #: classes/gateways/class.pmprogateway_stripe.php:1326
6442
  #: classes/gateways/class.pmprogateway_stripe.php:1336
6450
  msgid "Error creating customer record with Stripe:"
6451
  msgstr ""
6452
 
6453
+ #: classes/gateways/class.pmprogateway_stripe.php:1408
6454
  #: classes/gateways/class.pmprogateway_stripe.php:1275
6455
  #: classes/gateways/class.pmprogateway_stripe.php:1303
6456
  #: classes/gateways/class.pmprogateway_stripe.php:1313
6457
  #: classes/gateways/class.pmprogateway_stripe.php:1317
6458
  #: classes/gateways/class.pmprogateway_stripe.php:1357
6459
  #: classes/gateways/class.pmprogateway_stripe.php:1360
6460
+ #: classes/gateways/class.pmprogateway_stripe.php:1374
6461
  #: classes/gateways/class.pmprogateway_stripe.php:1384
6462
  #: classes/gateways/class.pmprogateway_stripe.php:1385
6463
  #: classes/gateways/class.pmprogateway_stripe.php:1395
6471
  msgid "Error getting subscription with Stripe:"
6472
  msgstr ""
6473
 
6474
+ #: classes/gateways/class.pmprogateway_stripe.php:1559
6475
  #: classes/gateways/class.pmprogateway_stripe.php:278
6476
  #: classes/gateways/class.pmprogateway_stripe.php:279
6477
  #: classes/gateways/class.pmprogateway_stripe.php:286
6496
  #: classes/gateways/class.pmprogateway_stripe.php:1467
6497
  #: classes/gateways/class.pmprogateway_stripe.php:1507
6498
  #: classes/gateways/class.pmprogateway_stripe.php:1510
6499
+ #: classes/gateways/class.pmprogateway_stripe.php:1525
6500
  #: classes/gateways/class.pmprogateway_stripe.php:1540
6501
  #: classes/gateways/class.pmprogateway_stripe.php:1541
6502
  #: classes/gateways/class.pmprogateway_stripe.php:1551
6510
  msgid "Error creating plan with Stripe:"
6511
  msgstr ""
6512
 
6513
+ #: classes/gateways/class.pmprogateway_stripe.php:1590
6514
  #: classes/gateways/class.pmprogateway_stripe.php:294
6515
  #: classes/gateways/class.pmprogateway_stripe.php:295
6516
  #: classes/gateways/class.pmprogateway_stripe.php:302
6530
  #: classes/gateways/class.pmprogateway_stripe.php:1498
6531
  #: classes/gateways/class.pmprogateway_stripe.php:1538
6532
  #: classes/gateways/class.pmprogateway_stripe.php:1541
6533
+ #: classes/gateways/class.pmprogateway_stripe.php:1554
6534
  #: classes/gateways/class.pmprogateway_stripe.php:1571
6535
  #: classes/gateways/class.pmprogateway_stripe.php:1572
6536
  #: classes/gateways/class.pmprogateway_stripe.php:1582
6544
  msgid "Error subscribing customer to plan with Stripe:"
6545
  msgstr ""
6546
 
6547
+ #: classes/gateways/class.pmprogateway_stripe.php:1681
6548
  #: classes/gateways/class.pmprogateway_stripe.php:769
6549
  #: classes/gateways/class.pmprogateway_stripe.php:770
6550
  #: classes/gateways/class.pmprogateway_stripe.php:780
6557
  #: classes/gateways/class.pmprogateway_stripe.php:849
6558
  #: classes/gateways/class.pmprogateway_stripe.php:887
6559
  #: classes/gateways/class.pmprogateway_stripe.php:914
6560
+ #: classes/gateways/class.pmprogateway_stripe.php:1643
6561
  #: classes/gateways/class.pmprogateway_stripe.php:1698
6562
  #: classes/gateways/class.pmprogateway_stripe.php:1706
6563
  #: classes/gateways/class.pmprogateway_stripe.php:1714
6567
  msgid "Could not cancel the old subscription. Updates have not been processed."
6568
  msgstr ""
6569
 
6570
+ #: classes/gateways/class.pmprogateway_stripe.php:1793
6571
  #: classes/gateways/class.pmprogateway_stripe.php:383
6572
  #: classes/gateways/class.pmprogateway_stripe.php:389
6573
  #: classes/gateways/class.pmprogateway_stripe.php:410
6588
  #: classes/gateways/class.pmprogateway_stripe.php:1668
6589
  #: classes/gateways/class.pmprogateway_stripe.php:1678
6590
  #: classes/gateways/class.pmprogateway_stripe.php:1716
6591
+ #: classes/gateways/class.pmprogateway_stripe.php:1744
6592
  #: classes/gateways/class.pmprogateway_stripe.php:1752
6593
  #: classes/gateways/class.pmprogateway_stripe.php:1801
6594
  #: classes/gateways/class.pmprogateway_stripe.php:1809
6599
  msgid "Could not cancel old subscription."
6600
  msgstr ""
6601
 
6602
+ #: classes/gateways/class.pmprogateway_stripe.php:1809
6603
  #: classes/gateways/class.pmprogateway_stripe.php:1533
6604
  #: classes/gateways/class.pmprogateway_stripe.php:1534
6605
  #: classes/gateways/class.pmprogateway_stripe.php:1535
6617
  #: classes/gateways/class.pmprogateway_stripe.php:1685
6618
  #: classes/gateways/class.pmprogateway_stripe.php:1695
6619
  #: classes/gateways/class.pmprogateway_stripe.php:1733
6620
+ #: classes/gateways/class.pmprogateway_stripe.php:1760
6621
  #: classes/gateways/class.pmprogateway_stripe.php:1769
6622
  #: classes/gateways/class.pmprogateway_stripe.php:1818
6623
  #: classes/gateways/class.pmprogateway_stripe.php:1826
6628
  msgid "Could not find the customer."
6629
  msgstr ""
6630
 
6631
+ #: classes/gateways/class.pmprogateway_stripe.php:1973
6632
  #: classes/gateways/class.pmprogateway_stripe.php:1836
6633
  #: classes/gateways/class.pmprogateway_stripe.php:1837
6634
  #: classes/gateways/class.pmprogateway_stripe.php:1847
6635
  #: classes/gateways/class.pmprogateway_stripe.php:1885
6636
+ #: classes/gateways/class.pmprogateway_stripe.php:1920
6637
  #: classes/gateways/class.pmprogateway_stripe.php:1921
6638
  #: classes/gateways/class.pmprogateway_stripe.php:1978
6639
  #: classes/gateways/class.pmprogateway_stripe.php:1986
6644
  msgid "Error: "
6645
  msgstr ""
6646
 
6647
+ #: classes/gateways/class.pmprogateway_stripe.php:1987
6648
  #: classes/gateways/class.pmprogateway_stripe.php:1849
6649
  #: classes/gateways/class.pmprogateway_stripe.php:1850
6650
  #: classes/gateways/class.pmprogateway_stripe.php:1860
6651
  #: classes/gateways/class.pmprogateway_stripe.php:1898
6652
+ #: classes/gateways/class.pmprogateway_stripe.php:1933
6653
  #: classes/gateways/class.pmprogateway_stripe.php:1934
6654
  #: classes/gateways/class.pmprogateway_stripe.php:1991
6655
  #: classes/gateways/class.pmprogateway_stripe.php:1999
6661
  msgid "Error: Unkown error while refunding charge #%s"
6662
  msgstr ""
6663
 
6664
+ #: classes/gateways/class.pmprogateway_stripe.php:2438
6665
+ msgid ""
6666
+ "Customer authentication is required to complete this transaction. Please "
6667
+ "complete the verification steps issued by your payment provider."
6668
+ msgstr ""
6669
+
6670
+ #: classes/gateways/class.pmprogateway_stripe.php:2455
6671
+ msgid ""
6672
+ "Customer authentication is required to finish setting up your subscription. "
6673
+ "Please complete the verification steps issued by your payment provider."
6674
+ msgstr ""
6675
+
6676
  #: classes/gateways/class.pmprogateway_twocheckout.php:59
6677
+ #: paid-memberships-pro.php:156
6678
  #: classes/gateways/class.pmprogateway_twocheckout.php:53
6679
  #: classes/gateways/class.pmprogateway_twocheckout.php:59
6680
  #: classes/gateways/class.pmprogateway_twocheckout.php:60
6684
  #: paid-memberships-pro.php:136 paid-memberships-pro.php:137
6685
  #: paid-memberships-pro.php:138 paid-memberships-pro.php:139
6686
  #: paid-memberships-pro.php:144 paid-memberships-pro.php:149
6687
+ #: paid-memberships-pro.php:154
6688
  msgid "2Checkout"
6689
  msgstr ""
6690
 
6884
  msgid "Visit Customer Support Forum"
6885
  msgstr ""
6886
 
6887
+ #: includes/cleanup.php:43
6888
+ msgid ""
6889
+ "<p><strong>Warning:</strong> One or more users for deletion have an active "
6890
+ "membership level. Deleting a user will also cancel their membership and "
6891
+ "recurring subscription.</p>"
6892
+ msgstr ""
6893
+
6894
+ #: includes/cleanup.php:45
6895
+ msgid ""
6896
+ "<p><strong>Warning:</strong> This user has an active membership level. "
6897
+ "Deleting a user will also cancel their membership and recurring subscription."
6898
+ "</p>"
6899
+ msgstr ""
6900
+
6901
  #: includes/countries.php:7 includes/countries.php:7
6902
  msgid "Andorra"
6903
  msgstr ""
7887
  msgid "US Armed Forces"
7888
  msgstr ""
7889
 
7890
+ #: includes/currencies.php:7 includes/currencies.php:100
7891
+ #: includes/currencies.php:127 includes/currencies.php:7
7892
  #: includes/currencies.php:17 includes/currencies.php:37
7893
  #: includes/currencies.php:44 includes/currencies.php:64
7894
  #: includes/currencies.php:68 includes/currencies.php:75
7899
  msgid "US Dollars (&#36;)"
7900
  msgstr ""
7901
 
7902
+ #: includes/currencies.php:9 includes/currencies.php:103
7903
  #: includes/currencies.php:8 includes/currencies.php:9
7904
  #: includes/currencies.php:19 includes/currencies.php:40
7905
  #: includes/currencies.php:47 includes/currencies.php:67
7910
  msgid "Euros (&euro;)"
7911
  msgstr ""
7912
 
7913
+ #: includes/currencies.php:14 includes/currencies.php:102
7914
  #: includes/currencies.php:9 includes/currencies.php:14
7915
  #: includes/currencies.php:24 includes/currencies.php:39
7916
  #: includes/currencies.php:46 includes/currencies.php:66
7938
  msgid "Brazilian Real (R&#36;)"
7939
  msgstr ""
7940
 
7941
+ #: includes/currencies.php:25 includes/currencies.php:101
7942
  #: includes/currencies.php:12 includes/currencies.php:24
7943
  #: includes/currencies.php:25 includes/currencies.php:34
7944
  #: includes/currencies.php:35 includes/currencies.php:38
8081
  msgid "Russian Ruble (&#8381;)"
8082
  msgstr ""
8083
 
8084
+ #: includes/currencies.php:71 includes/currencies.php:25
8085
  #: includes/currencies.php:28 includes/currencies.php:45
8086
  #: includes/currencies.php:52 includes/currencies.php:62
8087
  #: includes/currencies.php:64 includes/currencies.php:65
8090
  msgid "Singapore Dollar (&#36;)"
8091
  msgstr ""
8092
 
8093
+ #: includes/currencies.php:76 includes/currencies.php:50
8094
  #: includes/currencies.php:57 includes/currencies.php:67
8095
  #: includes/currencies.php:69 includes/currencies.php:70
8096
  #: includes/currencies.php:73 includes/currencies.php:75
8098
  msgid "South African Rand (R)"
8099
  msgstr ""
8100
 
8101
+ #: includes/currencies.php:81 includes/currencies.php:30
8102
  #: includes/currencies.php:50 includes/currencies.php:54
8103
  #: includes/currencies.php:61 includes/currencies.php:71
8104
  #: includes/currencies.php:73 includes/currencies.php:75
8107
  msgid "South Korean Won"
8108
  msgstr ""
8109
 
8110
+ #: includes/currencies.php:84 includes/currencies.php:26
8111
  #: includes/currencies.php:31 includes/currencies.php:51
8112
  #: includes/currencies.php:55 includes/currencies.php:62
8113
  #: includes/currencies.php:72 includes/currencies.php:74
8116
  msgid "Swedish Krona"
8117
  msgstr ""
8118
 
8119
+ #: includes/currencies.php:85 includes/currencies.php:27
8120
  #: includes/currencies.php:32 includes/currencies.php:52
8121
  #: includes/currencies.php:56 includes/currencies.php:63
8122
  #: includes/currencies.php:73 includes/currencies.php:75
8125
  msgid "Swiss Franc"
8126
  msgstr ""
8127
 
8128
+ #: includes/currencies.php:86 includes/currencies.php:28
8129
  #: includes/currencies.php:33 includes/currencies.php:53
8130
  #: includes/currencies.php:57 includes/currencies.php:64
8131
  #: includes/currencies.php:74 includes/currencies.php:76
8134
  msgid "Taiwan New Dollars"
8135
  msgstr ""
8136
 
8137
+ #: includes/currencies.php:87 includes/currencies.php:29
8138
  #: includes/currencies.php:34 includes/currencies.php:54
8139
  #: includes/currencies.php:58 includes/currencies.php:65
8140
  #: includes/currencies.php:75 includes/currencies.php:77
8143
  msgid "Thai Baht"
8144
  msgstr ""
8145
 
8146
+ #: includes/currencies.php:88 includes/currencies.php:35
8147
  #: includes/currencies.php:55 includes/currencies.php:59
8148
  #: includes/currencies.php:66 includes/currencies.php:76
8149
  #: includes/currencies.php:78 includes/currencies.php:82
8152
  msgid "Turkish Lira"
8153
  msgstr ""
8154
 
8155
+ #: includes/currencies.php:90 includes/currencies.php:36
8156
  #: includes/currencies.php:56 includes/currencies.php:60
8157
  #: includes/currencies.php:67 includes/currencies.php:77
8158
  #: includes/currencies.php:79 includes/currencies.php:84
8191
  msgid "Profile Start Date Issue Detected and Fixed at %s"
8192
  msgstr ""
8193
 
8194
+ #: includes/functions.php:340 includes/functions.php:452
8195
  #: includes/functions.php:160 includes/functions.php:196
8196
  #: includes/functions.php:200 includes/functions.php:202
8197
  #: includes/functions.php:203 includes/functions.php:204
8204
  msgid "The price for membership is <strong>%s</strong> now"
8205
  msgstr ""
8206
 
8207
+ #: includes/functions.php:342 includes/functions.php:454
8208
  #: includes/functions.php:202 includes/functions.php:204
8209
  #: includes/functions.php:205 includes/functions.php:206
8210
  #: includes/functions.php:209 includes/functions.php:245
8216
  msgid "<strong>%s</strong> now"
8217
  msgstr ""
8218
 
8219
+ #: includes/functions.php:349 includes/functions.php:330
8220
  #, php-format
8221
  msgid " and then <strong>%1$s per %2$s for %3$d more %4$s</strong>."
8222
  msgstr ""
8223
 
8224
+ #: includes/functions.php:351 includes/functions.php:332
8225
  #, php-format
8226
  msgid " and then <strong>%1$s every %2$d %3$s for %4$d more payments</strong>."
8227
  msgstr ""
8228
 
8229
+ #: includes/functions.php:354 includes/functions.php:335
8230
  #, php-format
8231
  msgid " and then <strong>%1$s after %2$d %3$s</strong>."
8232
  msgstr ""
8233
 
8234
+ #: includes/functions.php:359 includes/functions.php:340
8235
  #, php-format
8236
  msgid "The price for membership is <strong>%1$s per %2$s</strong>."
8237
  msgstr ""
8238
 
8239
+ #: includes/functions.php:361 includes/functions.php:342
8240
  #, php-format
8241
  msgid "<strong>%1$s per %2$s</strong>."
8242
  msgstr ""
8243
 
8244
+ #: includes/functions.php:365 includes/functions.php:346
8245
  #, php-format
8246
  msgid "The price for membership is <strong>%1$s every %2$d %3$s</strong>."
8247
  msgstr ""
8248
 
8249
+ #: includes/functions.php:367 includes/functions.php:348
8250
  #, php-format
8251
  msgid "<strong>%1$s every %2$d %3$s</strong>."
8252
  msgstr ""
8253
 
8254
+ #: includes/functions.php:372 includes/functions.php:353
8255
  #, php-format
8256
  msgid " and then <strong>%1$s per %2$s</strong>."
8257
  msgstr ""
8258
 
8259
+ #: includes/functions.php:374 includes/functions.php:355
8260
  #, php-format
8261
  msgid " and then <strong>%1$s every %2$d %3$s</strong>."
8262
  msgstr ""
8263
 
8264
+ #: includes/functions.php:389 includes/functions.php:202
8265
  #: includes/functions.php:238 includes/functions.php:249
8266
  #: includes/functions.php:260 includes/functions.php:261
8267
  #: includes/functions.php:262 includes/functions.php:264
8272
  msgid "After your initial payment, your first payment is Free."
8273
  msgstr ""
8274
 
8275
+ #: includes/functions.php:391 includes/functions.php:206
8276
  #: includes/functions.php:242 includes/functions.php:253
8277
  #: includes/functions.php:264 includes/functions.php:265
8278
  #: includes/functions.php:266 includes/functions.php:268
8284
  msgid "After your initial payment, your first %d payments are Free."
8285
  msgstr ""
8286
 
8287
+ #: includes/functions.php:395 includes/functions.php:213
8288
  #: includes/functions.php:249 includes/functions.php:260
8289
  #: includes/functions.php:271 includes/functions.php:272
8290
  #: includes/functions.php:273 includes/functions.php:275
8296
  msgid "After your initial payment, your first payment will cost %s."
8297
  msgstr ""
8298
 
8299
+ #: includes/functions.php:397 includes/functions.php:378
8300
  #, php-format
8301
  msgid "After your initial payment, your first %1$d payments will cost %2$s."
8302
  msgstr ""
8303
 
8304
+ #: includes/functions.php:407 includes/functions.php:508
8305
  #: includes/functions.php:388 includes/functions.php:489
8306
  #, php-format
8307
  msgid "Customers in %1$s will be charged %2$s%% tax."
8308
  msgstr ""
8309
 
8310
+ #: includes/functions.php:465 includes/functions.php:446
8311
  #, php-format
8312
  msgid "<strong>%1$s per %2$s for %3$d more %4$s</strong>"
8313
  msgstr ""
8314
 
8315
+ #: includes/functions.php:467 includes/functions.php:448
8316
  #, php-format
8317
  msgid "<strong>%1$s every %2$d %3$s for %4$d more payments</strong>"
8318
  msgstr ""
8319
 
8320
+ #: includes/functions.php:470 includes/functions.php:451
8321
  #, php-format
8322
  msgid "<strong>%1$s after %2$d %3$s</strong>"
8323
  msgstr ""
8324
 
8325
+ #: includes/functions.php:473 includes/functions.php:454
8326
  #, php-format
8327
  msgid "<strong>%1$s every %2$s</strong>"
8328
  msgstr ""
8329
 
8330
+ #: includes/functions.php:475 includes/functions.php:456
8331
  #, php-format
8332
  msgid "<strong>%1$s every %2$d %3$s</strong>"
8333
  msgstr ""
8334
 
8335
+ #: includes/functions.php:497 includes/functions.php:478
8336
  #: includes/functions.php:511 includes/functions.php:520
8337
  msgid "Trial pricing has been applied to the first payment."
8338
  msgstr ""
8339
 
8340
+ #: includes/functions.php:499 includes/functions.php:480
8341
  #: includes/functions.php:513 includes/functions.php:522
8342
  #, php-format
8343
  msgid "Trial pricing has been applied to the first %d payments."
8344
  msgstr ""
8345
 
8346
+ #: includes/functions.php:524 includes/functions.php:505
8347
  #, php-format
8348
  msgid "Membership expires after %1$d %2$s."
8349
  msgstr ""
8350
 
8351
+ #: includes/functions.php:543 includes/functions.php:524
8352
  #, php-format
8353
  msgid "%1$s membership expires after %2$d %3$s"
8354
  msgstr ""
8355
 
8356
+ #: includes/functions.php:901 includes/functions.php:491
8357
  #: includes/functions.php:514 includes/functions.php:525
8358
  #: includes/functions.php:536 includes/functions.php:537
8359
  #: includes/functions.php:538 includes/functions.php:545
8362
  #: includes/functions.php:615 includes/functions.php:694
8363
  #: includes/functions.php:760 includes/functions.php:766
8364
  #: includes/functions.php:874 includes/functions.php:877
8365
+ #: includes/functions.php:882 includes/functions.php:945
8366
+ #: includes/functions.php:947 includes/functions.php:956
8367
  msgid "User ID not found."
8368
  msgstr ""
8369
 
8370
+ #: includes/functions.php:913 includes/functions.php:886
8371
+ #: includes/functions.php:889 includes/functions.php:894
8372
  msgid "No membership_id specified in pmpro_changeMembershipLevel."
8373
  msgstr ""
8374
 
8375
+ #: includes/functions.php:919 includes/functions.php:927
8376
  #: includes/functions.php:508 includes/functions.php:531
8377
  #: includes/functions.php:542 includes/functions.php:553
8378
  #: includes/functions.php:554 includes/functions.php:555
8383
  #: includes/functions.php:780 includes/functions.php:786
8384
  #: includes/functions.php:892 includes/functions.php:895
8385
  #: includes/functions.php:900 includes/functions.php:903
8386
+ #: includes/functions.php:908 includes/functions.php:965
8387
+ #: includes/functions.php:967 includes/functions.php:976
8388
  msgid "Invalid level."
8389
  msgstr ""
8390
 
8391
+ #: includes/functions.php:938 includes/functions.php:520
8392
  #: includes/functions.php:542 includes/functions.php:553
8393
  #: includes/functions.php:564 includes/functions.php:565
8394
  #: includes/functions.php:566 includes/functions.php:573
8397
  #: includes/functions.php:623 includes/functions.php:646
8398
  #: includes/functions.php:725 includes/functions.php:791
8399
  #: includes/functions.php:797 includes/functions.php:911
8400
+ #: includes/functions.php:914 includes/functions.php:919
8401
+ #: includes/functions.php:976 includes/functions.php:978
8402
+ #: includes/functions.php:987
8403
  msgid "not changing?"
8404
  msgstr ""
8405
 
8406
+ #: includes/functions.php:994 includes/functions.php:537
8407
  #: includes/functions.php:559 includes/functions.php:570
8408
  #: includes/functions.php:581 includes/functions.php:582
8409
  #: includes/functions.php:583 includes/functions.php:590
8427
  #: includes/functions.php:881 includes/functions.php:887
8428
  #: includes/functions.php:905 includes/functions.php:911
8429
  #: includes/functions.php:967 includes/functions.php:970
8430
+ #: includes/functions.php:975 includes/functions.php:1017
8431
+ #: includes/functions.php:1037 includes/functions.php:1046
8432
  msgid "Error interacting with database"
8433
  msgstr ""
8434
 
8435
+ #: includes/functions.php:1096 includes/functions.php:907
8436
  #: includes/functions.php:1064 includes/functions.php:1067
8437
+ #: includes/functions.php:1077 includes/functions.php:1123
8438
+ #: includes/functions.php:1127 includes/functions.php:1129
8439
+ #: includes/functions.php:1138
8440
  #, php-format
8441
  msgid "Error interacting with database: %s"
8442
  msgstr ""
8443
 
8444
+ #: includes/functions.php:1174 includes/functions.php:1212
8445
  #: includes/functions.php:629 includes/functions.php:651
8446
  #: includes/functions.php:667 includes/functions.php:668
8447
  #: includes/functions.php:678 includes/functions.php:681
8460
  #: includes/functions.php:948 includes/functions.php:953
8461
  #: includes/functions.php:986 includes/functions.php:987
8462
  #: includes/functions.php:992 includes/functions.php:1138
8463
+ #: includes/functions.php:1141 includes/functions.php:1155
8464
+ #: includes/functions.php:1176 includes/functions.php:1179
8465
+ #: includes/functions.php:1193 includes/functions.php:1198
8466
  #: includes/functions.php:1202 includes/functions.php:1204
8467
  #: includes/functions.php:1213 includes/functions.php:1237
8468
  #: includes/functions.php:1241 includes/functions.php:1243
8470
  msgid "Membership level not found."
8471
  msgstr ""
8472
 
8473
+ #: includes/functions.php:1586 includes/functions.php:1100
8474
  #: includes/functions.php:1101 includes/functions.php:1118
8475
  #: includes/functions.php:1142 includes/functions.php:1143
8476
  #: includes/functions.php:1150 includes/functions.php:1157
8478
  #: includes/functions.php:1290 includes/functions.php:1356
8479
  #: includes/functions.php:1357 includes/functions.php:1362
8480
  #: includes/functions.php:1530 includes/functions.php:1533
8481
+ #: includes/functions.php:1547 includes/functions.php:1605
8482
+ #: includes/functions.php:1609 includes/functions.php:1611
8483
+ #: includes/functions.php:1620
8484
  msgid "No code was given to check."
8485
  msgstr ""
8486
 
8487
+ #: includes/functions.php:1595 includes/functions.php:1050
8488
  #: includes/functions.php:1072 includes/functions.php:1088
8489
  #: includes/functions.php:1099 includes/functions.php:1102
8490
  #: includes/functions.php:1109 includes/functions.php:1110
8495
  #: includes/functions.php:1205 includes/functions.php:1299
8496
  #: includes/functions.php:1365 includes/functions.php:1366
8497
  #: includes/functions.php:1371 includes/functions.php:1539
8498
+ #: includes/functions.php:1542 includes/functions.php:1556
8499
+ #: includes/functions.php:1614 includes/functions.php:1618
8500
+ #: includes/functions.php:1620 includes/functions.php:1629
8501
  msgid "The discount code could not be found."
8502
  msgstr ""
8503
 
8504
+ #: includes/functions.php:1610 includes/functions.php:1066
8505
  #: includes/functions.php:1088 includes/functions.php:1104
8506
  #: includes/functions.php:1115 includes/functions.php:1118
8507
  #: includes/functions.php:1124 includes/functions.php:1125
8512
  #: includes/functions.php:1220 includes/functions.php:1314
8513
  #: includes/functions.php:1380 includes/functions.php:1381
8514
  #: includes/functions.php:1386 includes/functions.php:1554
8515
+ #: includes/functions.php:1557 includes/functions.php:1571
8516
+ #: includes/functions.php:1629 includes/functions.php:1633
8517
+ #: includes/functions.php:1635 includes/functions.php:1644
8518
  #, php-format
8519
  msgid "This discount code goes into effect on %s."
8520
  msgstr ""
8521
 
8522
+ #: includes/functions.php:1617 includes/functions.php:1075
8523
  #: includes/functions.php:1097 includes/functions.php:1113
8524
  #: includes/functions.php:1124 includes/functions.php:1127
8525
  #: includes/functions.php:1131 includes/functions.php:1132
8530
  #: includes/functions.php:1227 includes/functions.php:1321
8531
  #: includes/functions.php:1387 includes/functions.php:1388
8532
  #: includes/functions.php:1393 includes/functions.php:1561
8533
+ #: includes/functions.php:1564 includes/functions.php:1578
8534
+ #: includes/functions.php:1636 includes/functions.php:1640
8535
+ #: includes/functions.php:1642 includes/functions.php:1651
8536
  #, php-format
8537
  msgid "This discount code expired on %s."
8538
  msgstr ""
8539
 
8540
+ #: includes/functions.php:1626 includes/functions.php:1087
8541
  #: includes/functions.php:1109 includes/functions.php:1125
8542
  #: includes/functions.php:1136 includes/functions.php:1139
8543
  #: includes/functions.php:1141 includes/functions.php:1142
8548
  #: includes/functions.php:1237 includes/functions.php:1331
8549
  #: includes/functions.php:1397 includes/functions.php:1398
8550
  #: includes/functions.php:1403 includes/functions.php:1570
8551
+ #: includes/functions.php:1573 includes/functions.php:1587
8552
+ #: includes/functions.php:1646 includes/functions.php:1650
8553
+ #: includes/functions.php:1652 includes/functions.php:1661
8554
  msgid "This discount code is no longer valid."
8555
  msgstr ""
8556
 
8557
+ #: includes/functions.php:1645 includes/functions.php:1102
8558
  #: includes/functions.php:1124 includes/functions.php:1140
8559
  #: includes/functions.php:1151 includes/functions.php:1154
8560
  #: includes/functions.php:1155 includes/functions.php:1164
8565
  #: includes/functions.php:1344 includes/functions.php:1410
8566
  #: includes/functions.php:1411 includes/functions.php:1416
8567
  #: includes/functions.php:1589 includes/functions.php:1592
8568
+ #: includes/functions.php:1606 includes/functions.php:1666
8569
+ #: includes/functions.php:1670 includes/functions.php:1672
8570
+ #: includes/functions.php:1681
8571
  msgid "This discount code does not apply to this membership level."
8572
  msgstr ""
8573
 
8574
+ #: includes/functions.php:1683 includes/functions.php:1110
8575
  #: includes/functions.php:1132 includes/functions.php:1148
8576
  #: includes/functions.php:1159 includes/functions.php:1162
8577
  #: includes/functions.php:1172 includes/functions.php:1180
8582
  #: includes/functions.php:1276 includes/functions.php:1370
8583
  #: includes/functions.php:1436 includes/functions.php:1442
8584
  #: includes/functions.php:1448 includes/functions.php:1627
8585
+ #: includes/functions.php:1630 includes/functions.php:1644
8586
+ #: includes/functions.php:1703 includes/functions.php:1707
8587
+ #: includes/functions.php:1709 includes/functions.php:1718
8588
  msgid "This discount code is okay."
8589
  msgstr ""
8590
 
8591
+ #: includes/functions.php:1711 includes/functions.php:1134
8592
  #: includes/functions.php:1156 includes/functions.php:1172
8593
  #: includes/functions.php:1183 includes/functions.php:1186
8594
  #: includes/functions.php:1196 includes/functions.php:1205
8599
  #: includes/functions.php:1395 includes/functions.php:1397
8600
  #: includes/functions.php:1463 includes/functions.php:1469
8601
  #: includes/functions.php:1475 includes/functions.php:1655
8602
+ #: includes/functions.php:1658 includes/functions.php:1672
8603
+ #: includes/functions.php:1730 includes/functions.php:1734
8604
+ #: includes/functions.php:1736 includes/functions.php:1745
8605
  msgid "and"
8606
  msgstr ""
8607
 
8608
+ #: includes/functions.php:2100 includes/functions.php:1319
8609
  #: includes/functions.php:1341 includes/functions.php:1361
8610
  #: includes/functions.php:1372 includes/functions.php:1375
8611
  #: includes/functions.php:1385 includes/functions.php:1394
8620
  #: includes/functions.php:2015 includes/functions.php:2019
8621
  #: includes/functions.php:2022 includes/functions.php:2024
8622
  #: includes/functions.php:2030 includes/functions.php:2033
8623
+ #: includes/functions.php:2034 includes/functions.php:2061
8624
  msgid "Sign Up for !!name!! Now"
8625
  msgstr ""
8626
 
8627
+ #: includes/functions.php:2124 includes/functions.php:2021
8628
+ #: includes/functions.php:2054 includes/functions.php:2085
8629
  msgid "Sign Up Now"
8630
  msgstr ""
8631
 
8775
  "\">Settings</a>."
8776
  msgstr ""
8777
 
8778
+ #: includes/pointers.php:44 includes/pointers.php:44 includes/pointers.php:45
8779
  msgid "Close"
8780
  msgstr ""
8781
 
9036
  "the issues</a>."
9037
  msgstr ""
9038
 
9039
+ #: pages/billing.php:31 pages/billing.php:389 pages/billing.php:14
9040
+ #: pages/billing.php:23 pages/billing.php:25 pages/billing.php:26
9041
+ #: pages/billing.php:27 pages/billing.php:28
9042
  #, php-format
9043
  msgid "Logged in as <strong>%s</strong>."
9044
  msgstr ""
9045
 
9046
+ #: pages/billing.php:31 pages/billing.php:389 pages/billing.php:14
9047
+ #: pages/billing.php:23 pages/billing.php:25 pages/billing.php:26
9048
+ #: pages/billing.php:27 pages/billing.php:28
9049
  msgid "logout"
9050
  msgstr ""
9051
 
9052
+ #: pages/billing.php:51 pages/account.php:14 pages/billing.php:18
9053
  #: pages/billing.php:27 pages/billing.php:29 pages/billing.php:30
9054
  #: pages/billing.php:32 pages/billing.php:43 pages/billing.php:46
9055
  #: pages/billing.php:47
9056
  msgid "Membership Fee"
9057
  msgstr ""
9058
 
9059
+ #: pages/billing.php:55 pages/account.php:18 pages/billing.php:22
9060
  #: pages/billing.php:31 pages/billing.php:33 pages/billing.php:34
9061
  #: pages/billing.php:36 pages/billing.php:47 pages/billing.php:50
9062
  #: pages/billing.php:51 pages/levels.php:70
9064
  msgid "%s every %d %s."
9065
  msgstr ""
9066
 
9067
+ #: pages/billing.php:57 pages/account.php:20 pages/billing.php:24
9068
  #: pages/billing.php:33 pages/billing.php:35 pages/billing.php:36
9069
  #: pages/billing.php:38 pages/billing.php:49 pages/billing.php:52
9070
  #: pages/billing.php:53 pages/levels.php:66
9072
  msgid "%s per %s."
9073
  msgstr ""
9074
 
9075
+ #: pages/billing.php:67 pages/account.php:25 pages/account.php:29
9076
  #: pages/billing.php:29 pages/billing.php:33 pages/billing.php:42
9077
  #: pages/billing.php:44 pages/billing.php:45 pages/billing.php:47
9078
  #: pages/billing.php:59 pages/billing.php:62 pages/billing.php:63
9079
  msgid "Duration"
9080
  msgstr ""
9081
 
9082
+ #: pages/billing.php:85 pages/billing.php:39 pages/billing.php:43
9083
  #: pages/billing.php:52 pages/billing.php:54 pages/billing.php:55
9084
  #: pages/billing.php:57 pages/billing.php:77 pages/billing.php:80
9085
  #: pages/billing.php:81
9088
  "paypal.com\">login to PayPal here</a> to update your billing information."
9089
  msgstr ""
9090
 
9091
+ #: pages/billing.php:112 pages/checkout.php:230 pages/billing.php:65
9092
  #: pages/billing.php:69 pages/billing.php:78 pages/billing.php:81
9093
  #: pages/billing.php:83 pages/billing.php:84 pages/billing.php:87
9094
  #: pages/billing.php:104 pages/billing.php:107 pages/billing.php:108
9100
  msgid "First Name"
9101
  msgstr ""
9102
 
9103
+ #: pages/billing.php:116 pages/checkout.php:234 pages/billing.php:69
9104
  #: pages/billing.php:73 pages/billing.php:82 pages/billing.php:85
9105
  #: pages/billing.php:87 pages/billing.php:88 pages/billing.php:91
9106
  #: pages/billing.php:108 pages/billing.php:111 pages/billing.php:112
9112
  msgid "Last Name"
9113
  msgstr ""
9114
 
9115
+ #: pages/billing.php:120 pages/checkout.php:238 pages/billing.php:73
9116
  #: pages/billing.php:77 pages/billing.php:86 pages/billing.php:89
9117
  #: pages/billing.php:91 pages/billing.php:92 pages/billing.php:95
9118
  #: pages/billing.php:112 pages/billing.php:115 pages/billing.php:116
9124
  msgid "Address 1"
9125
  msgstr ""
9126
 
9127
+ #: pages/billing.php:124 pages/checkout.php:242 pages/billing.php:77
9128
  #: pages/billing.php:81 pages/billing.php:90 pages/billing.php:93
9129
  #: pages/billing.php:95 pages/billing.php:96 pages/billing.php:99
9130
  #: pages/billing.php:116 pages/billing.php:119 pages/billing.php:120
9136
  msgid "Address 2"
9137
  msgstr ""
9138
 
9139
+ #: pages/billing.php:134 pages/checkout.php:249 pages/billing.php:87
9140
  #: pages/billing.php:91 pages/billing.php:100 pages/billing.php:103
9141
  #: pages/billing.php:105 pages/billing.php:106 pages/billing.php:109
9142
  #: pages/billing.php:126 pages/billing.php:129 pages/billing.php:130
9148
  msgid "City"
9149
  msgstr ""
9150
 
9151
+ #: pages/billing.php:138 pages/checkout.php:253 pages/billing.php:91
9152
  #: pages/billing.php:95 pages/billing.php:104 pages/billing.php:107
9153
  #: pages/billing.php:109 pages/billing.php:110 pages/billing.php:113
9154
  #: pages/billing.php:130 pages/billing.php:133 pages/billing.php:134
9160
  msgid "State"
9161
  msgstr ""
9162
 
9163
+ #: pages/billing.php:142 pages/checkout.php:257 pages/billing.php:95
9164
  #: pages/billing.php:99 pages/billing.php:108 pages/billing.php:111
9165
  #: pages/billing.php:113 pages/billing.php:114 pages/billing.php:117
9166
  #: pages/billing.php:134 pages/billing.php:137 pages/billing.php:138
9172
  msgid "Postal Code"
9173
  msgstr ""
9174
 
9175
+ #: pages/billing.php:151 pages/checkout.php:262 pages/billing.php:104
9176
  #: pages/billing.php:108 pages/billing.php:117 pages/billing.php:120
9177
  #: pages/billing.php:122 pages/billing.php:123 pages/billing.php:126
9178
  #: pages/billing.php:143 pages/billing.php:146 pages/billing.php:147
9184
  msgid "City, State Zip"
9185
  msgstr ""
9186
 
9187
+ #: pages/billing.php:204 pages/checkout.php:299 pages/billing.php:157
9188
  #: pages/billing.php:161 pages/billing.php:170 pages/billing.php:173
9189
  #: pages/billing.php:175 pages/billing.php:176 pages/billing.php:179
9190
  #: pages/billing.php:196 pages/billing.php:199 pages/billing.php:200
9196
  msgid "Country"
9197
  msgstr ""
9198
 
9199
+ #: pages/billing.php:229 pages/checkout.php:315 pages/billing.php:182
9200
  #: pages/billing.php:186 pages/billing.php:195 pages/billing.php:198
9201
  #: pages/billing.php:200 pages/billing.php:201 pages/billing.php:204
9202
  #: pages/billing.php:221 pages/billing.php:224 pages/billing.php:225
9208
  msgid "Phone"
9209
  msgstr ""
9210
 
9211
+ #: pages/billing.php:240 pages/checkout.php:148 pages/checkout.php:330
9212
  #: pages/billing.php:193 pages/billing.php:197 pages/billing.php:206
9213
  #: pages/billing.php:209 pages/billing.php:211 pages/billing.php:212
9214
  #: pages/billing.php:215 pages/billing.php:232 pages/billing.php:235
9223
  msgid "E-mail Address"
9224
  msgstr ""
9225
 
9226
+ #: pages/billing.php:244 pages/checkout.php:337 pages/billing.php:197
9227
  #: pages/billing.php:201 pages/billing.php:210 pages/billing.php:213
9228
  #: pages/billing.php:215 pages/billing.php:216 pages/billing.php:219
9229
  #: pages/billing.php:236 pages/billing.php:239 pages/billing.php:240
9235
  msgid "Confirm E-mail"
9236
  msgstr ""
9237
 
9238
+ #: pages/billing.php:267 pages/billing.php:217 pages/billing.php:221
9239
  #: pages/billing.php:230 pages/billing.php:231 pages/billing.php:234
9240
  #: pages/billing.php:238 pages/billing.php:244 pages/billing.php:247
9241
  #: pages/billing.php:259 pages/billing.php:262 pages/billing.php:263
9243
  msgid "Credit Card Information"
9244
  msgstr ""
9245
 
9246
+ #: pages/billing.php:268 pages/billing.php:217 pages/billing.php:221
9247
  #: pages/billing.php:230 pages/billing.php:232 pages/billing.php:235
9248
  #: pages/billing.php:239 pages/billing.php:245 pages/billing.php:248
9249
  #: pages/billing.php:260 pages/billing.php:263 pages/billing.php:264
9252
  msgid "We accept %s"
9253
  msgstr ""
9254
 
9255
+ #: pages/billing.php:406
9256
+ #, php-format
9257
+ msgid ""
9258
+ "You do not have an active membership. <a href='%s'>Choose a membership level."
9259
+ "</a>"
9260
+ msgstr ""
9261
+
9262
+ #: pages/billing.php:409
9263
+ #, php-format
9264
+ msgid "You do not have an active membership. <a href='%s'>Register here.</a>"
9265
+ msgstr ""
9266
+
9267
+ #: pages/billing.php:412
9268
+ #, php-format
9269
+ msgid "Your membership is not active. <a href='%s'>Renew now.</a>"
9270
+ msgstr ""
9271
+
9272
+ #: pages/billing.php:415 pages/billing.php:309 pages/billing.php:313
9273
  #: pages/billing.php:344 pages/billing.php:353 pages/billing.php:356
9274
  #: pages/billing.php:360 pages/billing.php:364 pages/billing.php:378
9275
  #: pages/billing.php:380 pages/billing.php:381 pages/billing.php:385
9315
  msgid "Click here to go to the home page."
9316
  msgstr ""
9317
 
9318
+ #: pages/checkout.php:38 pages/checkout.php:26 pages/checkout.php:27
9319
  #: pages/checkout.php:28 pages/checkout.php:30 pages/checkout.php:35
9320
  #: pages/checkout.php:38
9321
  msgid ""
9323
  "<strong>click the \"Complete Payment\" button</strong> to finish your order."
9324
  msgstr ""
9325
 
9326
+ #: pages/checkout.php:48 pages/checkout.php:33 pages/checkout.php:34
9327
  #: pages/checkout.php:35 pages/checkout.php:40 pages/checkout.php:42
9328
  #: pages/checkout.php:43 pages/checkout.php:46
9329
  msgid "change"
9330
  msgstr ""
9331
 
9332
+ #: pages/checkout.php:52 pages/checkout.php:39 pages/checkout.php:41
9333
  #: pages/checkout.php:42 pages/checkout.php:43 pages/checkout.php:44
9334
  #: pages/checkout.php:50 pages/checkout.php:51 pages/checkout.php:54
9335
  #, php-format
9336
  msgid "You have selected the <strong>%s</strong> membership level."
9337
  msgstr ""
9338
 
9339
+ #: pages/checkout.php:69 pages/checkout.php:51 pages/checkout.php:53
9340
  #: pages/checkout.php:56 pages/checkout.php:60 pages/checkout.php:61
9341
  #: pages/checkout.php:68 pages/checkout.php:71
9342
  #, php-format
9345
  "been applied to your order.</p>"
9346
  msgstr ""
9347
 
9348
+ #: pages/checkout.php:79 pages/checkout.php:66 pages/checkout.php:71
9349
  msgid "Click here to change your discount code."
9350
  msgstr ""
9351
 
9352
+ #: pages/checkout.php:81 pages/checkout.php:64 pages/checkout.php:65
9353
  #: pages/checkout.php:66 pages/checkout.php:68 pages/checkout.php:73
9354
  #: pages/checkout.php:74 pages/checkout.php:81 pages/checkout.php:84
9355
  msgid "Click here to enter your discount code"
9356
  msgstr ""
9357
 
9358
+ #: pages/checkout.php:81 pages/checkout.php:64 pages/checkout.php:65
9359
  #: pages/checkout.php:66 pages/checkout.php:68 pages/checkout.php:73
9360
  #: pages/checkout.php:74 pages/checkout.php:81 pages/checkout.php:84
9361
  msgid "Do you have a discount code?"
9362
  msgstr ""
9363
 
9364
+ #: pages/checkout.php:113 pages/checkout.php:160 pages/checkout.php:162
9365
  #: pages/checkout.php:163 pages/checkout.php:165 pages/checkout.php:170
9366
  #: pages/checkout.php:172 pages/checkout.php:173 pages/checkout.php:175
9367
  #: pages/checkout.php:182 pages/checkout.php:185
9368
  msgid "Account Information"
9369
  msgstr ""
9370
 
9371
+ #: pages/checkout.php:114 pages/checkout.php:160 pages/checkout.php:163
9372
  #: pages/checkout.php:165 pages/checkout.php:171 pages/checkout.php:172
9373
  #: pages/checkout.php:174 pages/checkout.php:176 pages/checkout.php:183
9374
  #: pages/checkout.php:186
9375
  msgid "Already have an account?"
9376
  msgstr ""
9377
 
9378
+ #: pages/checkout.php:114 pages/checkout.php:160 pages/checkout.php:163
9379
  #: pages/checkout.php:165 pages/checkout.php:171 pages/checkout.php:172
9380
  #: pages/checkout.php:174 pages/checkout.php:176 pages/checkout.php:183
9381
  #: pages/checkout.php:186
9382
  msgid "Log in here"
9383
  msgstr ""
9384
 
9385
+ #: pages/checkout.php:135 pages/checkout.php:184 pages/checkout.php:186
9386
  #: pages/checkout.php:189 pages/checkout.php:191 pages/checkout.php:192
9387
  #: pages/checkout.php:198 pages/checkout.php:200 pages/checkout.php:202
9388
  #: pages/checkout.php:209 pages/checkout.php:212
9389
  msgid "Confirm Password"
9390
  msgstr ""
9391
 
9392
+ #: pages/checkout.php:156 pages/checkout.php:205 pages/checkout.php:213
9393
  #: pages/checkout.php:216 pages/checkout.php:218 pages/checkout.php:225
9394
  #: pages/checkout.php:227 pages/checkout.php:229 pages/checkout.php:236
9395
  #: pages/checkout.php:239
9396
  msgid "Confirm E-mail Address"
9397
  msgstr ""
9398
 
9399
+ #: pages/checkout.php:169 pages/checkout.php:218 pages/checkout.php:226
9400
  #: pages/checkout.php:232 pages/checkout.php:235 pages/checkout.php:237
9401
  #: pages/checkout.php:244 pages/checkout.php:246 pages/checkout.php:248
9402
  #: pages/checkout.php:255 pages/checkout.php:258
9403
  msgid "Full Name"
9404
  msgstr ""
9405
 
9406
+ #: pages/checkout.php:170 pages/checkout.php:219 pages/checkout.php:227
9407
  #: pages/checkout.php:233 pages/checkout.php:236 pages/checkout.php:238
9408
  #: pages/checkout.php:245 pages/checkout.php:247 pages/checkout.php:249
9409
  #: pages/checkout.php:256 pages/checkout.php:259
9410
  msgid "LEAVE THIS BLANK"
9411
  msgstr ""
9412
 
9413
+ #: pages/checkout.php:189 pages/checkout.php:238 pages/checkout.php:246
9414
  #: pages/checkout.php:257 pages/checkout.php:260 pages/checkout.php:262
9415
  #: pages/checkout.php:269 pages/checkout.php:271 pages/checkout.php:273
9416
  #: pages/checkout.php:280 pages/checkout.php:283
9420
  "different account for this membership, <a href=\"%s\">log out now</a>."
9421
  msgstr ""
9422
 
9423
+ #: pages/checkout.php:205 pages/checkout.php:254 pages/checkout.php:262
9424
  #: pages/checkout.php:276 pages/checkout.php:278 pages/checkout.php:285
9425
  #: pages/checkout.php:287 pages/checkout.php:289 pages/checkout.php:292
9426
  #: pages/checkout.php:296 pages/checkout.php:299
9427
  msgid "Choose your Payment Method"
9428
  msgstr ""
9429
 
9430
+ #: pages/checkout.php:210 pages/checkout.php:259 pages/checkout.php:267
9431
  #: pages/checkout.php:284 pages/checkout.php:286 pages/checkout.php:293
9432
  #: pages/checkout.php:296 pages/checkout.php:298 pages/checkout.php:300
9433
  #: pages/checkout.php:305 pages/checkout.php:307 pages/checkout.php:308
9434
  msgid "Check Out with a Credit Card Here"
9435
  msgstr ""
9436
 
9437
+ #: pages/checkout.php:420 classes/gateways/class.pmprogateway_stripe.php:623
9438
+ #: classes/gateways/class.pmprogateway_stripe.php:638
9439
+ #: classes/gateways/class.pmprogateway_stripe.php:646
9440
+ #: classes/gateways/class.pmprogateway_stripe.php:653
9441
+ #: classes/gateways/class.pmprogateway_stripe.php:654
9442
+ #: classes/gateways/class.pmprogateway_stripe.php:655 pages/checkout.php:492
9443
+ #: pages/checkout.php:500
9444
+ msgid "Security Code (CVC)"
9445
+ msgstr ""
9446
+
9447
+ #: pages/checkout.php:459 pages/checkout.php:277 pages/checkout.php:284
9448
  #: pages/checkout.php:567 pages/checkout.php:575 pages/checkout.php:657
9449
  #: pages/checkout.php:672 pages/checkout.php:673 pages/checkout.php:681
9450
  #: pages/checkout.php:686 pages/checkout.php:690 pages/checkout.php:692
9453
  msgid "I agree to the %s"
9454
  msgstr ""
9455
 
9456
+ #: pages/checkout.php:484 pages/checkout.php:586 pages/checkout.php:594
9457
  #: pages/checkout.php:667 pages/checkout.php:674 pages/checkout.php:677
9458
  #: pages/checkout.php:692 pages/checkout.php:693 pages/checkout.php:701
9459
  #: pages/checkout.php:706 pages/checkout.php:710 pages/checkout.php:712
9461
  msgid "Complete Payment"
9462
  msgstr ""
9463
 
9464
+ #: pages/checkout.php:506 pages/checkout.php:608 pages/checkout.php:616
9465
  #: pages/checkout.php:687 pages/checkout.php:694 pages/checkout.php:697
9466
  #: pages/checkout.php:713 pages/checkout.php:714 pages/checkout.php:723
9467
  #: pages/checkout.php:728 pages/checkout.php:732 pages/checkout.php:734
9493
  msgid "Invoice #%s on %s"
9494
  msgstr ""
9495
 
 
 
 
 
 
9496
  #: pages/confirmation.php:52 pages/confirmation.php:123 pages/invoice.php:27
9497
  #: pages/confirmation.php:45 pages/confirmation.php:46
9498
  #: pages/confirmation.php:52 pages/confirmation.php:102
9505
  #: pages/confirmation.php:55 pages/invoice.php:31 pages/account.php:29
9506
  #: pages/account.php:33 pages/confirmation.php:48 pages/confirmation.php:49
9507
  #: pages/confirmation.php:55 pages/invoice.php:29 pages/invoice.php:30
9508
+ #: pages/invoice.php:31
9509
  msgid "Membership Expires"
9510
  msgstr ""
9511
 
9513
  #: pages/account.php:109 pages/confirmation.php:61 pages/confirmation.php:63
9514
  #: pages/confirmation.php:69 pages/confirmation.php:79
9515
  #: pages/confirmation.php:82 pages/invoice.php:48 pages/invoice.php:50
9516
+ #: pages/invoice.php:61 pages/invoice.php:62
9517
  msgid "Payment Method"
9518
  msgstr ""
9519
 
9520
  #: pages/confirmation.php:80 pages/invoice.php:63 pages/confirmation.php:80
9521
  #: pages/confirmation.php:82 pages/confirmation.php:83
9522
+ #: pages/confirmation.php:88 pages/invoice.php:62 pages/invoice.php:63
9523
+ #: pages/invoice.php:67 pages/invoice.php:69
9524
  msgid "ending in"
9525
  msgstr ""
9526
 
9528
  #: pages/confirmation.php:61 pages/confirmation.php:63
9529
  #: pages/confirmation.php:65 pages/confirmation.php:71
9530
  #: pages/confirmation.php:88 pages/invoice.php:50 pages/invoice.php:52
9531
+ #: pages/invoice.php:70 pages/invoice.php:71 pages/invoice.php:90
9532
+ #: pages/invoice.php:103 pages/invoice.php:104 pages/invoice.php:107
9533
+ #: pages/invoice.php:109 pages/invoice.php:110
9534
  msgid "Total Billed"
9535
  msgstr ""
9536
 
9537
  #: pages/confirmation.php:94 pages/invoice.php:77 pages/confirmation.php:94
9538
+ #: pages/invoice.php:76 pages/invoice.php:77 pages/invoice.php:80
9539
+ #: pages/invoice.php:82
9540
  msgid "Coupon"
9541
  msgstr ""
9542
 
9559
  #: pages/confirmation.php:132 pages/invoice.php:135 pages/confirmation.php:111
9560
  #: pages/confirmation.php:113 pages/confirmation.php:121
9561
  #: pages/confirmation.php:124 pages/confirmation.php:132 pages/invoice.php:121
9562
+ #: pages/invoice.php:134 pages/invoice.php:135 pages/invoice.php:139
9563
+ #: pages/invoice.php:141
9564
  msgid "View Your Membership Account &rarr;"
9565
  msgstr ""
9566
 
9572
  "site owner."
9573
  msgstr ""
9574
 
9575
+ #: pages/invoice.php:29 pages/invoice.php:29
9576
  msgid "success"
9577
  msgstr ""
9578
 
9579
  #: pages/invoice.php:102 pages/invoice.php:88 pages/invoice.php:101
9580
+ #: pages/invoice.php:102 pages/invoice.php:106 pages/invoice.php:108
9581
  msgid "Invoice #"
9582
  msgstr ""
9583
 
9584
  #: pages/invoice.php:128 pages/invoice.php:114 pages/invoice.php:127
9585
+ #: pages/invoice.php:128 pages/invoice.php:132 pages/invoice.php:134
9586
  msgid "No invoices found."
9587
  msgstr ""
9588
 
9589
  #: pages/invoice.php:139 pages/invoice.php:125 pages/invoice.php:138
9590
+ #: pages/invoice.php:139 pages/invoice.php:143 pages/invoice.php:145
9591
  msgid "&larr; View All Invoices"
9592
  msgstr ""
9593
 
9624
  msgid "&larr; Return to Home"
9625
  msgstr ""
9626
 
9627
+ #: paid-memberships-pro.php:147 adminpages/orders.php:398
9628
  #: adminpages/orders.php:448 paid-memberships-pro.php:115
9629
  #: paid-memberships-pro.php:116 paid-memberships-pro.php:123
9630
  #: paid-memberships-pro.php:124 paid-memberships-pro.php:125
9631
  #: paid-memberships-pro.php:126 paid-memberships-pro.php:127
9632
  #: paid-memberships-pro.php:128 paid-memberships-pro.php:129
9633
  #: paid-memberships-pro.php:130 paid-memberships-pro.php:135
9634
+ #: paid-memberships-pro.php:140 paid-memberships-pro.php:145
9635
  msgid "Testing Only"
9636
  msgstr ""
9637
 
9638
+ #: paid-memberships-pro.php:152 paid-memberships-pro.php:120
9639
  #: paid-memberships-pro.php:121 paid-memberships-pro.php:128
9640
  #: paid-memberships-pro.php:129 paid-memberships-pro.php:130
9641
  #: paid-memberships-pro.php:131 paid-memberships-pro.php:132
9642
  #: paid-memberships-pro.php:133 paid-memberships-pro.php:134
9643
  #: paid-memberships-pro.php:135 paid-memberships-pro.php:140
9644
+ #: paid-memberships-pro.php:145 paid-memberships-pro.php:150
9645
  msgid "PayPal Payflow Pro/PayPal Pro"
9646
  msgstr ""
9647
 
9648
+ #: paid-memberships-pro.php:157 paid-memberships-pro.php:125
9649
  #: paid-memberships-pro.php:126 paid-memberships-pro.php:133
9650
  #: paid-memberships-pro.php:134 paid-memberships-pro.php:135
9651
  #: paid-memberships-pro.php:136 paid-memberships-pro.php:137
9652
  #: paid-memberships-pro.php:138 paid-memberships-pro.php:139
9653
  #: paid-memberships-pro.php:140 paid-memberships-pro.php:145
9654
+ #: paid-memberships-pro.php:150 paid-memberships-pro.php:155
9655
  msgid "Cybersource"
9656
  msgstr ""
9657
 
9658
+ #: paid-memberships-pro.php:161
9659
+ msgid "Default"
9660
+ msgstr ""
9661
+
9662
+ #: paid-memberships-pro.php:182 paid-memberships-pro.php:156
9663
  #: paid-memberships-pro.php:157 paid-memberships-pro.php:158
9664
  #: paid-memberships-pro.php:159 paid-memberships-pro.php:160
9665
  #: paid-memberships-pro.php:161 paid-memberships-pro.php:166
9666
+ #: paid-memberships-pro.php:171 paid-memberships-pro.php:176
9667
  msgid "Once a month"
9668
  msgstr ""
9669
 
9753
  msgid "Your membership has been cancelled."
9754
  msgstr ""
9755
 
9756
+ #: preheaders/checkout.php:37 preheaders/checkout.php:358
9757
  #: preheaders/checkout.php:28 preheaders/checkout.php:30
9758
  #: preheaders/checkout.php:31 preheaders/checkout.php:32
9759
  #: preheaders/checkout.php:34 preheaders/checkout.php:344
9765
  msgid "Invalid gateway."
9766
  msgstr ""
9767
 
9768
+ #: preheaders/checkout.php:72 preheaders/checkout.php:54
9769
+ #: preheaders/checkout.php:68 preheaders/checkout.php:88
9770
+ #: preheaders/checkout.php:89 preheaders/checkout.php:91
9771
+ #: preheaders/checkout.php:95 preheaders/checkout.php:96
9772
  msgid "Checkout: Payment Information"
9773
  msgstr ""
9774
 
9775
+ #: preheaders/checkout.php:77 preheaders/checkout.php:59
9776
+ #: preheaders/checkout.php:73 preheaders/checkout.php:100
9777
+ #: preheaders/checkout.php:101
9778
  msgid "Set Up Your Account"
9779
  msgstr ""
9780
 
9781
+ #: preheaders/checkout.php:301 preheaders/checkout.php:289
9782
+ #: preheaders/checkout.php:300 preheaders/checkout.php:303
9783
+ #: preheaders/checkout.php:304 preheaders/checkout.php:331
9784
+ #: preheaders/checkout.php:416 preheaders/checkout.php:421
9785
  msgid "There are JavaScript errors on the page. Please contact the webmaster."
9786
  msgstr ""
9787
 
9813
 
9814
  #: preheaders/checkout.php:382 preheaders/checkout.php:368
9815
  #: preheaders/checkout.php:377 preheaders/checkout.php:381
9816
+ #: preheaders/checkout.php:382 preheaders/checkout.php:410
9817
+ #: preheaders/checkout.php:503 preheaders/checkout.php:510
9818
+ #: preheaders/checkout.php:515 preheaders/checkout.php:518
9819
+ #: preheaders/checkout.php:535 preheaders/checkout.php:536
9820
  msgid "That username is already taken. Please try another."
9821
  msgstr ""
9822
 
9823
  #: preheaders/checkout.php:387 preheaders/checkout.php:373
9824
+ #: preheaders/checkout.php:387
9825
  msgid ""
9826
  "That email address is already in use. Please log in, or use a different "
9827
  "email address."
9828
  msgstr ""
9829
 
9830
+ #: preheaders/checkout.php:419 preheaders/checkout.php:397
9831
  #: preheaders/checkout.php:399 preheaders/checkout.php:404
9832
+ #: preheaders/checkout.php:416 preheaders/checkout.php:418
9833
+ #: preheaders/checkout.php:420 preheaders/checkout.php:446
9834
+ #: preheaders/checkout.php:525 preheaders/checkout.php:532
9835
+ #: preheaders/checkout.php:537 preheaders/checkout.php:544
9836
+ #: preheaders/checkout.php:561 preheaders/checkout.php:562
9837
  #, php-format
9838
  msgid "reCAPTCHA failed. (%s) Please try again."
9839
  msgstr ""
9840
 
9841
+ #: preheaders/checkout.php:445 preheaders/checkout.php:482
9842
  #: preheaders/checkout.php:484 preheaders/checkout.php:491
9843
  #: preheaders/checkout.php:495 preheaders/checkout.php:496
9844
  #: preheaders/checkout.php:501 preheaders/checkout.php:505
9845
+ #: preheaders/checkout.php:509 preheaders/checkout.php:533
9846
+ #: preheaders/checkout.php:647 preheaders/checkout.php:654
9847
+ #: preheaders/checkout.php:659 preheaders/checkout.php:683
9848
+ #: preheaders/checkout.php:701 preheaders/checkout.php:702
9849
  msgid "Payment accepted."
9850
  msgstr ""
9851
 
9852
+ #: preheaders/checkout.php:451 preheaders/checkout.php:490
9853
  #: preheaders/checkout.php:492 preheaders/checkout.php:497
9854
  #: preheaders/checkout.php:501 preheaders/checkout.php:502
9855
  #: preheaders/checkout.php:509 preheaders/checkout.php:513
9856
+ #: preheaders/checkout.php:515 preheaders/checkout.php:539
9857
+ #: preheaders/checkout.php:653 preheaders/checkout.php:660
9858
+ #: preheaders/checkout.php:665 preheaders/checkout.php:691
9859
+ #: preheaders/checkout.php:709 preheaders/checkout.php:710
9860
  msgid ""
9861
  "Unknown error generating account. Please contact us to set up your "
9862
  "membership."
9863
  msgstr ""
9864
 
9865
+ #: preheaders/checkout.php:537 preheaders/checkout.php:550
9866
  #: preheaders/checkout.php:552 preheaders/checkout.php:569
9867
  #: preheaders/checkout.php:571 preheaders/checkout.php:572
9868
  #: preheaders/checkout.php:575 preheaders/checkout.php:576
9869
  #: preheaders/checkout.php:577 preheaders/checkout.php:581
9870
+ #: preheaders/checkout.php:596 preheaders/checkout.php:614
9871
+ #: preheaders/checkout.php:785 preheaders/checkout.php:792
9872
+ #: preheaders/checkout.php:797 preheaders/checkout.php:825
9873
+ #: preheaders/checkout.php:844 preheaders/checkout.php:859
9874
+ #: preheaders/checkout.php:860
9875
  msgid ""
9876
  "Your payment was accepted, but there was an error setting up your account. "
9877
  "Please contact us."
9878
  msgstr ""
9879
 
9880
+ #: preheaders/checkout.php:767 preheaders/checkout.php:691
9881
  #: preheaders/checkout.php:693 preheaders/checkout.php:710
9882
  #: preheaders/checkout.php:712 preheaders/checkout.php:722
9883
  #: preheaders/checkout.php:730 preheaders/checkout.php:754
9893
  "submit this form again. Please contact the site owner to fix this issue."
9894
  msgstr ""
9895
 
9896
+ #: preheaders/checkout.php:770 preheaders/checkout.php:694
9897
  #: preheaders/checkout.php:696 preheaders/checkout.php:713
9898
  #: preheaders/checkout.php:715 preheaders/checkout.php:725
9899
  #: preheaders/checkout.php:733 preheaders/checkout.php:757
9909
  "this form again. Please contact the site owner to fix this issue."
9910
  msgstr ""
9911
 
9912
+ #: preheaders/checkout.php:781 preheaders/checkout.php:705
9913
  #: preheaders/checkout.php:707 preheaders/checkout.php:724
9914
  #: preheaders/checkout.php:726 preheaders/checkout.php:736
9915
  #: preheaders/checkout.php:744 preheaders/checkout.php:768
9925
  "will be processed."
9926
  msgstr ""
9927
 
9928
+ #: preheaders/checkout.php:783 preheaders/checkout.php:707
9929
  #: preheaders/checkout.php:709 preheaders/checkout.php:726
9930
  #: preheaders/checkout.php:728 preheaders/checkout.php:738
9931
  #: preheaders/checkout.php:746 preheaders/checkout.php:770
10142
  "select customers."
10143
  msgstr ""
10144
 
10145
+ #: adminpages/discountcodes.php:617 adminpages/discountcodes.php:622
10146
+ #: adminpages/discountcodes.php:650 adminpages/discountcodes.php:651
10147
+ #: adminpages/discountcodes.php:652 adminpages/discountcodes.php:653
10148
+ #: adminpages/discountcodes.php:658 adminpages/discountcodes.php:738
10149
+ #: adminpages/discountcodes.php:792 adminpages/discountcodes.php:805
10150
+ #: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:572
10151
+ #: adminpages/membershiplevels.php:574 adminpages/membershiplevels.php:580
10152
+ #: adminpages/membershiplevels.php:601 adminpages/membershiplevels.php:660
10153
+ #: adminpages/membershiplevels.php:662 adminpages/membershiplevels.php:664
10154
+ #: adminpages/membershiplevels.php:669 adminpages/membershiplevels.php:670
10155
+ #: adminpages/membershiplevels.php:674 adminpages/membershiplevels.php:686
10156
+ #: adminpages/membershiplevels.php:696 adminpages/membershiplevels.php:746
10157
+ #: adminpages/membershiplevels.php:748 adminpages/orders.php:664
10158
+ #: adminpages/orders.php:967 adminpages/orders.php:985
10159
+ #: adminpages/orders.php:995 adminpages/orders.php:998
10160
+ #: adminpages/orders.php:1027 adminpages/orders.php:1056
10161
+ #: adminpages/orders.php:1211 adminpages/orders.php:1245
10162
+ #: adminpages/orders.php:1251 adminpages/orders.php:1366
10163
+ #: adminpages/orders.php:1495
10164
+ msgid "delete"
10165
+ msgstr ""
10166
+
10167
+ #: adminpages/discountcodes.php:804 adminpages/membershiplevels.php:565
10168
+ #: adminpages/membershiplevels.php:571 adminpages/membershiplevels.php:573
10169
+ #: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:600
10170
+ #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
10171
+ #: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:669
10172
+ #: adminpages/membershiplevels.php:670 adminpages/membershiplevels.php:674
10173
+ #: adminpages/membershiplevels.php:686 adminpages/membershiplevels.php:696
10174
+ #: adminpages/membershiplevels.php:746 adminpages/membershiplevels.php:748
10175
+ #: adminpages/orders.php:661 adminpages/orders.php:964
10176
+ #: adminpages/orders.php:982 adminpages/orders.php:992
10177
+ #: adminpages/orders.php:995 adminpages/orders.php:1024
10178
+ #: adminpages/orders.php:1053 adminpages/orders.php:1208
10179
+ #: adminpages/orders.php:1242 adminpages/orders.php:1248
10180
+ #: adminpages/orders.php:1363 adminpages/orders.php:1492
10181
+ msgid "copy"
10182
+ msgstr ""
10183
+
10184
+ #: adminpages/discountcodes.php:807 adminpages/discountcodes.php:809
10185
+ msgid "orders"
10186
+ msgstr ""
10187
+
10188
+ #: adminpages/discountcodes.php:807
10189
+ msgid "view orders"
10190
+ msgstr ""
10191
+
10192
+ #: adminpages/discountcodes.php:809
10193
+ msgid "no orders"
10194
+ msgstr ""
10195
+
10196
  #: adminpages/emailsettings.php:63 adminpages/emailsettings.php:72
10197
  msgid ""
10198
  "To modify the appearance of system generated emails, add the files "
10261
  msgid "every"
10262
  msgstr ""
10263
 
10264
+ #: adminpages/orders.php:1030 adminpages/orders.php:1059
10265
+ #: adminpages/orders.php:1215 adminpages/orders.php:1249
10266
+ #: adminpages/orders.php:1255 adminpages/orders.php:1370
10267
+ #: adminpages/orders.php:1499
10268
+ msgid "print"
10269
+ msgstr ""
10270
+
10271
+ #: adminpages/orders.php:1033 adminpages/orders.php:1062
10272
+ #: adminpages/orders.php:1219 adminpages/orders.php:1253
10273
+ #: adminpages/orders.php:1259 adminpages/orders.php:1374
10274
+ #: adminpages/orders.php:1503
10275
+ msgid "email"
10276
+ msgstr ""
10277
+
10278
  #: adminpages/pagesettings.php:73
10279
  #, php-format
10280
  msgid "Membership %s"
10475
  msgid "Your Secret Key appears incorrect."
10476
  msgstr ""
10477
 
10478
+ #: classes/gateways/class.pmprogateway_stripe.php:1090
10479
+ #: classes/gateways/class.pmprogateway_stripe.php:1119
10480
+ #: classes/gateways/class.pmprogateway_stripe.php:1127
10481
+ #: classes/gateways/class.pmprogateway_stripe.php:1134
10482
+ #: classes/gateways/class.pmprogateway_stripe.php:1135
10483
+ #: classes/gateways/class.pmprogateway_stripe.php:1136
10484
+ #: classes/gateways/class.pmprogateway_stripe.php:1142
10485
+ #: classes/gateways/class.pmprogateway_stripe.php:1172
10486
+ msgid "Payment error: Please contact the webmaster (stripe-load-error)"
10487
+ msgstr ""
10488
+
10489
  #: classes/gateways/class.pmprogateway_twocheckout.php:139
10490
  msgid "API Private Key"
10491
  msgstr ""
languages/paid-memberships-pro.pot CHANGED
@@ -6,7 +6,7 @@ msgid ""
6
  msgstr ""
7
  "Project-Id-Version: paid-memberships-pro\n"
8
  "Report-Msgid-Bugs-To: info@paidmembershipspro.com\n"
9
- "POT-Creation-Date: 2019-04-25 14:30-0400\n"
10
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
11
  "Last-Translator: \n"
12
  "Language-Team: Stranger Studios <info@paidmembershipspro.com>\n"
@@ -59,7 +59,7 @@ msgstr ""
59
  msgid "Check Again"
60
  msgstr ""
61
 
62
- #: adminpages/addons.php:93 adminpages/orders.php:1039 adminpages/addons.php:76
63
  #: adminpages/addons.php:79 adminpages/addons.php:92 adminpages/addons.php:93
64
  #: adminpages/orders.php:605 adminpages/orders.php:712
65
  #: adminpages/orders.php:741 adminpages/orders.php:850
@@ -103,7 +103,7 @@ msgstr ""
103
  #: adminpages/addons.php:112 adminpages/membershiplevels.php:296
104
  #: adminpages/membershiplevels.php:298 adminpages/membershiplevels.php:300
105
  #: adminpages/membershiplevels.php:324 adminpages/membershiplevels.php:334
106
- #: adminpages/membershiplevels.php:356
107
  msgid "Description"
108
  msgstr ""
109
 
@@ -171,9 +171,10 @@ msgstr ""
171
  msgid "Activate %s"
172
  msgstr ""
173
 
174
- #: adminpages/addons.php:231 adminpages/addons.php:213
175
- #: adminpages/addons.php:216 adminpages/addons.php:229
176
- #: adminpages/addons.php:231
 
177
  msgid "Delete"
178
  msgstr ""
179
 
@@ -208,8 +209,8 @@ msgstr ""
208
  msgid "WordPress.org"
209
  msgstr ""
210
 
211
- #: adminpages/addons.php:249 adminpages/orders.php:910
212
- #: adminpages/orders.php:1462 adminpages/orders.php:1472
213
  #: includes/profile.php:186 shortcodes/pmpro_account.php:158
214
  #: adminpages/addons.php:231 adminpages/addons.php:234
215
  #: adminpages/addons.php:247 adminpages/addons.php:249
@@ -349,7 +350,7 @@ msgid ""
349
  msgstr ""
350
 
351
  #: adminpages/admin_header.php:135
352
- #: classes/gateways/class.pmprogateway_stripe.php:66
353
  #: adminpages/admin_header.php:125 adminpages/admin_header.php:135
354
  #: classes/gateways/class.pmprogateway_stripe.php:66
355
  #: classes/gateways/class.pmprogateway_stripe.php:68
@@ -399,18 +400,18 @@ msgstr ""
399
  msgid "Members"
400
  msgstr ""
401
 
402
- #: adminpages/admin_header.php:196 adminpages/orders.php:994
403
- #: includes/adminpages.php:52 includes/adminpages.php:156
404
- #: adminpages/admin_header.php:196 adminpages/orders.php:520
405
- #: adminpages/orders.php:570 adminpages/orders.php:677
406
- #: adminpages/orders.php:706 adminpages/orders.php:810
407
- #: adminpages/orders.php:841 adminpages/orders.php:852
408
- #: adminpages/orders.php:939 adminpages/orders.php:994
409
- #: includes/adminpages.php:17 includes/adminpages.php:52
410
- #: includes/adminpages.php:55 includes/adminpages.php:56
411
- #: includes/adminpages.php:84 includes/adminpages.php:156
412
- #: includes/adminpages.php:163 includes/adminpages.php:167
413
- #: includes/adminpages.php:172
414
  msgid "Orders"
415
  msgstr ""
416
 
@@ -439,7 +440,7 @@ msgstr ""
439
  msgid "Levels"
440
  msgstr ""
441
 
442
- #: adminpages/admin_header.php:215 adminpages/membershiplevels.php:702
443
  #: adminpages/pagesettings.php:85 includes/metaboxes.php:130
444
  #: adminpages/admin_header.php:128 adminpages/admin_header.php:149
445
  #: adminpages/admin_header.php:150 adminpages/admin_header.php:159
@@ -451,15 +452,15 @@ msgstr ""
451
  #: adminpages/membershiplevels.php:609 adminpages/membershiplevels.php:618
452
  #: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:631
453
  #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:700
454
- #: adminpages/pagesettings.php:69 adminpages/pagesettings.php:70
455
- #: adminpages/pagesettings.php:71 adminpages/pagesettings.php:85
456
- #: includes/adminpages.php:44 includes/adminpages.php:64
457
- #: includes/adminpages.php:65 includes/adminpages.php:69
458
- #: includes/adminpages.php:70 includes/adminpages.php:100
459
- #: includes/adminpages.php:107 includes/adminpages.php:111
460
- #: includes/adminpages.php:116 includes/metaboxes.php:126
461
- #: includes/metaboxes.php:130 includes/metaboxes.php:131
462
- #: includes/metaboxes.php:132
463
  msgid "Membership Levels"
464
  msgstr ""
465
 
@@ -503,6 +504,7 @@ msgid "Payment Gateway &amp; SSL Settings"
503
  msgstr ""
504
 
505
  #: adminpages/admin_header.php:231 adminpages/memberslist.php:168
 
506
  #: shortcodes/pmpro_account.php:111 adminpages/admin_header.php:131
507
  #: adminpages/admin_header.php:152 adminpages/admin_header.php:162
508
  #: adminpages/admin_header.php:171 adminpages/admin_header.php:183
@@ -518,11 +520,12 @@ msgstr ""
518
  #: adminpages/admin_header.php:231 adminpages/emailsettings.php:83
519
  #: includes/adminpages.php:61 adminpages/admin_header.php:231
520
  #: adminpages/emailsettings.php:60 adminpages/emailsettings.php:69
521
- #: adminpages/emailsettings.php:79 includes/adminpages.php:12
522
- #: includes/adminpages.php:50 includes/adminpages.php:51
523
- #: includes/adminpages.php:59 includes/adminpages.php:61
524
- #: includes/adminpages.php:121 includes/adminpages.php:128
525
- #: includes/adminpages.php:132 includes/adminpages.php:137
 
526
  msgid "Email Settings"
527
  msgstr ""
528
 
@@ -537,11 +540,12 @@ msgstr ""
537
  #: includes/adminpages.php:62 adminpages/admin_header.php:235
538
  #: adminpages/advancedsettings.php:79 adminpages/advancedsettings.php:86
539
  #: adminpages/advancedsettings.php:88 adminpages/advancedsettings.php:91
540
- #: adminpages/advancedsettings.php:107 includes/adminpages.php:13
541
- #: includes/adminpages.php:51 includes/adminpages.php:52
542
- #: includes/adminpages.php:62 includes/adminpages.php:64
543
- #: includes/adminpages.php:128 includes/adminpages.php:135
544
- #: includes/adminpages.php:139 includes/adminpages.php:144
 
545
  msgid "Advanced Settings"
546
  msgstr ""
547
 
@@ -560,12 +564,13 @@ msgstr ""
560
  #: adminpages/advancedsettings.php:61 adminpages/advancedsettings.php:35
561
  #: adminpages/advancedsettings.php:42 adminpages/advancedsettings.php:43
562
  #: adminpages/advancedsettings.php:46 adminpages/advancedsettings.php:60
 
563
  msgid "Your advanced settings have been updated."
564
  msgstr ""
565
 
566
  #: adminpages/advancedsettings.php:87 adminpages/advancedsettings.php:66
567
  #: adminpages/advancedsettings.php:68 adminpages/advancedsettings.php:71
568
- #: adminpages/advancedsettings.php:85
569
  #, php-format
570
  msgid ""
571
  "This content is for !!levels!! members only. <a href=\"%s\">Register here</"
@@ -574,7 +579,7 @@ msgstr ""
574
 
575
  #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:71
576
  #: adminpages/advancedsettings.php:73 adminpages/advancedsettings.php:76
577
- #: adminpages/advancedsettings.php:90
578
  #, php-format
579
  msgid ""
580
  "Please <a href=\"%s\">login</a> to view this content. (<a href=\"%s"
@@ -583,7 +588,7 @@ msgstr ""
583
 
584
  #: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:76
585
  #: adminpages/advancedsettings.php:78 adminpages/advancedsettings.php:81
586
- #: adminpages/advancedsettings.php:95
587
  msgid ""
588
  "This content is for members only. Visit the site and log in/register to read."
589
  msgstr ""
@@ -591,12 +596,14 @@ msgstr ""
591
  #: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:85
592
  #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:94
593
  #: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:113
 
594
  msgid "Message for Logged-in Non-members"
595
  msgstr ""
596
 
597
  #: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:89
598
  #: adminpages/advancedsettings.php:96 adminpages/advancedsettings.php:98
599
  #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:117
 
600
  msgid ""
601
  "This message replaces the post content for non-members. Available variables"
602
  msgstr ""
@@ -604,40 +611,47 @@ msgstr ""
604
  #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:94
605
  #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:103
606
  #: adminpages/advancedsettings.php:106 adminpages/advancedsettings.php:122
 
607
  msgid "Message for Logged-out Users"
608
  msgstr ""
609
 
610
  #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:98
611
  #: adminpages/advancedsettings.php:105 adminpages/advancedsettings.php:107
612
  #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:126
 
613
  msgid "This message replaces the post content for logged-out visitors."
614
  msgstr ""
615
 
616
  #: adminpages/advancedsettings.php:133 adminpages/advancedsettings.php:103
617
  #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:112
618
  #: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:131
 
619
  msgid "Message for RSS Feed"
620
  msgstr ""
621
 
622
  #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:107
623
  #: adminpages/advancedsettings.php:114 adminpages/advancedsettings.php:116
624
  #: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:135
 
625
  msgid "This message replaces the post content in RSS feeds."
626
  msgstr ""
627
 
628
  #: adminpages/advancedsettings.php:143 adminpages/advancedsettings.php:122
629
  #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:141
 
630
  msgid "Filter searches and archives?"
631
  msgstr ""
632
 
633
  #: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:126
634
  #: adminpages/advancedsettings.php:129 adminpages/advancedsettings.php:145
 
635
  msgid ""
636
  "No - Non-members will see restricted posts/pages in searches and archives."
637
  msgstr ""
638
 
639
  #: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:127
640
  #: adminpages/advancedsettings.php:130 adminpages/advancedsettings.php:146
 
641
  msgid ""
642
  "Yes - Only members will see restricted posts/pages in searches and archives."
643
  msgstr ""
@@ -645,45 +659,51 @@ msgstr ""
645
  #: adminpages/advancedsettings.php:154 adminpages/advancedsettings.php:113
646
  #: adminpages/advancedsettings.php:120 adminpages/advancedsettings.php:133
647
  #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:152
 
648
  msgid "Show Excerpts to Non-Members?"
649
  msgstr ""
650
 
651
  #: adminpages/advancedsettings.php:158 adminpages/advancedsettings.php:117
652
  #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:137
653
  #: adminpages/advancedsettings.php:140 adminpages/advancedsettings.php:156
 
654
  msgid "No - Hide excerpts."
655
  msgstr ""
656
 
657
  #: adminpages/advancedsettings.php:159 adminpages/advancedsettings.php:118
658
  #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:138
659
  #: adminpages/advancedsettings.php:141 adminpages/advancedsettings.php:157
 
660
  msgid "Yes - Show excerpts."
661
  msgstr ""
662
 
663
  #: adminpages/advancedsettings.php:165 adminpages/advancedsettings.php:144
664
  #: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:163
 
665
  msgid "Hide Ads From Members?"
666
  msgstr ""
667
 
668
  #: adminpages/advancedsettings.php:169 adminpages/advancedsettings.php:228
669
- #: adminpages/advancedsettings.php:240 adminpages/membershiplevels.php:746
670
- #: adminpages/paymentsettings.php:236
671
- #: classes/gateways/class.pmprogateway_stripe.php:283 includes/profile.php:125
672
  #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:135
673
  #: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:151
674
- #: adminpages/advancedsettings.php:167 adminpages/advancedsettings.php:187
675
- #: adminpages/advancedsettings.php:194 adminpages/advancedsettings.php:199
676
- #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:207
677
- #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:219
678
- #: adminpages/advancedsettings.php:222 adminpages/advancedsettings.php:226
679
- #: adminpages/advancedsettings.php:238 adminpages/membershiplevels.php:563
680
- #: adminpages/membershiplevels.php:569 adminpages/membershiplevels.php:571
681
- #: adminpages/membershiplevels.php:578 adminpages/membershiplevels.php:598
682
- #: adminpages/membershiplevels.php:658 adminpages/membershiplevels.php:660
683
- #: adminpages/membershiplevels.php:662 adminpages/membershiplevels.php:667
684
- #: adminpages/membershiplevels.php:668 adminpages/membershiplevels.php:672
685
- #: adminpages/membershiplevels.php:684 adminpages/membershiplevels.php:694
686
- #: adminpages/membershiplevels.php:744 adminpages/paymentsettings.php:210
 
 
687
  #: adminpages/paymentsettings.php:219 adminpages/paymentsettings.php:236
688
  #: adminpages/paymentsettings.php:414 adminpages/paymentsettings.php:429
689
  #: adminpages/paymentsettings.php:434 adminpages/paymentsettings.php:436
@@ -699,6 +719,7 @@ msgstr ""
699
  #: classes/gateways/class.pmprogateway_stripe.php:222
700
  #: classes/gateways/class.pmprogateway_stripe.php:249
701
  #: classes/gateways/class.pmprogateway_stripe.php:281
 
702
  #: classes/gateways/class.pmprogateway_stripe.php:289
703
  #: classes/gateways/class.pmprogateway_stripe.php:291
704
  #: classes/gateways/class.pmprogateway_stripe.php:297
@@ -711,58 +732,66 @@ msgstr ""
711
  #: adminpages/advancedsettings.php:170 adminpages/advancedsettings.php:129
712
  #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:149
713
  #: adminpages/advancedsettings.php:152 adminpages/advancedsettings.php:168
 
714
  msgid "Hide Ads From All Members"
715
  msgstr ""
716
 
717
  #: adminpages/advancedsettings.php:171 adminpages/advancedsettings.php:130
718
  #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:150
719
  #: adminpages/advancedsettings.php:153 adminpages/advancedsettings.php:169
 
720
  msgid "Hide Ads From Certain Members"
721
  msgstr ""
722
 
723
  #: adminpages/advancedsettings.php:178 adminpages/advancedsettings.php:137
724
  #: adminpages/advancedsettings.php:144 adminpages/advancedsettings.php:157
725
  #: adminpages/advancedsettings.php:160 adminpages/advancedsettings.php:176
 
726
  msgid "Ads from the following plugins will be automatically turned off"
727
  msgstr ""
728
 
729
  #: adminpages/advancedsettings.php:179 adminpages/advancedsettings.php:138
730
  #: adminpages/advancedsettings.php:145 adminpages/advancedsettings.php:158
731
  #: adminpages/advancedsettings.php:161 adminpages/advancedsettings.php:177
 
732
  msgid "To hide ads in your template code, use code like the following"
733
  msgstr ""
734
 
735
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:149
736
  #: adminpages/advancedsettings.php:156 adminpages/advancedsettings.php:169
737
  #: adminpages/advancedsettings.php:172 adminpages/advancedsettings.php:188
 
738
  msgid "Choose Levels to Hide Ads From"
739
  msgstr ""
740
 
741
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:183
742
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203
743
  #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:222
 
744
  msgid "Redirect all traffic from registration page to /susbcription/?"
745
  msgstr ""
746
 
747
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:183
748
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203
749
  #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:222
 
750
  msgid "multisite only"
751
  msgstr ""
752
 
753
- #: adminpages/advancedsettings.php:229 adminpages/membershiplevels.php:746
754
- #: adminpages/paymentsettings.php:237
755
- #: classes/gateways/class.pmprogateway_stripe.php:284 includes/profile.php:126
756
  #: adminpages/advancedsettings.php:188 adminpages/advancedsettings.php:195
757
  #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:211
758
- #: adminpages/advancedsettings.php:227 adminpages/membershiplevels.php:563
759
- #: adminpages/membershiplevels.php:569 adminpages/membershiplevels.php:571
760
- #: adminpages/membershiplevels.php:578 adminpages/membershiplevels.php:598
761
- #: adminpages/membershiplevels.php:658 adminpages/membershiplevels.php:660
762
- #: adminpages/membershiplevels.php:662 adminpages/membershiplevels.php:667
763
- #: adminpages/membershiplevels.php:668 adminpages/membershiplevels.php:672
764
- #: adminpages/membershiplevels.php:684 adminpages/membershiplevels.php:694
765
- #: adminpages/membershiplevels.php:744 adminpages/paymentsettings.php:211
 
766
  #: adminpages/paymentsettings.php:220 adminpages/paymentsettings.php:237
767
  #: adminpages/paymentsettings.php:415 adminpages/paymentsettings.php:424
768
  #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:435
@@ -778,6 +807,7 @@ msgstr ""
778
  #: classes/gateways/class.pmprogateway_stripe.php:223
779
  #: classes/gateways/class.pmprogateway_stripe.php:250
780
  #: classes/gateways/class.pmprogateway_stripe.php:282
 
781
  #: classes/gateways/class.pmprogateway_stripe.php:290
782
  #: classes/gateways/class.pmprogateway_stripe.php:292
783
  #: classes/gateways/class.pmprogateway_stripe.php:298
@@ -790,83 +820,92 @@ msgstr ""
790
  #: adminpages/advancedsettings.php:236 adminpages/advancedsettings.php:195
791
  #: adminpages/advancedsettings.php:202 adminpages/advancedsettings.php:215
792
  #: adminpages/advancedsettings.php:218 adminpages/advancedsettings.php:234
 
793
  msgid "Use reCAPTCHA?"
794
  msgstr ""
795
 
796
  #: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:200
797
  #: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:220
798
  #: adminpages/advancedsettings.php:223 adminpages/advancedsettings.php:239
 
799
  msgid "Yes - Free memberships only."
800
  msgstr ""
801
 
802
  #: adminpages/advancedsettings.php:242 adminpages/advancedsettings.php:201
803
  #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:221
804
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:240
 
805
  msgid "Yes - All memberships."
806
  msgstr ""
807
 
808
  #: adminpages/advancedsettings.php:244 adminpages/advancedsettings.php:203
809
  #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223
810
  #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:242
 
811
  msgid "A free reCAPTCHA key is required."
812
  msgstr ""
813
 
814
  #: adminpages/advancedsettings.php:244 adminpages/advancedsettings.php:203
815
  #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223
816
  #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:242
 
817
  msgid "Click here to signup for reCAPTCHA"
818
  msgstr ""
819
 
820
- #: adminpages/advancedsettings.php:250
821
  msgid "reCAPTCHA Version"
822
  msgstr ""
823
 
824
- #: adminpages/advancedsettings.php:252
825
  msgid " v2 - Checkbox"
826
  msgstr ""
827
 
828
- #: adminpages/advancedsettings.php:253
829
  msgid "v3 - Invisible"
830
  msgstr ""
831
 
832
- #: adminpages/advancedsettings.php:255
833
  msgid "Changing your version will require new API keys."
834
  msgstr ""
835
 
836
  #: adminpages/advancedsettings.php:257 adminpages/advancedsettings.php:248
 
837
  msgid "reCAPTCHA Site Key"
838
  msgstr ""
839
 
840
  #: adminpages/advancedsettings.php:260 adminpages/advancedsettings.php:251
 
841
  msgid "reCAPTCHA Secret Key"
842
  msgstr ""
843
 
844
  #: adminpages/advancedsettings.php:266 adminpages/advancedsettings.php:218
845
  #: adminpages/advancedsettings.php:225 adminpages/advancedsettings.php:238
846
  #: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:257
 
847
  msgid "Require Terms of Service on signups?"
848
  msgstr ""
849
 
850
  #: adminpages/advancedsettings.php:273 adminpages/advancedsettings.php:225
851
  #: adminpages/advancedsettings.php:232 adminpages/advancedsettings.php:245
852
  #: adminpages/advancedsettings.php:248 adminpages/advancedsettings.php:264
 
853
  msgid ""
854
  "If yes, create a WordPress page containing your TOS agreement and assign it "
855
  "using the dropdown above."
856
  msgstr ""
857
 
858
  #: adminpages/advancedsettings.php:384 adminpages/pagesettings.php:315
859
- #: adminpages/paymentsettings.php:267 adminpages/advancedsettings.php:284
860
  #: adminpages/advancedsettings.php:355 adminpages/advancedsettings.php:359
861
  #: adminpages/advancedsettings.php:368 adminpages/advancedsettings.php:375
862
- #: adminpages/pagesettings.php:209 adminpages/pagesettings.php:223
863
- #: adminpages/pagesettings.php:251 adminpages/pagesettings.php:254
864
- #: adminpages/pagesettings.php:294 adminpages/pagesettings.php:295
865
- #: adminpages/pagesettings.php:310 adminpages/pagesettings.php:315
866
- #: adminpages/paymentsettings.php:238 adminpages/paymentsettings.php:250
867
- #: adminpages/paymentsettings.php:267 adminpages/paymentsettings.php:485
868
- #: adminpages/paymentsettings.php:526 adminpages/paymentsettings.php:532
869
- #: adminpages/paymentsettings.php:534
870
  msgid "Save Settings"
871
  msgstr ""
872
 
@@ -954,7 +993,7 @@ msgid ""
954
  msgstr ""
955
 
956
  #: adminpages/dashboard.php:215 adminpages/memberslist.php:165
957
- #: pages/checkout.php:175 shortcodes/pmpro_account.php:110
958
  #: adminpages/dashboard.php:215 adminpages/dashboard.php:223
959
  #: adminpages/memberslist.php:112 adminpages/memberslist.php:145
960
  #: adminpages/memberslist.php:155 adminpages/memberslist.php:165
@@ -1024,8 +1063,8 @@ msgid "No members found."
1024
  msgstr ""
1025
 
1026
  #: adminpages/dashboard.php:282 adminpages/discountcodes.php:447
1027
- #: adminpages/discountcodes.php:747 adminpages/orders.php:419
1028
- #: adminpages/orders.php:1353 adminpages/dashboard.php:282
1029
  #: adminpages/dashboard.php:290 adminpages/discountcodes.php:311
1030
  #: adminpages/discountcodes.php:314 adminpages/discountcodes.php:315
1031
  #: adminpages/discountcodes.php:316 adminpages/discountcodes.php:321
@@ -1048,7 +1087,7 @@ msgstr ""
1048
  msgid "Code"
1049
  msgstr ""
1050
 
1051
- #: adminpages/dashboard.php:283 adminpages/orders.php:1354
1052
  #: adminpages/reports/login.php:179
1053
  #: classes/gateways/class.pmprogateway_payflowpro.php:116
1054
  #: adminpages/dashboard.php:283 adminpages/dashboard.php:291
@@ -1065,7 +1104,7 @@ msgstr ""
1065
  msgid "User"
1066
  msgstr ""
1067
 
1068
- #: adminpages/dashboard.php:284 includes/privacy.php:241 pages/billing.php:41
1069
  #: pages/cancel.php:60 pages/invoice.php:103 pages/levels.php:35
1070
  #: shortcodes/pmpro_account.php:44 shortcodes/pmpro_account.php:128
1071
  #: adminpages/dashboard.php:284 adminpages/dashboard.php:292
@@ -1074,16 +1113,16 @@ msgstr ""
1074
  #: pages/billing.php:27 pages/billing.php:28 pages/billing.php:30
1075
  #: pages/billing.php:41 pages/billing.php:44 pages/billing.php:45
1076
  #: pages/cancel.php:52 pages/cancel.php:60 pages/cancel.php:61
1077
- #: pages/invoice.php:89 pages/invoice.php:102 pages/invoice.php:109
1078
- #: pages/levels.php:13 pages/levels.php:35 shortcodes/pmpro_account.php:43
1079
- #: shortcodes/pmpro_account.php:44 shortcodes/pmpro_account.php:123
1080
- #: shortcodes/pmpro_account.php:125 shortcodes/pmpro_account.php:126
1081
- #: shortcodes/pmpro_account.php:128
1082
  msgid "Level"
1083
  msgstr ""
1084
 
1085
- #: adminpages/dashboard.php:285 adminpages/orders.php:637
1086
- #: adminpages/orders.php:1357 adminpages/templates/orders-email.php:64
1087
  #: adminpages/templates/orders-print.php:93 includes/privacy.php:285
1088
  #: pages/confirmation.php:96 pages/invoice.php:79 adminpages/dashboard.php:285
1089
  #: adminpages/dashboard.php:293 adminpages/orders.php:320
@@ -1098,13 +1137,13 @@ msgstr ""
1098
  #: adminpages/orders.php:1236 adminpages/orders.php:1357
1099
  #: adminpages/templates/orders-email.php:64
1100
  #: adminpages/templates/orders-print.php:93 includes/privacy.php:285
1101
- #: pages/confirmation.php:96 pages/invoice.php:78 pages/invoice.php:82
1102
- #: pages/invoice.php:84
1103
  msgid "Total"
1104
  msgstr ""
1105
 
1106
- #: adminpages/dashboard.php:286 adminpages/orders.php:722
1107
- #: adminpages/orders.php:1361 includes/privacy.php:202 includes/privacy.php:309
1108
  #: pages/invoice.php:29 shortcodes/pmpro_account.php:130
1109
  #: adminpages/dashboard.php:286 adminpages/dashboard.php:294
1110
  #: adminpages/orders.php:373 adminpages/orders.php:423
@@ -1117,12 +1156,12 @@ msgstr ""
1117
  #: adminpages/orders.php:1112 adminpages/orders.php:1143
1118
  #: adminpages/orders.php:1149 adminpages/orders.php:1240
1119
  #: adminpages/orders.php:1361 includes/privacy.php:202 includes/privacy.php:309
1120
- #: shortcodes/pmpro_account.php:130
1121
  msgid "Status"
1122
  msgstr ""
1123
 
1124
- #: adminpages/dashboard.php:287 adminpages/orders.php:825
1125
- #: adminpages/orders.php:1362 pages/invoice.php:101
1126
  #: shortcodes/pmpro_account.php:127 adminpages/dashboard.php:287
1127
  #: adminpages/dashboard.php:295 adminpages/orders.php:442
1128
  #: adminpages/orders.php:492 adminpages/orders.php:493
@@ -1135,13 +1174,14 @@ msgstr ""
1135
  #: adminpages/orders.php:1113 adminpages/orders.php:1144
1136
  #: adminpages/orders.php:1150 adminpages/orders.php:1241
1137
  #: adminpages/orders.php:1362 pages/account.php:91 pages/invoice.php:87
1138
- #: pages/invoice.php:100 pages/invoice.php:105 pages/invoice.php:107
1139
- #: shortcodes/pmpro_account.php:122 shortcodes/pmpro_account.php:124
1140
- #: shortcodes/pmpro_account.php:125 shortcodes/pmpro_account.php:127
 
1141
  msgid "Date"
1142
  msgstr ""
1143
 
1144
- #: adminpages/dashboard.php:294 adminpages/orders.php:1512
1145
  #: adminpages/dashboard.php:294 adminpages/dashboard.php:302
1146
  #: adminpages/orders.php:674 adminpages/orders.php:977
1147
  #: adminpages/orders.php:995 adminpages/orders.php:1005
@@ -1152,7 +1192,7 @@ msgstr ""
1152
  msgid "No orders found."
1153
  msgstr ""
1154
 
1155
- #: adminpages/dashboard.php:311 adminpages/orders.php:1395
1156
  #: adminpages/dashboard.php:311 adminpages/dashboard.php:319
1157
  #: adminpages/orders.php:630 adminpages/orders.php:933
1158
  #: adminpages/orders.php:943 adminpages/orders.php:972
@@ -1162,7 +1202,7 @@ msgstr ""
1162
  msgid "deleted"
1163
  msgstr ""
1164
 
1165
- #: adminpages/dashboard.php:313 adminpages/orders.php:1397
1166
  #: adminpages/dashboard.php:313 adminpages/dashboard.php:321
1167
  #: adminpages/orders.php:1275 adminpages/orders.php:1397
1168
  msgid "none"
@@ -1289,8 +1329,8 @@ msgid "Add New Discount Code"
1289
  msgstr ""
1290
 
1291
  #: adminpages/discountcodes.php:442 adminpages/discountcodes.php:746
1292
- #: adminpages/membershiplevels.php:346 adminpages/membershiplevels.php:715
1293
- #: adminpages/memberslist.php:164 adminpages/orders.php:1352
1294
  #: adminpages/reports/login.php:178 adminpages/templates/orders-email.php:46
1295
  #: adminpages/templates/orders-print.php:75 adminpages/discountcodes.php:306
1296
  #: adminpages/discountcodes.php:309 adminpages/discountcodes.php:310
@@ -1304,13 +1344,14 @@ msgstr ""
1304
  #: adminpages/membershiplevels.php:284 adminpages/membershiplevels.php:286
1305
  #: adminpages/membershiplevels.php:288 adminpages/membershiplevels.php:312
1306
  #: adminpages/membershiplevels.php:322 adminpages/membershiplevels.php:344
1307
- #: adminpages/membershiplevels.php:505 adminpages/membershiplevels.php:511
1308
- #: adminpages/membershiplevels.php:513 adminpages/membershiplevels.php:540
1309
- #: adminpages/membershiplevels.php:541 adminpages/membershiplevels.php:583
1310
- #: adminpages/membershiplevels.php:629 adminpages/membershiplevels.php:631
1311
- #: adminpages/membershiplevels.php:636 adminpages/membershiplevels.php:637
1312
- #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:653
1313
- #: adminpages/membershiplevels.php:663 adminpages/membershiplevels.php:713
 
1314
  #: adminpages/memberslist.php:111 adminpages/memberslist.php:144
1315
  #: adminpages/memberslist.php:154 adminpages/memberslist.php:164
1316
  #: adminpages/orders.php:597 adminpages/orders.php:900
@@ -1325,7 +1366,7 @@ msgstr ""
1325
  msgid "ID"
1326
  msgstr ""
1327
 
1328
- #: adminpages/discountcodes.php:443 adminpages/orders.php:412
1329
  #: adminpages/discountcodes.php:307 adminpages/discountcodes.php:310
1330
  #: adminpages/discountcodes.php:311 adminpages/discountcodes.php:312
1331
  #: adminpages/discountcodes.php:317 adminpages/discountcodes.php:382
@@ -1348,9 +1389,9 @@ msgid "Start Date"
1348
  msgstr ""
1349
 
1350
  #: adminpages/discountcodes.php:503
1351
- #: classes/gateways/class.pmprogateway_braintree.php:486
1352
- #: classes/gateways/class.pmprogateway_stripe.php:598 pages/billing.php:313
1353
- #: pages/checkout.php:471 adminpages/discountcodes.php:367
1354
  #: adminpages/discountcodes.php:370 adminpages/discountcodes.php:371
1355
  #: adminpages/discountcodes.php:372 adminpages/discountcodes.php:377
1356
  #: adminpages/discountcodes.php:442 adminpages/discountcodes.php:483
@@ -1378,6 +1419,7 @@ msgstr ""
1378
  #: classes/gateways/class.pmprogateway_stripe.php:532
1379
  #: classes/gateways/class.pmprogateway_stripe.php:570
1380
  #: classes/gateways/class.pmprogateway_stripe.php:597
 
1381
  #: classes/gateways/class.pmprogateway_stripe.php:613
1382
  #: classes/gateways/class.pmprogateway_stripe.php:621
1383
  #: classes/gateways/class.pmprogateway_stripe.php:628
@@ -1430,9 +1472,10 @@ msgstr ""
1430
  #: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:339
1431
  #: adminpages/membershiplevels.php:341 adminpages/membershiplevels.php:342
1432
  #: adminpages/membershiplevels.php:365 adminpages/membershiplevels.php:375
1433
- #: adminpages/membershiplevels.php:398 adminpages/membershiplevels.php:507
1434
- #: adminpages/membershiplevels.php:513 adminpages/membershiplevels.php:515
1435
- #: adminpages/membershiplevels.php:542 pages/levels.php:14
 
1436
  msgid "Initial Payment"
1437
  msgstr ""
1438
 
@@ -1445,7 +1488,7 @@ msgstr ""
1445
  #: adminpages/membershiplevels.php:340 adminpages/membershiplevels.php:350
1446
  #: adminpages/membershiplevels.php:352 adminpages/membershiplevels.php:353
1447
  #: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:386
1448
- #: adminpages/membershiplevels.php:409
1449
  msgid "The initial amount collected at registration."
1450
  msgstr ""
1451
 
@@ -1458,7 +1501,7 @@ msgstr ""
1458
  #: adminpages/membershiplevels.php:344 adminpages/membershiplevels.php:354
1459
  #: adminpages/membershiplevels.php:356 adminpages/membershiplevels.php:357
1460
  #: adminpages/membershiplevels.php:380 adminpages/membershiplevels.php:390
1461
- #: adminpages/membershiplevels.php:413
1462
  msgid "Recurring Subscription"
1463
  msgstr ""
1464
 
@@ -1471,7 +1514,7 @@ msgstr ""
1471
  #: adminpages/membershiplevels.php:345 adminpages/membershiplevels.php:355
1472
  #: adminpages/membershiplevels.php:357 adminpages/membershiplevels.php:358
1473
  #: adminpages/membershiplevels.php:381 adminpages/membershiplevels.php:391
1474
- #: adminpages/membershiplevels.php:414
1475
  msgid "Check if this level has a recurring subscription payment."
1476
  msgstr ""
1477
 
@@ -1484,12 +1527,13 @@ msgstr ""
1484
  #: adminpages/membershiplevels.php:359 adminpages/membershiplevels.php:361
1485
  #: adminpages/membershiplevels.php:362 adminpages/membershiplevels.php:385
1486
  #: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:418
 
1487
  msgid "Billing Amount"
1488
  msgstr ""
1489
 
1490
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1491
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1492
- #: classes/gateways/class.pmprogateway_stripe.php:655
1493
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1494
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1495
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
@@ -1502,10 +1546,11 @@ msgstr ""
1502
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1503
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1504
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1505
- #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476
1506
- #: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479
1507
- #: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501
1508
- #: adminpages/membershiplevels.php:511 adminpages/membershiplevels.php:535
 
1509
  #: classes/gateways/class.pmprogateway_stripe.php:521
1510
  #: classes/gateways/class.pmprogateway_stripe.php:522
1511
  #: classes/gateways/class.pmprogateway_stripe.php:532
@@ -1517,6 +1562,7 @@ msgstr ""
1517
  #: classes/gateways/class.pmprogateway_stripe.php:588
1518
  #: classes/gateways/class.pmprogateway_stripe.php:599
1519
  #: classes/gateways/class.pmprogateway_stripe.php:637
 
1520
  #: classes/gateways/class.pmprogateway_stripe.php:664
1521
  #: classes/gateways/class.pmprogateway_stripe.php:671
1522
  #: classes/gateways/class.pmprogateway_stripe.php:679
@@ -1528,7 +1574,7 @@ msgstr ""
1528
 
1529
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1530
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1531
- #: classes/gateways/class.pmprogateway_stripe.php:655
1532
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1533
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1534
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
@@ -1541,10 +1587,11 @@ msgstr ""
1541
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1542
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1543
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1544
- #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476
1545
- #: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479
1546
- #: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501
1547
- #: adminpages/membershiplevels.php:511 adminpages/membershiplevels.php:535
6
  msgstr ""
7
  "Project-Id-Version: paid-memberships-pro\n"
8
  "Report-Msgid-Bugs-To: info@paidmembershipspro.com\n"
9
+ "POT-Creation-Date: 2019-09-13 12:49-0400\n"
10
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
11
  "Last-Translator: \n"
12
  "Language-Team: Stranger Studios <info@paidmembershipspro.com>\n"
59
  msgid "Check Again"
60
  msgstr ""
61
 
62
+ #: adminpages/addons.php:93 adminpages/orders.php:994 adminpages/addons.php:76
63
  #: adminpages/addons.php:79 adminpages/addons.php:92 adminpages/addons.php:93
64
  #: adminpages/orders.php:605 adminpages/orders.php:712
65
  #: adminpages/orders.php:741 adminpages/orders.php:850
103
  #: adminpages/addons.php:112 adminpages/membershiplevels.php:296
104
  #: adminpages/membershiplevels.php:298 adminpages/membershiplevels.php:300
105
  #: adminpages/membershiplevels.php:324 adminpages/membershiplevels.php:334
106
+ #: adminpages/membershiplevels.php:356 adminpages/membershiplevels.php:358
107
  msgid "Description"
108
  msgstr ""
109
 
171
  msgid "Activate %s"
172
  msgstr ""
173
 
174
+ #: adminpages/addons.php:231 adminpages/discountcodes.php:771
175
+ #: adminpages/membershiplevels.php:762 adminpages/orders.php:1358
176
+ #: adminpages/addons.php:213 adminpages/addons.php:216
177
+ #: adminpages/addons.php:229 adminpages/addons.php:231
178
  msgid "Delete"
179
  msgstr ""
180
 
209
  msgid "WordPress.org"
210
  msgstr ""
211
 
212
+ #: adminpages/addons.php:249 adminpages/orders.php:900
213
+ #: adminpages/orders.php:1429 adminpages/orders.php:1439
214
  #: includes/profile.php:186 shortcodes/pmpro_account.php:158
215
  #: adminpages/addons.php:231 adminpages/addons.php:234
216
  #: adminpages/addons.php:247 adminpages/addons.php:249
350
  msgstr ""
351
 
352
  #: adminpages/admin_header.php:135
353
+ #: classes/gateways/class.pmprogateway_stripe.php:71
354
  #: adminpages/admin_header.php:125 adminpages/admin_header.php:135
355
  #: classes/gateways/class.pmprogateway_stripe.php:66
356
  #: classes/gateways/class.pmprogateway_stripe.php:68
400
  msgid "Members"
401
  msgstr ""
402
 
403
+ #: adminpages/admin_header.php:196 adminpages/discountcodes.php:775
404
+ #: adminpages/orders.php:949 includes/adminpages.php:52
405
+ #: includes/adminpages.php:156 adminpages/admin_header.php:196
406
+ #: adminpages/orders.php:520 adminpages/orders.php:570
407
+ #: adminpages/orders.php:677 adminpages/orders.php:706
408
+ #: adminpages/orders.php:810 adminpages/orders.php:841
409
+ #: adminpages/orders.php:852 adminpages/orders.php:939
410
+ #: adminpages/orders.php:994 includes/adminpages.php:17
411
+ #: includes/adminpages.php:52 includes/adminpages.php:55
412
+ #: includes/adminpages.php:56 includes/adminpages.php:84
413
+ #: includes/adminpages.php:156 includes/adminpages.php:163
414
+ #: includes/adminpages.php:167 includes/adminpages.php:172
415
  msgid "Orders"
416
  msgstr ""
417
 
440
  msgid "Levels"
441
  msgstr ""
442
 
443
+ #: adminpages/admin_header.php:215 adminpages/membershiplevels.php:728
444
  #: adminpages/pagesettings.php:85 includes/metaboxes.php:130
445
  #: adminpages/admin_header.php:128 adminpages/admin_header.php:149
446
  #: adminpages/admin_header.php:150 adminpages/admin_header.php:159
452
  #: adminpages/membershiplevels.php:609 adminpages/membershiplevels.php:618
453
  #: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:631
454
  #: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:700
455
+ #: adminpages/membershiplevels.php:702 adminpages/pagesettings.php:69
456
+ #: adminpages/pagesettings.php:70 adminpages/pagesettings.php:71
457
+ #: adminpages/pagesettings.php:85 includes/adminpages.php:44
458
+ #: includes/adminpages.php:64 includes/adminpages.php:65
459
+ #: includes/adminpages.php:69 includes/adminpages.php:70
460
+ #: includes/adminpages.php:100 includes/adminpages.php:107
461
+ #: includes/adminpages.php:111 includes/adminpages.php:116
462
+ #: includes/metaboxes.php:126 includes/metaboxes.php:130
463
+ #: includes/metaboxes.php:131 includes/metaboxes.php:132
464
  msgid "Membership Levels"
465
  msgstr ""
466
 
504
  msgstr ""
505
 
506
  #: adminpages/admin_header.php:231 adminpages/memberslist.php:168
507
+ #: adminpages/orders.php:372 adminpages/orders.php:1365
508
  #: shortcodes/pmpro_account.php:111 adminpages/admin_header.php:131
509
  #: adminpages/admin_header.php:152 adminpages/admin_header.php:162
510
  #: adminpages/admin_header.php:171 adminpages/admin_header.php:183
520
  #: adminpages/admin_header.php:231 adminpages/emailsettings.php:83
521
  #: includes/adminpages.php:61 adminpages/admin_header.php:231
522
  #: adminpages/emailsettings.php:60 adminpages/emailsettings.php:69
523
+ #: adminpages/emailsettings.php:79 adminpages/emailsettings.php:83
524
+ #: includes/adminpages.php:12 includes/adminpages.php:50
525
+ #: includes/adminpages.php:51 includes/adminpages.php:59
526
+ #: includes/adminpages.php:61 includes/adminpages.php:121
527
+ #: includes/adminpages.php:128 includes/adminpages.php:132
528
+ #: includes/adminpages.php:137
529
  msgid "Email Settings"
530
  msgstr ""
531
 
540
  #: includes/adminpages.php:62 adminpages/admin_header.php:235
541
  #: adminpages/advancedsettings.php:79 adminpages/advancedsettings.php:86
542
  #: adminpages/advancedsettings.php:88 adminpages/advancedsettings.php:91
543
+ #: adminpages/advancedsettings.php:107 adminpages/advancedsettings.php:109
544
+ #: includes/adminpages.php:13 includes/adminpages.php:51
545
+ #: includes/adminpages.php:52 includes/adminpages.php:62
546
+ #: includes/adminpages.php:64 includes/adminpages.php:128
547
+ #: includes/adminpages.php:135 includes/adminpages.php:139
548
+ #: includes/adminpages.php:144
549
  msgid "Advanced Settings"
550
  msgstr ""
551
 
564
  #: adminpages/advancedsettings.php:61 adminpages/advancedsettings.php:35
565
  #: adminpages/advancedsettings.php:42 adminpages/advancedsettings.php:43
566
  #: adminpages/advancedsettings.php:46 adminpages/advancedsettings.php:60
567
+ #: adminpages/advancedsettings.php:61
568
  msgid "Your advanced settings have been updated."
569
  msgstr ""
570
 
571
  #: adminpages/advancedsettings.php:87 adminpages/advancedsettings.php:66
572
  #: adminpages/advancedsettings.php:68 adminpages/advancedsettings.php:71
573
+ #: adminpages/advancedsettings.php:85 adminpages/advancedsettings.php:87
574
  #, php-format
575
  msgid ""
576
  "This content is for !!levels!! members only. <a href=\"%s\">Register here</"
579
 
580
  #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:71
581
  #: adminpages/advancedsettings.php:73 adminpages/advancedsettings.php:76
582
+ #: adminpages/advancedsettings.php:90 adminpages/advancedsettings.php:92
583
  #, php-format
584
  msgid ""
585
  "Please <a href=\"%s\">login</a> to view this content. (<a href=\"%s"
588
 
589
  #: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:76
590
  #: adminpages/advancedsettings.php:78 adminpages/advancedsettings.php:81
591
+ #: adminpages/advancedsettings.php:95 adminpages/advancedsettings.php:97
592
  msgid ""
593
  "This content is for members only. Visit the site and log in/register to read."
594
  msgstr ""
596
  #: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:85
597
  #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:94
598
  #: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:113
599
+ #: adminpages/advancedsettings.php:115
600
  msgid "Message for Logged-in Non-members"
601
  msgstr ""
602
 
603
  #: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:89
604
  #: adminpages/advancedsettings.php:96 adminpages/advancedsettings.php:98
605
  #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:117
606
+ #: adminpages/advancedsettings.php:119
607
  msgid ""
608
  "This message replaces the post content for non-members. Available variables"
609
  msgstr ""
611
  #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:94
612
  #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:103
613
  #: adminpages/advancedsettings.php:106 adminpages/advancedsettings.php:122
614
+ #: adminpages/advancedsettings.php:124
615
  msgid "Message for Logged-out Users"
616
  msgstr ""
617
 
618
  #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:98
619
  #: adminpages/advancedsettings.php:105 adminpages/advancedsettings.php:107
620
  #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:126
621
+ #: adminpages/advancedsettings.php:128
622
  msgid "This message replaces the post content for logged-out visitors."
623
  msgstr ""
624
 
625
  #: adminpages/advancedsettings.php:133 adminpages/advancedsettings.php:103
626
  #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:112
627
  #: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:131
628
+ #: adminpages/advancedsettings.php:133
629
  msgid "Message for RSS Feed"
630
  msgstr ""
631
 
632
  #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:107
633
  #: adminpages/advancedsettings.php:114 adminpages/advancedsettings.php:116
634
  #: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:135
635
+ #: adminpages/advancedsettings.php:137
636
  msgid "This message replaces the post content in RSS feeds."
637
  msgstr ""
638
 
639
  #: adminpages/advancedsettings.php:143 adminpages/advancedsettings.php:122
640
  #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:141
641
+ #: adminpages/advancedsettings.php:143
642
  msgid "Filter searches and archives?"
643
  msgstr ""
644
 
645
  #: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:126
646
  #: adminpages/advancedsettings.php:129 adminpages/advancedsettings.php:145
647
+ #: adminpages/advancedsettings.php:147
648
  msgid ""
649
  "No - Non-members will see restricted posts/pages in searches and archives."
650
  msgstr ""
651
 
652
  #: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:127
653
  #: adminpages/advancedsettings.php:130 adminpages/advancedsettings.php:146
654
+ #: adminpages/advancedsettings.php:148
655
  msgid ""
656
  "Yes - Only members will see restricted posts/pages in searches and archives."
657
  msgstr ""
659
  #: adminpages/advancedsettings.php:154 adminpages/advancedsettings.php:113
660
  #: adminpages/advancedsettings.php:120 adminpages/advancedsettings.php:133
661
  #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:152
662
+ #: adminpages/advancedsettings.php:154
663
  msgid "Show Excerpts to Non-Members?"
664
  msgstr ""
665
 
666
  #: adminpages/advancedsettings.php:158 adminpages/advancedsettings.php:117
667
  #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:137
668
  #: adminpages/advancedsettings.php:140 adminpages/advancedsettings.php:156
669
+ #: adminpages/advancedsettings.php:158
670
  msgid "No - Hide excerpts."
671
  msgstr ""
672
 
673
  #: adminpages/advancedsettings.php:159 adminpages/advancedsettings.php:118
674
  #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:138
675
  #: adminpages/advancedsettings.php:141 adminpages/advancedsettings.php:157
676
+ #: adminpages/advancedsettings.php:159
677
  msgid "Yes - Show excerpts."
678
  msgstr ""
679
 
680
  #: adminpages/advancedsettings.php:165 adminpages/advancedsettings.php:144
681
  #: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:163
682
+ #: adminpages/advancedsettings.php:165
683
  msgid "Hide Ads From Members?"
684
  msgstr ""
685
 
686
  #: adminpages/advancedsettings.php:169 adminpages/advancedsettings.php:228
687
+ #: adminpages/advancedsettings.php:240 adminpages/membershiplevels.php:779
688
+ #: adminpages/paymentsettings.php:253
689
+ #: classes/gateways/class.pmprogateway_stripe.php:321 includes/profile.php:125
690
  #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:135
691
  #: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:151
692
+ #: adminpages/advancedsettings.php:167 adminpages/advancedsettings.php:169
693
+ #: adminpages/advancedsettings.php:187 adminpages/advancedsettings.php:194
694
+ #: adminpages/advancedsettings.php:199 adminpages/advancedsettings.php:206
695
+ #: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:210
696
+ #: adminpages/advancedsettings.php:219 adminpages/advancedsettings.php:222
697
+ #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:228
698
+ #: adminpages/advancedsettings.php:238 adminpages/advancedsettings.php:240
699
+ #: adminpages/membershiplevels.php:563 adminpages/membershiplevels.php:569
700
+ #: adminpages/membershiplevels.php:571 adminpages/membershiplevels.php:578
701
+ #: adminpages/membershiplevels.php:598 adminpages/membershiplevels.php:658
702
+ #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
703
+ #: adminpages/membershiplevels.php:667 adminpages/membershiplevels.php:668
704
+ #: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:684
705
+ #: adminpages/membershiplevels.php:694 adminpages/membershiplevels.php:744
706
+ #: adminpages/membershiplevels.php:746 adminpages/paymentsettings.php:210
707
  #: adminpages/paymentsettings.php:219 adminpages/paymentsettings.php:236
708
  #: adminpages/paymentsettings.php:414 adminpages/paymentsettings.php:429
709
  #: adminpages/paymentsettings.php:434 adminpages/paymentsettings.php:436
719
  #: classes/gateways/class.pmprogateway_stripe.php:222
720
  #: classes/gateways/class.pmprogateway_stripe.php:249
721
  #: classes/gateways/class.pmprogateway_stripe.php:281
722
+ #: classes/gateways/class.pmprogateway_stripe.php:283
723
  #: classes/gateways/class.pmprogateway_stripe.php:289
724
  #: classes/gateways/class.pmprogateway_stripe.php:291
725
  #: classes/gateways/class.pmprogateway_stripe.php:297
732
  #: adminpages/advancedsettings.php:170 adminpages/advancedsettings.php:129
733
  #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:149
734
  #: adminpages/advancedsettings.php:152 adminpages/advancedsettings.php:168
735
+ #: adminpages/advancedsettings.php:170
736
  msgid "Hide Ads From All Members"
737
  msgstr ""
738
 
739
  #: adminpages/advancedsettings.php:171 adminpages/advancedsettings.php:130
740
  #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:150
741
  #: adminpages/advancedsettings.php:153 adminpages/advancedsettings.php:169
742
+ #: adminpages/advancedsettings.php:171
743
  msgid "Hide Ads From Certain Members"
744
  msgstr ""
745
 
746
  #: adminpages/advancedsettings.php:178 adminpages/advancedsettings.php:137
747
  #: adminpages/advancedsettings.php:144 adminpages/advancedsettings.php:157
748
  #: adminpages/advancedsettings.php:160 adminpages/advancedsettings.php:176
749
+ #: adminpages/advancedsettings.php:178
750
  msgid "Ads from the following plugins will be automatically turned off"
751
  msgstr ""
752
 
753
  #: adminpages/advancedsettings.php:179 adminpages/advancedsettings.php:138
754
  #: adminpages/advancedsettings.php:145 adminpages/advancedsettings.php:158
755
  #: adminpages/advancedsettings.php:161 adminpages/advancedsettings.php:177
756
+ #: adminpages/advancedsettings.php:179
757
  msgid "To hide ads in your template code, use code like the following"
758
  msgstr ""
759
 
760
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:149
761
  #: adminpages/advancedsettings.php:156 adminpages/advancedsettings.php:169
762
  #: adminpages/advancedsettings.php:172 adminpages/advancedsettings.php:188
763
+ #: adminpages/advancedsettings.php:190
764
  msgid "Choose Levels to Hide Ads From"
765
  msgstr ""
766
 
767
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:183
768
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203
769
  #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:222
770
+ #: adminpages/advancedsettings.php:224
771
  msgid "Redirect all traffic from registration page to /susbcription/?"
772
  msgstr ""
773
 
774
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:183
775
  #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203
776
  #: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:222
777
+ #: adminpages/advancedsettings.php:224
778
  msgid "multisite only"
779
  msgstr ""
780
 
781
+ #: adminpages/advancedsettings.php:229 adminpages/membershiplevels.php:779
782
+ #: adminpages/paymentsettings.php:254
783
+ #: classes/gateways/class.pmprogateway_stripe.php:323 includes/profile.php:126
784
  #: adminpages/advancedsettings.php:188 adminpages/advancedsettings.php:195
785
  #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:211
786
+ #: adminpages/advancedsettings.php:227 adminpages/advancedsettings.php:229
787
+ #: adminpages/membershiplevels.php:563 adminpages/membershiplevels.php:569
788
+ #: adminpages/membershiplevels.php:571 adminpages/membershiplevels.php:578
789
+ #: adminpages/membershiplevels.php:598 adminpages/membershiplevels.php:658
790
+ #: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662
791
+ #: adminpages/membershiplevels.php:667 adminpages/membershiplevels.php:668
792
+ #: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:684
793
+ #: adminpages/membershiplevels.php:694 adminpages/membershiplevels.php:744
794
+ #: adminpages/membershiplevels.php:746 adminpages/paymentsettings.php:211
795
  #: adminpages/paymentsettings.php:220 adminpages/paymentsettings.php:237
796
  #: adminpages/paymentsettings.php:415 adminpages/paymentsettings.php:424
797
  #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:435
807
  #: classes/gateways/class.pmprogateway_stripe.php:223
808
  #: classes/gateways/class.pmprogateway_stripe.php:250
809
  #: classes/gateways/class.pmprogateway_stripe.php:282
810
+ #: classes/gateways/class.pmprogateway_stripe.php:284
811
  #: classes/gateways/class.pmprogateway_stripe.php:290
812
  #: classes/gateways/class.pmprogateway_stripe.php:292
813
  #: classes/gateways/class.pmprogateway_stripe.php:298
820
  #: adminpages/advancedsettings.php:236 adminpages/advancedsettings.php:195
821
  #: adminpages/advancedsettings.php:202 adminpages/advancedsettings.php:215
822
  #: adminpages/advancedsettings.php:218 adminpages/advancedsettings.php:234
823
+ #: adminpages/advancedsettings.php:236
824
  msgid "Use reCAPTCHA?"
825
  msgstr ""
826
 
827
  #: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:200
828
  #: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:220
829
  #: adminpages/advancedsettings.php:223 adminpages/advancedsettings.php:239
830
+ #: adminpages/advancedsettings.php:241
831
  msgid "Yes - Free memberships only."
832
  msgstr ""
833
 
834
  #: adminpages/advancedsettings.php:242 adminpages/advancedsettings.php:201
835
  #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:221
836
  #: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:240
837
+ #: adminpages/advancedsettings.php:242
838
  msgid "Yes - All memberships."
839
  msgstr ""
840
 
841
  #: adminpages/advancedsettings.php:244 adminpages/advancedsettings.php:203
842
  #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223
843
  #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:242
844
+ #: adminpages/advancedsettings.php:244
845
  msgid "A free reCAPTCHA key is required."
846
  msgstr ""
847
 
848
  #: adminpages/advancedsettings.php:244 adminpages/advancedsettings.php:203
849
  #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223
850
  #: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:242
851
+ #: adminpages/advancedsettings.php:244
852
  msgid "Click here to signup for reCAPTCHA"
853
  msgstr ""
854
 
855
+ #: adminpages/advancedsettings.php:250 adminpages/advancedsettings.php:250
856
  msgid "reCAPTCHA Version"
857
  msgstr ""
858
 
859
+ #: adminpages/advancedsettings.php:252 adminpages/advancedsettings.php:252
860
  msgid " v2 - Checkbox"
861
  msgstr ""
862
 
863
+ #: adminpages/advancedsettings.php:253 adminpages/advancedsettings.php:253
864
  msgid "v3 - Invisible"
865
  msgstr ""
866
 
867
+ #: adminpages/advancedsettings.php:255 adminpages/advancedsettings.php:255
868
  msgid "Changing your version will require new API keys."
869
  msgstr ""
870
 
871
  #: adminpages/advancedsettings.php:257 adminpages/advancedsettings.php:248
872
+ #: adminpages/advancedsettings.php:257
873
  msgid "reCAPTCHA Site Key"
874
  msgstr ""
875
 
876
  #: adminpages/advancedsettings.php:260 adminpages/advancedsettings.php:251
877
+ #: adminpages/advancedsettings.php:260
878
  msgid "reCAPTCHA Secret Key"
879
  msgstr ""
880
 
881
  #: adminpages/advancedsettings.php:266 adminpages/advancedsettings.php:218
882
  #: adminpages/advancedsettings.php:225 adminpages/advancedsettings.php:238
883
  #: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:257
884
+ #: adminpages/advancedsettings.php:266
885
  msgid "Require Terms of Service on signups?"
886
  msgstr ""
887
 
888
  #: adminpages/advancedsettings.php:273 adminpages/advancedsettings.php:225
889
  #: adminpages/advancedsettings.php:232 adminpages/advancedsettings.php:245
890
  #: adminpages/advancedsettings.php:248 adminpages/advancedsettings.php:264
891
+ #: adminpages/advancedsettings.php:273
892
  msgid ""
893
  "If yes, create a WordPress page containing your TOS agreement and assign it "
894
  "using the dropdown above."
895
  msgstr ""
896
 
897
  #: adminpages/advancedsettings.php:384 adminpages/pagesettings.php:315
898
+ #: adminpages/paymentsettings.php:284 adminpages/advancedsettings.php:284
899
  #: adminpages/advancedsettings.php:355 adminpages/advancedsettings.php:359
900
  #: adminpages/advancedsettings.php:368 adminpages/advancedsettings.php:375
901
+ #: adminpages/advancedsettings.php:384 adminpages/pagesettings.php:209
902
+ #: adminpages/pagesettings.php:223 adminpages/pagesettings.php:251
903
+ #: adminpages/pagesettings.php:254 adminpages/pagesettings.php:294
904
+ #: adminpages/pagesettings.php:295 adminpages/pagesettings.php:310
905
+ #: adminpages/pagesettings.php:315 adminpages/paymentsettings.php:238
906
+ #: adminpages/paymentsettings.php:250 adminpages/paymentsettings.php:267
907
+ #: adminpages/paymentsettings.php:485 adminpages/paymentsettings.php:526
908
+ #: adminpages/paymentsettings.php:532 adminpages/paymentsettings.php:534
909
  msgid "Save Settings"
910
  msgstr ""
911
 
993
  msgstr ""
994
 
995
  #: adminpages/dashboard.php:215 adminpages/memberslist.php:165
996
+ #: pages/checkout.php:118 shortcodes/pmpro_account.php:110
997
  #: adminpages/dashboard.php:215 adminpages/dashboard.php:223
998
  #: adminpages/memberslist.php:112 adminpages/memberslist.php:145
999
  #: adminpages/memberslist.php:155 adminpages/memberslist.php:165
1063
  msgstr ""
1064
 
1065
  #: adminpages/dashboard.php:282 adminpages/discountcodes.php:447
1066
+ #: adminpages/discountcodes.php:747 adminpages/orders.php:409
1067
+ #: adminpages/orders.php:1308 adminpages/dashboard.php:282
1068
  #: adminpages/dashboard.php:290 adminpages/discountcodes.php:311
1069
  #: adminpages/discountcodes.php:314 adminpages/discountcodes.php:315
1070
  #: adminpages/discountcodes.php:316 adminpages/discountcodes.php:321
1087
  msgid "Code"
1088
  msgstr ""
1089
 
1090
+ #: adminpages/dashboard.php:283 adminpages/orders.php:1309
1091
  #: adminpages/reports/login.php:179
1092
  #: classes/gateways/class.pmprogateway_payflowpro.php:116
1093
  #: adminpages/dashboard.php:283 adminpages/dashboard.php:291
1104
  msgid "User"
1105
  msgstr ""
1106
 
1107
+ #: adminpages/dashboard.php:284 includes/privacy.php:241 pages/billing.php:49
1108
  #: pages/cancel.php:60 pages/invoice.php:103 pages/levels.php:35
1109
  #: shortcodes/pmpro_account.php:44 shortcodes/pmpro_account.php:128
1110
  #: adminpages/dashboard.php:284 adminpages/dashboard.php:292
1113
  #: pages/billing.php:27 pages/billing.php:28 pages/billing.php:30
1114
  #: pages/billing.php:41 pages/billing.php:44 pages/billing.php:45
1115
  #: pages/cancel.php:52 pages/cancel.php:60 pages/cancel.php:61
1116
+ #: pages/invoice.php:89 pages/invoice.php:102 pages/invoice.php:103
1117
+ #: pages/invoice.php:109 pages/levels.php:13 pages/levels.php:35
1118
+ #: shortcodes/pmpro_account.php:43 shortcodes/pmpro_account.php:44
1119
+ #: shortcodes/pmpro_account.php:123 shortcodes/pmpro_account.php:125
1120
+ #: shortcodes/pmpro_account.php:126 shortcodes/pmpro_account.php:128
1121
  msgid "Level"
1122
  msgstr ""
1123
 
1124
+ #: adminpages/dashboard.php:285 adminpages/orders.php:627
1125
+ #: adminpages/orders.php:1312 adminpages/templates/orders-email.php:64
1126
  #: adminpages/templates/orders-print.php:93 includes/privacy.php:285
1127
  #: pages/confirmation.php:96 pages/invoice.php:79 adminpages/dashboard.php:285
1128
  #: adminpages/dashboard.php:293 adminpages/orders.php:320
1137
  #: adminpages/orders.php:1236 adminpages/orders.php:1357
1138
  #: adminpages/templates/orders-email.php:64
1139
  #: adminpages/templates/orders-print.php:93 includes/privacy.php:285
1140
+ #: pages/confirmation.php:96 pages/invoice.php:78 pages/invoice.php:79
1141
+ #: pages/invoice.php:82 pages/invoice.php:84
1142
  msgid "Total"
1143
  msgstr ""
1144
 
1145
+ #: adminpages/dashboard.php:286 adminpages/orders.php:712
1146
+ #: adminpages/orders.php:1316 includes/privacy.php:202 includes/privacy.php:309
1147
  #: pages/invoice.php:29 shortcodes/pmpro_account.php:130
1148
  #: adminpages/dashboard.php:286 adminpages/dashboard.php:294
1149
  #: adminpages/orders.php:373 adminpages/orders.php:423
1156
  #: adminpages/orders.php:1112 adminpages/orders.php:1143
1157
  #: adminpages/orders.php:1149 adminpages/orders.php:1240
1158
  #: adminpages/orders.php:1361 includes/privacy.php:202 includes/privacy.php:309
1159
+ #: pages/invoice.php:29 shortcodes/pmpro_account.php:130
1160
  msgid "Status"
1161
  msgstr ""
1162
 
1163
+ #: adminpages/dashboard.php:287 adminpages/orders.php:815
1164
+ #: adminpages/orders.php:1317 pages/invoice.php:101
1165
  #: shortcodes/pmpro_account.php:127 adminpages/dashboard.php:287
1166
  #: adminpages/dashboard.php:295 adminpages/orders.php:442
1167
  #: adminpages/orders.php:492 adminpages/orders.php:493
1174
  #: adminpages/orders.php:1113 adminpages/orders.php:1144
1175
  #: adminpages/orders.php:1150 adminpages/orders.php:1241
1176
  #: adminpages/orders.php:1362 pages/account.php:91 pages/invoice.php:87
1177
+ #: pages/invoice.php:100 pages/invoice.php:101 pages/invoice.php:105
1178
+ #: pages/invoice.php:107 shortcodes/pmpro_account.php:122
1179
+ #: shortcodes/pmpro_account.php:124 shortcodes/pmpro_account.php:125
1180
+ #: shortcodes/pmpro_account.php:127
1181
  msgid "Date"
1182
  msgstr ""
1183
 
1184
+ #: adminpages/dashboard.php:294 adminpages/orders.php:1462
1185
  #: adminpages/dashboard.php:294 adminpages/dashboard.php:302
1186
  #: adminpages/orders.php:674 adminpages/orders.php:977
1187
  #: adminpages/orders.php:995 adminpages/orders.php:1005
1192
  msgid "No orders found."
1193
  msgstr ""
1194
 
1195
+ #: adminpages/dashboard.php:311 adminpages/orders.php:1345
1196
  #: adminpages/dashboard.php:311 adminpages/dashboard.php:319
1197
  #: adminpages/orders.php:630 adminpages/orders.php:933
1198
  #: adminpages/orders.php:943 adminpages/orders.php:972
1202
  msgid "deleted"
1203
  msgstr ""
1204
 
1205
+ #: adminpages/dashboard.php:313 adminpages/orders.php:1347
1206
  #: adminpages/dashboard.php:313 adminpages/dashboard.php:321
1207
  #: adminpages/orders.php:1275 adminpages/orders.php:1397
1208
  msgid "none"
1329
  msgstr ""
1330
 
1331
  #: adminpages/discountcodes.php:442 adminpages/discountcodes.php:746
1332
+ #: adminpages/membershiplevels.php:346 adminpages/membershiplevels.php:741
1333
+ #: adminpages/memberslist.php:164 adminpages/orders.php:1307
1334
  #: adminpages/reports/login.php:178 adminpages/templates/orders-email.php:46
1335
  #: adminpages/templates/orders-print.php:75 adminpages/discountcodes.php:306
1336
  #: adminpages/discountcodes.php:309 adminpages/discountcodes.php:310
1344
  #: adminpages/membershiplevels.php:284 adminpages/membershiplevels.php:286
1345
  #: adminpages/membershiplevels.php:288 adminpages/membershiplevels.php:312
1346
  #: adminpages/membershiplevels.php:322 adminpages/membershiplevels.php:344
1347
+ #: adminpages/membershiplevels.php:346 adminpages/membershiplevels.php:505
1348
+ #: adminpages/membershiplevels.php:511 adminpages/membershiplevels.php:513
1349
+ #: adminpages/membershiplevels.php:540 adminpages/membershiplevels.php:541
1350
+ #: adminpages/membershiplevels.php:583 adminpages/membershiplevels.php:629
1351
+ #: adminpages/membershiplevels.php:631 adminpages/membershiplevels.php:636
1352
+ #: adminpages/membershiplevels.php:637 adminpages/membershiplevels.php:641
1353
+ #: adminpages/membershiplevels.php:653 adminpages/membershiplevels.php:663
1354
+ #: adminpages/membershiplevels.php:713 adminpages/membershiplevels.php:715
1355
  #: adminpages/memberslist.php:111 adminpages/memberslist.php:144
1356
  #: adminpages/memberslist.php:154 adminpages/memberslist.php:164
1357
  #: adminpages/orders.php:597 adminpages/orders.php:900
1366
  msgid "ID"
1367
  msgstr ""
1368
 
1369
+ #: adminpages/discountcodes.php:443 adminpages/orders.php:402
1370
  #: adminpages/discountcodes.php:307 adminpages/discountcodes.php:310
1371
  #: adminpages/discountcodes.php:311 adminpages/discountcodes.php:312
1372
  #: adminpages/discountcodes.php:317 adminpages/discountcodes.php:382
1389
  msgstr ""
1390
 
1391
  #: adminpages/discountcodes.php:503
1392
+ #: classes/gateways/class.pmprogateway_braintree.php:479
1393
+ #: classes/gateways/class.pmprogateway_stripe.php:565 pages/billing.php:321
1394
+ #: pages/checkout.php:389 adminpages/discountcodes.php:367
1395
  #: adminpages/discountcodes.php:370 adminpages/discountcodes.php:371
1396
  #: adminpages/discountcodes.php:372 adminpages/discountcodes.php:377
1397
  #: adminpages/discountcodes.php:442 adminpages/discountcodes.php:483
1419
  #: classes/gateways/class.pmprogateway_stripe.php:532
1420
  #: classes/gateways/class.pmprogateway_stripe.php:570
1421
  #: classes/gateways/class.pmprogateway_stripe.php:597
1422
+ #: classes/gateways/class.pmprogateway_stripe.php:598
1423
  #: classes/gateways/class.pmprogateway_stripe.php:613
1424
  #: classes/gateways/class.pmprogateway_stripe.php:621
1425
  #: classes/gateways/class.pmprogateway_stripe.php:628
1472
  #: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:339
1473
  #: adminpages/membershiplevels.php:341 adminpages/membershiplevels.php:342
1474
  #: adminpages/membershiplevels.php:365 adminpages/membershiplevels.php:375
1475
+ #: adminpages/membershiplevels.php:398 adminpages/membershiplevels.php:400
1476
+ #: adminpages/membershiplevels.php:507 adminpages/membershiplevels.php:513
1477
+ #: adminpages/membershiplevels.php:515 adminpages/membershiplevels.php:542
1478
+ #: pages/levels.php:14
1479
  msgid "Initial Payment"
1480
  msgstr ""
1481
 
1488
  #: adminpages/membershiplevels.php:340 adminpages/membershiplevels.php:350
1489
  #: adminpages/membershiplevels.php:352 adminpages/membershiplevels.php:353
1490
  #: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:386
1491
+ #: adminpages/membershiplevels.php:409 adminpages/membershiplevels.php:411
1492
  msgid "The initial amount collected at registration."
1493
  msgstr ""
1494
 
1501
  #: adminpages/membershiplevels.php:344 adminpages/membershiplevels.php:354
1502
  #: adminpages/membershiplevels.php:356 adminpages/membershiplevels.php:357
1503
  #: adminpages/membershiplevels.php:380 adminpages/membershiplevels.php:390
1504
+ #: adminpages/membershiplevels.php:413 adminpages/membershiplevels.php:415
1505
  msgid "Recurring Subscription"
1506
  msgstr ""
1507
 
1514
  #: adminpages/membershiplevels.php:345 adminpages/membershiplevels.php:355
1515
  #: adminpages/membershiplevels.php:357 adminpages/membershiplevels.php:358
1516
  #: adminpages/membershiplevels.php:381 adminpages/membershiplevels.php:391
1517
+ #: adminpages/membershiplevels.php:414 adminpages/membershiplevels.php:416
1518
  msgid "Check if this level has a recurring subscription payment."
1519
  msgstr ""
1520
 
1527
  #: adminpages/membershiplevels.php:359 adminpages/membershiplevels.php:361
1528
  #: adminpages/membershiplevels.php:362 adminpages/membershiplevels.php:385
1529
  #: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:418
1530
+ #: adminpages/membershiplevels.php:420
1531
  msgid "Billing Amount"
1532
  msgstr ""
1533
 
1534
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1535
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1536
+ #: classes/gateways/class.pmprogateway_stripe.php:608
1537
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1538
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1539
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
1546
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1547
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1548
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1549
+ #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:449
1550
+ #: adminpages/membershiplevels.php:476 adminpages/membershiplevels.php:477
1551
+ #: adminpages/membershiplevels.php:479 adminpages/membershiplevels.php:480
1552
+ #: adminpages/membershiplevels.php:501 adminpages/membershiplevels.php:511
1553
+ #: adminpages/membershiplevels.php:535 adminpages/membershiplevels.php:537
1554
  #: classes/gateways/class.pmprogateway_stripe.php:521
1555
  #: classes/gateways/class.pmprogateway_stripe.php:522
1556
  #: classes/gateways/class.pmprogateway_stripe.php:532
1562
  #: classes/gateways/class.pmprogateway_stripe.php:588
1563
  #: classes/gateways/class.pmprogateway_stripe.php:599
1564
  #: classes/gateways/class.pmprogateway_stripe.php:637
1565
+ #: classes/gateways/class.pmprogateway_stripe.php:655
1566
  #: classes/gateways/class.pmprogateway_stripe.php:664
1567
  #: classes/gateways/class.pmprogateway_stripe.php:671
1568
  #: classes/gateways/class.pmprogateway_stripe.php:679
1574
 
1575
  #: adminpages/discountcodes.php:607 adminpages/discountcodes.php:661
1576
  #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:537
1577
+ #: classes/gateways/class.pmprogateway_stripe.php:610
1578
  #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466
1579
  #: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468
1580
  #: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492
1587
  #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
1588
  #: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400
1589
  #: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:433
1590
+ #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:449
1591
+ #: adminpages/membershiplevels.php:476 adminpages/membershiplevels.php:477
1592
+ #: adminpages/membershiplevels.php:479 adm