1. 程式人生 > >支付寶批量轉賬介面使用全過程 一一介紹

支付寶批量轉賬介面使用全過程 一一介紹

    關於支付寶批量轉賬介面,我覺得有寫點什麼的必要了,畢竟在裡面走了很多彎路%>_<%,而且網上關於這個的資料少之又少,甚至有人都不知道有這個,寶寶真是快哭了(;′⌒`),下面我來一一詳細介紹。

 1.申請介面

    申請支付寶批量轉賬介面,現在支付寶的這個服務已經下架了,所以是找不到這個簽約的,需撥打 0571-88158090 這個電話去人工申請該介面。然後,他會問你需要的是哪一種服務,一種是在他的平臺上,可以上傳批量打款名單檔案進行批量打款的,另一種是提供一個介面給你,讓你可以在自己的網站上就實現批量打款。當然,我選的是第二種,因為第一種就太簡單了,根本不會遇到很多問題O__O "…。當然,兩種服務,支付寶都是會收取打款手續費的,一筆按照打款金額的0.5%手續費收取,不足1元的按照1元收取,上限為25元。一般大概會有五個工作日,能拿到這個介面。拿到介面之後(登入商家賬戶,會看到簽約產品裡面有一個批量付款到支付寶,說明介面拿到了),可以到支付寶文件中心去下載demo,地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7386797.0.0.I0MkUm&treeId=64&articleId=103569&docType=1

2.使用介面

   2.1後臺方面

    得到下載包後,裡面有多種語言的demo,我使用的是batch_trans_notify-JAVA-UTF-8。拿到這個demo之後,很簡單,裡面的東西都不要動,只需要修改這幾個地方:

     com.alipay.config.AlipayConfig檔案

          partner屬性即是你的合作身份者ID---PID

          key屬性即是商戶私鑰---安全檢驗碼

登入商家賬戶有一個“檢視PID、Key”的按鈕,可以看到自己的PID和Key,對於Key,需注意幾點:

      1.批量轉賬支援MD5加密的資料簽名,也支援RSA加密的資料簽名(當然,支付寶提供給我們的demo預設只有MD5加密)

      2.“檢視PID、Key”看到的"預設加密"即是MD5私鑰,對於我們的demo,把看到的這個私鑰填入key即可完成AlipayConfig的所有配置^_^

      3.頁面下面還有個“RSA加密,檢視金鑰即是檢視RSA公鑰(支付寶提供給我們RSA金鑰生成器,用於生產公鑰與私鑰,相關操作詳見https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.lOJgU5&treeId=64&articleId=104740&docType=1),後面還有個“支付寶公鑰。對於RSA加密,請將key改為private_key,並填入RSA金鑰生成器生產的私鑰,並在下面新增一個字串“ali_public_key”,值為上面說到的“支付寶公鑰

”。並且,在最後一行將sign_type改為RSA。最後,需要找到Base64.java和RSA.java兩個檔案才能完成RSA簽名,而demo裡面是沒有的,這兩個檔案,大家可以在支付寶實時到賬demo裡面去找,那裡面有^_^。

2.2前臺方面

    demo裡面有三個jsp頁面:

      index.jsp,負責填寫相關資料(具體格式demo註釋有寫)

      alipayapi.jsp,負責處理index.jsp傳入的資料,並呼叫AlipaySubmit檔案相應方法,生成一個html格式的form表單並自動提交到支付寶。

      notify_url.jsp,支付寶非同步通知的頁面,需要在alipayapi.jsp頁面配置notify_url變數,如果,你的專案不在外網上面,支付寶訪問不到你的這個頁面,你可以使用花生殼,使支付寶能夠訪問到你的頁面。關於花生殼,不懂的就自己百度吧^_^。

      下面分別介紹這三個頁面:

           A-index.jsp:

           付款賬號即是你的支付寶賬戶,

           付款賬戶名即是你的商戶名字

           付款當天日期,new SimpleDateFormat("yyyyMMdd").format(new Date())當前日期

           批次號,new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())當前時間的時間戳

           付款總金額,由於訂單是用表格批量顯示的,所以使用js操作dom,獲取勾選狀態的所有訂單的支付金額之和

           付款筆數,同上,獲取勾選狀態的所有訂單數

           付款詳細資料,仍然是使用js進行動態拼接勾選狀態的訂單的相關屬性。

注意:支付寶工作人員說,使用介面的話是無法進行檔案上傳的。所以儘管demo裡面有上傳檔案的方法,但是還是沒有什麼用處的。因此,就出現一個問題,那就是,將上面說到的AlipaySubmit檔案生成的html格式的form表單提交到支付寶會存在一個Request Entity Too Large問題,也就是“請求中提供的資料量超過容量限制。因為無法上傳檔案,因此,如果像支付寶所說的那樣,一次最多可以批量處理1000條是無法真正做到的,因為經過測試,在備註說明為空的情況下,都只能批量上傳大概100條,大概是4500-5000個位元組╮(╯▽╰)╭。

       B-alipayapi.jsp:

           獲取index.jsp傳來的值,建議將付款賬號和賬戶名存放在AlipayConfig檔案中,這樣就不用每次轉賬都要輸入這兩個值了。

           該頁面會把傳來的值放入一個叫做sParaTemp的Map中,然後呼叫AlipaySubmit.buildRequest方法,將sParaTemp以相應的加密方式(MD5/RSA)加密為資料簽名,並放在生成的html格式的form表單的一個名叫sign的input中。當然,這些我們不去關心。buildRequest方法推薦使用post提交方式,也就是其第二個引數。而該方法的第三個引數是生成的html格式的form表單的提交按鈕的value值(嘿嘿,說得有點長^_^),當然,這個提交按鈕是display:none不可見的,所以這個東西要不要都無所謂的,反正是自動提交。

注意:該系統只能在IE下才能實現轉賬功能,這是因為支付寶還不支援其他第三方瀏覽器進行轉賬。(如果瀏覽器為極速模式,那麼轉賬時瀏覽器會自動切換成IE)
          如果你的頁面嵌有iframe,且原視窗跳轉到alipayapi.jsp(window.location.href或者a標籤跳轉)

               對於單筆轉賬,如果瀏覽器為極速模式,那麼轉賬時瀏覽器不會自動切換成IE,所以,對於單筆交易,請切換為IE,再點選批量轉賬,否則可能出現“當前操作環境不支援支付寶控制元件而導致不能轉賬的問題。
               對於多筆轉賬(批量),請使用極速模式,瀏覽器在轉賬時會自動切換為IE,否則,則可能出現批量轉賬申請提交失敗錯誤。

          故,推薦使用新視窗跳轉到alipayapi.jsp,以上問題就都不會出現了。---window.open或者a標籤加target

C-notify_url.jsp:

           非同步通知頁面,一般在輸入密碼、點選轉賬後2-5分鐘,支付寶會根據之前設定的notify_url找到該頁面,進行非同步通知。非同步通知,即是支付寶自動請求該notify_url,並將轉賬處理結果帶入到該頁面,該頁面進行相應處理後,進行out.println("success")輸出,支付寶便知道你已經收到了它的通知,便不再繼續通知(否則會每隔一段時間會繼續通知。而整個過程都是非同步的,即不會造成任何程式或頁面的阻塞、等待。

          相應的通知結果引數在https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.5n5tQs&treeId=64&articleId=104804&docType=1可查閱。主要引數為success_details,fail_details,batch_no,首先AlipayNotify.verify(params)方法會將返回的所有引數params進行資料簽名,以確認是否是支付寶發來的訊息,確認成功後,我們就可以在下面寫上我們自己的業務邏輯程式碼。

          業務邏輯程式碼如:

  String batch_no=request.getParameter("batch_no");
  if(!batch_no.equals(application.getAttribute("batch_no"))){//判斷是否已對該批次做過處理(避免支付寶重複傳送導致的重複處理)
       application.setAttribute("batch_no",batch_no);
       //寫上你的業務邏輯,如將成功的訂單資料庫狀態改為成功,失敗的改為失敗
   }
  out.println("success");//請不要修改或刪除

注意:對於success_details和fail_details,在該demo下可能會出現中文亂碼的情況,大家可以先設定request.setCharacterEncoding("gbk");然後再獲取success_details與fail_details。

                      到這裡,整個過程就完工了!下面是我做的一個小後臺demo,前端使用的是H-UI框架,後臺是servlet+mybatis。有需要原始碼的朋友,請移步:http://download.csdn.net/detail/localhost01/9604148