PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

สอบถามปัญหา Push Notification ครับ

สอบถามปัญหา Push Notification ครับ
พี่นิกคับ
 
ผมทำตามที่ที่ได้โพส เรื่อง push notification ครับ
 
พอรันแล้วไม่มีอะไรเกิดขึ้นคับ
 
ทำถึงขั้นตอนสุดท้ายแล้ว
 
 
วิธีการทำสอบ ก็ให้อัพไฟล์นี้ขึ้น server แล้วกด รีเฟรส หร็อ รันไฟล์ 
ถ้าไม่มีข้อผิดพลาด ก็ จะได้รับข้อความเป็น push notification ที่เครื่องมือถือของเรา
เท่าที่รู้ เราสามารถส่งได้พร้อมกันสูงสุด 1000 regid
 
 
แต่ผลลัพที่ได้หน้าบราวเซอร์เป็นแบบนี้ครับ
 
 
Warning: json_encode() expects exactly 1 parameter, 2 given in C:AppServwwwstd_project54231_416pusher.php on line 71
JSON_PARSING_ERROR: Unexpected token END OF FILE at position 0.
 
 
 
ผมใส่ key ตามที่ได้สมัคร GCM แล้วครับ แต่ก้อยังไม่ได้
 
ไม่ทราบว่าพี่พอจะมีวิธีแก้ไขไหมครับ
 
ขอบคุณครับ


โดย:  Natjadee IP: 110.164.182.xxx วันที่: 02-12-2014 เวลา: 16:02:46

คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ


  • ( หรือ สามารถทำการ สมัครสมาชิก และล็อกอิน ด้วย ปุ่ม Log in with Facebook ด้านล่าง )
 ความคิดเห็นที่ 20
ได้แล้วคับ ขอบคุณมากคับ

โดย:  Mal2321 IP: 180.183.173.xxx วันที่: 01-07-2015 เวลา: 14:30:13
 ความคิดเห็นที่ 19
แปลกว่าส่งไม่สำเร็จ success 0

ลองไล่ดู หรือหาเครื่องทดสอบ อาจจะเป็นมือถือจริงๆ  



ลองทดสอบที่เครื่องขึ้นว่า registered ตามรูปด้านบน


ภาคต่อ สร้าง app ใช้งาน Push Notifications ใน phonegap ตอนที่ 10 
http://www.ninenik.com/content.php?arti_id=586 via @ninenik


โดย:  Ninenik IP: 180.183.40.xxx วันที่: 18-06-2015
 ความคิดเห็นที่ 18
Array
(
    [0] => APA91bEi9BaALk1JTYidhD-fVITcIDWJZb2E4bmLBRr6RNpISRpqiVccICgQmyBjxN7fJpwaZpZ7Veuasw4MP0mHjzZnPS6nlTKG9Zs7nvJgt8OSZ7B9PhbxRXLW4m-FadzObpgyBn1egyvqTQg82CKfaj9bAnjRJQ
)
Array
(
    [multicast_id] => 6484845527708779443
    [success] => 0
    [failure] => 1
    [canonical_ids] => 0
    [results] => Array
        (
            [0] => Array
                (
                    [error] => NotRegistered
                )

        )

)

ถ้ามันมาแบบนี้ แปลว่าอะไรคับพี่


โดย:  Mal2321 IP: 180.183.24.xxx วันที่: 18-06-2015 เวลา: 12:08:05
 ความคิดเห็นที่ 17
  แปลกมาก 555 น่าจะมีอะไรผิด เอาไฟล์ test_push ที่มีค่า จริง ทั้ง api key และก็ regid  
ที่บันทึก ส่งเข้าเมลล์ ninenik@gmail.com มาดู

โดย:  Ninenik IP: 171.96.17.xxx วันที่: 03-12-2014
 ความคิดเห็นที่ 16
serอer ก้อ enable ให้แล้วน่ะครับ



โดย:  Natjadee IP: 110.164.182.xxx วันที่: 03-12-2014 เวลา: 10:41:18
 ความคิดเห็นที่ 15
ลองสร้างไฟล์เปล่า แล้วใส่โค้ด

<?
phpinfo();
?>


รันดูว่า สามารถใช้งาน curl ได้ไหม

เช็คถ้าแบบด้านล่าง แสดงว่าน่าจะใช้ curl ได้ ต้องหาสาเหตุอื่นต่อ

curl

cURL support enabled
cURL Information libcurl/7.16.0 OpenSSL/0.9.8g zlib/1.2.3
 


โดย:  Ninenik IP: 171.96.17.xxx วันที่: 03-12-2014
 ความคิดเห็นที่ 14
http://ict.sci.psu.ac.th/std_project/54/231_416/test_push.php


index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">    
    <title>Push</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
</head>
<body>
  
<br><br>      
<div class="container-fluid">

<pre>
    <div id="home">
        <div id="app-status-div">
            <ul id="app-status-ul">
                <li>Cordova PushNotification Plugin Demo</li>
            </ul>
        </div>
    </div>
</pre>

</div>    
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>    
<script src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript">
$(function(){

});
</script>     
<script type="text/javascript">
    var pushNotification;
    var php_addRegist="http://ict.sci.psu.ac.th/std_project/54/231_416/add_regist.php";  // path ไฟล์ 

    function onDeviceReady() {  //ฟังก์ชั่นทำงานเมื่อเครื่องพร้อม
        var data_uid=device.uuid; // เก็บค่า uid 
        // แสดงข้อความถึง event ที่เกิดขึ้น  ส่วนนี้ ใช้งานจริง สามารถลบออกได้
        $("#app-status-ul").append('<li>deviceready event received</li>');
        $("#app-status-ul").append('<li>UID'+data_uid+'</li>');  // แสดงค่า uid

        // ส่วนนี้ไม่เกี่ยวโดยตรงสักเท่าไหร่ แต่ประยุกต์ได้ เป็น event เมื่อกดปุ่ม back ที่เครื่อง
        document.addEventListener("backbutton", function(e){
            $("#app-status-ul").append('<li>backbutton event received</li>');
            // ถ้าหน้านี้มี div id เท่ากับ home แล้วถ้ากดปุ่ม back ให้ทำอะไร
            if( $("#home").length > 0){
                // ใน commnet ด้านล่าง เขาแนะนำว่า เราอาจจะยกเลือกการ register เมื่อ
                // เกิดขึ้นในกรณีตามกล่าวข้างต้น
                // call this to get a new token each time. don't call it to reuse existing token.
                //pushNotification.unregister(successHandler, errorHandler);
                e.preventDefault();
                navigator.app.exitApp(); //ปิด app ถ้าอยู่หน้า home
            }else{
                navigator.app.backHistory();  // ย้อนกลับแบบปกติ ถ้าอยู่หน้าอื่น
            }
        }, false);

        try{   // เรียกใช้งาน plugin push
            pushNotification = window.plugins.pushNotification;
            $("#app-status-ul").append('<li>registering ' + device.platform + '</li>');
            
            if(device.platform == 'android' || device.platform == 'Android' ||
                    device.platform == 'amazon-fireos' ) {
                    pushNotification.register(successHandler, errorHandler, {  // ทำการลง register 
                        "senderID":"287041799426",    // เปลี่ยนเป็นค่า project name จาก phonegap ตอนที่ 9
                        "ecb":"onNotification"
                    });		// required!
            }
        }catch(err){  // กรณีเกิดข้อผิดพลาด
            txt="There was an error on this page.nn"; 
            txt+="Error description: " + err.message + "nn"; 
            alert(txt); 
        } 
    }

    // จัดการกับข้อ GCM notifications สำหรับ Android
    function onNotification(e) {
        // แสดงสถานะ ใช้งานจริง ตรงนี่ิตัดออกได้ 
        $("#app-status-ul").append('<li>EVENT -> RECEIVED:' + e.event + '</li>');

        switch( e.event ){  // การทำงานกับเงื่อนไขเหตุการณ์ที่เกิดขึ้น
            case 'registered':  // มีมีการ registered
                if( e.regid.length > 0 ){  // มีค่า regid
                    // ข้อความแสดงสถานะการทำงาน ใช้งานจริง ตรงนี่ิตัดออกได้ 
                    $("#app-status-ul").append('<li>REGISTERED -> REGID:' + e.regid + "</li>");

                    // ทดสอบดูค่า regiid ใช้งานจริงปรับได้ตามต้องการ
                    console.log("regID = " + e.regid);
                    
                    // ส่งค่า regid และ uid ไปบันทึกไว้บน server
                    $.post(php_addRegist,{

                        uid:device.uuid, // คล้าย id เครื่องเรา
                        regid:e.regid,
                        datetime:moment().format('YYYY-MM-DD HH:mm:ss')
                    },function(data){
                        alert(data); // ทำงานตามต้องการ ในที่นี้ทดสอบ ให้ alert ค่าที่ได้จากไฟล์ add_regist.php
                    });
                }
                break;
            case 'message':  // เมื่อได้รับข้อความ push
                // ถ้าเราเปิด app อยู่ หมายถึง กำลังใช้งาน app จะให้ทำอย่างไร
                if (e.foreground){
                    // ใสคำสั่งส่วนนี้ตามต้องการ  ในตัวอย่าง เขาจะบอกแค่สถานะว่า เป็นการแจ้งแบบ inline
                    $("#app-status-ul").append('<li>--INLINE NOTIFICATION--' + '</li>');
                    
                }else{ // กรณีอื่นๆ หรือก็คือ เมื่อมี push มา
                    
                    if(e.coldstart){ // แล้วเรากดที่ ข้อความ push ด้านบน
                        // ก็จะเข้ามาทำงานในส่วนนี้ กำหนดตามต้องการ
                        $("#app-status-ul").append('<li>--COLDSTART NOTIFICATION--' + '</li>');
                    }else{
                        // กรณีอื่นๆ เช่น ทำงานแบบ background
                        $("#app-status-ul").append('<li>--BACKGROUND NOTIFICATION--' + '</li>');
                    }
                }

                // แสดงข้อความ e.payload.message คือค่าข้อความทีเราได้ เราสามารถส่งตัวแปร อื่นๆ ตามต้องการได้
                // ส่วนนี้ทำงานเม่อได้รับข้อความ push
                $("#app-status-ul").append('<li>MESSAGE -> MSG: ' + e.payload.message + '</li>');
                break;
            case 'error':  // กรณี error
                $("#app-status-ul").append('<li>ERROR -> MSG:' + e.msg + '</li>');
                break;
            default:  // อื่นๆ 
                $("#app-status-ul").append('<li>EVENT -> Unknown, an event was received and we do not know what it is</li>');
            break;
        }
    }

    // ฟังก์ชั่นเมื่อ process สำเร็จ  
    function successHandler (result) {      
        // เวลาใช้งานจริง บรทดัต่อจากนี้สามารถตัดออกได้ หรือใช้กำหนดค่าอื่นตามต้องการได้
        $("#app-status-ul").append('<li>success:'+ result +'</li>');
    }
