首頁  >  文章  >  Java  >  Java呼叫支付寶支付介面的案例詳解

Java呼叫支付寶支付介面的案例詳解

php是最好的语言
php是最好的语言原創
2018-08-09 13:59:354583瀏覽

一、場景:公司需要在網站上進行支付寶支付。
二、API:使用支付寶開放平台的支付能力-即時到帳介面。支付寶開放平台連結
三、分析:

#1、支付寶的文檔比較容易看,主要是有對應的DEMO,我這裡看的DEMO是JAVA-UTF-8版本。

Java呼叫支付寶支付介面的案例詳解

2、導入DEMO,在com.alipay.config中填入對應的partner和key(在對應的商家後台取得)就可以直接運行了解支付流程了。

Java呼叫支付寶支付介面的案例詳解

3、改寫:我這邊使用的是springmvc mybatis。商品發起購買(走支付寶支付)、跳到支付寶、支付寶回呼支付狀態。

四、實作:

1、商品發起購買請求(將DEMO中的頁面直接拿過來用了)。

[javascript] view plain# copy


  1. #  

  2.     

    class

    #="header">  

    #
  3.         

    class

    =「容器黑色」#>

  4. ##            

    class# > ##                

    class

  5. =
  6. "小代碼" > ##                    Java呼叫支付寶支付介面的案例詳解"16px"##cm#cm#moooo "

  7.  id=
  8. "licode"> #

  9.                     

    #class

    =##"N"showqrs"##>> ">

  10.                         

                            

  11.                             Java呼叫支付寶支付介面的案例詳解"img/guanzhu_qrcode.png" width= 《 80》> #
  12.                             <) margin-top:5px;">                 ##                                            

    class

    =
  13. #"shmsg"

  14.  style=
  15. "margin-bottom:5px;">  

  16. ###################################### #####                               地接收重要資訊                #################       ;/p>  ##################                    <)    ######
  17.             

  18.         

  19.         

    class

    ##=##"容器"

  20.             

    class##"nav"

  21. "nav"
  22.                 "https://www.alipay.com/"## href="https://www.alipay.com/"## 

    #######' #class######=######"logo"######>Java呼叫支付寶支付介面的案例詳解 ##########
  23.                 class=#"pier"##></1>

  24. #                "http://open.alipay.com/platform/#home.htm"##」http://open.alipay.com/platform/#home. class="open" target="_blank">開放平台  
  25. #                 
  26. N#( ##>  

  27. #                  .com/doc2/detail?treeId=62&articleId=103566&docType=1" target="_blank">線上文件 li>  

    ###
  28.                     

  29. "_blank">技術支援

       #                  
  30.           p>  
  31.         

    class

    #=

    "container blue"
  32. # >              

    class

    =

  33. "title"
  34. >支付寶即時到帳(create_direct_pay_by_user)

            #  &  #      
  35.     

    class

  36. ##    

    class##=

  37. #"content"
  38. >  #

  39.         "${ctx}/aliPay/open" class="alipayform" method=#"POST" target=##"_blank"> --%>  

  40. #           ##  ## ##"element" style="margin-top:60px;"

  41. >  
  42. ######################### ######                

    #####################            

      #######
  43.             

    class

  44. #                

    ##=Ngt;商家訂單編號:

    ##                

    class

  45. #=##"ein 「文字」名稱=「WIDout_trade_no」 id=「out_trade_no」 >

                    
  46.                 

    class

    #= ).必填(建議是英文字母與數字,不能含有特殊字元)

      
  47.             

  48. #              
  49.     
  50. #"element"

    >            ”

  51. ##               ## 

    "etitle">商品名稱:

      
  52.                 

    class

    #=#"einput"##<input; #"text" name="WIDsubject" id="WIDsubject"# value="test商品123">

      
  53.         _   
  54. #                

    #class

  55. ="mark"#注意產品搭配產品名稱(subject),必填(建議中文,英文,數字,不能含有特殊字符)

                 ;  
  56.             

    class

  57. =
  58. #」element> #

  59.                 

    class

    #=#"etitle"> ;  

  60.                 

    class

    #"einput" #>"text" name="WIDtotal_fee" id="WIDtotal_fee " value="0.01">

      
  61. #                
      

  62.                 

    class="mark" >注意:付款金額(total_fee),必填(格式如:1.00,請精確到分)

      
  63. #            

      
  64.             

    class

    =### ##                

    class

  65. =
  66. #"etitle"class=>商品描述/p>  

  67.                 

    class="einput" >"text" name="WIDbody" id= "WIDbody" value="即時到帳測試">

      
  68. #                
      

    #########################################
  69.                 

    class

    #=#"mark"

    S)注意商品描述(body描述,選填(建議中文,英文,數字,不能含有特殊字元)  
  70.           
  71. #          ”             

    class

    ##="element"##> 

  72. ##                "button" class="alisubmit" id="sbumitBtn" value ="確認付款">

  73.             

      
  74. #    

    "returnAli">

      >  ############>  #########
  75.     

    class

    #="頁腳">

  76. ##        

    class=#"footer-sub"# >

  77. ##            "http://ab.alipay.com/i/index.htm"# target="_blank">關於支付寶|;
  78. ##            "https://e.alipay.com/index.htm"

    # target=#"_blank">商業中心

    |
  79.             "https://job.alibaba.com/zhaopin/index.htm"#"https://job.alibaba.com/zhaopin/index.htm" # # target="_blank">誠徵英才| #
  80.             "http://ab.alipay.com/i/lianxi.htm" target "_blank">聯絡我們|

  81. ##            "#"

     id="國際""#" id=  target="_blank">國際業務

    |
  82.             "http://ab.alipay.com/i/jieshao.htm#en"  target="_blank">關於支付寶

  83.             

  84.              所有在支付寶版權

  85.             class#="頁腳日期"#> ; 2004-2016

  86.             "http://fun.alipay.com/certificate/jyxkz.htm""http://fun.alipay.com/certificate/jyxkz.htm"  target="_blank">ICP證:滬B2-20150087

    #######
  87.         

      
  88. #  

  89.   
  90.   


  

1

             

    

  
#      

o

Sbody;/p>
  1. ##2、點擊確認付款之後,這裡透過ajax要求後台,將傳回的一段html程式碼直接放到上面的

    中,這個表單會自動提交。

    [javascript]
  2.  view plain
  3.  copy

    $(

    function
  4. # (){  

  5. #    $("#sbumitBtn"#).on('click'

    , #######function#### ###(){  #####################        $.ajax({  ################## type : ###"post"######,  ##########
  6.             資料 : {  

  7.     ).val(),  

  8. ##卷

    #                WIDtotal_fee : $('#WID 

  9.                 WIDbody : $('#WIDbody'#            ,  

  10.            ##           .

    #                $(
  11. '#returnAli'
  12. ##).append(data.sHtmlText);

  13.             },  

  14. ####################################################################。
  15.             error : function##(da){   

  16.         });  

  17. #    })  

  18. #    })  

    #    }) 
  19.       

  20. #});  


