Heim > Backend-Entwicklung > PHP-Problem > PHP implementiert asynchrone Benachrichtigungen

PHP implementiert asynchrone Benachrichtigungen

WBOY
Freigeben: 2023-05-07 14:42:08
Original
945 Leute haben es durchsucht

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.

  1. Initiieren Sie eine Zahlungsanforderung:

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'] : '';
Nach dem Login kopieren
  1. Rufen Sie die Schnittstelle der Zahlungsplattform auf:

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);
}
Nach dem Login kopieren
  1. Legen Sie die Rückgabe-URL in der Schnittstelle fest:

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',
];
Nach dem Login kopieren

notify_url wird verwendet, um die Adresse zum Empfangen von Zahlungsergebnissen und die Adresse zum Senden asynchroner Benachrichtigungen durch die Zahlungsplattform zu übergeben.

  1. Rückruffunktion zum Empfangen einer asynchronen Benachrichtigung

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';
}
Nach dem Login kopieren
  1. Signatur überprüfen

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 dem Login kopieren
  1. Bestellstatus aktualisieren

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 dem Login kopieren
  1. Bestätigungsinformationen zurücksenden

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';
Nach dem Login kopieren

3. Vermeiden Sie die Schwachstellen asynchroner Benachrichtigungen

Um die Sicherheit zu gewährleisten, müssen wir die folgenden Schwachstellen vermeiden:

  1. Asynchrone Benachrichtigungen nur einmal verarbeiten, Andernfalls kommt es zu mehreren Anfragen und bringt unnötige Sicherheitsrisiken mit sich.
  2. Stellen Sie bei der Verarbeitung asynchroner Benachrichtigungen eine Signaturüberprüfung der Ergebnisse sicher, um eine Manipulation von Anfragen durch Dritte zu vermeiden.
  3. Stellen Sie sicher, dass die Funktionslogik der asynchronen Benachrichtigungsergebnisverarbeitung nicht ausfällt und zu Dateninkonsistenzen führt.
  4. Stellen Sie sicher, dass die asynchrone Benachrichtigungs-URL nicht manipuliert wird, wenn sie an Dritte weitergegeben wird, um zu verhindern, dass Angreifer die Adresse böswillig manipulieren und CSRF-Angriffe durchführen.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage