來源:https://www.cnblogs.com/cvandy/p/8001542.html

注:這裏的支付是沙箱模擬支付

1、註冊螞蟻金服開放平臺

螞蟻金服開放平臺註冊地址:

https://open.alipay.com/platform/home.htm

支付寶掃碼登陸 -> 註冊爲自主研發者

調用支付寶第三方支付接口詳解(沙箱環境)


螞蟻金服頁面

2、配置你的沙箱支付寶

調用支付寶第三方支付接口詳解(沙箱環境)


配置你的沙箱支付寶

支付寶提供一鍵生成工具便於開發者生成一對RSA2密鑰:

https://docs.open.alipay.com/291/105971

該工具使用需要java環境

windows安裝java環境:

https://blog.csdn.net/edison_03/article/details/79757591

Mac安裝java環境:

https://www.cnblogs.com/xqx-qyy/p/7659805.html


調用支付寶第三方支付接口詳解(沙箱環境)


生成RSA2密鑰

注意:生成時一定要選擇PKCS8+2048

調用支付寶第三方支付接口詳解(沙箱環境)


配置RSA2密鑰

將應用網關和回調地址更改爲:

https://www.alipay.com

AES密鑰不用管

然後往下會有支付寶沙箱安卓端工具,下載,以供後續支付使用

進入頁面左側導航欄沙箱賬號,沙箱安卓端安裝後用買家賬號登陸

到這裏基本配置就完了,下面進入大家喜歡的代碼時間:

3、新建一個配置類 AlipayConfig.java

package com.alipay.config;
import java.io.FileWriter;
import java.io.IOException;
/* *
*類名:AlipayConfig
*作者:有夢想一起實現
*/
public class AlipayConfig{
// ↓↓↓↓↓↓↓↓↓↓請在這裏配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
public static String app_id = "APPID";//例:2016082600317257
// 商戶私鑰,您的PKCS8格式RSA2私鑰
public static String merchant_private_key = "商戶私鑰!!!!私鑰!!!不是公鑰!!!";
// 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm
// 對應APPID下的支付寶公鑰。
public static String alipay_public_key = "支付寶公鑰,記得是支付寶公鑰!!!!!!!支付寶公鑰";
// 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
/**
* 返回的時候此頁面不會返回到用戶頁面,只會執行你寫到控制器裏的地址
*/
public static String notify_url = "你的服務器地址/項目名稱/notify_url";
// 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
/**
* 此頁面是同步返回用戶頁面,也就是用戶支付後看到的頁面,上面的notify_url是異步返回商家操作,謝謝
* 要是看不懂就找度娘,或者多讀幾遍,或者去看支付寶第三方接口API,不看API直接拿去就用,遇坑不怪別人
*/
public static String return_url = " 你的服務器地址/項目名稱/return_url";
// 簽名方式
public static String sign_type = "RSA2";
// 字符編碼格式
public static String charset = "gbk";
// 支付寶網關
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 日誌地址
public static String log_path = "D:/logs/";
// ↑↑↑↑↑↑↑↑↑↑請在這裏配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 寫日誌,方便測試(看網站需求,也可以改成把記錄存入數據庫)
*
* @param sWord
* 要寫入日誌裏的文本內容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_"
+ System.currentTimeMillis() + ".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

如果你是在本地測試,支付完成不會跳轉回調頁面,那麼就需要外網了

推薦一個東西,叫內網穿透,只要你電腦tomcat啓動,可以連接外網,就可以使用。

NATAPP 提供免費的測試足夠:

https://natapp.cn/

ngrok或者frp以及其他免費開源,自行搜索瞭解

4、引入依賴包


com.pentahohub.nexus
alipay-sdk-java
20150820220052

如果上面的依賴失效或者無法使用,依賴下載地址:

http://central.maven.org/maven2/com/pentahohub/nexus/alipay-sdk-java/20150820220052/alipay-sdk-java-20150820220052.jar

5、支付調用的接口

/**
* 快捷支付調用支付寶支付接口
* @param model,id,payables,
* @throws IOException,AlipayApiException
* @return Object
* @author 有夢想一起實現
*/
@RequestMapping("alipaySum")
public Object alipayIumpSum(Model model, String payables, String subject, String body, HttpServletResponse response)
throws Exception {
// 獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfigInfo.gatewayUrl, AlipayConfigInfo.app_id,
AlipayConfigInfo.merchant_private_key, "json", AlipayConfigInfo.charset,
AlipayConfigInfo.alipay_public_key, AlipayConfigInfo.sign_type);
// 設置請求參數
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfigInfo.return_url);
alipayRequest.setNotifyUrl(AlipayConfigInfo.notify_url2);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
// 商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
String out_trade_no = sdf.format(new Date());
// 付款金額,必填
String total_amount = payables.replace(",", "");
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount
+ "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
// 請求
String result = alipayClient.pageExecute(alipayRequest).getBody();
// System.out.println(result);
AlipayConfigInfo.logResult(result);// 記錄支付日誌
response.setContentType("text/html; charset=gbk");
PrintWriter out = response.getWriter();
out.print(result);
return null;
}

參數傳入是必須有的,不然會報訂單信息有誤。

如果有其他額外參數,請參考支付寶第三方API文檔:

https://docs.open.alipay.com/api_1/alipay.trade.create/

6、支付完成回調

這裏支付完成會回調兩個接口,notify_url和return_url,就是在配置類配置的兩個接口:

1、notify_url接口->異步回調的後臺操作

/**
* 支付完成回調驗證操作
* @param response,request
* @throws Exception
* @return void
* @author 有夢想一起實現
*/
@RequestMapping("notify_url")
public void Notify(HttpServletResponse response, HttpServletRequest request) throws Exception {
System.out.println("----------------------------notify_url------------------------");
// 商戶訂單號
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "GBK");
// 付款金額
String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "GBK");
// 支付寶交易號
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "GBK");
// 交易說明
String cus = new String(request.getParameter("body").getBytes("ISO-8859-1"), "GBK");
// 交易狀態
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "GBK");
if (trade_status.equals("TRADE_SUCCESS")) {//支付成功商家操作
//下面是我寫的一個簡單的插入操作,根據你的操作自行編寫
/*Map map = new HashMap();
map.put("cuId", Integer.valueOf(cus));
RepaymentPlan repaymentPlan = new RepaymentPlan();
Integer id = Integer.valueOf(out_trade_no);
double payablesCheck = Double.valueOf(total_amount);
RepaymentPlan repayCheck = serviceMain.selectByPrimaryKey(id);
double total = repayCheck.getPayables();
if (Double.valueOf(total_amount) < repayCheck.getPayables()) {
map.put("ubalance", total - Double.valueOf(total_amount));
serviceMain.updateCusMoney(map);
}
repaymentPlan.setId(id);
repaymentPlan.setActualPayment(total);
repaymentPlan.setRepaymentStatus(1);
int i = serviceMain.updateByPrimaryKeySelective(repaymentPlan);
System.out.println("---------------------還款影響行數----------------------------" + i);*/
}
}

2、return_url 接口->同步通知返回的是頁面

/**
* 同步通知的頁面的Controller
* 我這邊就簡單的返回了一個頁面
* @param request,response
* @throws InterruptedException
*/
@RequestMapping("return_url")
public String Return_url() throws InterruptedException {
return "alipayexit";
}

7、請求支付接口的JSP的頁面

target="_blank">


商戶訂單號 :






訂單名稱 :






付款金額 :






商品描述:








如果您點擊“付款”按鈕,即表示您同意該次的執行操作。





支付寶接口的SDK&DEMO地址:

https://docs.open.alipay.com/270/106291/
相關文章