調用支付寶接口的簡單demo


依賴:

1 <!--        alipay-sdk-java 注意一下版本-->
2         <dependency>
3             <groupId>com.alipay.sdk</groupId>
4             <artifactId>alipay-sdk-java</artifactId>
5             <version>3.4.49.ALL</version>
6         </dependency>

配置類:

 1 package com.sdk.pay.alipay;
 2 
 3 public class AlipayConfig {
 4     // 商戶appid
 5     public static String APPID = "2016102100729846";
 6     // 私鑰 pkcs8格式的
 7     public static String RSA_PRIVATE_KEY =
 8                     "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHiiREGifXUNV4" +
 9                     "2QJixj0NEq4DgOBhjA3lTdQxCrJBeOBz7UUPXQfKw39LGKhoyrgPmJKzYwWosfIl" +
10                     "mFk4qvGGsxbvuIGW8aUpxwFR9PmUetgoLroko/6mddnCA1+pSkBVA2vZhKO7MgZc" +
11                     "onfJN305izNcGMSbYm20W0mAnmRCZgux5nZpFq6kUYP45WAmyMUoXVQOrUOb6Ec0" +
12                     "6+CPuTpeV32IWpW6Sr/Ukvxt6BNw+XMhwM7vrIYsN8RW50aMsOlTwACQ19G5EOKe" +
13                     "vA07urMxwdeEoDxggYFG0o4As6IxzlUdd4eYWKOuX1l0/zZpOCxQiMrXrv+eRZFa" +
14                     "lBPvN++3AgMBAAECggEAEt73qxEmL3DPn4w2c4z3/SKFHoOztMYAEm2X4cN3NEXw" +
15                     "REZuP5O2xvBSO5Hra22wlpkBVsHIqTmbAv8zgO55xRlu0+EJMHNOAXN2pn+akvZD" +
16                     "NxmkNQ7laGzA2V5kT6hcCS43puyqZ2vFukELPxZmW2jUxKL7BQ77/RCdFPLl3HmL" +
17                     "QEJsOITqf7+q8pMWaaKF3mesqzz8AGzD0LC/pQwCh7h6ur0ojle6hDslHMK7UkEY" +
18                     "QUTK+Kz6ZGgXJWIc3xsE0oG6O/+QgAgssoaKgDPFmzfOt4yq4cfCzx8xlDCBDmC6" +
19                     "hdqdegwICxqxmbKlp9cRnLnEOv3Q5gUB0YlorM3e8QKBgQD1eIeUJkyM2v1Gobtm" +
20                     "eOFdtblc2E5cy2P5DGC5nawCtpK3kIGDxDM8Np5xasRkwsaSovQkH1bJ5ocStwLX" +
21                     "rDOj57oENrdieIGEHP8ffpAVsa7SgTYUjwdyA79FsMEZWX1PanbqF7J3NS2coneg" +
22                     "HVkdPQXRkmXMuJ/l96ZSMxGfJQKBgQDQGT/4B8LSCv62WaQHMnMyNdxCbg/135ov" +
23                     "suMymgGre13onOblCyUb3SnvOAO1vnSHWNbmj5Knz5/cRYzxBAPXaJ0gYVJkMxEy" +
24                     "nQelWCBhPRqfRIjeHTN9F98g2fsTArPy1zhR+NzwSdRx4aL08beDOwYIMPZuTGod" +
25                     "xmt58L96qwKBgGQDXcog6KOjPfqfPsl7iucxeXq4rwTj4bHBN0+pTEI2vQSJnhtf" +
26                     "vzhTUK8JP0eGjH2GY06sbiIJCRO4+TGCee/YJFQ/LuyyCKMZZWEhofcU1BP0jWJG" +
27                     "/FOZ7z6ny6VWbtYCnLy4NwCW7CSblX3pNzvQdyRyL4P/3TZHdr6bDBz5AoGBAJQW" +
28                     "w+0QKNYsuOKvnAj7H/tFVP95L6Z7f1Aeb4xdCH8uBcA5mB669aeElgkExa8aX/bJ" +
29                     "g/UDiwwctticLhZ+EvXCHr8iQu3HYZ+xG/XQZwqL31wj+3qFMVT+He1U8lWvALv5" +
30                     "6Lx8602cXLDGL588PKoI4NwHa/dGLeYOhAF9D+aNAoGBAK6geTKYSbdh/0IEBxSx" +
31                     "kMVx4D1pYKUOgTEqGuw7IYeNrwwE/F/SVhgkpAvz3ppYUM+bsPHbofEu7W/uanP8" +
32                     "2Akf8D0dpTcQju+6MuQmCPcLmJSq2pqVNHG4gUnzz5CZoi+IrK/VMTXfU2O+i+H0" +
33                     "rGQXtgvpSTBHlrcRklSvYjaC";
34     // 服務器異步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
35     public static String notify_url = "http://28k6010n77.wicp.vip/callback.html";
36     // 頁面跳轉同步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 商戶可以自定義同步跳轉地址
37     public static String return_url = "http://28k6010n77.wicp.vip/return.html";
38     // 請求網關地址
39     public static String URL = "https://openapi.alipaydev.com/gateway.do";
40     // 編碼
41     public static String CHARSET = "UTF-8";
42     // 返回格式
43     public static String FORMAT = "json";
44     // 支付寶公鑰
45     public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAov3L35qUSYI2E5iDZmjXgJJs4cWKW2LhaddgKw5D7UgFYOcOv/ZYf5SdiWVk4tjhhJxFy1iDRxB+V5d0KD0cOc0PHBA0jQ6UfEu1BSV6rNL+ipgF1xLDudwT+iuVyKg2EEkFWb14Mm1D06qqen7yQyftzCU4TQ/gOUBzHcrQ5HJ1TxqgP0kHRUwe44utEwAMYNgJk9hxZ01ULVBQVAVxjGirju47OSIjnOCIfhk1fMrHIZreZFPp5uhzluJnIUHRugw+w7MunWy3iAOpNM47FKs4RuV/YHqeEdc1jFflAmeJhXT84ySuQZc6ZkwpY3JJc4ObGIchSj3SOqy1iSN9BwIDAQAB";
46     // 日志記錄目錄
47     public static String log_path = "/log";
48     // RSA2
49     public static String SIGNTYPE = "RSA2";
50 }

