この記事は前回の記事の補足です。通知に関する公式のデモが存在しないため、石を触って川を渡るのは非常に困難です。それを開発して誰もが見ることができるようにするのが便利です。 通知メカニズムの実装には公式ドキュメントのみがあり、デモコードはありません。これまでに実行したことがない人にとっては、テストに時間がかかります。 文書に記載されている内容から判断すると、WeChat によって毎回通知されるデータの構造は比較的複雑であり、POST データを取得するだけでなく、他のデータも取得する必要があります。 これには、まず php://input と $_POST の値に関する質問が含まれます。いくつかの簡単な点は次のとおりです。 1. Content-Type 値が application/x-www-form-urlencoded の場合、PHP は http リクエスト本文の対応するデータを配列 $_POST に埋め込み、$_POST 配列に埋め込まれたデータは次のように解析されます。 urldecode() の結果。 (実際にはContent-Typeの他にフォームデータであることを示すmultipart/form-dataもありますが、これについては後ほど紹介します) 2. Content-Type が multipart/form-data でない限り、php://input データ (この条件は後で紹介します)。 php://input データは、データの http エンティティ本体部分と一致します。この部分的に一貫したデータの長さは、Content-Length によって指定されます。 3. Content-Type が application/x-www-form-urlencoded で、送信メソッドが POST メソッドである場合にのみ、$_POST データと php://input データが「一致」します (引用符で囲まれていることを示します)。形式は一貫していませんが、コンテンツは一貫しています)。そうでなければ、それらは矛盾します。 4、php://input は $_GET データを読み取ることができません。これは、$_GET データが http リクエストの本文部分ではなく、http リクエスト ヘッダーの PATH フィールドに query_path として書き込まれているためです。 xml_rpc サーバーが file_get_contents(‘php://input’, ‘r’) を通じてデータを読み取る理由を理解するのに役立ちます。 $_POST から読み取るのではなく、xml_rpc のデータ仕様が xml であり、その Content-Type が text/xml であるためです。 5. php://input は multipart/form-data と一致します。その説明については RFC1867 を確認してください。 multipart/form-data も POST メソッドを使用してフォーム データを送信することを意味し、ファイルのアップロードを伴うため、application/x-www-form-urlencoded データ形式とは異なります。より合理的かつ効率的なデータ形式でサーバーに渡されます。 Content-Type が multipart/form-data の場合、HTTP リクエストボディにデータがあっても、php://input は空になります。このとき、PHP は php://input ストリームにデータを埋め込みません。したがって、php://input を使用して enctype=multipart/form-data データを読み取ることはできないことは確かです。 6. Content-Type が application/x-www-form-urlencoded の場合、php://input と $_POST データは、他の Content-Type の場合、php://input と $_POST データが「一致」します。データが矛盾しています。 Content-Type が application/x-www-form-urlencoded または multipart/form-data の場合にのみ、PHP は http リクエスト パケット内の本文データの対応する部分を $_POST グローバル変数に埋め込むためです。 , PHP は両方を無視します。データ型が multipart/form-data の場合は php://input が空であることを除き、他の状況では空にならない場合があります。 上記で言い換えた多くの言葉の意味は、WeChat から送信されたデータを読み取るにはこれら 2 つの方法を使用する必要があるということです。 まず $POST を取得します。これは次の形式の通常の支払い通知メッセージです。
コードをコピー
|