上一節我們使用了Java mail完成了給買家發送郵件的功能,還遺留一個功能,就是給買家發送短信,告訴他訂單已經生成之類的。這一節主要介紹一下如何在使用者支付完成後自動給使用者發送短信。
1. 申請短信發送功能 |
很明顯,我們自己不能發短信,也沒有做短信的功能,是以我們需要去借助第三方的營運商。但是像中國移動,聯通,電信這種不會直接給我們提供短信服務,而是先把短信服務提供給一些營運商,然後這些營運商再提供給我們。
有一個營運商叫“中國網建sms短信通”(官網位址)。這個營運商可以給我們提供短信的服務,進入官網後可以看下收費标準,當然咯,首次注冊免費送5條短信,不過免費的可能不是太穩定,或者發送的時間比較久,這得看人品,不過付費的基本上都挺好的。他的盈利模式就是用較低的價格從移動,聯通或者電信那邊拿到短信,然後賣給使用者,當然有優惠套餐的,這種一般都是大公司或者有需要向使用者發送短信的業務時會購買。
首先我們去注冊一個賬号(其實是為了拿到那5條免費的短息來測試我們的程式),為了把流程說清楚,我盡量寫詳細一點,請看如下界面:
像這些姓名啊,email啊都可以随便填的,手機填自己的就行了,因為會收到登陸的使用者名和密碼。登陸後我們可以看到有5條免費短信可以發送,如下:
友情提示:5條免費短信第一天别用完,第二天又會再送5條,然後就不送了~
然後我們點選上面圖檔中的發送短信,會彈出一個發送短信的界面,我們不是為了去發送短信,而是去設定一些短信的字尾,即使用者收到短信後,最後面都有個字尾說明來自哪裡,如下:
儲存之後,我們點選左邊欄目中的“短信API接口”,就會跳出關于發送短信的API(這裡也給出那個連接配接的位址),我們程式設計就需要參考他們提供給我們的API接口,就跟前面做支付功能一樣的,使用易寶給我們提供的官方接口。我們簡單看一下:
上面隻是部分内容,詳情可以點選上面給的連結。我們點選圖檔中密鑰的立即修改,主要是看一下密鑰是啥,然後将密鑰複制下來,儲存一下,後面寫程式的時候要用到。
好了,現在準備工作都做好了,API也有了,現在我們可以着手開發短信功能了。
2. 測試一下第三方伺服器正常與否 |
在開發短信功能之前,我們先來測試一下這個中國網建的伺服器是否正常,根據短信API頁面提供的資料,我們可以使用UTF-8編碼發送接口的位址:
http://utf8.sms.webchinese.cn/?Uid=本站使用者名&Key=接口安全秘鑰&smsMob=手機号碼&smsText=驗證碼:8888
來測試一下
utf8.sms.webchines.cn
是否正常。下面在工程中寫一個test.jsp頁面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ include file="/public/head.jspf" %>
</head>
<body>
<!-- 參數自己要填好 -->
<a href="http://utf8.sms.webchinese.cn/?Uid=本站使用者名&Key=接口安全秘鑰&smsMob=手機号碼&smsText=驗證碼:8888">
測試伺服器
</a>
</body>
</html>
(友情提示:在測試的時候不要多次測試,一次就夠了,主要看伺服器是否正常,還得留幾次後面測試用。也可以将某個參數寫錯,如果傳回一個負數,說明伺服器是正常的,可以根據API頁面提供的參數看相應的負數代表哪裡出錯了。這隻是用來測試的,實際中并不能這麼去發,因為連結中還有我的使用者名和密碼,肯定不行。)
3. 開發短信發送功能 |
###** 3.1 發送短信流程測試** 使用短信發送功能,需要以下三個jar包:(免費下載下傳位址:http://download.csdn.net/detail/eson_15/9528009) - `commons-codec-1.4.jar` - `commons-httpclient-3.1.jar` - `commons-logging-1.1.1.jar` 下面我們先寫一個普通的java類來完成短信發送功能,并測試正确性:
public class SendMessageDemo {
public static void main(String[] args) throws Exception {
//1. 打開浏覽器
HttpClient client = new HttpClient();
//2. 建立請求的方式:get/post
PostMethod post = new PostMethod("http://utf8.sms.webchinese.cn/");//剛剛我們申請的那個伺服器位址
//3. 設定請求的參數資訊
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");//設定轉碼
post.setParameter("Uid", "xxxx");//參數都和上面的一樣
post.setParameter("Key", "xxxx");
post.setParameter("smsMob", "xxxx");
post.setParameter("smsText", "測試一下!");
//4. 送出請求并傳回狀态碼
int code = client.executeMethod(post);
System.out.println("http傳回的狀态碼:" + code);//如果列印出200說明正常
//5. 擷取伺服器端傳回的資料資訊
String result = post.getResponseBodyAsString();
System.out.println("短信發送結果為:" + result);//如果傳回1說明發送正常
}
}
接下來就可以運作一下這個java程式發送給自己一條短信測試一下了。我的測試結果如下: ![測試結果](https://img-blog.csdn.net/20160523122802066) ###** 3.2 封裝到MessageUtilImpl中** 接下來就要在我們自己的項目中使用這個功能了,我們将上面的流程封裝到MessageUtilImpl工具類中,并抽取接口,如下:
//抽取後的MessageUtil接口
public interface MessageUtil {
public abstract void sendMessage(String phoneNum, String id);
//MessageUtilImpl實作類
@Component("messageUtil")
public class MessageUtilImpl implements MessageUtil {
@Override
public void sendMessage(String phoneNum, String id) {
//1. 打開浏覽器
HttpClient client = new HttpClient();
//2. 建立請求的方式:get/post
PostMethod post = new PostMethod("http://utf8.sms.webchinese.cn/");
//3. 設定請求的參數資訊
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
post.setParameter("Uid", "eson_15");
post.setParameter("Key", "0537729d0b59a7e7358b");
post.setParameter("smsMob", "15216771570");
post.setParameter("smsText", "測試一下!");
//4. 送出請求并傳回狀态碼
try {
int code = ;
code = client.executeMethod(post);
System.out.println("http傳回的狀态碼:" + code);
//5. 擷取伺服器端傳回的資料資訊
String result = post.getResponseBodyAsString();
System.out.println("短信發送結果為:" + result);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
post.releaseConnection();
}
}
}
4. 完善payAction |
完成了工具類的封裝,接下來我們把該工具類放到BaseAction中,通過@Resource注解注入進來,供Action使用,下面我們完善前面的payAction中的
backBank()
方法,如下:
@Controller("payAction")
@Scope("prototype")
public class PayAction extends BaseAction<Object> implements ParameterAware {
//省去無關代碼……
public void backBank() {
BackData backData = (BackData)model;
System.out.println(model);
boolean isOK = payService.checkBackData(backData);
if(isOK) {
//1. 更新訂單狀态,參數是自己根據資料庫中的情況傳進去的,用來測試
forderService.updateStatusById(Integer.parseInt(backData.getR6_Order()), );
//2. 根據user郵箱位址,發送郵件
String emailAddress = backData.getR8_MP().split(",")[];
emailUtil.sendEmail(emailAddress, backData.getR6_Order());
//3. 發送手機短信
String phoneNum = backData.getR8_MP().split(",")[];
messageUtil.sendMessage(phoneNum, backData.getR6_Order());
System.out.println("----success!!----");
} else {
System.out.println("----false!!!----");
}
}
}
從易寶那邊傳回的資訊中r6_Order參數中儲存的是訂單的編号,r8_MP參數中是使用者的郵箱和電話,第一個是郵箱第二個是手機号碼,用逗号隔開了,是以我們首先要擷取使用者的手機号碼,然後再來發送短信。好了,支付完成後給使用者發送短信的功能就完成了。
相關閱讀:http://blog.csdn.net/column/details/str2hiberspring.html
整個項目的源碼下載下傳位址:http://blog.csdn.net/eson_15/article/details/51479994
文末福利:“程式員私房菜”,一個有溫度的公衆号~
—–樂于分享,共同進步!
—–更多文章請看:http://blog.csdn.net/eson_15