LV. 24
GP 1k

【問題】PHP開發的問題?

樓主 稽誕 w8312002
GP0 BP-

請教諸位前輩,這是巴哈提供的範例:
===========================================
$body = file_get_contents("php://input");
$signature = $_SERVER['HTTP_X_BAHA_DATA_SIGNATURE'];
$expectedOutput = 'sha1='.hash_hmac('sha1',$body,$App_Secret,false);
if ($signature !== $expectedOutput) {
echo 'not ok';
} else {
echo 'ok';
}
============================================
問題一、
'HTTP_X_BAHA_DATA_SIGNATURE' <= 這是什麼東西啊
問題二、
接收 webhook 事件後,必須傳回 200 OK HTTP 回應。
怎麼回應呢?echo 'ok'?還是用post發json過去呢?
============================================
如果能正確串接,我再把野狐禪流PHP原代碼丟上來給大家看看另類大腦洞


============================================

0
-
LV. 15
GP 39
2 樓 蒼時弦也 abr0616
GP1 BP-
https://sites.google.com/gamer.com.tw/hahamut-bot/%E6%8E%A5%E6%94%B6webhook%E4%BA%8B%E4%BB%B6?authuser=0#h.p_rrQma2omRQTB

參考這段的說明,Signature 是讓你檢查是不是巴哈發過來的,因為我們開發完的 API 是不會有驗證。所以巴哈在發過來的時候會把內容用 Secret 做一次 Hash 處理變成一個 Signature 所以你只需要檢查傳過來的內容(JSON)用你拿到的 Secret 做 Hash 是不是一樣就能驗證了。
(這個 Secret 應該只有你自己跟巴哈知道)

也可以參考我之前分享的文章 XD
https://blog.frost.tw/posts/2019/07/26/The-bahamut-chatbot-receiving-the-webhook/

問題二我自己測試巴哈大概沒管回傳什麼,一般來說保持好習慣正常就回 200 出問題就看情況回 403 / 500 之類的
1
-
LV. 24
GP 1k
3 樓 稽誕 w8312002
GP0 BP-
各位大大,在開發的過程中遇到一個很嚴重的問題,
當程式運行一直出錯時,會忍不住對BOT發脾氣,甚至像這樣...
不小心就和BOT對話起來...

請問一下....這種狀況是正常的嗎?
是不是該去看醫生了?

0
-
LV. 24
GP 1k
4 樓 稽誕 w8312002
GP0 BP-
基本串接測試完成,有興趣的同好可以看看
<?php

//參數設定
$Access_Token='Bot後台 >> Bot token >> Access Token';
$App_Secret='Bot後台 >> Bot token >> App Secret';
$Bot_Id = 'bot@xxx';
$Bot_Url='https://us-central1-hahamut-8888.cloudfunctions.net/messagePush';
$主機位址 = 'https://網址/檔名.php';
$記錄位址 = 'https://網址/檔名.htm';

//接收webhook事件
$封包 = file_get_contents("php://input");
解譯封包();

function 解譯封包(){
    global $封包;
    $接收訊息 = json_decode($封包);
    $現在時間 = date("Y/m/d-h:i:sa");
    $機器編號 = $接收訊息 -> botid;
    $發訊時間 = $接收訊息 -> time;
    $發訊編號 = $接收訊息 -> messaging[0]->sender_id;
    $訊息內容 = $接收訊息 -> messaging[0]->message->text;
    
    $紀錄訊息 = '接收訊息:'.$封包.'<br>'.PHP_EOL;
    $紀錄訊息.= '現在時間:'.$現在時間.'<br>'.PHP_EOL;
    $紀錄訊息.= '機器編號:'.$機器編號.'<br>'.PHP_EOL;
    $紀錄訊息.= '發訊時間:'.$發訊時間.'<br>'.PHP_EOL;
    $紀錄訊息.= '發訊編號:'.$發訊編號.'<br>'.PHP_EOL;
    $紀錄訊息.= '訊息內容:'.$訊息內容.'<br>'.PHP_EOL;

    $指令 = 'SELECT * FROM `1001_userdata`';
    $資料庫 = 類別讀取($指令);

    print_r($資料庫);
    
    $文字 = "data".$資料庫[0]['欄位'];
    
    $發送內容 = array(
        "recipient" => array(
            "id" => $發訊編號
        ),
        "message" => array(
            "type" => "text",
            "text" => $文字
        )
    );

    $發送文字 = json_encode($發送內容);
    
    $紀錄訊息.= '發送文字:'.$發送文字.'<br>'.PHP_EOL;
    
    傳送訊息($發送文字,$紀錄訊息);
}
/*----------------------------------------------------------------------------------------------------*/
/*信息發送--------------------------------------------------------------------------------------------*/
function 傳送訊息($發送文字,$紀錄訊息){
    global $Access_Token;
    $data = $發送文字;
    $url = 'https://us-central1-hahamut-8888.cloudfunctions.net/messagePush?access_token='.$Access_Token;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'post');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $發送文字);
    $巴哈回傳 = curl_exec($ch);
    curl_close($ch);
    
    $紀錄訊息.= '巴哈回傳:'.$巴哈回傳.'<br>'.PHP_EOL;
    傳送紀錄($紀錄訊息);
}
/*----------------------------------------------------------------------------------------------------*/
/*紀錄發送--------------------------------------------------------------------------------------------*/
function 傳送紀錄($紀錄訊息){
    $檔名= './190918_log.htm';
    $開啟=fopen($檔名,'w');
    fwrite($開啟,$紀錄訊息);
    fclose($開啟);
}
/*----------------------------------------------------------------------------------------------------*/
function 類別讀取($指令){
    
    $位置 = '';
    $帳號 = '';
    $密碼 = '';
    $資料庫 = '';
    
    $連線 = @mysqli_connect($位置,$帳號,$密碼,$資料庫)
    or die('190904_linkmysql.php:無法開啟MySQL資料庫連接!'.PHP_EOL);
    mysqli_query($連線, 'SET NAMES utf8');        //送出UTF8編碼的MySQL指令
    
    $資料 = array();
    
    $回覆 = @mysqli_query($連線,$指令);
    if ( mysqli_errno($連線) != 0 ){
        echo '<!--div>190904_linkmysql.php:MySql錯誤代碼: '.mysqli_errno($連線).'</div-->'.PHP_EOL;
        echo '<!--div>190904_linkmysql.php:MySql錯誤訊息: '.mysqli_error($連線).'</div-->'.PHP_EOL;
    }else{
        $i = 0;
        while ($臨時 = mysqli_fetch_array($回覆, MYSQLI_ASSOC)){
            $資料[$i]=$臨時;
            $i++;
        }
    }
    mysqli_free_result($回覆);                //釋放記憶體
    mysqli_close($連線);                    //關閉資料庫連接
    return $資料;
}
/*----------------------------------------------------------------------------------------------------*/
/*上傳圖片--------------------------------------------------------------------------------------------*/
function 上傳圖片(){
    global $Bot_Id,$Access_Token;
    $data = array('filedata'=>curl_file_create('102_skn/btn_01.png'));
    $url = 'https://us-central1-hahamut-8888.cloudfunctions.net/imagePush?bot_id='.$Bot_Id.'&access_token='.$Access_Token;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $rdata = curl_exec($ch);
    curl_close($ch);
    echo $rdata."\n";
}

0
-
未登入的勇者,要加入 5 樓的討論嗎?
板務人員:

0 筆精華,吸收日月精華中
一個月內新增 0
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】