ホームページ >バックエンド開発 >PHPの問題 >PHP は非同期通知を実装します

PHP は非同期通知を実装します

WBOY
WBOYオリジナル
2023-05-07 14:42:08909ブラウズ

インターネットビジネスでは、支払い、チャージ、返金、現金引き出しなどの資金取引を伴うシナリオが不可欠です。これには、システムが非同期通知を実行して双方にトランザクション結果を通知できる必要があります。このようなシナリオでは、非常に人気のあるバックエンド開発言語として PHP が広く使用されています。この記事では、PHP を使用して非同期通知を実装する方法について説明します。

1. 非同期通知とは何ですか?

ユーザーが取引を実行すると、支払い側または受け取り側は取引成功の通知を受け取り、双方が取引結果をタイムリーに理解できるようになります。このシナリオで同期通知が使用されると、トランザクション時間が長くなり、ユーザー エクスペリエンスが低下し、トランザクションが失敗する可能性があり、トランザクションの信頼性に影響する可能性があります。したがって、非同期通知、つまりコールバック関数を使用してトランザクション結果を通知します。

2. PHP で非同期通知を実装する手順

支払いシナリオを例として、PHP を使用して非同期通知を実装する方法を紹介します。

  1. 支払いリクエストの開始:

ユーザーがアプリケーションで支払いリクエストを開始すると、バックエンドは支払いリクエストを支払いプラットフォームに送信し、支払いプラットフォームから応答を受け取ります。支払いプラットフォームにアクセスし、応答から支払い URL を取得します。

PHP サンプル コード:

$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'] : '';
  1. 決済プラットフォーム インターフェイスの呼び出し:

cURL 経由で POST リクエストを送信し、決済プラットフォーム インターフェイスを呼び出して送信します。支払いプラットフォーム 支払いリクエストを送信し、支払いプラットフォームから返される応答結果を取得します。

PHP サンプル コード:

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);
}
  1. インターフェイスに戻り URL を設定します:

支払いが成功または失敗した場合のインターフェイスに戻り URL を設定します。 、バックグラウンドでの支払い結果がアプリケーションに通知され、取引ステータスの照会にも使用できます。

PHP サンプル コード:

$data = [
    'amount' => '10.00',
    'body' => '测试订单',
    'channel' => 'alipay_wap',
    'currency' => 'cny',
    'return_url' => 'http://example.com/return',
    'notify_url' => 'http://example.com/notify',
];

notify_url パラメーターは、支払い結果を受信するためのアドレスと、支払いプラットフォームによる非同期通知を送信するためのアドレスを渡すために使用されます。

  1. 非同期通知を受信するためのコールバック関数

決済プラットフォームがユーザーの支払いリクエストを受信して​​トランザクションを完了すると、指定されたnotify_urlに非同期通知を送信して通知します。支払い結果。そのため、コールバック関数内で署名の検証やビジネスロジックの処理を行い、最後に確認情報を返す必要があります。

PHP サンプル コード:

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';
}
  1. 署名の検証

支払いプラットフォームから送信される結果は信頼性を保証する必要があるため、支払いプラットフォームによって返された結果 データは検証されています。署名検証プロセスでは、支払いプラットフォームによって提供された公開キーを使用して署名を検証し、それが支払いプラットフォームによって発行された正当な結果であることを確認する必要があります。

PHP サンプル コード:

if (!openssl_verify(json_encode($data), base64_decode($data['signature']), $public_key)) {
    return 'false';
}
  1. 注文ステータスの更新

支払いが成功した後、注文のステータス情報を更新する必要があります。アプリケーションは注文の実際の状況を把握できます。このステップでは、ビジネス ロジックを呼び出して更新できます。

PHP サンプル コード:

function update_order($order_id)
{
    // 调用业务逻辑处理订单状态更新
}
  1. 確認情報を返す

処理が完了したら、確認情報を支払いプラットフォームに返して表示する必要があります。支払い結果が処理され、リターン コード (200 など) が処理が成功したことを示していることを確認します。

PHP サンプル コード:

return 'success';

3. 非同期通知の脆弱性を回避する

非同期通知を使用するプロセスでは、セキュリティを確保するために、次の脆弱性:

  1. 非同期通知は 1 回のみ処理してください。処理しないと、複数のリクエストが発生し、不要なセキュリティ リスクが発生します。
  2. 非同期通知を処理するときは、第三者によるリクエストの改ざんを避けるために、結果が署名および検証されていることを確認してください。
  3. 非同期通知結果処理の機能ロジックが失敗してデータの不整合が発生しないようにしてください。
  4. 攻撃者が悪意を持ってアドレスを改ざんして CSRF 攻撃を実行することを防ぐために、非同期通知 URL が第三者に提供される場合は改ざんされていないことを確認してください。

4. まとめ

この記事では、PHP を使用して非同期通知を実装する手順を紹介し、セキュリティ上の注意事項を提案します。非同期通知は金融取引のシナリオでは特に重要であり、セキュリティに特別な注意を払う必要があります。抜け穴やエラーを避けるために、署名、反復処理、セキュリティ リスクなどの問題を設計中に慎重に考慮する必要があります。

以上がPHP は非同期通知を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。