Webhook

Code webhook

Ở bước này bạn cần tạo kết nối webhook vào app, để app có thể gửi dữ liệu chuyển khoản bank vào hook trong quá trình xử lý hoàn tất đơn hàng tự động.

Để tạo kết nối webhook bạn cần 3 thông số:

  • Tiền tố: đi liền mã đơn hàng (Vd: ABC123 | ABC là tiền tố, 123 là mã đơn hàng), là nội dung chuyển khoản để xác nhận đơn hàng tự động.

  • Token: mã bí mật truy cập vào webhook

  • Hook URL: web hook URL.

Điền thông tin vào link này và nhấn nút "Tạo qrcode", hình ảnh qrcode sẽ xuất hiện, cuối cùng bạn mở app và tạo kết nối website ở phần Cài đặt.

Webhook xử lý đơn hàng

Đây là webhook chính kết nối website trên app android.

Đối với website không sử dụng WooCommerce, bạn sử dụng mẫu webhook dưới đây. Ví dụ sau sử dụng NodeJS Express Framework làm mẫu:

//webhook for process order
routes.post('/process-order', async (req, res) => {
	var result = {};
	const {data} = req.body;	
	
	result.error=1;
	result.msg = '';

	if(data) {
		
		for(let i=0;i<data.length;i++) {
			result._ok=1;	//important: xác nhận webhook đã xử lý
			
			//lấy nội dung chuyển khoản
			if(is_JSON(data[i].description)) {
				var jsonDes = typeof data[i].description=='string'? JSON.parse(data[i].description): data[i].description;
				if(jsonDes.code) data[i].description = jsonDes.code;
			}
			//số tiền mà khách hàng chuyển khoản
			data[i].amount;	
			
			//your code..
		}
		
	}
	res.status(200).send(result);
});

Ví dụ mẫu với PHP:

<?php
function getHeader(){
	$headers = array();

    $copy_server = array(
        'CONTENT_TYPE'   => 'Content-Type',
        'CONTENT_LENGTH' => 'Content-Length',
        'CONTENT_MD5'    => 'Content-Md5',
    );

    foreach ($_SERVER as $key => $value) {
        if (substr($key, 0, 5) === 'HTTP_') {
            $key = substr($key, 5);
            if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) {
                $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key))));
                $headers[$key] = $value;
            }
        } elseif (isset($copy_server[$key])) {
            $headers[$copy_server[$key]] = $value;
        }
    }

    if (!isset($headers['Authorization'])) {
        if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
            $headers['Authorization'] = sanitize_text_field($_SERVER['REDIRECT_HTTP_AUTHORIZATION']);
        } elseif (isset($_SERVER['PHP_AUTH_USER'])) {
            $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';
            $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass);
        } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) {
            $headers['Authorization'] = sanitize_text_field($_SERVER['PHP_AUTH_DIGEST']);
        }
    }

    return $headers;
}
function payment_handler()
{
	$txtBody = file_get_contents('php://input');
	$jsonBody = json_decode($txtBody);
	if (!$txtBody || !$jsonBody) {
		echo json_encode(['error'=>"Missing body"]) ;
		die();
	}
	if (isset($jsonBody->error) && $jsonBody->error != 0) {
		echo json_encode(['error'=> "An error occurred"]);
		die();
	}
	$header = getHeader();
	$token = isset($header["Secure-Token"])? $header["Secure-Token"]: '';
	if (strcasecmp($token, $this->settings['bank_transfer']['secure_token']) !== 0) {
		echo json_encode(['error'=> "Missing secure_token or wrong secure_token"]);
		die();
	}
	$result = ['msg'=>[],'error'=>0,'rawInput'=> $txtBody];
	if(!empty($jsonBody->data))
	foreach ($jsonBody->data as $key => $transaction) {
		$result['_ok']=1;	//detect webhook ok
		$des = $transaction->description;	//tin nhắn/code
		if(is_JSON($des)) {
			$desJson = is_string($des)? json_decode($des, true): $des;
			if(is_array($desJson)) {
				if(isset($desJson['code'])) {
					$des = $desJson['code'];
				}
			}
		}
		//...code xử lý đơn hàng
		if(empty($result['error'])) break;
	}
	echo json_encode($result);
	die();
}

Webhook phụ

Chúng tôi thêm một webhook phụ, mọi giao dịch của tất cả các website sẽ gọi vào webhook này. Bạn có thể dùng vào mục đích xủ lý thêm dữ liệu theo ý muốn.

Dữ liệu được truyền vào webhook giống như webhook chính.

Last updated