上一節我們使用了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頁面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<%@ 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類來完成短信發送功能,并測試正確性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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程序發送給自己一條短信測試一下了。我的測試結果如下:  ###**3.2 封裝到MessageUtilImpl中** 接下來就要在我們自己的項目中使用這個功能了,我們將上面的流程封裝到MessageUtilImpl工具類中,并抽取接口,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
//抽取后的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 = 0 ; 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()方法,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@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 ); //2. 根據user郵箱地址,發送郵件 String emailAddress = backData.getR8_MP().split( "," )[ 0 ]; emailUtil.sendEmail(emailAddress, backData.getR6_Order()); //3. 發送手機短信 String phoneNum = backData.getR8_MP().split( "," )[ 1 ]; messageUtil.sendMessage(phoneNum, backData.getR6_Order()); System.out.println( "----success!!----" ); } else { System.out.println( "----false!!!----" ); } } } |
從易寶那邊返回的信息中r6_Order參數中保存的是訂單的編號,r8_MP參數中是用戶的郵箱和電話,第一個是郵箱第二個是手機號碼,用逗號隔開了,所以我們首先要獲取用戶的手機號碼,然后再來發送短信。好了,支付完成后給用戶發送短信的功能就完成了。
原文鏈接:http://blog.csdn.net/eson_15/article/details/51475431
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。