// ฟังก์ชั่นเมื่อ process เกิดข้อผิดพลาด 
    function errorHandler (error) {
        // เวลาใช้งานจริง บรทดัต่อจากนี้สามารถตัดออกได้ หรือใช้กำหนดค่าอื่นตามต้องการได้
        $("#app-status-ul").append('<li>error:'+ error +'</li>');
    }

    // ให้ไปทำงานฟังก์ชัน onDeviceReady เมือ cordova โหลดเรียบร้อยแล้ว
    document.addEventListener('deviceready', onDeviceReady, true);

 </script>  
</body>
</html>

add_regist.php

<?php
header("Content-type:text/html; charset=UTF-8");            
header("Cache-Control: no-store, no-cache, must-revalidate");         
header("Cache-Control: post-check=0, pre-check=0", false);      
// เชื่อมต่อกับฐานข้อมูล      
$link=mysql_connect("**************","**************","**************"); // เชื่อมต่อ Server        
mysql_select_db("**************");  // ติดต่อฐานข้อมูล        
mysql_query("set character set utf8"); // กำหนดค่า character set ที่จะใช้แสดงผล   
if(isset($_POST['uid']) && $_POST['uid']!="" && isset($_POST['regid']) && $_POST['regid']!=""){
	$id_reg=@mysql_result(@mysql_query("
	SELECT id FROM regid WHERE uid='".$_POST['uid']."'
	"),0,0);
	if($id_reg>0){
		@mysql_query("
		UPDATE regid SET
		val='".$_POST['regid']."',
		datetime_update=''".$_POST['datetime']."' 
		WHERE uid='".$_POST['uid']."'
		");
		echo 2;
	}else{
		@mysql_query("
		INSERT INTO regid(
			id,val,uid,datetime_add,datetime_update,regist
		)VALUES(
			NULL,'".$_POST['regid']."','".$_POST['uid']."','".$_POST['datetime']."','".$_POST['datetime']."','1'
		)
		");
		echo 1;
	}
}else{
	echo 0;	
}
?>


โดย:  Natjadee IP: 110.164.182.xxx วันที่: 03-12-2014 เวลา: 09:02:45
 ความคิดเห็นที่ 13
C:AppServwwwstd_project54231_416pusher.php on line 71

ผลที่เอามาวาง นี้จากของจริง หรือก็อบปจากด้านล่าง
เพราะถ้าจากของจริง ทำไม path ถึงเป้น drive C ซึ่งเแสดงว่ารันที่เครื่อง 

เอา url ที่เรารันไฟล์มาโชว์ด้วยดู

ตามที่ทดสอบในเว็บ ก็เช่น http://www.ninenik.com/test_push.php ประมาณนี้
ของเรา ใช้ประมาณไหน ลองเอามาวางดู ไม่ต้องวางหมด เปลี่ยนค่าที่เป็นเฉพาะเป็น xxx แทนได้

โดย:  Ninenik IP: 1.47.17.xxx วันที่: 03-12-2014
 ความคิดเห็นที่ 12
ผมเอาค่า regid จากฐานข้อมูลที่มันเก็บ

แล้วเทียบกับบนเครื่องที่มันแสดงอยู่ ก้อตรงกันน่ะครับ

ผลที่ได้ก้อเกิดอาการเดิมครับ


<?php
header("Content-type:text/html; charset=UTF-8");            
header("Cache-Control: no-store, no-cache, must-revalidate");         
header("Cache-Control: post-check=0, pre-check=0", false);      
// ส่วนตั้งค่าการใช้งาน push
include("pusher.php");
$apiKey = "***************************************";  // ค่าา api key จาก phonegap ตอนที่ 9 Key for browser applications
$pusher = new Pusher($apiKey);


$regId=array("**********************************"); // ใส่ regid จากในฐานข้อมูล


// prep the bundle
$msg = array
(
    'message'   => 'ทดสอบ',
    'title'     => 'Push',
);
$pusher->notify($regId, $msg);
 echo "<pre>";
print_r($pusher->getOutputAsArray());
echo "</pre>";
?>


Warning: json_encode() expects exactly 1 parameter, 2 given in C:AppServwwwstd_project54231_416pusher.php on line 71
JSON_PARSING_ERROR: Unexpected token END OF FILE at position 0.



โดย:  Natjadee IP: 110.164.182.xxx วันที่: 03-12-2014 เวลา: 00:11:00
 ความคิดเห็นที่ 11
โค้ดก็ถูกหมดน่ะ  ลองเอาค่ามา regid มาใส่ตรงตามความเห็นที่ 8 ดู 
อาจะเป็นไปได้ไหม ที่ server ไม่รองรับ curl ฟังก์ชั่น

โดย:  Ninenik IP: 1.47.17.xxx วันที่: 03-12-2014
 ความคิดเห็นที่ 10
server เป็นของสาขาวิชาครับ

ไม่ได้รันบน localhost เครื่องตัวเองครับ


นี้เป็นไฟล์ test_push.php
<?php
header("Content-type:text/html; charset=UTF-8");            
header("Cache-Control: no-store, no-cache, must-revalidate");         
header("Cache-Control: post-check=0, pre-check=0", false);      
// เชื่อมต่อกับฐานข้อมูล      
$link=mysql_connect("***********","***********","***********"); // เชื่อมต่อ Server        
mysql_select_db("***********");  // ติดต่อฐานข้อมูล        
mysql_query("set character set utf8"); // กำหนดค่า character set ที่จะใช้แสดงผล   
// ส่วนตั้งค่าการใช้งาน push
include("pusher.php");
$apiKey = "***********";  // ค่าา api key จาก phonegap ตอนที่ 9
$pusher = new Pusher($apiKey);


$regId=array();
$q="
SELECT * FROM regid
";
$qr=mysql_query($q);
while($rs=mysql_fetch_assoc($qr)){
	$regId[]=$rs['val'];
}


// prep the bundle
$msg = array
(
    'message'   => 'ทดสอบ',
    'title'     => 'Push',
);
$pusher->notify($regId, $msg);
 echo "<pre>";
print_r($pusher->getOutputAsArray());
echo "</pre>";
?>

นี้เป็นไฟล์ pusher.php คับ

<?php
class Pusher
{
    const GOOGLE_GCM_URL = 'https://android.googleapis.com/gcm/send';
 
    private $apiKey;
    private $proxy;
    private $output;
 
    public function __construct($apiKey, $proxy = null)
    {
        $this->apiKey = $apiKey;
        $this->proxy  = $proxy;
    }
 
    /**
     * @param string|array $regIds
     * @param string $data
     * @throws Exception
     */
    public function notify($regIds, $data)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, self::GOOGLE_GCM_URL);
        if (!is_null($this->proxy)) {
            curl_setopt($ch, CURLOPT_PROXY, $this->proxy);
        }
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHeaders());
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $this->getPostFields($regIds, $data));
 
        $result = curl_exec($ch);
        if ($result === false) {
            throw new Exception(curl_error($ch));
        }
 
        curl_close($ch);
 
        $this->output = $result;
    }
 
    /**
     * @return array
     */
    public function getOutputAsArray()
    {
        return json_decode($this->output, true);
    }
 
    /**
     * @return object
     */
    public function getOutputAsObject()
    {
        return json_decode($this->output);
    }
 
    private function getHeaders()
    {
        return array('Authorization: key=' . $this->apiKey,'Content-Type: application/json');
    }
 
    private function getPostFields($regIds, $data)
    {
        $fields = array(
            "registration_ids" => is_string($regIds) ? array($regIds) : $regIds,
            "data"=> is_string($data) ? array('message' => $data) : $data,
        );
        return json_encode($fields, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE);
    }
}
?>


