在 SSH 框架構建的網路商城專案中,完成郵件通知後,我們還需要整合第三方簡訊服務,在用戶支付成功後自動發送簡訊提醒。本文詳細記錄從申請服務、測試 API 到封裝工具類、整合至支付回調的完整流程。
個人無法直接對接三大運營商,需透過簡訊服務商(如「中國網建 sms 短信通」)獲取 API。註冊後可獲得免費測試額度(首日 5 條,次日再送 5 條),並需配置簡訊簽名(後綴)與獲取 API 金鑰。
Uid(用戶名)與 Key(接口密鑰)備用在專案中建立 test.jsp 快速驗證:
<a href="https://utf8.sms.webchinese.cn/?Uid=用戶名&Key=密鑰&smsMob=手機號&smsText=驗證碼:8888">測試服務器</a>
點擊連結若回傳正數(如 1 代表成功),說明服務正常。注意:測試時勿頻繁請求,且含帳密的連結不可用於生產環境。
需引入三個 JAR:commons-httpclient-3.1.jar、commons-codec-1.4.jar、commons-logging-1.1.1.jar。使用 HttpClient 模擬 POST 請求:
public class SendMessageDemo {
public static void main(String[] args) throws Exception {
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("https://utf8.sms.webchinese.cn/");
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
post.setParameter("Uid", "你的用戶名");
post.setParameter("Key", "你的密鑰");
post.setParameter("smsMob", "接收手機號");
post.setParameter("smsText", "測試一下!");
int code = client.executeMethod(post);
String result = post.getResponseBodyAsString();
System.out.println("HTTP 狀態碼:" + code + ",發送結果:" + result); // 1 為成功
post.releaseConnection();
}
}
定義介面與實現類,註冊為 Spring 元件:
public interface MessageUtil {
void sendMessage(String phoneNum, String orderId);
}
@Component("messageUtil")
public class MessageUtilImpl implements MessageUtil {
@Override
public void sendMessage(String phoneNum, String orderId) {
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("https://utf8.sms.webchinese.cn/");
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
post.setParameter("Uid", "eson_15");
post.setParameter("Key", "0537729d0b59a7e7358b");
post.setParameter("smsMob", phoneNum);
post.setParameter("smsText", "您的訂單 " + orderId + " 已支付成功,感謝購買!");
try {
int code = client.executeMethod(post);
String result = post.getResponseBodyAsString();
System.out.println("簡訊發送狀態碼:" + code + ",結果:" + result);
} catch (Exception e) {
throw new RuntimeException("簡訊發送失敗", e);
} finally {
post.releaseConnection();
}
}
}
在 PayAction 的 backBank() 方法中注入 messageUtil,支付驗證通過後發送簡訊:
@Controller("payAction")
@Scope("prototype")
public class PayAction extends BaseAction<Object> implements ParameterAware {
@Resource
private MessageUtil messageUtil;
public void backBank() {
BackData backData = (BackData) model;
boolean isOK = payService.checkBackData(backData);
if (isOK) {
// 1. 更新訂單狀態
forderService.updateStatusById(Integer.parseInt(backData.getR6_Order()), 2);
// 2. 發送郵件
String email = backData.getR8_MP().split(",")[0];
emailUtil.sendEmail(email, backData.getR6_Order());
// 3. 發送簡訊
String phone = backData.getR8_MP().split(",")[1];
messageUtil.sendMessage(phone, backData.getR6_Order());
System.out.println("----success!!----");
} else {
System.out.println("----false!!!----");
}
}
}
易寶回調參數中 R6_Order 為訂單號,R8_MP 為「郵箱,手機」格式,以逗號分隔。
透過第三方簡訊 API 實現支付後通知,關鍵在於:正確申請並配置服務商參數、封裝可復用的工具類、在業務流程關鍵節點調用。此模式同樣適用於註冊驗證碼、物流通知等場景。