ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルで WeChat 支払い通知を処理する方法の簡単な分析

PHP_PHP チュートリアルで WeChat 支払い通知を処理する方法の簡単な分析

WBOY
WBOYオリジナル
2016-07-13 10:29:24737ブラウズ

通知メカニズムの実装には公式ドキュメントのみがあり、デモコードはありません。これまでに実行したことがない人にとっては、テストに時間がかかります。

ドキュメントによると、WeChat によって毎回通知されるデータの構造は比較的複雑で、POST データを取得するだけでなく、他のデータも取得する必要があります。

これにはまず、php://input と $_POST の値に関する質問が含まれます。ここではいくつかの簡単なポイントを示します。

コードをコピーします コードは次のとおりです:
1. Content-Type 値が application/x-www-form-urlencoded の場合、php は http リクエスト本文の対応するデータを配列 $_POST $_POST 配列に入力されたデータは、urldecode() の解析の結果です。 (実際には、Content-Type に加えて、データがフォームデータであることを示す multipart/form-data もあります。これについては後で紹介します)
2. php://input データ。タイプが multipart/form-data ではありません (条件付き制限は後で導入されます)。 php://input データは、データの http エンティティ本体部分と一致します。この部分的に一貫したデータの長さは、Content-Length によって指定されます。
3. Content-Type が application/x-www-form-urlencoded で、送信メソッドが POST メソッドである場合にのみ、$_POST データと php://input データは「一貫性」があります (引用符で囲まれていることを示します)。形式は一貫していませんが、コンテンツは一貫しています)。そうでなければ、それらは矛盾します。
4. php://input は $_GET データを読み取ることができません。これは、http リクエストのボディ部分ではなく、http リクエスト ヘッダー (header) の PATH フィールドに $_GET データが 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 を取得します。これは、次の形式の通常の支払い通知メッセージです。

コードをコピーします コードは次のとおりです:
array (
'bank_type' => '3006',
'discount' => '0',
'fee_type' => '1',
'input_charset' => 'UTF-8',
'notify_id' => 'YaNO6cznoNZK0aGb8nJWGgVUWssjt7Ze7gWRaRS0R_5w9oXgGNkRGxReEk0r45yk3I9a2_gzo9IqgqMYbap6bxC2T3p 0o-2C'、
'out_trade_no' => '1214284731'、
'partner' => '12xxxxxxxx'、
'product_fee ' => '3400',
'sign' => '545FA0E8B594BBXXXX48XX142F084TY',
'sign_type' => 'time_end' => '20130223110224',
'total_fee' =>「3400」 ,
'trade_mode' => '1',
'trade_state' => '12XXX449012014XXX33174005XXX',
'transport_fee' =>


file_get_contents('php://input') を使用して、次の形式で追加情報を読み取ります:


コードをコピーします

コードは次のとおりです:


AppId>
1
1400814743
& lt;/NonceStr>



最後に、対応するビジネス ロジック処理を実行します。詳細については説明しません。

http://www.bkjia.com/PHPjc/776462.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/776462.html技術記事通知メカニズムの実装には公式ドキュメントのみがあり、デモ コードはありません。これまでに実行したことがない人にとっては、テストに時間がかかります。 文書の内容から判断すると、毎回 WeChat から送信される通知の数は...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。