後端---史上最全最小白最簡單最細緻的Java接入支付寶支付介面方法
昨天Boss在講專案的業務需求的時候對我突然說讓我做一下支付寶微信支付介面這塊功能,我的心裡是充滿問號的????,但是我的嘴卻堅定的說出了沒問題!!!
????????
於是開啟了我這一天的快樂之旅,在這個無情又寒冷的深夜裡將我今天的快樂分享給大家!
哈哈哈哈哈哈,不扯了,我們開始正題!
正題
每天早上起來的雞蛋豆皮火燒(╯▽╰ )好香~~啊!啃完這個火燒我們開啟電腦,回想昨天的任務,按照我們程式設計師的尿性,有事沒事先百度,於是有了接下來各種搜尋,然而各種五花八門的部落格亂象百出,沒有一篇能讓大家從頭到位,從零到一的從沒有到完成整個支付寶介面接入功能。
不過還是證明去官方網站看文件和教程比較實在,並且有什麼技術問題問技術客服比較簡單有效。
一.支付知識背景瞭解
我們先來看一看現在支付寶介面呼叫整個支付的流程是怎樣的?(盜用支付寶官方圖)
支付包已經將所有支付功能整合在SDK裡面,也就是我們Java人員所說的jar包。我們只要呼叫jar包裡面的以上六個方法並傳入上面六個方法約定好的引數就可以完成相關的功能。
在這裡直接給出支付寶關於這方面知識的文件講解連結:
https://docs.open.alipay.com/270/105899/ 電腦網站支付快速接入
https://docs.open.alipay.com/270/alipay.trade.page.pay 詳細引數講解
二.前提工作
首先先去這個網站https://docs.open.alipay.com/54/103419 下我們所需的Jar包,我們點進去這個頁面
這時候再看我們下載下來的檔案有
但我們只需接入支付寶介面只需要上圖紅箭頭標示的兩個jar包,這時候就問我們為什麼不用maven依賴dependency引用呢,非常遺憾的告訴大家因為maven線上倉庫並沒有alipay-sdk-java3.3.2.jar這個包,我們需要先把這個包insall進我們的maven倉庫,然後才可以通過maven依賴引入這兩個jar包
我們開啟cmd命令列使用maven insall命令:
這裡給出maven命令,如果還不明白可以去參考這篇部落格怎麼製作jar包https://blog.csdn.net/xiaoxiaoniaoQ/article/details/80350830
mvn install:install-file -DgroupId=com.alipay -DartifactId=sdk-Java -Dversion=20151021120052 -Dpackaging=jar -Dfile=alipay-sdk-java20151021120052.jar
在上面的maven install命令中我們需將自己的 -Dfile=後面的名稱改成自己下載的jar包名稱,然後前面是生成的jar包名字,版本號,id什麼的,可以不用修改,這裡是我們pom.xml引入這個jar包寫的名字,隨便什麼都可以。但是我們要知道這一步進行完以後我們只是將這個jar包放在了我們的maven倉庫裡面,並沒有放在我們的專案當中。
我們先在這裡給出maven依賴(pom.xml)等會會在我們的講解中用到:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alipay</groupId>
<artifactId>sdk-java</artifactId>
<version>20151021120052</version>
</dependency>
二.支付寶官網操作
1.配置沙箱
首先我們開啟這個頁面
https://openhome.alipay.com/platform/appDaily.htm?tab=account 進入到支付寶沙箱我們建立一個沙箱後,我們需要填寫的資訊是一個RSA2的公鑰。
(這是我設定完成後的狀態)
我們再開啟 https://docs.open.alipay.com/200/105311 進入支付寶沙箱講解,這裡面有如何建立一個RSA2公鑰的方法
進入這個頁面 https://docs.open.alipay.com/291/105971
在這個頁面我們可以看出
下載後這個樣子:
上圖中我們先用1來生成一對公鑰和私鑰,公鑰會直接生成在cmd上面我們複製貼上在剛在的沙箱頁面的應用公鑰上 ,這時支付寶會對我們生成一個支付寶公鑰.OK,到這裡我們的沙箱配置完成,先彆著急關這個頁面。
2生成的RSA2私鑰,等會會在配置中用到,開啟用NotePad++或者記事本開啟都可以。
然後我們再開啟
https://docs.open.alipay.com/270/106291 這個連結
下載後是這個樣子的:
我們可以看到這種目錄結構是一個Java web 專案,我們用eclipse右鍵import匯入一個Exeisting Project 。。。。
然後就會出現這個
我們先進入AlipayConfig.java這個檔案,
package com.alipay.config;
import java.io.FileWriter;
import java.io.IOException;
/* *
*類名:AlipayConfig
*功能:基礎配置類
*詳細:設定帳戶有關資訊及返回路徑
*修改日期:2017-04-05
*說明:
*以下程式碼只是為了方便商戶測試而提供的樣例程式碼,商戶可以根據自己網站的需要,按照技術文件編寫,並非一定要使用該程式碼。
*該程式碼僅供學習和研究支付寶介面使用,只是提供一個參考。
*/
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓請在這裡配置您的基本資訊↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
public static String app_id = "2016092400582266";
// 商戶私鑰,您的PKCS8格式RSA2私鑰
public static String merchant_private_key = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCxBPnCsdzNrUwp\r\n" +
"L3RXw4Y6sYhKRme1yr6cV3x7juEoV+9xUnnyb5W8qARM+pnfst1lulj5QCXR4b/+\r\n" +
"HWU9ILJhLcWfQKsmue8iVY66KHRjUyY2sc0pq0SP+j5Ef/pEb2Z5Sj/0GIkLJHJT\r\n" +
"bQFQUbBWdCnWSTAxCwkWF8iOXJTDqEbVxUZy5wwi2z4I9faJyeLCL6uWzCLeLJRe\r\n" +
"DLcrfPEmE0aTdiZk98GjvIZvZ8qWsiJr2bjNs1wu+9iXnINcjWbHc+r60gq+WmNg\r\n" +
"96EAa0oZWvuxbyMTb+t2AAiRTeghZJmmtmv2g5ivTKAGjwn5oc1Lo+7GLIXoQiMc\r\n" +
"VaZvNvTJAgMBAAECggEASzPz73Ske3R+AJk6cfaM1e6KGhPjB2ZEqCK6rbs7iGoj\r\n" +
"PR9u00H4eRdgDFwCdviD+i26ktlft9SSPiC628dCQOqzJD7S9zbSkuGKKyf4miG/\r\n" +
"AEl1AZjTHd+QCIXeCqjQ/gI/PTIXNnabYznR7w9lPLVI+NJK+OrZR1t/RouqX5wu\r\n" +
"lA+v3sFpE+fVnKttdUGM0MGnG0JKEcmnt2e0xtMQg80bOPz9OT6IQSW8YWkMQqJK\r\n" +
"nSzLOYisqxhX4v2MI1RWiEQgkg4JcVBiraoVk+8V6KzAN8zy6yz52y2sb8evIpg4\r\n" +
"d9Ch8WoBSY98wj1EXzMnUDX7wedrE0P1CMLSpPUOKQKBgQDiXMmsX5Dh3D0reEXX\r\n" +
"qk4jbPPg60camgoorKBKTJkQZ32rQsGfoF/ppmB80Dma8bNP91EM6DMu/zG+dYGq\r\n" +
"ABvtY/27hABWUaOmlhkThfE8UxnbVeGxkDID9/eAEl74t3hGEW9D1kgB3GRjEB44\r\n" +
"xtNbPyESSNgg3cLdG7sYM7y3dwKBgQDIMk9BmYNLYhny0f9zn7MLPe4GGK9oZ9lv\r\n" +
"99LjymMoWFxZz6Cgh4rUHMmIbNXT4khQOc2lkUccsYSZZQLScEf4auKMBEirxOlP\r\n" +
"AbyOtdmuOZGb5KKog7PYTRpuAGmfFf/dYAx1sTv8vgvfv7aeN/EDVOYN8J70fbdX\r\n" +
"GRTZ44FFvwKBgAVP7COxcnL6ei0E+46eHotSST7kBp0nNEnUE0brGUR7SUW1oVmf\r\n" +
"p+CR2P3U3SU3ut+LjEljQaA+uOohU9OrgPxHNnMqG9/qto54Q0pkAE9MG/U7xLoo\r\n" +
"CiRxs0s8IyJvG9F5I0VSSApTI7/3Zt4qPFeN2bbWIsxSp/oMZo2g2TLtAoGAJnlc\r\n" +
"t/u7utoQqJTpJhxz+V4eh3dpBoSmyhjzo6l6ov9QSEZZ1WAXMyqRJLHd6kmboidp\r\n" +
"uT8RTpdjJ2O9RhokCr7n6QbNvI0sVW29AiQ6wHv52t72z7H390LiKG/V3KgKs03J\r\n" +
"NzknkSwo9ghPHVsc64n+aIFs2wnqGUgNtM4/QtsCgYAx3GEqKF2sWtku/c3P4k+H\r\n" +
"ipuZpKn3pffLQrtcl3wDx2/iEapaKMpTJT9giRt19sdRDXLKCxv+ToY/G2kRg8lJ\r\n" +
"INqU+5Cm0x5XSgo3lzrRjeeeYmABf439qP7qU/MW2EstK5xOSPgULtZJ1dloD6lh\r\n" +
"ixsf+5uhriZq30AWT1UTaA==";
// 支付寶公鑰,檢視地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtk1ggapsg03NPApUz6oYmzN9kKfjUIAYVgofIm/zqOU2JZI/46GdMz0j2uOh0w7UiH9ewwRtjQVtGInkww/EYcILvqcev/rCSSypj7LTd1+A24npuaP9W6yeg7jKu9LyrlcbsmGn9F4SSiO4T5CPUO5ixvdCaVHImkgPTuqoYbLNXyjHpupNQ0MhlMexjD5sc+LefPzdoernFWokM+VUrzQzQkM68UCzfdfgCeqMkBA9jI4vBc/MDnwrqGF1r6xoo/pJrNaZmRBRaD77Q3ShEVE7uorIXSKVzwVri6Zrsf9VVRQiDK5verPEoE+FFb8Ry2Ex0FZo8S7Xe6YPBNoWMQIDAQAB";
// 伺服器非同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
public static String notify_url = "http://工程公網訪問地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
public static String return_url = "http://工程公網訪問地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
// 簽名方式
public static String sign_type = "RSA2";
// 字元編碼格式
public static String charset = "utf-8";
// 支付寶閘道器
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 支付寶閘道器
public static String log_path = "C:\\";
//↑↑↑↑↑↑↑↑↑↑請在這裡配置您的基本資訊↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 寫日誌,方便測試(看網站需求,也可以改成把記錄存入資料庫)
* @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();
}
}
}
}
}
我們需要修改的就是將
app_id (沙盒提供的應用ID)
merchant_private_key(PKCS8格式RSA2私鑰)
alipay_public_key(沙盒提供的支付寶公鑰)
gatewayUrl(請求支付寶網址)"https://openapi.alipaydev.com/gateway.do“ 這個是沙盒請求的,具體使用的可以百度
notify_url
return_url 最後這兩個是完成訂單後伺服器要調整和被通知的路徑,因為只是測試我們這裡就不再寫了
然後執行專案的index.jsp檔案在Tomcat上:
我們點選付款後,可以看到跳轉到下面頁面:
那我們怎麼付款呢?我們需要下載一個沙箱錢包:
然後就可以掃碼完成支付功能,但是整個專案也是支付寶提供給我們的Demo,但是我們可以將他們的demo拿來用
比如我們新建一個SSM專案,我們現在pom.xml依賴匯入我們上面剛提到的兩個核心Jar包
我們只要
完成這四步,直接給出程式碼,都是從Demo中整合,提煉出來的(大家也可以自己整理,增加對這個支付介面的瞭解):
AlipayConfig.java
package com.qcb.controllers;
import java.io.FileWriter;
import java.io.IOException;
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓請在這裡配置您的基本資訊↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
public static String app_id = "2016092400582266";
// 商戶私鑰,您的PKCS8格式RSA2私鑰
public static String merchant_private_key = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCxBPnCsdzNrUwp\r\n" +
"L3RXw4Y6sYhKRme1yr6cV3x7juEoV+9xUnnyb5W8qARM+pnfst1lulj5QCXR4b/+\r\n" +
"HWU9ILJhLcWfQKsmue8iVY66KHRjUyY2sc0pq0SP+j5Ef/pEb2Z5Sj/0GIkLJHJT\r\n" +
"bQFQUbBWdCnWSTAxCwkWF8iOXJTDqEbVxUZy5wwi2z4I9faJyeLCL6uWzCLeLJRe\r\n" +
"DLcrfPEmE0aTdiZk98GjvIZvZ8qWsiJr2bjNs1wu+9iXnINcjWbHc+r60gq+WmNg\r\n" +
"96EAa0oZWvuxbyMTb+t2AAiRTeghZJmmtmv2g5ivTKAGjwn5oc1Lo+7GLIXoQiMc\r\n" +
"VaZvNvTJAgMBAAECggEASzPz73Ske3R+AJk6cfaM1e6KGhPjB2ZEqCK6rbs7iGoj\r\n" +
"PR9u00H4eRdgDFwCdviD+i26ktlft9SSPiC628dCQOqzJD7S9zbSkuGKKyf4miG/\r\n" +
"AEl1AZjTHd+QCIXeCqjQ/gI/PTIXNnabYznR7w9lPLVI+NJK+OrZR1t/RouqX5wu\r\n" +
"lA+v3sFpE+fVnKttdUGM0MGnG0JKEcmnt2e0xtMQg80bOPz9OT6IQSW8YWkMQqJK\r\n" +
"nSzLOYisqxhX4v2MI1RWiEQgkg4JcVBiraoVk+8V6KzAN8zy6yz52y2sb8evIpg4\r\n" +
"d9Ch8WoBSY98wj1EXzMnUDX7wedrE0P1CMLSpPUOKQKBgQDiXMmsX5Dh3D0reEXX\r\n" +
"qk4jbPPg60camgoorKBKTJkQZ32rQsGfoF/ppmB80Dma8bNP91EM6DMu/zG+dYGq\r\n" +
"ABvtY/27hABWUaOmlhkThfE8UxnbVeGxkDID9/eAEl74t3hGEW9D1kgB3GRjEB44\r\n" +
"xtNbPyESSNgg3cLdG7sYM7y3dwKBgQDIMk9BmYNLYhny0f9zn7MLPe4GGK9oZ9lv\r\n" +
"99LjymMoWFxZz6Cgh4rUHMmIbNXT4khQOc2lkUccsYSZZQLScEf4auKMBEirxOlP\r\n" +
"AbyOtdmuOZGb5KKog7PYTRpuAGmfFf/dYAx1sTv8vgvfv7aeN/EDVOYN8J70fbdX\r\n" +
"GRTZ44FFvwKBgAVP7COxcnL6ei0E+46eHotSST7kBp0nNEnUE0brGUR7SUW1oVmf\r\n" +
"p+CR2P3U3SU3ut+LjEljQaA+uOohU9OrgPxHNnMqG9/qto54Q0pkAE9MG/U7xLoo\r\n" +
"CiRxs0s8IyJvG9F5I0VSSApTI7/3Zt4qPFeN2bbWIsxSp/oMZo2g2TLtAoGAJnlc\r\n" +
"t/u7utoQqJTpJhxz+V4eh3dpBoSmyhjzo6l6ov9QSEZZ1WAXMyqRJLHd6kmboidp\r\n" +
"uT8RTpdjJ2O9RhokCr7n6QbNvI0sVW29AiQ6wHv52t72z7H390LiKG/V3KgKs03J\r\n" +
"NzknkSwo9ghPHVsc64n+aIFs2wnqGUgNtM4/QtsCgYAx3GEqKF2sWtku/c3P4k+H\r\n" +
"ipuZpKn3pffLQrtcl3wDx2/iEapaKMpTJT9giRt19sdRDXLKCxv+ToY/G2kRg8lJ\r\n" +
"INqU+5Cm0x5XSgo3lzrRjeeeYmABf439qP7qU/MW2EstK5xOSPgULtZJ1dloD6lh\r\n" +
"ixsf+5uhriZq30AWT1UTaA==";
// 支付寶公鑰,檢視地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtk1ggapsg03NPApUz6oYmzN9kKfjUIAYVgofIm/zqOU2JZI/46GdMz0j2uOh0w7UiH9ewwRtjQVtGInkww/EYcILvqcev/rCSSypj7LTd1+A24npuaP9W6yeg7jKu9LyrlcbsmGn9F4SSiO4T5CPUO5ixvdCaVHImkgPTuqoYbLNXyjHpupNQ0MhlMexjD5sc+LefPzdoernFWokM+VUrzQzQkM68UCzfdfgCeqMkBA9jI4vBc/MDnwrqGF1r6xoo/pJrNaZmRBRaD77Q3ShEVE7uorIXSKVzwVri6Zrsf9VVRQiDK5verPEoE+FFb8Ry2Ex0FZo8S7Xe6YPBNoWMQIDAQAB";
// 伺服器非同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
public static String notify_url = "http://www.baidu.com";
// 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
public static String return_url = "http://www.baidu.com";
// 簽名方式
public static String sign_type = "RSA2";
// 字元編碼格式
public static String charset = "utf-8";
// 支付寶閘道器
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 支付寶閘道器
public static String log_path = "C:\\";
//↑↑↑↑↑↑↑↑↑↑請在這裡配置您的基本資訊↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 寫日誌,方便測試(看網站需求,也可以改成把記錄存入資料庫)
* @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();
}
}
}
}
}
ApliyTrade.java
package com.qcb.utils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeCloseRequest;
import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.qcb.controllers.AlipayConfig;
public class AlipayTrade {
public String Refund(HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException {
//獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//設定請求引數
AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
//商戶訂單號,商戶網站訂單系統中唯一訂單號
String out_trade_no = new String(request.getParameter("WIDTRout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付寶交易號
String trade_no = new String(request.getParameter("WIDTRtrade_no").getBytes("ISO-8859-1"),"UTF-8");
//請二選一設定
//需要退款的金額,該金額不能大於訂單金額,必填
String refund_amount = new String(request.getParameter("WIDTRrefund_amount").getBytes("ISO-8859-1"),"UTF-8");
//退款的原因說明
String refund_reason = new String(request.getParameter("WIDTRrefund_reason").getBytes("ISO-8859-1"),"UTF-8");
//標識一次退款請求,同一筆交易多次退款需要保證唯一,如需部分退款,則此引數必傳
String out_request_no = new String(request.getParameter("WIDTRout_request_no").getBytes("ISO-8859-1"),"UTF-8");
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"trade_no\":\""+ trade_no +"\","
+ "\"refund_amount\":\""+ refund_amount +"\","
+ "\"refund_reason\":\""+ refund_reason +"\","
+ "\"out_request_no\":\""+ out_request_no +"\"}");
//請求
String result = alipayClient.execute(alipayRequest).getBody();
//輸出
System.out.println(result);
return result;
}
public String Pagepay(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
//獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//設定請求引數
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
//商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//付款金額,必填
String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");
//訂單名稱,必填
String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");
//商品描述,可空
String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//若想給BizContent增加其他可選請求引數,以增加自定義超時時間引數timeout_express來舉例說明
//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
// + "\"total_amount\":\""+ total_amount +"\","
// + "\"subject\":\""+ subject +"\","
// + "\"body\":\""+ body +"\","
// + "\"timeout_express\":\"10m\","
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//請求引數可查閱【電腦網站支付的API文件-alipay.trade.page.pay-請求引數】章節
//請求
String result = alipayClient.pageExecute(alipayRequest).getBody();
//輸出
System.out.println(result);
return result;
}
public String Close(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
//獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
System.out.println(AlipayConfig.app_id);
//設定請求引數
AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest();
//商戶訂單號,商戶網站訂單系統中唯一訂單號
String out_trade_no = new String(request.getParameter("WIDTCout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付寶交易號
String trade_no = new String(request.getParameter("WIDTCtrade_no").getBytes("ISO-8859-1"),"UTF-8");
//請二選一設定
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," +"\"trade_no\":\""+ trade_no +"\"}");
//請求
String result = alipayClient.execute(alipayRequest).getBody();
//輸出
System.out.println(result);
return result;
}
public String FastpayRefund(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
//獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//設定請求引數
AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();
//商戶訂單號,商戶網站訂單系統中唯一訂單號
String out_trade_no = new String(request.getParameter("WIDRQout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付寶交易號
String trade_no = new String(request.getParameter("WIDRQtrade_no").getBytes("ISO-8859-1"),"UTF-8");
//請二選一設定
//請求退款介面時,傳入的退款請求號,如果在退款請求時未傳入,則該值為建立交易時的外部交易號,必填
String out_request_no = new String(request.getParameter("WIDRQout_request_no").getBytes("ISO-8859-1"),"UTF-8");
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+"\"trade_no\":\""+ trade_no +"\","
+"\"out_request_no\":\""+ out_request_no +"\"}");
//請求
String result = alipayClient.execute(alipayRequest).getBody();
//輸出
System.out.println(result);
return result;
}
public String Query(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
//獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//設定請求引數
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
//商戶訂單號,商戶網站訂單系統中唯一訂單號
String out_trade_no = new String(request.getParameter("WIDTQout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付寶交易號
String trade_no = new String(request.getParameter("WIDTQtrade_no").getBytes("ISO-8859-1"),"UTF-8");
//請二選一設定
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+"\"trade_no\":\""+ trade_no +"\"}");
//請求
String result = alipayClient.execute(alipayRequest).getBody();
//輸出
System.out.println(result);
return result;
}
}
Newfile.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>支付寶電腦網站支付</title>
<style>
* {
margin: 0;
padding: 0;
}
ul, ol {
list-style: none;
}
body {
font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande",
sans-serif;
}
.tab-head {
margin-left: 120px;
margin-bottom: 10px;
}
.tab-content {
clear: left;
display: none;
}
h2 {
border-bottom: solid #02aaf1 2px;
width: 200px;
height: 25px;
margin: 0;
float: left;
text-align: center;
font-size: 16px;
}
.selected {
color: #FFFFFF;
background-color: #02aaf1;
}
.show {
clear: left;
display: block;
}
.hidden {
display: none;
}
.new-btn-login-sp {
padding: 1px;
display: inline-block;
width: 75%;
}
.new-btn-login {
background-color: #02aaf1;
color: #FFFFFF;
font-weight: bold;
border: none;
width: 100%;
height: 30px;
border-radius: 5px;
font-size: 16px;
}
#main {
width: 100%;
margin: 0 auto;
font-size: 14px;
}
.red-star {
color: #f00;
width: 10px;
display: inline-block;
}
.null-star {
color: #fff;
}
.content {
margin-top: 5px;
}
.content dt {
width: 100px;
display: inline-block;
float: left;
margin-left: 20px;
color: #666;
font-size: 13px;
margin-top: 8px;
}
.content dd {
margin-left: 120px;
margin-bottom: 5px;
}
.content dd input {
width: 85%;
height: 28px;
border: 0;
-webkit-border-radius: 0;
-webkit-appearance: none;
}
#foot {
margin-top: 10px;
position: absolute;
bottom: 15px;
width: 100%;
}
.foot-ul {
width: 100%;
}
.foot-ul li {
width: 100%;
text-align: center;
color: #666;
}
.note-help {
color: #999999;
font-size: 12px;
line-height: 130%;
margin-top: 5px;
width: 100%;
display: block;
}
#btn-dd {
margin: 20px;
text-align: center;
}
.foot-ul {
width: 100%;
}
.one_line {
display: block;
height: 1px;
border: 0;
border-top: 1px solid #eeeeee;
width: 100%;
margin-left: 20px;
}
.am-header {
display: -webkit-box;
display: -ms-flexbox;
display: box;
width: 100%;
position: relative;
padding: 7px 0;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
background: #1D222D;
height: 50px;
text-align: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
box-pack: center;
-webkit-box-align: center;
-ms-flex-align: center;
box-align: center;
}
.am-header h1 {
-webkit-box-flex: 1;
-ms-flex: 1;
box-flex: 1;
line-height: 18px;
text-align: center;
font-size: 18px;
font-weight: 300;
color: #fff;
}
</style>
</head>
<body text=#000000 bgColor="#ffffff" leftMargin=0 topMargin=4>
<header class="am-header">
<h1>這是支付寶電腦網站支付體驗入口頁</h1>
</header>
<div id="main">
<div id="tabhead" class="tab-head">
<h2 id="tab1" class="selected" name="tab">付 款</h2>
<h2 id="tab2" name="tab">交 易 查 詢</h2>
<h2 id="tab3" name="tab">退 款</h2>
<h2 id="tab4" name="tab">退 款 查 詢</h2>
<h2 id="tab5" name="tab">交 易 關 閉</h2>
</div>
<form name=alipayment action=http://localhost:8080/Myssm/views/hello0 method=post
target="_blank">
<div id="body1" class="show" name="divcontent">
<dl class="content">
<dt>商戶訂單號 :</dt>
<dd>
<input id="WIDout_trade_no" name="WIDout_trade_no" />
</dd>
<hr class="one_line">
<dt>訂單名稱 :</dt>
<dd>
<input id="WIDsubject" name="WIDsubject" />
</dd>
<hr class="one_line">
<dt>付款金額 :</dt>
<dd>
<input id="WIDtotal_amount" name="WIDtotal_amount" />
</dd>
<hr class="one_line">
<dt>商品描述:</dt>
<dd>
<input id="WIDbody" name="WIDbody" />
</dd>
<hr class="one_line">
<dt></dt>
<dd id="btn-dd">
<span class="new-btn-login-sp">
<button class="new-btn-login" type="submit"
style="text-align: center;">付 款</button>
</span> <span class="note-help">如果您點選“付款”按鈕,即表示您同意該次的執行操作。</span>
</dd>
</dl>
</div>
</form>
<form name=tradequery action=http://localhost:8080/Myssm/views/hello1 method=post
target="_blank">
<div id="body2" class="tab-content" name="divcontent">
<dl class="content">
<dt>商戶訂單號 :</dt>
<dd>
<input id="WIDTQout_trade_no" name="WIDTQout_trade_no" />
</dd>
<hr class="one_line">
<dt>支付寶交易號 :</dt>
<dd>
<input id="WIDTQtrade_no" name="WIDTQtrade_no" />
</dd>
<hr class="one_line">
<dt></dt>
<dd id="btn-dd">
<span class="new-btn-login-sp">
<button class="new-btn-login" type="submit"
style="text-align: center;">交 易 查 詢</button>
</span> <span class="note-help">商戶訂單號與支付寶交易號二選一,如果您點選“交易查詢”按鈕,即表示您同意該次的執行操作。</span>
</dd>
</dl>
</div>
</form>
<form name=traderefund action=alipay.trade.refund.jsp method=post
target="_blank">
<div id="body3" class="tab-content" name="divcontent">
<dl class="content">
<dt>商戶訂單號 :</dt>
<dd>
<input id="WIDTRout_trade_no" name="WIDTRout_trade_no" />
</dd>
<hr class="one_line">
<dt>支付寶交易號 :</dt>
<dd>
<input id="WIDTRtrade_no" name="WIDTRtrade_no" />
</dd>
<hr class="one_line">
<dt>退款金額 :</dt>
<dd>
<input id="WIDTRrefund_amount" name="WIDTRrefund_amount" />
</dd>
<hr class="one_line">
<dt>退款原因 :</dt>
<dd>
<input id="WIDTRrefund_reason" name="WIDTRrefund_reason" />
</dd>
<hr class="one_line">
<dt>退款請求號 :</dt>
<dd>
<input id="WIDTRout_request_no" name="WIDTRout_request_no" />
</dd>
<hr class="one_line">
<dt></dt>
<dd id="btn-dd">
<span class="new-btn-login-sp">
<button class="new-btn-login" type="submit"
style="text-align: center;">退 款</button>
</span> <span class="note-help">商戶訂單號與支付寶交易號二選一,如果您點選“退款”按鈕,即表示您同意該次的執行操作。</span>
</dd>
</dl>
</div>
</form>
<form name=traderefundquery
action=alipay.trade.fastpay.refund.query.jsp method=post
target="_blank">
<div id="body4" class="tab-content" name="divcontent">
<dl class="content">
<dt>商戶訂單號 :</dt>
<dd>
<input id="WIDRQout_trade_no" name="WIDRQout_trade_no" />
</dd>
<hr class="one_line">
<dt>支付寶交易號 :</dt>
<dd>
<input id="WIDRQtrade_no" name="WIDRQtrade_no" />
</dd>
<hr class="one_line">
<dt>退款請求號 :</dt>
<dd>
<input id="WIDRQout_request_no" name="WIDRQout_request_no" />
</dd>
<hr class="one_line">
<dt></dt>
<dd id="btn-dd">
<span class="new-btn-login-sp">
<button class="new-btn-login" type="submit"
style="text-align: center;">退 款 查 詢</button>
</span> <span class="note-help">商戶訂單號與支付寶交易號二選一,如果您點選“退款查詢”按鈕,即表示您同意該次的執行操作。</span>
</dd>
</dl>
</div>
</form>
<form name=tradeclose action=alipay.trade.close.jsp method=post
target="_blank">
<div id="body5" class="tab-content" name="divcontent">
<dl class="content">
<dt>商戶訂單號 :</dt>
<dd>
<input id="WIDTCout_trade_no" name="WIDTCout_trade_no" />
</dd>
<hr class="one_line">
<dt>支付寶交易號 :</dt>
<dd>
<input id="WIDTCtrade_no" name="WIDTCtrade_no" />
</dd>
<hr class="one_line">
<dt></dt>
<dd id="btn-dd">
<span class="new-btn-login-sp">
<button class="new-btn-login" type="submit"
style="text-align: center;">交 易 關 閉</button>
</span> <span class="note-help">商戶訂單號與支付寶交易號二選一,如果您點選“交易關閉”按鈕,即表示您同意該次的執行操作。</span>
</dd>
</dl>
</div>
</form>
<div id="foot">
<ul class="foot-ul">
<li>支付寶版權所有 2015-2018 ALIPAY.COM</li>
</ul>
</div>
</div>
</body>
<script language="javascript">
var tabs = document.getElementsByName('tab');
var contents = document.getElementsByName('divcontent');
(function changeTab(tab) {
for(var i = 0, len = tabs.length; i < len; i++) {
tabs[i].onmouseover = showTab;
}
})();
function showTab() {
for(var i = 0, len = tabs.length; i < len; i++) {
if(tabs[i] === this) {
tabs[i].className = 'selected';
contents[i].className = 'show';
} else {
tabs[i].className = '';
contents[i].className = 'tab-content';
}
}
}
function GetDateNow() {
var vNow = new Date();
var sNow = "";
sNow += String(vNow.getFullYear());
sNow += String(vNow.getMonth() + 1);
sNow += String(vNow.getDate());
sNow += String(vNow.getHours());
sNow += String(vNow.getMinutes());
sNow += String(vNow.getSeconds());
sNow += String(vNow.getMilliseconds());
document.getElementById("WIDout_trade_no").value = sNow;
document.getElementById("WIDsubject").value = "測試";
document.getElementById("WIDtotal_amount").value = "0.01";
}
GetDateNow();
</script>
</html>
index.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/views/";
%>
<html>
<head>
<link href="<%=basePath%>css/classification/Classification_page.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${message}
<h2>Hello World!</h2>
</body>
</html>