Repository navigation
Technical Plugin PayPalYPT
Manages PayPal checkout, recurring plans and provider-verified reconciliation.
Audience: developers, advanced administrators and AI-assisted diagnosis. Plugin catalog.
- Review date: 2026-10-29. Method: static source analysis; runtime/provider behavior was not exercised.
- Code ownership: AVideo Streamer repository.
- Reported version:
3.0. - Source revision:
7d48f2dfc0289236718a3f9fba7c5ffecff4a37f. - Entry class file: PayPalYPT.php.
Confirm the installed plugin version independently of the Streamer version. Configuration defaults below are not a dump of this installation's saved settings.
Browser return, webhook/IPN and status polling converge on checkout reconciliation. Payment state is re-read from the provider. Agreement approval alone does not establish a completed payment. Wallet credit and plan/rental fulfillment are separate outcomes.
| Plugin | Required by declaration | Source reason |
|---|---|---|
| YPTWallet | Required | Credits confirmed PayPal payments to the user wallet balance |
Literal runtime plugin references: FansSubscriptions, PayPerView, PayPerViewLive, Subscription, YPTWallet. These calls do not mean every referenced plugin is mandatory.
| Override | Implementation |
|---|---|
getTags() |
PayPalYPT.php:47 |
updateScript() |
PayPalYPT.php:94 |
getMyAccount($users_id) |
PayPalYPT.php:860 |
getWalletConfigurationHTML($users_id, $wallet, $walletDataObject) |
PayPalYPT.php:1014 |
getPluginMenu() |
PayPalYPT.php:1031 |
These are direct assignments inside getEmptyDataObject(), not evaluated effective defaults. Stored plugins.object_data, globals, structured values and conditional branches may alter runtime behavior. Private/default credential values are omitted.
| Field | Literal default or expression type | Literal source label/help | Evidence |
|---|---|---|---|
ClientID |
Private setting; value omitted | REST app Client ID: From your own app in developer.paypal.com (Sandbox or Live, matching disableSandbox). The default value is a shared public sandbox app: replace it. | source |
ClientSecret |
Private setting; value omitted | REST app secret: Secret of the same PayPal app. Never post it in issues. | source |
subscriptionButtonLabel |
"Subscribe With PayPal" |
— | source |
paymentButtonLabel |
"Pay With PayPal" |
— | source |
disableSandbox |
false |
Live payments: Unchecked: PayPal Sandbox (test money). Checked: Live (real payments). Use credentials from the same environment. | source |
webhookId |
"" |
Webhook ID: Filled by Check configuration. Used to verify the signature of webhook deliveries; copy it from your PayPal app if you created the webhook manually. | source |
This inventory distinguishes implementation files from an API specification. Includes, templates, callbacks and CLI workers are not interchangeable HTTP endpoints. Request-field names below are direct source references, not a complete schema or permission declaration.
| File | Source role | Direct request fields observed |
|---|---|---|
| Objects/PayPalConfiguration.php | class/helper implementation | — |
| Objects/PayPalPaymentProcessor.php | class/helper implementation | — |
| Objects/PayPalYPT_checkout.php | class/helper implementation | — |
| Objects/PayPalYPT_log.php | class/helper implementation | — |
| PayPalAgreementCancel.json.php | JSON entry point; inspect caller and guard | agreement_id |
| PayPalAgreementStatus.json.php | JSON entry point; inspect caller and guard | agreement_id |
| PayPalClient.php | class/helper implementation | — |
| PayPalYPT.php | plugin entry class |
PayerID, paymentId, plans_id, token
|
| View/PayPalYPT_log/add.json.php | JSON entry point; inspect caller and guard |
agreement_id, id, json, recurring_payment_id, token, users_id, value
|
| View/PayPalYPT_log/delete.json.php | JSON entry point; inspect caller and guard | id |
| View/PayPalYPT_log/index.php | PHP page/include/worker; inspect caller | — |
| View/PayPalYPT_log/index_body.php | PHP page/include/worker; inspect caller | — |
| View/PayPalYPT_log/index_head.php | PHP page/include/worker; inspect caller | — |
| View/PayPalYPT_log/list.json.php | JSON entry point; inspect caller and guard | draw |
| View/editor.php | PHP page/include/worker; inspect caller | — |
| agreementCancel.json.php | JSON entry point; inspect caller and guard | agreement |
| bootstrap.php | PHP page/include/worker; inspect caller | — |
| checkout.php | PHP page/include/worker; inspect caller | invoice |
| checkoutStatus.json.php | JSON entry point; inspect caller and guard | invoice |
| configuration.json.php | JSON entry point; inspect caller and guard | action |
| configuration.php | PHP page/include/worker; inspect caller | — |
| getWalletConfigurationHTML.php | PHP page/include/worker; inspect caller | — |
| install/install.sql | schema/migration SQL | — |
| install/updateV3.0.sql | schema/migration SQL | — |
| ipn.php | PHP page/include/worker; inspect caller |
amount, currency_code, initial_payment_amount, initial_payment_status, initial_payment_txn_id, invoice, ipn_track_id, mc_currency, mc_gross, payment_status, recurring_payment_id, txn_id, txn_type, verify_sign
|
| ipnV2.php | PHP page/include/worker; inspect caller |
amount, currency_code, json, mc_currency, mc_gross, payment_status, success, token, txn_id, txn_type, verify_sign
|
| payOutReceiverEmailForm.php | PHP page/include/worker; inspect caller | — |
| payout.php | PHP page/include/worker; inspect caller | payout_batch |
| resend.php | PHP page/include/worker; inspect caller | event_id |
| savePayPalReceiverEmail.json.php | JSON entry point; inspect caller and guard | PayPalReceiverEmail |
| subscriptions_list.php | PHP page/include/worker; inspect caller | — |
| test.php | PHP page/include/worker; inspect caller | — |
| webhook.php | PHP page/include/worker; inspect caller | — |
Tables named in available CREATE TABLE statements: PayPalYPT_checkout, PayPalYPT_log.
Apply installation/update behavior through the owning plugin; this reference is not a script for running historical migrations manually.
Visibility and implementation semantics must be checked in source. Nonempty string defaults are represented as . This is a symbol reference, not a stable public API promise.
| Function or method | Source |
|---|---|
getPluginDependencies() |
41 |
getTags() |
47 |
getDescription() |
55 |
getName() |
63 |
getUUID() |
68 |
getPluginVersion() |
73 |
getEmptyDataObject() |
78 |
updateScript() |
94 |
getEnvironment($settings = null) |
100 |
getApiBaseURL($settings = null) |
106 |
getClientHash($settings = null) |
112 |
isSharedDemoApp($settings = null) |
118 |
getSdkConfig($settings = null) |
124 |
getApiContext($requestId = null, $settings = null) |
139 |
restCall($method, $path, $payload = '', $apiContext = null) |
151 |
describeApiError($exception) |
161 |
setUpPayment($invoiceNumber, $redirect_url, $cancel_url, $total = '<string>', $currency = '<string>', $description = "") |
175 |
getPlanDetails($plan_id) |
220 |
executePayment() |
233 |
createBillingPlan($redirect_url, $cancel_url, $total = '<string>', $currency = '<string>', $frequency = '<string>', $interval = 1, $name = '<string>', $plans_id = 0) |
283 |
getPlanId() |
379 |
setUpSubscription($invoiceNumber, $redirect_url, $cancel_url, $total = '<string>', $currency = '<string>', $frequency = '<string>', $interval = 1, $name = '<string>') |
398 |
setUpSubscriptionV2($total = '<string>', $currency = '<string>', $frequency = '<string>', $interval = 1, $name = ''<string>'', $trialDays = 0) |
465 |
createBillingPlanV2($total = '<string>', $currency = '<string>', $frequency = '<string>', $interval = 1, $name = ''<string>'', $trialDays = 0) |
517 |
executeBillingAgreement() |
616 |
getBillingAgreement($agreement_id) |
637 |
cancelAgreement($agreement_id) |
644 |
execute() |
664 |
getAmountFromPayment($payment) |
677 |
sendToPayPal($invoiceNumber, $redirect_url, $cancel_url, $total, $currency) |
705 |
updateBillingPlan($plan_id, $total = '<string>', $currency = '<string>', $interval = 1, $name = '<string>') |
717 |
getRawIPN() |
761 |
getIPNVerificationURL($settings = null) |
773 |
IPNcheck() |
779 |
setUserReceiverEmail($users_id, $email) |
846 |
getUserReceiverEmail($users_id) |
853 |
getMyAccount($users_id) |
860 |
WalletPayout($users_id_to_be_paid, $value) |
872 |
Payout($receiver_email, $value, $currency = '<string>', $note = ''<string>'') |
926 |
getPayoutInfo($payout_batch_id) |
993 |
getWalletConfigurationHTML($users_id, $wallet, $walletDataObject) |
1014 |
getPluginMenu() |
1031 |
isTokenUsed($token) |
1038 |
isRecurringPaymentIdUsed($recurring_payment_id) |
1044 |
getAllLogsFromUser($users_id) |
1050 |
getOrCreateWebhook() |
1060 |
getWebhook($apiContext = null) |
1072 |
createWebhook() |
1086 |
deleteAllWebhooks() |
1093 |
getWebhookIdForValidation() |
1100 |
getSignatureHeaders() |
1111 |
validateWebhook() |
1128 |
getWebhookURL() |
1172 |
resendWebhook($event_id) |
1180 |
recordDelivery($channel, $eventType) |
1197 |
getRecordedDelivery($channel, $settings = null) |
1218 |
deliveryCacheName($settings, $channel) |
1231 |
getIPNURL() |
1238 |
createCheckoutPayment(array $checkout, $returnUrl, $cancelUrl) |
1249 |
isPayPalApprovalURL($url) |
1286 |
cleanReceiptText($text, $length) |
1292 |
normalizePayment(array $data) |
1299 |
assertPaymentMatchesCheckout(array $payment, array $checkout) |
1326 |
assertSameApp(array $checkout) |
1336 |
errorName($exception) |
1343 |
reconcileCheckout(array $checkout, $source) |
1356 |
getApprovalToken($approvalURL) |
1445 |
getAgreementPayments($agreementId, $since) |
1452 |
reconcileSubscriptionCheckout(array $checkout, $source) |
1470 |
startOneTimeCheckout($usersId, array $request) |
1559 |
startSubscriptionCheckout($usersId, $plansId) |
1680 |
getCheckoutReturnBase() |
1740 |
getCheckoutPageURL($invoice) |
1746 |
getPublicCheckoutStatus(array $checkout) |
1753 |
These symbols are grouped by source file; inspect the class declaration and visibility before calling them.
Declared classes: PayPalConfiguration, PayPalConfigurationHttpException.
| Named symbol | Source |
|---|---|
__construct($settings, $webhookURL, ?callable $http = null) |
27 |
curl($method, $url, array $headers, $body) |
34 |
environment() |
61 |
apiBase() |
66 |
finding(&$report, $id, $label, $status, $message) |
71 |
credentialsPresent() |
79 |
isSharedDemoApp() |
84 |
describeStatus($status) |
90 |
authenticate(&$report) |
108 |
api($method, $path, $body = null) |
141 |
hasScope($pattern) |
152 |
checkScopes(&$report, $features) |
163 |
probe(&$report, $label, $path) |
192 |
listWebhooks() |
209 |
matching(array $webhooks) |
218 |
eventNames($webhook) |
225 |
missingEvents($webhook) |
232 |
isPublicHttpsURL() |
238 |
inspectWebhook(&$report) |
250 |
check($features = []) |
285 |
configure(callable $save) |
364 |
saveWebhookId(callable $save, $id, $message) |
429 |
__construct($status) |
449 |
Declared classes: PayPalPaymentProcessor, PayPalPaymentMismatchException.
| Named symbol | Source |
|---|---|
withoutBrowserOrigin(callable $work) |
16 |
cents($value) |
33 |
fulfillCheckoutSale($wallet, array $checkout, array $sale, $source) |
43 |
processSubscriptionSale($wallet, $users_id, $plans_id, $agreementId, array $paymentIds, $amount, $description, $json, array $logFields = [], ?callable $legacyCheck = null) |
103 |
findAgreementOwner($agreementId) |
152 |
logContext($checkout, $sale, $source) |
167 |
Declared classes: PayPalYPT_checkout, PayPalCheckoutBusyException, PayPalCheckoutRefused.
| Named symbol | Source |
|---|---|
isInstalled() |
29 |
newInvoiceNumber() |
34 |
isValidInvoiceNumber($invoice) |
39 |
isValidProviderId($id) |
45 |
selectionHash($users_id, $purpose, $selection, $amount, $currency, $environment, $clientHash) |
50 |
formatAmount($amount) |
56 |
create($users_id, $purpose, array $selection, $amount, $currency, $environment, $clientHash, $selectionHash = null) |
61 |
update($id, array $fields) |
83 |
getOne($where, $formats, $values) |
114 |
decode($row) |
125 |
getById($id) |
131 |
getByInvoice($invoice) |
136 |
getByPaymentId($paymentId) |
141 |
getByAgreementId($agreementId) |
146 |
getReusable($users_id, $selectionHash) |
153 |
getUnfinishedPaid($users_id, $selectionHash) |
160 |
lockName($row) |
166 |
withLock($name, callable $work, $timeout = 10) |
173 |
Declared classes: PayPalYPT_log.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
15 |
getTableName() |
20 |
getAllUsers() |
25 |
setId($id) |
46 |
setAgreement_id($agreement_id) |
51 |
setUsers_id($users_id) |
56 |
setJson($json) |
61 |
setRecurring_payment_id($recurring_payment_id) |
69 |
setValue($value) |
74 |
setToken($token) |
79 |
getId() |
84 |
getAgreement_id() |
89 |
getUsers_id() |
94 |
getJson() |
99 |
getRecurring_payment_id() |
104 |
getValue() |
109 |
getToken() |
114 |
getFromToken($token) |
119 |
getFromRecurringPaymentId($recurring_payment_id) |
135 |
getAllFromUser($users_id) |
151 |
save() |
174 |
Declared classes: PayPalClient.
| Named symbol | Source |
|---|---|
client() |
16 |
environment() |
26 |
- Check the installed/enabled version and the dependencies/settings above.
- Identify the actual failing page, request, callback or worker and correlate its timestamp with the AVideo log.
- Follow the linked method and caller. Check business-state changes and output artifacts as well as HTTP status.
- Reproduce the relevant workflow in a test environment. External provider, Encoder, live-server, storage, payment and authenticated flows require their real integrations.
Shared diagnostic workflow. This page is not a security audit or a claim of end-to-end validation.
Start
Install and update
- Install on Ubuntu 24.04 or 26.04
- Installation Setup Page
- Scheduler cron job (required)
- Set up email
- Use HTTPS
- Own Encoder
- Docker
- Update AVideo
- Backup
- Secure file permissions
- Server command-line tools
- Hidden configuration options
Videos
- Upload a video
- Local Encoder (on your computer)
- Bulk upload by FTP
- Import a channel
- Publish on YouTube and social media
- Privacy options
- Only for logged-in users
- Resolutions by user group
- Storage options
- Move and protect video files
- Video does not play
Users
Live
- Make a live stream
- Stream with OBS
- Own live server
- One live server, many sites
- Live server install errors
- Live does not play
Plugins
Problems
Other
- Translate your site
- Write a plugin (developers)
- Technical reference (developers and advanced administrators)
Old and retired guides