參考資料: https://a-bad-engineer.blogspot.com/2018/01/line-line-notify-1.html
php 5.6版本 apache2.2.3
有一個功能出現了錯誤??之前還可以的,不知道為何不能用了??
新人加入Line Notify推播,取得code後,再次向Line取得token,就出現問題?
測試網址:(測試帳號!!)
http://ble.com.tw/Iot360/v00_line_notify.php
測試流程如下:
圖一
圖二
圖三
我有將code,拿去用postman測試(註:這是我第一次用postman,參數如果設錯,請指教,thx)
還是一樣,回傳錯誤
{"status":400,"message":"invalid code","access_token":null}
這是我的php line notify程式碼??
http://220.132.53.237:1111/sharing/J41cjpU8w
感謝,thx
我剛剛看官方文件做的,可以拿到 access_token
<?php
//所註冊服務的 client id
const CLIENT_ID='';
//所註冊服務的 client secret
const CLIENT_SECRET='';
//所註冊服務的 callback URL(由 authLineToken.php 處理)
const AUTH_PAGE_URL='http://localhost/notify/authLineToken.php';
<?php
require(__DIR__.'/env.php');
?><!DOCTYPE html>
<html lang="Zh-Hant">
<head>
<meta charset="utf-8">
<title>首頁</title>
</head>
<body>
<button onclick="redirectToLine()">讓 Line 通知我</button>
<script>
function redirectToLine() {
let url='https://notify-bot.line.me/oauth/authorize';
let params={
response_type: 'code',
client_id: '<?php echo CLIENT_ID;?>',
redirect_uri: '<?php echo AUTH_PAGE_URL;?>',
scope: 'notify',
state: 'step1',
response_mode: 'form_post'
};
url+='?'+Object.keys(params).map(key=>`${key}=${encodeURIComponent(params[key])}`).join('&');
location.href=url;
}
</script>
</body>
</html>
<?php
require(__DIR__.'/env.php');
if(isset($_POST['state']) && $_POST['state']==='step1') {
if(isset($_POST['code'])) {
$ch=curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://notify-bot.line.me/oauth/token',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'grant_type' => 'authorization_code',
'code' => $_POST['code'],
'redirect_uri' => AUTH_PAGE_URL,
'client_id' => CLIENT_ID,
'client_secret' => CLIENT_SECRET
],
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
]);
$body=curl_exec($ch);
$code=curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if($code===200) {
$json=json_decode($body, true);
echo 'access_token: '.(isset($json['access_token'])?$json['access_token']:'null');
} else {
echo '無法取得 access_token';
}
} elseif(isset($_POST['error']) && isset($_POST['error_description'])) {
exit($_POST['error'].'<br>'.$_POST['error_description']);
} else {
exit('未知的錯誤');
}
} else {
exit('Bad Request');
}
奇怪了,我用你的程式嗎?? 修改一下,卻還是
step1
step1
9feQQ6HW6wl1wqUihiKXvQ
無法取得 access_token
測試網址
https://ble.com.tw/Iot360/w00_line_notify.php
<?php
//所註冊服務的 client id
const CLIENT_ID='X1zUzNSSqbJeokBalwdBmi';
//所註冊服務的 client secret
const CLIENT_SECRET='0h5PkTU6ZlymWE0soqXvTYxx8mkqfoEvur38XA3I2I5';
//所註冊服務的 callback URL(由 authLineToken.php 處理)
const AUTH_PAGE_URL='https://ble.com.tw/Iot360/w00_line_notify_call.php';
?>
<?php
?><!DOCTYPE html>
<html lang="Zh-Hant">
<head>
<meta charset="utf-8">
<title>首頁</title>
</head>
<body>
<button onclick="redirectToLine()">讓 Line 通知我</button>
<script>
function redirectToLine() {
let url='https://notify-bot.line.me/oauth/authorize';
let params={
response_type: 'code',
client_id: '<?php echo CLIENT_ID;?>',
redirect_uri: '<?php echo AUTH_PAGE_URL;?>',
scope: 'notify',
state: 'step1',
response_mode: 'form_post'
};
url+='?'+Object.keys(params).map(key=>`${key}=${encodeURIComponent(params[key])}`).join('&');
location.href=url;
}
</script>
</body>
</html>
第二支程式
<?php
//所註冊服務的 client id
const CLIENT_ID='X1zUzNSSqbJeokBalwdBmi';
//所註冊服務的 client secret
const CLIENT_SECRET='0h5PkTU6ZlymWE0soqXvTYxx8mkqfoEvur38XA3I2I5';
//所註冊服務的 callback URL(由 authLineToken.php 處理)
const AUTH_PAGE_URL='https://ble.com.tw/Iot360/w00_line_notify_call.php';
?>
<?php
echo $_POST['state'] .'<BR>';
echo $_POST['state'] .'<BR>';
echo $_POST['code'] .'<BR>';
if(isset($_POST['state']) && $_POST['state']==='step1') {
if(isset($_POST['code'])) {
$ch=curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://notify-bot.line.me/oauth/token',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'grant_type' => 'authorization_code',
'code' => $_POST['code'],
'redirect_uri' => AUTH_PAGE_URL,
'client_id' => CLIENT_ID,
'client_secret' => CLIENT_SECRET
],
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
]);
$body=curl_exec($ch);
$code=curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if($code===200) {
$json=json_decode($body, true);
echo 'access_token: '.(isset($json['access_token'])?$json['access_token']:'null');
} else {
echo '無法取得 access_token';
}
} elseif(isset($_POST['error']) && isset($_POST['error_description'])) {
exit($_POST['error'].'<br>'.$_POST['error_description']);
} else {
exit('未知的錯誤');
}
} else {
exit('Bad Request');
}
我有用本地端測試
http://localhost:9002//w01_line_notify.php
還是一樣!!!
AUTH_PAGE_URL 要跟 Line 那邊填寫的一樣
所以每次改 url ,要記得去 line 後台那邊修改
//所註冊服務的 callback URL(由 authLineToken.php 處理)
const AUTH_PAGE_URL='http://localhost/authLineToken.php';
其他資訊也確認一下吧?
就是當時填寫的這個,跟 AUTH_PAGE_URL 要相同
這邊的 callback URL
跟LINE那邊是一樣的
<?php
//所註冊服務的 client id
const CLIENT_ID='X1zUzNSSqbJeokBalwdBmi';
//所註冊服務的 client secret
const CLIENT_SECRET='0h5PkTU6ZlymWE0soqXvTYxx8mkqfoEvur38XA3I2I5';
//所註冊服務的 callback URL(由 authLineToken.php 處理)
const AUTH_PAGE_URL='https://ble.com.tw/Iot360/w00_line_notify_call.php';
?>
如果設錯的話,會出現
`Bad Request: redirect_uri is not matched with registered URI``
callback URL這部分,我設定正確!!!
昨天我是用 PHP7.4 + apache2.4
我剛剛改用 PHP5.6 + apache2.4,複製你後來改的程式碼,有跑出來 access_token。
所以還是不知道為什麼
另外你最原始的程式(7-zip內的) v00_line_notify_call.php
82~83行是不是要這樣?
$line_token = $response['access_token'];
echo "line_token: $line_token";
我測試一樣可以取得 token
我只能提幾個想法
1.我未指定編碼格式,英數應該不需要指定
2.php空白,這我確認過沒出現...
3.我確認過是抓取line給我的code
https://ble.com.tw/Iot360/w02_line_notify_call.php?code=gCR3odoPECXrW8uxeACGGu&state=NO_STATE
然後傳給它,才出錯的...
我打算發一封信給line客服 問原因
我也想不到其他的了,不知道新開一個帳號能不能正常運作。
如果是的話就是帳號的問題了。
這個方法,我嘗試過,別人的帳號測試過了...
在3台服務器上測試.結果一樣...
line的問題,真奇妙
你應該沒有在postman的Authorization設定你的access token
Type請選擇 Bearer token
右側再貼上你的access token 發送應該就可以了