โดย:  Natjadee IP: 110.164.182.xxx วันที่: 03-12-2014 เวลา: 00:02:59
 ความคิดเห็นที่ 9


โดย:  Natjadee IP: 110.164.182.xxx วันที่: 02-12-2014 เวลา: 23:50:32
 ความคิดเห็นที่ 8
เราโพสแจ้งปัญหา ก็ช่วยอะไรไ่ได้ ต้องลิ้สอะไรสักอย่างมาประกอบ ไม่ลองโพสโค้ดหน้า test_pusth.php มาดูหน่อยหรอ
อันไหนเป็นค่าเฉพาะ ก็เปลี่ยนเป็น xxx ก่อนโพส  
และก็ url ที่เราเรียกใช้ ว่่าใช้ที่ server นี้คือแบบไหน ไม่ใช่ที่เครื่องแล้วรัน php ได้น่ะ อันนั้นคนละอัน

หรือง่ายสุด เอาค่า val หรือที่เก็บ regid มาใส่ในโค้ดทดสอบนี้ดู อันนี้แบบทดสอบส่งตรงๆ เลย ไม่ต้องไปดึงฐานข้อมูล

<?php
header("Content-type:text/html; charset=UTF-8");            
header("Cache-Control: no-store, no-cache, must-revalidate");         
header("Cache-Control: post-check=0, pre-check=0", false);      
// ส่วนตั้งค่าการใช้งาน push
include("pusher.php");
$apiKey = "xxxxxx";  // ค่าา api key จาก phonegap ตอนที่ 9
$pusher = new Pusher($apiKey);