##3、後台controller中,基本上是將demo中的alipayapi.jsp直接拿來用了,不同的是,參數的傳遞是自己定義的,返回方式符合apringmvc要求,並且根據業務需求保存了狀態為未支付的訂單資訊。

[javascript] view plain copy


  1. @RequestMapping("open")  

  2. #public ResponseEntity open(Model model, String WIDout_trade_no, String WID ## String ##        String WIDbody) {  

  3.   

  4.     //////////////////////////////////// / 請求參數/////////////////////////////////////#  

  5.   

  6.     
  7. // 商家訂單編號,商家網站訂單系統中唯一訂單號,必填

      

  8.     String out_trade_no = WIDout_trade_no;  

  9.     
  10. // 訂單名稱,必填

      

  11.     String subject #    String subject = 

        String subject = ##ject  #ject  
  12.     
  13. // 付款金額,必填
  14.   

  15. #    String total_fee = WIDtotal_fee;  

  16. ##    #// 商品說明,可使用空白#    // 商品說明,可使用空白#  

  17. #    String body = WIDbody;  

      

    ################  #####################  #####################  ######### ####    ###// 將請求參數打包成數組######  ####################    Map();  #####################    sParaTemp.put(###"service" ######, AlipayConfig.service);  ##########
  18.     sParaTemp.put("partner", AlipayConfig.partner);

  19. ##    sParaTemp.put("seller_id", AlipayConfig.seller_id);

  20. ##    sParaTemp.put(

    "_input_charset", AlipayConfig.input_charset);

  21. ##    sParaTemp.put(
  22. " payment_type"

    , AlipayConfig. payment_type);

    ##    sParaTemp.put(
  23. "notify_url"
  24. , AlipayConfig.notify_url); ##    sParaTemp.put(

    "return_url"
  25. , AlipayConfig.return_url);

    ##    sParaTemp.put("anti_phishing_key"

    ##, AlipayConfig.anti_phishing_key);
  26. ##    sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip);

  27. ##    sParaTemp.put("out_trade_no", out_trade_no);

  28. ##    sParaTemp.put("subject", subject);

  29. ##    sParaTemp.put("total_fee", total_fee); #

  30.     sParaTemp.put("body", body);  

  31. #    // 其他業務參數根據線上開發文檔,新增參數.文檔位址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId= 62&articleId=103740&docType=1  

  32. #    

    // 如sParaTemp.put("參數名稱","參數值");
  33.   

    #  

  34. ##     #// 建立請求  

        String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, 
  35. "get"
  36. #"get"

    #, "確認"##);  

  37.     model.addAttribute(" sHtmlText"

  38. , sHtmlText);  
  39. #  

  40. ##  

    ################ #    ###// 保存付款記錄######  #####################    hysWebMeetingAliService.insertSelective(sParaTemp);  hysWebMeetingAliService.insertSelective(sParaTemp);  hysWebMeetingAliService.insertSelective(sParaTemp);  #####」
  41.     returnnew ResponseEntity(model, HttpStatus.OK);  

  42. #}  