controller:

  1 package com.sdk.pay.controller;
  2 
  3 import com.alipay.api.AlipayApiException;
  4 import com.alipay.api.AlipayClient;
  5 import com.alipay.api.DefaultAlipayClient;
  6 import com.alipay.api.domain.AlipayTradeWapPayModel;
  7 import com.alipay.api.internal.util.AlipaySignature;
  8 import com.alipay.api.request.AlipayTradeWapPayRequest;
  9 
 10 import com.sdk.pay.alipay.AlipayConfig;
 11 import org.springframework.stereotype.Controller;
 12 import org.springframework.web.bind.annotation.RequestMapping;
 13 
 14 import javax.servlet.http.HttpServletRequest;
 15 import javax.servlet.http.HttpServletResponse;
 16 import java.io.PrintWriter;
 17 import java.util.HashMap;
 18 import java.util.Iterator;
 19 import java.util.Map;
 20 
 21 
 22 @Controller
 23 public class AliPayController {
 24     @RequestMapping("ali.html")
 25     public String page() {
 26         return "alipay";
 27     }
 28 
 29     @RequestMapping("alipay.html")
 30     public void order(HttpServletRequest request, HttpServletResponse response, Integer amount) throws Exception {
 31         // 商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
 32         String out_trade_no = System.currentTimeMillis() + "";
 33         // 訂單名稱,必填
 34         String subject = "測試";
 35         System.out.println(subject);
 36         // 付款金額,必填
 37         String total_amount = amount.toString();
 38         // 超時時間 可空
 39         String timeout_express = "2m";
 40         // 銷售產品碼 必填
 41         String product_code = "QUICK_WAP_WAY";
 42         /**********************/
 43         // SDK 公共請求類,包含公共請求參數,以及封裝了簽名與驗簽,開發者無需關注簽名與驗簽
 44         //調用RSA簽名方式
 45         AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
 46         AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();
 47 
 48         // 封裝請求支付信息
 49         AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
 50         model.setOutTradeNo(out_trade_no);
 51         model.setSubject(subject);
 52         model.setTotalAmount(total_amount);
 53         // model.setBody(body);
 54         model.setTimeoutExpress(timeout_express);
 55         model.setProductCode(product_code);
 56         alipay_request.setBizModel(model);
 57         // 設置異步通知地址
 58         alipay_request.setNotifyUrl(AlipayConfig.notify_url);
 59         // 設置同步地址
 60         alipay_request.setReturnUrl(AlipayConfig.return_url);
 61 
 62         // form表單生產
 63         String form = "";
 64         try {
 65             // 調用SDK生成表單
 66             form = client.pageExecute(alipay_request).getBody();
 67             System.out.println(form);
 68             response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
 69             response.getWriter().write(form);//直接將完整的表單html輸出到頁面
 70             response.getWriter().flush();
 71             response.getWriter().close();
 72         } catch (AlipayApiException e) {
 73             // TODO Auto-generated catch block
 74             e.printStackTrace();
 75         }
 76     }
 77 
 78     @RequestMapping("callback.html")//以回調方法為准
 79     public void callback(HttpServletRequest request, HttpServletResponse response) throws Exception {
 80         System.out.println("支付回調============callback.html==================================");
 81         PrintWriter out = response.getWriter();
 82         //獲取支付寶POST過來反饋信息
 83         Map<String, String> params = new HashMap<String, String>();
 84         Map requestParams = request.getParameterMap();
 85         for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
 86             String name = (String) iter.next();
 87             String[] values = (String[]) requestParams.get(name);
 88             String valueStr = "";
 89             for (int i = 0; i < values.length; i++) {
 90                 valueStr = (i == values.length - 1) ? valueStr + values[i]
 91                         : valueStr + values[i] + ",";
 92             }
 93             //亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
 94             //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
 95             params.put(name, valueStr);
 96         }
 97         //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
 98         //商戶訂單號
 99 
100         String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
101         //支付寶交易號
102 
103         String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
104 
105         //交易狀態
106         String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
107 
108         //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
109         //計算得出通知驗證結果
110         //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
111         boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
112 
113         if (verify_result) {//驗證成功
114             //////////////////////////////////////////////////////////////////////////////////////////
115             //請在這里加上商戶的業務邏輯程序代碼
116 
117             //——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——
118 
119             if (trade_status.equals("TRADE_FINISHED")) {
120                 //判斷該筆訂單是否在商戶網站中已經做過處理
121                 //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
122                 //請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id為一致的
123                 //如果有做過處理,不執行商戶的業務程序
124 
125                 //注意:
126                 //如果簽約的是可退款協議,退款日期超過可退款期限后(如三個月可退款),支付寶系統發送該交易狀態通知
127                 //如果沒有簽約可退款協議,那么付款完成后,支付寶系統發送該交易狀態通知。
128             } else if (trade_status.equals("TRADE_SUCCESS")) {
129                 //判斷該筆訂單是否在商戶網站中已經做過處理
130                 //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
131                 //請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id為一致的
132                 //如果有做過處理,不執行商戶的業務程序
133                 //注意:
134                 //如果簽約的是可退款協議,那么付款完成后,支付寶系統發送該交易狀態通知。
135                 //更新訂單
136                 System.out.println("商戶訂單號:" + out_trade_no);
137                 System.out.println("支付寶訂單號:" + trade_no);
138                 System.out.println("支付寶金額:" + request.getParameter("total_amount"));
139             }
140 
141             //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——
142             out.println("success");    //請不要修改或刪除
143 
144             //////////////////////////////////////////////////////////////////////////////////////////
145         } else {//驗證失敗
146             out.println("fail");
147         }
148         out.close();
149     }
150 
151     @RequestMapping("return.html")//只給用戶一個提示
152     public void success(HttpServletRequest request, HttpServletResponse response) throws Exception {
153         System.out.println("return.html======只給用戶一個提示========================================");
154         response.setCharacterEncoding("utf-8");
155         response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
156         PrintWriter out = response.getWriter();
157         //獲取支付寶GET過來反饋信息
158         Map<String, String> params = new HashMap<String, String>();
159         Map requestParams = request.getParameterMap();
160         for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
161             String name = (String) iter.next();
162             String[] values = (String[]) requestParams.get(name);
163             String valueStr = "";
164             for (int i = 0; i < values.length; i++) {
165                 valueStr = (i == values.length - 1) ? valueStr + values[i]
166                         : valueStr + values[i] + ",";
167             }
168             //亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
169             //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
170             System.out.println(valueStr);
171             params.put(name, valueStr);
172         }
173         System.out.println(params);
174         //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
175         //商戶訂單號
176 
177         String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
178 
179         //支付寶交易號
180 
181         String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
182 
183         //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
184         //計算得出通知驗證結果
185         //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
186         boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
187 
188         if (verify_result) {//驗證成功
189             //////////////////////////////////////////////////////////////////////////////////////////
190             //請在這里加上商戶的業務邏輯程序代碼
191             //該頁面可做頁面美工編輯
192             out.flush();
193             out.println("驗證成功<br />");
194             //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——
195 
196             //////////////////////////////////////////////////////////////////////////////////////////
197         } else {
198             //該頁面可做頁面美工編輯
199             out.flush();
200             out.println("驗證失敗");
201         }
202         out.close();
203     }
204 }

html:

 1 <!DOCTYPE html>
 2 <html lang="en" xmlns:th="http://www.thymeleaf.org">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <form action="alipay.html" method="post">
 9     金額<input name="amount"/>
10     <input type="submit" value="提交"/>
11 </form>
12 </body>
13 </html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM