繼 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 就可以去更新狀態:
使用 $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;
}
}
}
2 則留言
您好,想請教文中所提到的"WooCommerce 推播通知外掛”有其他確切名稱嗎?
因為無論在woocommerce的擴充功能,或是wp外掛商店都沒有看到這個東西。
謝謝您。
您好!請參考這邊:https://oberonlai.blog/product/woocommerce-notify/