#4、回呼:也是直接將DEMO中的notify_url.jsp中的java程式碼拿來稍微做了修改和加上業務程式碼(修改狀態等);

[javascript] view plain

 copy
  1. #@RequestMapping(

    "notify"
  2. )  

    @ResponseBody  

  3. public String notify(HttpServletRequest request){  

    ### ############    ###//取得支付寶POST來回饋訊息######  #########
  4.     地圖 params = new HashMap();

  5.     對映 requestParams = request.getParameterMap();

  6.     #for (迭代器iter = requestParams.keySet().iterator(); iter.hasNext(); ) {

  7.         字串名稱 = (String) iter.next();

  8.         String[] 值 = (String[]) requestParams.get(name);

  9.         字串 valueStr = "";

  10. ##        for (int i = 0; i

  11.             valueStr valueStr   values[i]  

  12.                    

            }  
  13. ######################################################################################################################################################### #
  14.         //亂碼解決,此程式碼出現亂碼時使用。如果mysign和sign不相等也可以使用此程式碼轉換  

  15.         //valueStr = new String( valueStr.getBytes("ISO-8859-1"), "gbk");  

  16.        , valueStr);  

  17.     }  

  18.       

  19. ##    

        //取得支付寶的通知回傳參數,可參考技術文件中頁跳同步通知參數清單(下列僅供參考)//  

  20. #    //商家訂單號碼  

  21. #  

  22.     String out_trade_no = request.getParameter(

    "out_trade_no"); 

  23. '

  24. #  
  25. #    //支付寶交易號碼

    #  ###### ################  ##################    String trade_no = request.getParameter(###"trade_no"### ###);  #####################  ##################    ###//交易狀態######  #########
  26.     String trade_status = request.getParameter("trade_status");  

  27.   

  28.     //取得支付寶的通知回傳參數,可參考技術文件中頁跳到同步通知參數清單(以上僅供參考)//  

  29.   

  30.     #if(AlipayNotify.verify(params)){//驗證成功  

  31.         /////////////////////////////////////////// ////////////////////////////////////////////////  

  32.         //請在此加上商家的業務邏輯程式碼  

  33. #  

  34.         //—請根據您的業務邏輯來編寫程式(以下程式碼僅供參考)—  

  35.         boolean# flg false;  

    #
  36.         if(trade_status.equals(##"TRADE_FINISHED")){  #"TRADE_FINISHED")){  

  37.             //判斷該筆訂單是否已在商家網站中已做過處理  

  38. #'

    ##                ##已/ ##  

  39.                 #//請務必判斷請求時的total_fee、seller_id與通知時取得一致的請求時的total_fee、seller_id與通知時取得的一致請求的

      
  40. #                #//有在有資格做過的業務程序」

  41. #d #  

                      

    # #### ###  #####################            ###//退款日期超過可退款期限後(如三個月可退款),於支付寶系統發送該交易狀態通知######  ##########
  42.         } else if (trade_status.equals(#"TRADE_SUCCESS# (trade_status.equals(#"TRADE_SUCCESS# 》 )){  

  43.             //判斷該筆訂單是否已在商家網站中已處理  

  44.                 ///如沒有製作,請根據訂單編號(out_trade_no)在商家網站的訂單系統中查出到此訂單的詳細,並執行商家的業務程序  

  45.                的total_fee、seller_id與通知時取得的total_fee、seller_id為一致的  

  46.         #       過處理,不執行商家的業務程序

      
  47. #           
  48. ## #            //注意:  

  49.      此交易狀態通知  

  50. #              

    ############
  51.             //根據訂單號將訂單狀態和支付寶記錄表中狀態都改為已支付  

  52.             flg = hysWebMeetingAliService.changeOrderAndAliStatusSuccess(out_trade_no);  

  53. o>

  54. #        }  

  55. #  

  56.    請依照您的業務邏輯來寫程式(以上程式碼僅供參考)-

      

  57.              
  58. #        

    #//out.print("success"); //請不要修改或移除
  59. #  

      

  60. #        if(flg){  

  61.     "success";  

  62. ##        }else #{  

    ###
  63.             return "fail";  #o

    "fail"
  64.         }  

  65.   

  66.  ////////////////////////////////////////////////// ///////////////////////////////////////  

  67.     }else{//驗證失敗  

  68.         //out.print("fail");  

  69. #  ##  

  70. ##  

  71. #        return

#"fail"

;  ######################;  ##################### ###    }  ###################}  ###################################################################################################################

5、return_url:頁面跳轉同步通知頁面路徑,就是支付成功後,支付寶回跳的一個頁面。 “需http://格式的完整路徑,不能加?id=123這類自訂參數,必須外網可以正常訪問”,支付寶明確規定了回跳的頁面後面不能自訂參數,那麼有的我們就是根據一些類型去判斷跳轉的就有點麻煩了。我這裡做了一個取巧的做法:先把return_url.jsp中的java程式碼也直接搬過來,略做修改(換成springmvc的方式),我的回跳位址就是IP/aliPay/returnUrl,然後再new ModelAndView ("redirect:/meeting/info")進行重定向到我們想到的url中,(參數問題看下文總結第4點吧)。

[javascript] view plain# copy


  1. #    @RequestMapping("returnUrl")  

  2. #    public ModelAndView returnUrl(HttpServletRequest request){  

  3. # ModelAndView(

    "redirect:/meeting/info"

    );  
  4.         

    ########        ###//取得付款寶GET過來回饋資訊######  ##########
  5.         地圖 params = new HashMap();

  6.         對映 requestParams = request.getParameterMap();

  7.         for (迭代器iter = requestParams.keySet().iterator(); iter.hasNext();) {

  8.             字串名稱 = (String) iter.next();

  9.             String[] 值 = (String[]) requestParams.get(name);

  10.             字串 valueStr = "";

  11. ##            for (int i values.length; i ) {  

  12.                 valueStr valueStr   values[i]  

  13.                 #

  14.             }  

  15. #        如果mysign與sign不相等也可以使用此程式碼轉換  

  16.              //valueStr =        //valueStr = valueStr.getBytes("ISO-8859-1"), "utf-8");  

  17.        (name, valueStr);  

  18. #        }  

  19. #o ##  

    ##        

    //取得支付寶的通知回傳參數,可參考技術文件中頁跳同步通知參數清單(下列僅供參考)//
  20.   

            

    //商家訂單號碼
  21.   

    ##  

  22.   
  23.   

  24.   
  25.   

  26. ##  
  27.         String out_trade_no = request.getParameter("out_trade_no"##);

  28.   

    ##########        ###//支付寶交易編號#######  #########//付款寶交易號碼####### ##################  ##################        。 #####);  ######################  #######
  29.         #//交易狀態  

  30.     .getParameter("trade_status");  

  31.         "color:#ff0000;"
  32. >String meetingId = request.getParameter(##"extra_com#param"# #);          mv.addObject("meetingId"

    , meetingId);
  33.  #, meetingId);> 
  34.   

  35.         //取得支付寶的通知回傳參數,可參考技術文件中頁面跳轉同步通知參數清單(以上僅供參考)//

  36.   
  37. ##          

  38.         //計算出通知驗證結果

  39.   
  40. #  

  41. ##        boolean verify_result = AlipayNotify.verify(params);  

  42.  
  43.         if(verify_result){//驗證成功  

  44. #  

  45. '

    #            
  46. /////////////////////////////////// ////////////////////////////////////////////////// //////
  47.               //請在此加上商家的商業邏輯程式碼  

  48.   

                ##///— —請依照您的業務邏輯來撰寫程式(以下程式碼僅供參考)-

      
  49.             if

    (trade_status.equals(######"TRADE_FINISHED"######) || trade_status.equals(#######"TRADE_SUCCESS"#######))) {  #####################                ###//判斷該筆訂單是否已在商家網站中已處理#### #################                    ###//如果沒有使用過的訂單編號(out_trade_no)在商家的訂單系統中查到網站上的訂單資料執行商家的業務程序######  ##########
  50.                     ///如有做過處理,且不執行商家的商業程序             }  

  51.           ##//該頁面可當頁面美工編輯

  52.   
  53. #//          out.println("驗證成功
    ");  

  54.             

    //-請依照您的商業邏輯來編寫程式(上述程式碼僅作參考)—  

  55. #  

  56. /////////////////////////////////////////////// ///////////////////////////////////////////  

  57.         }else{  

  58. #{  

  59. ####### ###            ###//此頁面可做頁面工人編輯######  ################ ("驗證失敗");######  ######################        }  ##################################################
  60.           

  61.         #    }  

  62. #五、總結:

1、支付寶整合比較簡答,稍微看下DEMO,跑一下了解流程就比較容易了。

2、調試的時候,特別是回調,要把專案部署到能夠外網存取的伺服器上。

3、我沒有遇到上面莫名其妙的問題,如果遇到了的話,可以聯絡我,或是看下Eclipse遠端debug這篇文章,進行問題的追蹤。

4、做頁面跳轉同步通知頁面路徑時,需要傳遞參數怎麼辦,我一開始是自訂了一個參數,可是沒有取到,然後我看到DEMO中有一句註解是這麼寫的:

[javascript]

 view plain

 copy


// 其他業務參數根據線上開發文檔,新增參數.文檔位址:https://doc.open.alipay.com/doc2/detail.htm? spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1
    ##  
  1. 所以我打開看了之後,選擇看了之後,選擇看了了公用回傳參數extra_common_param,我自己知道這個欄位對我來說是什麼意義。不過也要注意,人家說明了:

    [javascript] view plain copy



    1. ##參數body(商品描述)、subject(商品名稱)、extra_common_param(公用回傳參數)不能包含特殊字元(如:#、%、&、 )、敏感詞彙,也不能使用外國文字(旺旺不支持的外文,如:韓文、泰語、藏文、蒙古文、阿拉伯語);  

    2. open方法中設定值:

    [javascript]

     view plain

     copy


    ######sParaTemp.put(#######"extra_common_param"######, meetingId);  ######### #############returnUrl方法中取值,並作為重定向參數:############[javascript]### view plain### copy# ###########################
    1. String meetingId = request.getParameter("extra_common_param"#);  

    2. #        mv.addObject("meetingId", meetingId);  

    相關推薦:

    #支付寶支付介面 單筆交易查詢介面

    支付寶手機網站支付介面 FOR ECShop

以上是Java呼叫支付寶支付介面的案例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn