ホームページ > バックエンド開発 > PHPチュートリアル > WeChat PHPカスタムメニュー

WeChat PHPカスタムメニュー

WBOY
リリース: 2016-06-23 14:40:06
オリジナル
846 人が閲覧しました

WeChat パブリック プラットフォームでテスト アカウントを申請しました。これをフォローした後、WeChat ID を使用してテスト アカウントにメッセージを送信し、テスト アカウントから正しい応答を取得したいと思います。 WeChat のカスタム メニューを実装するには、* を使用してテスト アカウントの appid とシークレットを置き換えます。問題は何ですか?

<?php/**  * wechat php test  *///define your tokendefine("TOKEN", "weixin");$token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=***&secret=***";$data = "{     "button":[     {	          "type":"click",          "name":"今日歌曲",          "key":"V1001_TODAY_MUSIC"      },      {           "type":"click",           "name":"歌手简介",           "key":"V1001_TODAY_SINGER"      },      {           "name":"菜单",           "sub_button":[            {               "type":"click",               "name":"hello word",               "key":"V1001_HELLO_WORLD"            },            {               "type":"click",               "name":"赞一下我们",               "key":"V1001_GOOD"            }]       }] }";$wechatObj = new wechatCallbackapiTest();$wechatObj->post($wechatObj->get_access_token(), $data);class wechatCallbackapiTest{		public function get_access_token(){          $json=http_request_json($token_url);        $data=json_decode($json,true);          if($data['access_token']){              return $data['access_token'];          }else{              return "获取access_token错误";          }             }  	    public function http_request_json($url){            $ch = curl_init();          curl_setopt($ch, CURLOPT_URL,$url);          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);          $result = curl_exec($ch);          curl_close($ch);          return $result;        }  		public function post($access_token, $jsonData){		$ch = curl_init("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token) ;		curl_setopt($ch, CURLOPT_POST, 1);		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");		curl_setopt($ch, CURLOPT_POSTFIELDS,$jsonData);		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));		$result = curl_exec($ch) ;		curl_close($ch) ;		return $result;	}}?>
ログイン後にコピー


ディスカッションへの返信 (解決策)

もう 1 つの質問があります。この種の WeChat PHP 開発をどのようにデバッグすればよいですか。また、サーバー上のログ (エコー値と同様) はどこで確認できますか? = を使用してサーバーを構築しました ここには一重引用符が必要で、もう 1 つの http_request_json は $this->http_request_json に変更されましたが、それでも動作しませんでした。これら 2 つの問題を変更しました

メニューには例があったことを覚えています。公式ドキュメント
デバッグに関しては、エラー番号はあなたが判断するのに便利です

WeChat公式によってスローされるエラーは、インターフェイス上で直接スローされるわけではありません。このエラーはサーバー上で確認できます

メニューが公式にあることを覚えています ドキュメントには例があります
デバッグに関しては、公式のエラー番号がスローされるので、判断してください
WeChat 公式がスローしたエラーは次のとおりです。私の経験によると、API 呼び出しのたびにコールバックがあるはずです...コールバック

もう 1 つの質問があります。この種の WeChat PHP 開発をデバッグするにはどうすればよいですか? サーバー上のどこでログ (エコーに似た値) を見ることができますか? Out of nowhere を使用してサーバーを構築しました。私は個人的に PHP が好きです。http://www.ihuxu.com でもっと交流を深めたいと思っています。

1. まずこのメソッドをチェックして、トークン値が取得されているかどうかを確認します。

$wechatObj->get_access_token()
ログイン後にコピー
ログイン後にコピー


2. カスタムメニューを送信すると、どのようなデータが返されますか?エラー コードを使用して、何が問題だったのかを調べます。

明らかに、このメソッドでトークン値を取得する方法がわかりません。 $token_url はどこから来たのでしょうか?

  public function get_access_token(){          $json=http_request_json($token_url);        $data=json_decode($json,true);          if($data['access_token']){              return $data['access_token'];          }else{              return "获取access_token错误";          }             }  
ログイン後にコピー
ログイン後にコピー


もう一つの質問ですが、この種の WeChat PHP 開発をデバッグするにはどうすればよいですか? サーバー上のログ (エコー値と同様) はどこで確認できますか? Out of nowhere を使用してサーバーを構築しました。私は個人的に PHP が好きです。http://www.ihuxu.com でもっと交流を深めたいと思っています。
現在の問題は、WeChat の公式 Web サイトでデバッグしたところ、プロンプトは成功しましたが、クライアントではそれが表示されないことです

1. まず、このメソッドをチェックして、トークン値が取得されているかどうかを確認します。

$wechatObj->get_access_token()
ログイン後にコピー
ログイン後にコピー

2. カスタムメニューを送信すると、どのようなデータが返されますか?エラー コードを使用して、何が問題だったのかを調べます。


明らかに、このメソッドでトークン値を取得する方法がわかりません。 $token_url はどこから来たのでしょうか?

  public function get_access_token(){          $json=http_request_json($token_url);        $data=json_decode($json,true);          if($data['access_token']){              return $data['access_token'];          }else{              return "获取access_token错误";          }             }  
ログイン後にコピー
ログイン後にコピー

token_url は私の投稿の上部にあり、宣言されています

実行したリターンが成功した場合は 24 時間かかりますが、フォローを解除して再度フォローして確認することもできます

実行した場合のリターンは成功しました。24 時間かかるか、フォローを解除して再度フォローして確認してください
サーバー上で直接印刷しているので、問題はわかっていますが、変更方法がわかりません
うわー
これが私が今作成したものですメニューメソッドを印刷して確認しました。トークンは正しく取得されましたが、システム印刷は
{"errcode":-1,"errmsg":"system error"} です。このエラーコードは次のとおりです。 WeChat 公式 私が見た説明では、システムがビジーであるということでしたが、これは問題ではないと思います。なぜなら、誰かが Java を使用して作成しても問題ないからです。PHP の記述にまだ問題があると思います。助けて?

public function post($token, $jsonData){		echo $token;				$MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token;				$ch = curl_init() ;		curl_setopt($ch, CURLOPT_URL, $MENU_URL);		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);		curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);		$result = curl_exec($ch) ;				if (curl_errno($ch)) {			echo 'Error'.curl_error($ch);		}				curl_close($ch) ;				echo $result;		//var_dump($result);		return $result;	}
ログイン後にコピー

//创建菜单function createMenu($data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".ACCESS_TOKEN); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) {  return curl_error($ch); } curl_close($ch); return $tmpInfo;}
ログイン後にコピー

あなた これと私の違いは何ですか? $token は、他の場所から取得した変数です。グローバル変数を定義して、トークンの値を記録する必要があります。違いはありませんね?

还有一个问题,我该怎么调试这种微信的php开发,在服务器上哪个地方可以看到日志(就是类似echo的值)?我是用xampp搭建的服务器 error_log("内容",3,"log.txt");
第一个参数是你要输入的内容,
第二个参数不要改,
第三个参数是日志的名称,你可以加一下路径 如"c:\log.txt"你就可以在C盘看到这个文件了

微信菜单,我自己写了个小工具,可以用的 可以用,要的话加QQ970871674

你是不是执行的时候也echo了?

你是不是执行的时候也echo了?
我重新贴下完整代码吧

post($wechatObj->get_access_token(), $data);//$wechatObj->responseMsg();class wechatCallbackapiTest{	public function valid()    {        $echoStr = $_GET["echostr"];        //valid signature , option        if($this->checkSignature()){        	echo $echoStr;        	exit;        }    }		public function get_access_token(){          $json=$this->http_request_json("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=***&secret=***");          $data=json_decode($json,true);  		        if($data['access_token']){              return $data['access_token'];          }else{              return "获取access_token错误";          }             }  	    public function http_request_json($url){            $ch = curl_init();          curl_setopt($ch, CURLOPT_URL, $url);          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);          $result = curl_exec($ch);          curl_close($ch);          return $result;        }  		public function post($token, $jsonData){		echo $token;						$MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token;				$ch = curl_init() ;		curl_setopt($ch, CURLOPT_URL, $MENU_URL);		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);		curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);		$result = curl_exec($ch) ;						if (curl_errno($ch)) {			echo 'Error'.curl_error($ch);		}				curl_close($ch) ;				echo $result;				return $result;	}?>
ログイン後にコピー

这就是现在代码了,除了真实的appid和secret被我用***代替了

解决了,是菜单中的中文导致的,将文件另存为“UTF-8 无BOM编码格式”就行了,感谢大家

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート