ホームページ >バックエンド開発 >PHPチュートリアル >WeChatパブリックプラットフォームのサンプルコード分析

WeChatパブリックプラットフォームのサンプルコード分析

PHP中文网
PHP中文网オリジナル
2017-03-29 16:33:101135ブラウズ

この記事では、主に php WeChat パブリック プラットフォームのサンプル コードを詳細に紹介します。興味のある友人は参照してください

1. 概要

WeChat パブリック プラットフォームは、さらなる開発の前に、簡単な php サンプル コードを提供します。私たちはそれを詳細に理解する必要があります。

2. コードを取得します


3. コードを分析します

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


rreee

オリジナルサンプルコードは大きく4つのパートに分かれています:

TOKENを定義する
クラスwechatCallbackapiTestを宣言する
クラスwechatCallbackapiTestのインスタンスオブジェクト$wechatObjを作成する
クラスのvalid()メソッドを呼び出す。

3.2 詳細な分析

3.2.1 TOKENの定義

<?php
/**
 * wechat php test
 */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
 public function valid()
 {
  $echoStr = $_GET["echostr"];

  //valid signature , option
  if($this->checkSignature()){
   echo $echoStr;
   exit;
  }
 }

 public function responseMsg()
 {
  //get post data, May be due to the different environments
  $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

  //extract post data
  if (!empty($postStr)){
    
    $postObj = simplexml_load_string($postStr, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);
    $fromUsername = $postObj->FromUserName;
    $toUsername = $postObj->ToUserName;
    $keyword = trim($postObj->Content);
    $time = time();
    $textTpl = "<xml>
       <ToUserName><![CDATA[%s]]></ToUserName>
       <FromUserName><![CDATA[%s]]></FromUserName>
       <CreateTime>%s</CreateTime>
       <MsgType><![CDATA[%s]]></MsgType>
       <Content><![CDATA[%s]]></Content>
       <FuncFlag>0</FuncFlag>
       </xml>";    
    if(!empty( $keyword ))
    {
     $msgType = "text";
     $contentStr = "Welcome to wechat world!";
     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
     echo $resultStr;
    }else{
     echo "Input something...";
    }

  }else {
   echo "";
   exit;
  }
 }
  
 private function checkSignature()
 {
  $signature = $_GET["signature"];
  $timestamp = $_GET["timestamp"];
  $nonce = $_GET["nonce"]; 
    
  $token = TOKEN;
  $tmpArr = array($token, $timestamp, $nonce);
  sort($tmpArr);
  $tmpStr = implode( $tmpArr );
  $tmpStr = sha1( $tmpStr );
  
  if( $tmpStr == $signature ){
   return true;
  }else{
   return false;
  }
 }
}

?>

defineは、定数に値を代入するために使用される関数です。この文は、定数値「TOKEN」を「weixin」に代入することを意味します。

TOKEN は対話型セキュリティ認証に使用され、開発者が自由に定義でき、パブリック プラットフォームで設定されたものと同じである必要があります。

3.2.2 クラスの宣言

define("TOKEN", "weixin");


3 つのメソッド (関数) を含むクラス wechatCallbackapiTest を宣言します。

a. public 関数 valid()

は、開発者になるための申請時に WeChat に検証情報を送信するために使用されます。

b. public 関数 responseMsg()

は、最もよく使用される関数でもあります。

responseMsg 関数の詳細:

class wechatCallbackapiTest{
}

WeChat パブリック プラットフォームから送信されたユーザー メッセージを受信します。メッセージ データ構造は XML であり、PHP のデフォルトの識別データ型ではないため、$GLOBALS['HTTP_RAW_POST_DATA'] は次のようになります。ここで使用されているものを受け取り、その値を $postStr

if (!empty($postStr))
に代入します。 $postStr が空でない (データが受信されている) 場合は、次のステートメントを実行し続けます。 ; 空の場合は、対応する else ステートメントにジャンプします。

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

simplexml_load_string() 関数を使用して、受信した XML メッセージ データをオブジェクト $postObj にロードします。この厳密な書き方の後に、読み込みが成功したかどうかを判定するための条件文を追加する必要がありますが、書かなくても大丈夫です。

$postObj = simplexml_load_string($postStr, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);

オブジェクト$postObj内のメッセージを送信したユーザーのOPENIDを$fromUsername変数に代入します

$fromUsername = $postObj->FromUserName;

オブジェクト$postObj内のパブリックアカウントのIDを$toUsername変数に代入します

$toUsername = $postObj->ToUserName;

trim () 関数 文字列の両端にある空白文字やその他の事前定義された文字を削除します。 1 日の 00:00:00 から現在時刻までの秒数。


$keyword = trim($postObj->Content);

WeChat 出力コンテンツを保存するテンプレート

$time = time();

$keyword が空でない場合は、対応する else ステートメントにジャンプします。 is echo "何かを入力してください...";

$textTpl = "<xml>
       <ToUserName><![CDATA[%s]]></ToUserName>
       <FromUserName><![CDATA[%s]]></FromUserName>
       <CreateTime>%s</CreateTime>
       <MsgType><![CDATA[%s]]></MsgType>
       <Content><![CDATA[%s]]></Content>
       <FuncFlag>0</FuncFlag>
       </xml>";

メッセージタイプはテキストタイプです

if(!empty( $keyword ))

返信メッセージの内容

$msgType = "text";

sprintf()関数を使用して、フォーマットされたデータを変数に書き込みます;

$fromUsername, $ toUsername、$time、$msgType、$contentStr は、テンプレート内の "%s" 位置を順番に置き換えます。つまり、変数 "$resultStr" は、実際には次のようになります。



$contentStr = "Welcome to wechat world!";

echo $resultStr;


c. プライベート関数 checkSignature()

開発者は署名をチェックすることでリクエストを検証します (検証方法は以下にあります)。この GET リクエストが WeChat サーバーからのものであることが確認され、echostr パラメータの内容がそのまま返された場合はアクセスが有効となり、それ以外の場合はアクセスが失敗します。 signature は、開発者によって入力されたトークンパラメータと、リクエスト内のタイムスタンプパラメータおよびノンスパラメータを組み合わせます。

暗号化/検証プロセス:

1. 3 つのパラメーターのトークン、タイムスタンプ、ノンスを辞書順に並べ替えます

2. 開発者は、暗号化された文字列を取得し、比較できます。リクエストが WeChat からのものであることを示す署名を付けます

3.2.3 インスタンス オブジェクトを作成します

$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

3.2.4 クラスのメソッドを呼び出して検証します

<xml>
<ToUserName><![CDATA[$toUsername]]></ToUserName>
<FromUserName><![CDATA[$fromUsername]]></FromUserName>
<CreateTime>$time</CreateTime>
<MsgType><![CDATA[$msgType]]></MsgType>
<Content><![CDATA[$contentStr]]></Content>
<FuncFlag>0</FuncFlag>  //位0x0001被标志时,星标刚收到的消息。
</xml>

その後、クラスの valid() メソッドを呼び出してインターフェイスの検証を実行します。インターフェイスが正常に設定された場合は、コメントアウトします。


4. まとめ


上記はWeChatの公式サンプルコードを分析したものです。誤った説明がある場合は専門家に指摘してください。さらに、このコードは公式が提供する単純なサンプルコードにすぎません。複雑な開発が必要な場合、開発者は引き続きこのコードを厳密な開発モデルに従って書き直す必要があります。これについては後続のチュートリアルで説明します。

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