1. 程式人生 > >【SSH網上商城專案實戰26】完成訂單支付後的簡訊傳送功能

【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>

  (友情提示:在測試的時候不要多次測試,一次就夠了,主要看伺服器是否正常,還得留幾次後面測試用。也可以將某個引數寫錯,如果返回一個負數,說明伺服器是正常的,可以根據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 = 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()方法,如下:

@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引數中是使用者的郵箱和電話,第一個是郵箱第二個是手機號碼,用逗號隔開了,所以我們首先要獲取使用者的手機號碼,然後再來發送簡訊。好了,支付完成後給使用者傳送簡訊的功能就完成了。