快錢支付平臺 退款功能

      最近做快錢支付平臺的退款功能,遇到不少問題,在解決問題的過程中,也獲得了不少心得,現在將它們整理出來,以備不時之需。

      首先,在做退款功能前,需要研究《快錢人民幣網關商戶退款接口規範》,弄明白退款所必需的流程,根據接口規範定義,完整的退款流程應該包含以下步驟:

      1. 在我們的web應用中,首先要確定兩個要素:需要退款的訂單本次退款金額,接下來,便是根據快錢接口規範,拼接退款Url地址。

      2. 拼接退款地址時,我們需要先了解接口規範,理解每個參數的含義,下圖是接口規範的定義。

快錢退款提交地址

      merchant_id爲商戶的編號,即快錢的客戶編號,找他們要就是了。

      version與command_type固定不變。

      txOrder爲退款流水號,由你自己制定生成規則,對於快錢來說,你只需要保證生成出來的號碼唯一就OK了。

      amount爲本次退款金額,在提交時最好格式化一下,統一帶兩位小數。

      postdata爲退款提交時間,一般取當前時間,格式爲“yyyyMMddHHMMSS”。

      orderid爲訂單號,是繳費時,由你自己制定規則,生成的訂單編號,同樣要保證唯一性,快錢通過這個編號,找到對應的繳費訂單。

      mac爲加密串,MD5加密,偏移量由快錢提供,加密內容包含退款流水線號、退款金額、提交時間、訂單號等等,用於安全校驗,避免其他參數被修改,導致一系列安全問題。

      以上參數中,merchant_id、version、command_type,這三個是固定不變的,可以放到配置文件中,也可以放到數據庫表格中。

 

      3. 第三步便是由我們的web應用來訪問這個拼接好的地址了,這個地址的返回值是一段XML文檔,只有接受到返回值,才能說明退款流程順利,我們才能進行後續的退款修改數據庫的操作。

      問題是在這個階段發生的,由於某些原因,我們的web服務器是無法連接外網的,也就是說,如果我們的web應用採用服務端訪問這段地址,是永遠獲取不到快錢返回給我們的數據。

      於是,我們決定將訪問操作放在客戶端,由客戶端使用Ajax來訪問這個鏈接,並且由於是Ajax訪問,我們寫了一段非常漂亮,用戶體驗超棒的代碼,但是,很快我們發現又遇到了另外一個問題,那就是js跨域訪問的問題

      嘗試過很多解決辦法,例如:

      JavaSrcipt跨域解決方案(這也是我說服我老大的一個憑據, - -    還是專家博客比較好使!)

      關於跨域有三個辦法,第一個是使用服務端代理,這是一個最常見也最好使的辦法,但是,這個辦法被我們當前的實際條件所拒絕(服務端不能連外網,公司不會因爲這個功能而做出讓步)。

      第二個是使用<script>標籤,利用src的設置來解決問題,這個也做過了嘗試,但是它要求返回的數據必須是Json格式或js文件的格式,而我們又無法要求快錢修改他們的接口定義,所以,這個方案也被否決了。

      第三個便是使用隱藏Iframe,然後,我們在嘗試過程中發現,Iframe只能解決一級域名相同情況下的跨域訪問,在一級域名不同的情況下,一樣存在權限被限制的問題,雖然能看到快錢返回的數據,但根本無法訪問。

      至此,我們似乎走到了衚衕的死角,基本上,在技術層面已經無法解決這個問題了,只能通過溝通,來獲得更多的一些東西。

      後來,一番交涉,我們獲得了一臺內外網中轉的機器,是公司的郵件服務器,解決辦法就是,我在客戶端使用Ajax請求後臺的Action,後臺的Action請求部署在郵件服務器上的web services,然後,這個web services訪問快錢的退款鏈接,終於把這個問題給解決了。


 

      上面解決了思路問題,下面就附貼一些代碼吧!貼點代碼,篇幅都要長一點    - -

      退款相關js

 

      退款Action

 

 

      web services接口定義

 

 

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章