【SSH網上商城項目實戰26】完成訂單支付後的短信發送功能

  上一節我們使用了Java mail完成了給買家發送郵件的功能,還遺留一個功能,就是給買家發送短信,告訴他訂單已經生成之類的。這一節主要介紹一下如何在用戶支付完成後自動給用戶發送短信。

1. 申請短信發送功能

  很明顯,我們自己不能發短信,也沒有做短信的功能,所以我們需要去借助第三方的運營商。但是像中國移動,聯通,電信這種不會直接給我們提供短信服務,而是先把短信服務提供給一些運營商,然後這些運營商再提供給我們。
  有一個運營商叫“中國網建sms短信通”(官網地址)。這個運營商可以給我們提供短信的服務,進入官網後可以看下收費標準,當然咯,首次註冊免費送5條短信,不過免費的可能不是太穩定,或者發送的時間比較久,這得看人品,不過付費的基本上都挺好的。他的盈利模式就是用較低的價格從移動,聯通或者電信那邊拿到短信,然後賣給用戶,當然有優惠套餐的,這種一般都是大公司或者有需要向用戶發送短信的業務時會購買。
  首先我們去註冊一個賬號(其實是爲了拿到那5條免費的短息來測試我們的程序),爲了把流程說清楚,我儘量寫詳細一點,請看如下界面:
註冊頁面
  像這些姓名啊,email啊都可以隨便填的,手機填自己的就行了,因爲會收到登陸的用戶名和密碼。登陸後我們可以看到有5條免費短信可以發送,如下:
基本信息
  友情提示:5條免費短信第一天別用完,第二天又會再送5條,然後就不送了~
  然後我們點擊上面圖片中的發送短信,會彈出一個發送短信的界面,我們不是爲了去發送短信,而是去設置一些短信的後綴,即用戶收到短信後,最後面都有個後綴說明來自哪裏,如下:
  填寫後綴
  保存之後,我們點擊左邊欄目中的“短信API接口”,就會跳出關於發送短信的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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

  (友情提示:在測試的時候不要多次測試,一次就夠了,主要看服務器是否正常,還得留幾次後面測試用。也可以將某個參數寫錯,如果返回一個負數,說明服務器是正常的,可以根據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說明發送正常           
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

  接下來就可以運行一下這個java程序發送給自己一條短信測試一下了。我的測試結果如下:
測試結果

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 = 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();
        }
    }
}
  • 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
  • 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

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);
            //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!!!----");
        }
    }
}
  • 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
  • 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

  從易寶那邊返回的信息中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

(function () { ('pre.prettyprint code').each(function () { var lines = (this).text().split(\n).length;var numbering = $('
    ').addClass('pre-numbering').hide(); (this).addClass(hasnumbering).parent().append( numbering); for (i = 1; i
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章