WooCommerce Notify 增加三竹簡訊發送

WooCommerce Notify 增加三竹簡訊發送

繼 Every8d 後,WooCommerce 推播通知外掛整合了另一家老牌的簡訊服務:三竹簡訊,讓已經有在使用三竹簡訊的客戶可以直接沿用相同的帳密來發送簡訊。雖然簡訊 API 的串接相較於金物流來說單純許多,這邊記錄下串接的過程:

1.使用 API 發送簡訊需要透過客服申請

可能是因為太習慣國外的服務,要串接 API 直覺上就是申請一個帳號,然後登入後台就可以看到 API Key,把 API 網址跟 Key 丟進去程式碼,然後就搞定了,結果這一關我卡超久,怎麼打都是直接回傳 HTML,跟文件寫的回傳內容完全不同。

後來才知道要使用 API 需要寫信給客服,綁定後台登入 IP 以及 API 請求主機 IP,並且使用客服提供的 API URL 才能正確請求,整個申請的流程是:發信給客服 > 接到電話詢問簡訊使用目的 > 收到業務客戶資料卡,填寫 IP 與相關資訊後回傳 > 得到 API URL 與後台登入帳密。

會有這麼多流程在想應該是因為簡訊詐騙太氾濫,讓他們必須要人工審核,開通後就可以拿到 300 點的試用點數,本來以為會不夠用,但我實際串接完後大概還剩 250 點,綽綽有餘~

2.簡訊內文中文字產生亂碼

串接文件中寫到,如果發送的簡訊內文帶有中文字,需要進行 URL Encode,為了讓英文也能相容,我將 CharsetURL 參數從預設的 Big5 修改為 UTF8,本以為這樣就行,結果發出的每一封簡訊都還是亂碼,後來才知道 CharsetURL 是網址查詢參數而非請求參數,我原始的寫法如下:

<?php

$response = wp_remote_request(
	$this->send_sms_url,
	array(
		'method'  => 'POST',
		'timeout' => 60,
		'headers' => array(
			'Content-Type' => 'application/x-www-form-urlencoded',
		),
		'body'    => http_build_query(
			array(
				'CharsetURL' => 'UTF-8' // 不應該放在請求參數
				'username'   => $this->username,
				'password'   => $this->password,
				'dstaddr'    => $phone,
				'smbody'     => $message,
				'clientid'   => time(),
				'response'   => rest_url() . 'wc-notify/v1/sms/callback',
			);
		),
	);
);

正確的寫法應該是接在 $this->send_sms_url 後面作為查詢參數才對:

<?php

$response = wp_remote_request(
	$this->send_sms_url . '?CharsetURL=UTF-8', // 放在網址查詢參數才對
	array(
		'method'  => 'POST',
		'timeout' => 60,
		'headers' => array(
			'Content-Type' => 'application/x-www-form-urlencoded',
		),
		'body'    => http_build_query(
			array(
				'username'   => $this->username,
				'password'   => $this->password,
				'dstaddr'    => $phone,
				'smbody'     => $message,
				'clientid'   => time(),
				'response'   => rest_url() . 'wc-notify/v1/sms/callback',
			);
		),
	);
);

3.更新簡訊發送狀態

三竹簡訊比 Every8d 貼心的地方是前者會主動通知簡訊發送結果,由於發簡訊是一種非同步狀態,不是呼叫發送 API 就能即時收到簡訊,常常會有各種狀況讓簡訊無法正確傳送,像是手機空號、基地台延遲等等的狀況,因此需要採用背景通知的方式來更新狀態。

在三竹的 API 中提供了一個 response 參數來主動通知,也就是當簡訊狀態更新時他們會主動請求這個網址,並且將簡訊 ID、發送結果一併回傳,我們只要準備好接收即可,在這邊我是開了一個 RESTful API 來處理回傳結果。

雖然 WooCommerce 推播通知外掛有查詢發送紀錄的功能,但在這份自訂的資料表格裡我並沒有設計簡訊 ID 的欄位,由於更新發送狀態使用的是簡訊 ID,所以我必須要能夠從簡訊 ID 回推紀錄 ID 才有辦法更新狀態,在不想新增欄位的情況下該如何處理狀態更新讓我很頭大。

最後想到的方法是「硬塞」,我在儲存發送紀錄的當下,把簡訊 ID 放在已經存在的欄位,當拿到三竹回傳的簡訊 ID 後,再去模糊比對這個簡訊 ID 是屬於哪一條紀錄 ID,找到紀錄 ID 就可以去更新狀態:

WooCommerce Notify 增加三竹簡訊發送

使用 $wpdb 來根據特定欄位中是否帶有簡訊 ID 來回推紀錄 ID:

<?php

/**
 * 自訂資料表查詢
 * 
 * @param string $keyword 搜尋關鍵字
 * @param string $field 搜尋欄位
 * 
 * @return int $result_id 搜尋結果 ID
 */
function db_select( $keyword, $field ) {
	global $wpdb;
	$table_name = $wpdb->prefix . 'notify_history';
	$results    = $wpdb->get_results(
		$wpdb->prepare(
			"SELECT ID FROM {$table_name} WHERE {$field} LIKE %s",
			'%' . $wpdb->esc_like( $keyword ) . '%'
		)
	);
	if ( $results ) {
		foreach ( $results as $result ) {
			return $result->ID;
		}
	}
}

文章標籤wc-notify

目錄

2 則留言

  1. 您好,想請教文中所提到的"WooCommerce 推播通知外掛”有其他確切名稱嗎?
    因為無論在woocommerce的擴充功能,或是wp外掛商店都沒有看到這個東西。
    謝謝您。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

Picture of 賴俊吾 / Oberon Lai
賴俊吾 / Oberon Lai

現為全職 WordPress 工程師,網站開發經歷 11 年,專攻前端工程與 WordPress 佈景主題、外掛客製化開發

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!

專注於分享 WordPress 開發、接案技巧、專案管理等自由工作者必備知識與心得

© 2024 想點創意科技有限公司

想點創意科技有限公司 | 統一編號 90516823
Designed by Hend Design | 隱私權政策

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!