$regId=array("xxxxxxxxxxxxx"); // ใส่ regid


// prep the bundle
$msg = array
(
    'message'   => 'ทดสอบ',
    'title'     => 'Push',
);
$pusher->notify($regId, $msg);
 echo "<pre>";
print_r($pusher->getOutputAsArray());
echo "</pre>";
?>


โดย:  Ninenik IP: 1.47.17.xxx วันที่: 02-12-2014
 ความคิดเห็นที่ 7
เกิดปัญหาเดิมเลยคับพี่นิก

โดย:  Natjadee IP: 110.164.182.xxx วันที่: 02-12-2014 เวลา: 23:37:55
 ความคิดเห็นที่ 6
มีการบันทึกลงฐานข้อมูลแล้วครับ

เด๋วผมจะลองอีกทีอย่างละเอียดครับ



โดย:  Natjadee IP: 110.164.182.xxx วันที่: 02-12-2014 เวลา: 22:46:25
 ความคิดเห็นที่ 5

ลองอ่านบทความดีๆ เราข้าม หรือตก ส่วนไหนไปหรือเปล่า

ดูว่า ที่ server ในฐานข้อมูลมีการบันทึกค่า val ของ regid เครื่องหรือเปล่า 



โดย:  Ninenik IP: 1.47.144.xxx วันที่: 02-12-2014
 ความคิดเห็นที่ 4
ผมลง server แล้วครับ

เกิด error อย่างที่ให้ดูครับ

โดย:  Natjadee IP: 110.164.182.xxx วันที่: 02-12-2014 เวลา: 21:12:25
 ความคิดเห็นที่ 3
ทดสอบที่ server เลย ที่เครื่องน่าจะไม่ได้

โดย:  Ninenik IP: 171.96.17.xxx วันที่: 02-12-2014
 ความคิดเห็นที่ 2
เป็นแบบนี้คับ


Warning: Unexpected character in input: '' (ASCII=92) state=1 in C:AppServwwwstd_project54231_416pusher.php on line 36

Warning: json_encode() expects exactly 1 parameter, 2 given in C:AppServwwwstd_project54231_416pusher.php on line 71
JSON_PARSING_ERROR: Unexpected token END OF FILE at position 0.




โดย:  Natjadee IP: 110.164.182.xxx วันที่: 02-12-2014 เวลา: 16:37:31
 ความคิดเห็นที่ 1
ก้อบโค้ดไฟล์ pusher.php ไม่สมบูรณ์หรือเปล่า ลองโหลดจากนี้แทนดู

http://www.ninenik.com/download/pusher.rar



โดย:  Ninenik IP: 171.96.17.xxx วันที่: 02-12-2014