Heim >Backend-Entwicklung >PHP-Problem >PHP implementiert asynchrone Benachrichtigungen
Im Internetgeschäft sind Szenarien mit Geldtransaktionen wie Zahlung, Aufladung, Rückerstattung und Bargeldabhebung von entscheidender Bedeutung. Dies erfordert, dass das System in der Lage ist, asynchrone Benachrichtigungen durchzuführen, um beide Parteien über die Transaktionsergebnisse zu informieren. In diesen Szenarien wird PHP als sehr beliebte Back-End-Entwicklungssprache häufig verwendet. In diesem Artikel erklären wir, wie Sie PHP zur Implementierung asynchroner Benachrichtigungen verwenden.
1. Was ist eine asynchrone Benachrichtigung?
Nachdem der Benutzer eine Transaktion durchgeführt hat, erhält die zahlende oder empfangende Partei eine Benachrichtigung über eine erfolgreiche Transaktion, sodass beide Parteien die Transaktionsergebnisse rechtzeitig verstehen können. Wenn in diesem Szenario eine synchrone Benachrichtigung verwendet wird, kann die Transaktionszeit länger sein, die Benutzererfahrung ist möglicherweise schlecht, die Transaktion kann fehlschlagen und die Zuverlässigkeit der Transaktion kann beeinträchtigt sein. Daher verwenden wir asynchrone Benachrichtigungen, das heißt, wir verwenden Rückruffunktionen, um Transaktionsergebnisse zu benachrichtigen.
2. Schritte zur Implementierung einer asynchronen Benachrichtigung in PHP
Wir nehmen das Zahlungsszenario als Beispiel, um vorzustellen, wie PHP zur Implementierung einer asynchronen Benachrichtigung verwendet wird.
Wenn der Benutzer in der Anwendung eine Zahlungsanforderung initiiert, sendet das Backend die Zahlungsanforderung an die Zahlungsplattform, empfängt die Antwort von der Zahlungsplattform und erhält die Zahlungs-URL aus der Antwort .
PHP-Beispielcode:
$data = [ 'amount' => '10.00', 'body' => '测试订单', 'channel' => 'alipay_wap', 'currency' => 'cny', 'return_url' => 'http://example.com/return', 'notify_url' => 'http://example.com/notify', ]; $result = curl_post('https://api.payment.com/payments', $data); $payment_url = isset($result['payment_url']) ? $result['payment_url'] : '';
Senden Sie eine POST-Anfrage über cURL, rufen Sie die Schnittstelle der Zahlungsplattform auf, senden Sie eine Zahlungsanforderung an die Zahlungsplattform und erhalten Sie das Antwortergebnis von der Zahlungsplattform zurückgegeben.
PHP-Beispielcode:
function curl_post($url, $data = [], $header = []) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Accept: application/json', ) + $header); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); }
Legen Sie die Rückgabe-URL in der Schnittstelle fest, die verwendet wird, um die Anwendung über die Ergebnisse der Hintergrundzahlung zu informieren, wenn die Zahlung erfolgreich ist oder fehlgeschlagen ist Kann auch zum Überprüfen des Transaktionsstatus verwendet werden.
PHP-Beispielcode: Der Parameter
$data = [ 'amount' => '10.00', 'body' => '测试订单', 'channel' => 'alipay_wap', 'currency' => 'cny', 'return_url' => 'http://example.com/return', 'notify_url' => 'http://example.com/notify', ];
notify_url wird verwendet, um die Adresse zum Empfangen von Zahlungsergebnissen und die Adresse zum Senden asynchroner Benachrichtigungen durch die Zahlungsplattform zu übergeben.
Wenn die Zahlungsplattform die Zahlungsanforderung des Benutzers empfängt und die Transaktion abschließt, sendet sie eine asynchrone Benachrichtigung an die angegebene notify_url, um das Zahlungsergebnis zu benachrichtigen. Daher müssen wir die Signaturen überprüfen und die Geschäftslogik in der Rückruffunktion verarbeiten und am Ende Bestätigungsinformationen zurückgeben.
PHP-Beispielcode:
function notify() { $data = $_POST; $time_now = time(); // 验证签名 if (!openssl_verify(json_encode($data), base64_decode($data['signature']), $public_key)) { return 'false'; } // 更新订单状态 update_order($data['order_id']); return 'success'; }
Da die von der Zahlungsplattform gesendeten Ergebnisse ihre Zuverlässigkeit sicherstellen müssen, müssen wir die Signatur der von der Zahlungsplattform zurückgegebenen Daten überprüfen. Während des Signaturüberprüfungsprozesses müssen wir den von der Zahlungsplattform bereitgestellten öffentlichen Schlüssel verwenden, um die Signatur zu überprüfen und sicherzustellen, dass es sich um ein legitimes, von der Zahlungsplattform ausgegebenes Ergebnis handelt.
PHP-Beispielcode:
if (!openssl_verify(json_encode($data), base64_decode($data['signature']), $public_key)) { return 'false'; }
Nach erfolgreicher Zahlung müssen die Statusinformationen der Bestellung aktualisiert werden, damit die Anwendung den tatsächlichen Status der Bestellung verstehen kann. In diesem Schritt können wir die Geschäftslogik zum Aktualisieren aufrufen.
PHP-Beispielcode:
function update_order($order_id) { // 调用业务逻辑处理订单状态更新 }
Nach Abschluss der Verarbeitung müssen Bestätigungsinformationen an die Zahlungsplattform zurückgegeben werden, um zu zeigen, dass wir bestätigt haben, dass das Zahlungsergebnis verarbeitet wurde, sowie den Rückgabecode (z. B. 200) zeigt an, dass die Verarbeitung erfolgreich war.
PHP-Beispielcode:
return 'success';
3. Vermeiden Sie die Schwachstellen asynchroner Benachrichtigungen
Um die Sicherheit zu gewährleisten, müssen wir die folgenden Schwachstellen vermeiden:
4. Zusammenfassung
Dieser Artikel stellt den Prozess der Verwendung von PHP zur Implementierung asynchroner Benachrichtigungen vor und schlägt Sicherheitsvorkehrungen vor, die hoffentlich für alle hilfreich sind. Asynchrone Benachrichtigungen sind in Finanztransaktionsszenarien besonders wichtig, und besonderes Augenmerk muss auf Sicherheitsprobleme wie Signaturen, wiederholte Verarbeitung und Sicherheitsrisiken gelegt werden, die beim Entwurf sorgfältig berücksichtigt werden müssen, um Lücken und Fehler zu vermeiden.
Das obige ist der detaillierte Inhalt vonPHP implementiert asynchrone Benachrichtigungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!