In diesem Artikel werden hauptsächlich die Ideen und Methoden von Paypal zur Implementierung wiederkehrender Abzüge (Abonnements) vorgestellt. Außerdem wird die Verwendung der Zahlungsschnittstelle von Paypal zusammengefasst, die einen guten Referenzwert hat.
Ursache
Das Unternehmen muss Paypal integrieren, um die wiederkehrende Abzugsfunktion zu realisieren. Baidu und GOOGLE haben sich jedoch umgesehen und außer der offiziellen Website keine relevanten Entwicklungs-Tutorials gefunden. Also musste ich mir Paypal ansehen, die erfolgreiche Integration dauerte zwei Tage. Hier ist eine Zusammenfassung, wie man die Zahlungsschnittstelle von Paypal nutzt.
Paypal hat jetzt mehrere Sockets:
Express Checkout wird über Braintree implementiert (wir werden später über Braintree sprechen); >
Braintree ist ein von Paypal übernommenes Unternehmen. Neben der Unterstützung von Paypal-Zahlungen bietet es auch Upgrade-Pläne, Kreditkarten und Kundeninformationen. usw. Eine vollständige Verwaltungsreihe, die bequemer zu verwenden ist. Der zweite Satz der REST-Schnittstelle von Paypal integriert tatsächlich die meisten dieser Funktionen, aber das Dashboard von Paypal kann diese Informationen nicht direkt verwalten, Braintree jedoch schon, daher bevorzuge ich die Verwendung von Braintree. Der Schlüssel liegt darin, dass das Backend-Framework, das ich verwende, Laravel ist und dessen Kassenlösung standardmäßig Braintee unterstützt, daher ist dieser Satz von Schnittstellen meine erste Wahl. Doch als ich alle Funktionen implementiert hatte, stieß ich auf ein schmerzhaftes Problem: Braintree wird in China nicht unterstützt. . . . . . Tod. . .
REST APIDies ist ein Produkt, das sich an die Entwicklung der Zeit anpasst. Wenn Sie bereits OAuth 2.0 und REST API verwendet haben, sollte es keine Verwirrung geben Blick auf diese Schnittstellen.
Alte SchnittstelleSolange die REST-API-Schnittstelle die Anforderungen, wie z. B. Richtlinieneinschränkungen, nicht erfüllen kann, wird ihre Verwendung nicht empfohlen. Die ganze Welt migriert auf die Authentifizierungsmethode OAuth 2.0 und die API-Nutzungsmethode der REST-API. Warum also gegen den Trend vorgehen? Wenn die REST-API das Problem lösen kann, habe ich daher keinen detaillierten Vergleich dieser Schnittstellen durchgeführt.
Einführung in die REST-APIOffizielles API-Referenzdokument https://developer.paypal.com/webapps/developer/docs/api/ für seine API und Verwendung Die Methode wird detaillierter vorgestellt, aber es ist immer noch sehr umständlich, diese APIs direkt anzupassen. Gleichzeitig möchten wir nur die Geschäftsanforderungen so schnell wie möglich erfüllen, anstatt uns eingehend mit der API zu befassen.
Wie fängt man also an? Es wird empfohlen, das offiziell bereitgestellte PayPal-PHP-SDK direkt zu installieren und dessen Wiki als Ausgangspunkt zu verwenden.
Bevor Sie das erste Beispiel ausfüllen, stellen Sie bitte sicher, dass Sie über ein Sandbox-Konto verfügen und dieses richtig konfigurieren:
Zahlungen Einmalige Zahlungsschnittstelle, unterstützt keine wiederkehrenden Spenden. Zu den wichtigsten Zahlungsinhalten gehören die Unterstützung von Paypal-Zahlungen, Kreditkartenzahlungen und die Unterstützung durch gespeicherte Kreditkarten (erfordert die Verwendung der Vault-Schnittstelle, eine solche Schnittstelle ist hauptsächlich auf PCI-Anforderungen zurückzuführen, allgemeine Websites dürfen keine vertraulichen Kreditkarteninformationen sammeln), und unterstützt die Zahlung an Dritte.
Auszahlungen Nicht verwendet, ignorieren;
Autorisierung und Capture unterstützt die direkte Anmeldung auf Ihrer Website über Ihr Paypal-Konto und erhält relevante Informationen
Sale Follow Relevant zum Einkaufszentrum, nicht genutzt, ignorieren;
Bestellen Relevant für das Einkaufszentrum, nicht genutzt, ignoriert;
Abrechnungsplan und -vereinbarungen Upgrade-Pläne und Verträge, also Abonnementfunktionen, müssen Sie die Funktionen hier nutzen, um wiederkehrende Abzüge zu erzielen, was hier im Mittelpunkt steht Artikel;
TresorKreditkarteninformationen speichern
Zahlung Erfahrung Nicht verwendet, ignorieren; Wichtig, aber nicht der Schwerpunkt dieses Artikels
Rechnung Rechnungsverarbeitung; Identität
So implementieren Sie wiederkehrende Abzüge
Erstellen Sie einen Upgrade-Plan und aktivieren;
Erstellen Sie ein Abonnement (Vereinbarung erstellen) und gehen Sie dann zur Paypal-Website, um auf die Zustimmung des Benutzers zu warten.
Nachdem der Benutzer zugestimmt hat, führen Sie das Abonnement aus
Lastschriftabrechnung erhalten
1. Erstellen Sie einen Upgrade-Plan
Upgrade-Plan Entspricht der Plan-Klasse. In diesem Schritt sind mehrere Punkte zu beachten:
Nachdem der Upgrade-Plan erstellt wurde, befindet er sich im Status ERSTELLT und muss in AKTIV geändert werden, bevor er normal verwendet werden kann.
Der Plan verfügt über zwei Objekte, PaymentDefinition und MerchantPreferences, die beide nicht leer sein dürfen.
Wenn Sie einen Plan vom Typ TRIAL erstellen möchten, Der Plan muss auch eine passende REGULAR-Zahlungsdefinition haben, andernfalls wird ein Fehler gemeldet.
Wenn man sich den Code ansieht, wird eine setSetupFee-Methode (sehr, sehr, sehr wichtig) aufgerufen, die legt die Gebühr für die erste Abbuchung danach fest, während die wiederkehrende Abzugsmethode des Vertragsobjekts die Gebühr zu Beginn der zweiten Abbuchung festlegt.
Nehmen Sie als Beispiel die Erstellung eines Standardplans. Seine Parameter lauten wie folgt:
$param = [ "name" => "standard_monthly", "display_name" => "Standard Plan", "desc" => "standard Plan for one month", "type" => "REGULAR", "frequency" => "MONTH", "frequency_interval" => 1, "cycles" => 0, "amount" => 20, "currency" => "USD" ];
Der zu erstellende Code und aktivieren Sie den Plan wie folgt:
//上面的$param例子是个数组,我的实际应用传入的实际是个对象,用户理解下就好。 public function createPlan($param) { $apiContext = $this->getApiContext(); $plan = new Plan(); // # Basic Information // Fill up the basic information that is required for the plan $plan->setName($param->name) ->setDescription($param->desc) ->setType('INFINITE');//例子总是设置为无限循环 // # Payment definitions for this billing plan. $paymentDefinition = new PaymentDefinition(); // The possible values for such setters are mentioned in the setter method documentation. // Just open the class file. e.g. lib/PayPal/Api/PaymentDefinition.php and look for setFrequency method. // You should be able to see the acceptable values in the comments. $paymentDefinition->setName($param->name) ->setType($param->type) ->setFrequency($param->frequency) ->setFrequencyInterval((string)$param->frequency_interval) ->setCycles((string)$param->cycles) ->setAmount(new Currency(array('value' => $param->amount, 'currency' => $param->currency))); // Charge Models $chargeModel = new ChargeModel(); $chargeModel->setType('TAX') ->setAmount(new Currency(array('value' => 0, 'currency' => $param->currency))); $returnUrl = config('payment.returnurl'); $merchantPreferences = new MerchantPreferences(); $merchantPreferences->setReturnUrl("$returnUrl?success=true") ->setCancelUrl("$returnUrl?success=false") ->setAutoBillAmount("yes") ->setInitialFailAmountAction("CONTINUE") ->setMaxFailAttempts("0") ->setSetupFee(new Currency(array('value' => $param->amount, 'currency' => 'USD'))); $plan->setPaymentDefinitions(array($paymentDefinition)); $plan->setMerchantPreferences($merchantPreferences); // For Sample Purposes Only. $request = clone $plan; // ### Create Plan try { $output = $plan->create($apiContext); } catch (Exception $ex) { return false; } $patch = new Patch(); $value = new PayPalModel('{"state":"ACTIVE"}'); $patch->setOp('replace') ->setPath('/') ->setValue($value); $patchRequest = new PatchRequest(); $patchRequest->addPatch($patch); $output->update($patchRequest, $apiContext); return $output; }
2. Erstellen Sie ein Abonnement (Erstellen Sie eine Vereinbarung) und gehen Sie dann zur Paypal-Website Warten Sie auf die Zustimmung des Benutzers
Wie können Sie Benutzer nach der Erstellung des Plans abonnieren? In Bezug auf die Vereinbarung sind folgende Punkte zu beachten:
Wie bereits erwähnt, legt die Methode setSetupFee des Objekts Plan die Gebühr für den ersten Abzug nach Abschluss des Abonnements fest, während die Methode des zyklischen Abzugs des Objekts Agreement die Gebühr für den zweiten festlegt Start.
Die setStartDate-Methode legt die Zeit für den zweiten Abzug fest. Wenn Sie also monatlich wechseln, sollte es sich um die aktuelle Zeit plus einen Monat handeln. Gleichzeitig erfordert diese Methode Dass das Zeitformat das ISO8601-Format ist, kann mit der Carbon-Bibliothek leicht gelöst werden.
Bei der Erstellung der Vereinbarung war die eindeutige ID noch nicht generiert, daher stieß ich auf eine kleine Schwierigkeit: Wenn also der Benutzer das Abonnement abschließt, woher weiß ich, zu welchem Benutzer dieses Abonnement gehört? Das Token in der URL, das über die getApprovalLink-Methode von Agreement erhalten wird, ist eindeutig. Ich extrahiere das Token als Identifikationsmethode und ersetze es durch die echte ID, nachdem der Benutzer das Abonnement abgeschlossen hat.
Die Beispielparameter lauten wie folgt:
$param = [ 'id' => 'P-26T36113JT475352643KGIHY',//上一步创建Plan时生成的ID 'name' => 'Standard', 'desc' => 'Standard Plan for one month' ];
Der Code lautet wie folgt:
public function createPayment($param) { $apiContext = $this->getApiContext(); $agreement = new Agreement(); $agreement->setName($param['name']) ->setDescription($param['desc']) ->setStartDate(Carbon::now()->addMonths(1)->toIso8601String()); // Add Plan ID // Please note that the plan Id should be only set in this case. $plan = new Plan(); $plan->setId($param['id']); $agreement->setPlan($plan); // Add Payer $payer = new Payer(); $payer->setPaymentMethod('paypal'); $agreement->setPayer($payer); // For Sample Purposes Only. $request = clone $agreement; // ### Create Agreement try { // Please note that as the agreement has not yet activated, we wont be receiving the ID just yet. $agreement = $agreement->create($apiContext); // ### Get redirect url // The API response provides the url that you must redirect // the buyer to. Retrieve the url from the $agreement->getApprovalLink() // method $approvalUrl = $agreement->getApprovalLink(); } catch (Exception $ex) { return "create payment failed, please retry or contact the merchant."; } return $approvalUrl;//跳转到$approvalUrl,等待用户同意 }
Nachdem die Funktion ausgeführt wurde, wird $approvalUrl zurückgegeben. Denken Sie daran, über Redirect($approvalUrl) zur Paypal-Website zu springen und auf die Zahlung des Benutzers zu warten.
Nachdem der Benutzer zustimmt, führen Sie das Abonnement aus
Nachdem der Benutzer zustimmt, wurde das Abonnement nicht abgeschlossen und die Ausführungsmethode der Vereinbarung wird verwendet muss ausgeführt werden, um das Abonnement wirklich abzuschließen. Bei diesem Schritt ist Folgendes zu beachten:
Nach Abschluss des Abonnements bedeutet dies nicht, dass die Zahlung abgebucht wird, sondern kann sich um einige Minuten verzögern <🎜; >
public function onPay($request) { $apiContext = $this->getApiContext(); if ($request->has('success') && $request->success == 'true') { $token = $request->token; $agreement = new \PayPal\Api\Agreement(); try { $agreement->execute($token, $apiContext); } catch(\Exception $e) { return ull; return $agreement; } return null; }
Transaktionsdatensätze abrufen
Nach dem Abonnieren wird der Der Transaktionsdatensatz für den Transaktionsabzug wird möglicherweise nicht sofort generiert. Wenn er leer ist, wird er nach einigen Minuten wiederholt. Hinweise zu diesem Schritt:/** 获取交易记录 * @param $id subscription payment_id * @warning 总是获取该subscription的所有记录 */ public function transactions($id) { $apiContext = $this->getApiContext(); $params = ['start_date' => date('Y-m-d', strtotime('-15 years')), 'end_date' => date('Y-m-d', strtotime('+5 days'))]; try { $result = Agreement::searchTransactions($id, $params, $apiContext); } catch(\Exception $e) { Log::error("get transactions failed" . $e->getMessage()); return null; } return $result->getAgreementTransactionList() ; }
Probleme, die berücksichtigt werden müssen
Die Funktion wurde implementiert, es gibt jedoch auch viele Einschränkungen:Verwandte Empfehlungen:
PaypalBeispielcode-Sharing zur Implementierung der wiederkehrenden Abzugsfunktion (Abonnement)
Zen Cart implementiert das Hinzufügen von Paypal-Reservierungen zu Bestellungen. Telefonmethode
Paypal Das einfachste PHP-Online-Zahlungs-SDK
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Funktion für wiederkehrende Abzüge (Abonnement) in Paypal. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!