利用微信公衆號做網課答案查詢-後端php-2020-4-17
題庫api需要自己去找,或是自己做,數據龐大
一、準備
1.公衆號
(不講)
2.服務器
(不講,我博客裏有教)
3.Php
(不講,我博客裏有教在服務器上安裝)
4.題庫api接口
(自己做或是用別人的) api不提供自己找,因爲過段時間就會失效
二、操作
1.新建一個php
cha.php //第一次先校驗token,讓微信公衆號接口驗證成功
<?php
//token是微信公衆號接口校驗用的,第一次需要
define("TOKEN", "weixin"); //根據自己的token改,我以weixin爲例
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid(); //接口驗證 第一次啓用,驗證完,註釋
//$wechatObj->responseMsg(); //調用回覆消息方法 先註釋
class wechatCallbackapiTest
{
public function valid() //校驗token的方法
{
$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 = file_get_contents('php://input');
//extract post data
if (!empty($postStr)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', 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 ))
{
$data = array(
'q' => $keyword,
);
$ch = curl_init();
$params[CURLOPT_URL] = "*****"; //請求url地址,******裏面填api題庫接口
$params[CURLOPT_HEADER] = FALSE; //是否返回響應頭信息
$params[CURLOPT_SSL_VERIFYPEER] = false;
$params[CURLOPT_SSL_VERIFYHOST] = false;
$params[CURLOPT_RETURNTRANSFER] = true; //是否將結果返回
$params[CURLOPT_POST] = true;
$params[CURLOPT_POSTFIELDS] = $data;
curl_setopt_array($ch, $params); //傳入curl參數
$content = curl_exec($ch); //執行
curl_close($ch); //關閉連接
//return $content;
$json1=json_decode($content);
$code=json_encode($json1,JSON_UNESCAPED_UNICODE);
$data=strtr($code, array("success"=>"成功獲取"));//這裏是過濾返回的json用的根據實際api修改
$msgType = "text";
$contentStr = $data;
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
private function checkSignature() //校驗token的
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
複製即可不用修改,//因爲是校驗而已
我的話是將cha.php放在網站入口處
2.微信公衆號修改配置
開發->基本配置->服務器配置->修改配置
URL是php文件所在地方
//比如我是,域名+cha.php,因爲我是反正網站入口處
Token是校驗碼,
//我已weixin爲例
EncodingAESKey 點擊隨機生成就好
選擇明文模式
提交
顯示token校驗成功,就好//如果不是檢查一下
3.修改cha.php
剛纔這是校驗成功,現在修改讓它具有查題功能
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();//接口驗證
$wechatObj->responseMsg();//調用回覆消息方法
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 = file_get_contents('php://input');
//extract post data
if (!empty($postStr)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', 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 ))
{
$data = array(
'q' => $keyword,
);
$ch = curl_init();
$params[CURLOPT_URL] = "這裏放題庫api"; //請求url地址
$params[CURLOPT_HEADER] = FALSE; //是否返回響應頭信息
$params[CURLOPT_SSL_VERIFYPEER] = false;
$params[CURLOPT_SSL_VERIFYHOST] = false;
$params[CURLOPT_RETURNTRANSFER] = true; //是否將結果返回
$params[CURLOPT_POST] = true;
$params[CURLOPT_POSTFIELDS] = $data;
curl_setopt_array($ch, $params); //傳入curl參數
$content = curl_exec($ch); //執行
curl_close($ch); //關閉連接
//return $content;
$json1=json_decode($content);
$code=json_encode($json1,JSON_UNESCAPED_UNICODE);
$data=strtr($code, array("success"=>"成功獲取"));//過濾返回json自己修改
$msgType = "text";
$contentStr = $data;
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
需要修改兩處,一個是題庫api,一個是返回json過濾,上面有標記自己看
然後保存即可,已經具備網課答案查詢自動回覆