ホームページ  >  記事  >  バックエンド開発  >  PHP WeChat決済通知処理メソッド実装方法

PHP WeChat決済通知処理メソッド実装方法

WBOY
WBOYオリジナル
2016-07-25 09:12:011214ブラウズ

この記事は前回の記事の補足です。通知に関する公式のデモが存在しないため、石を触って川を渡るのは非常に困難です。それを開発して誰もが見ることができるようにするのが便利です。

通知メカニズムの実装には公式ドキュメントのみがあり、デモコードはありません。これまでに実行したことがない人にとっては、テストに時間がかかります。 文書に記載されている内容から判断すると、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 を取得します。これは次の形式の通常の支払い通知メッセージです。

  1. array (
  2. 'bank_type' => '3006',
  3. 'discount' => '0',
  4. 'fee_type' => '1',
  5. 'input_charset' => 'UTF -8',
  6. 'notify_id' => 'YaNO6cznoNZK0aGb8nJWGgVUWssjt7Ze7gWRaRS0R_5w9oXgGNkRGxReEk0r45yk3I9a2_gzo9IqgqMYbap6bxC2T3p0o-2C',
  7. 'out_trade_no' =&g t; ​​' 1214284731',
  8. 'パートナー' => '12xxxxxxxx',
  9. 'product_fee' => '3400' 'sign' => ; '1',
  10. 'trade_state' => '0',
  11. 'transaction_id' => file_get_contents('php://input') は次の形式で追加情報を読み取ります。
  12. >
  13. 1
1400814743
<アプリ署名>< ! [CDATA[c2dxxxe186116b32b06axxxc1a688b671eexxx5e]]>

コードをコピー
  1. 最後に、対応するビジネス ロジックの処理を行います。詳細は説明しません。皆さんで勉強してください。


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