基于SpringBoot支付寶支付功能極簡
1、導入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.4.ALL</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- servlet 依賴包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
2、支付寶配置類
參數需要去支付寶開發憑條申請,這裡我使用的是沙箱環境。模拟交易金額收支沙箱環境也是可以看到的,收取一定費率手續費。
package springboot1.config;
//todo 支付寶配置類
public class AlipayConfig {
//todo APP應用ID
public static String app_id = "2021000127830828";
//todo 商戶私鑰
public static String merchant_private_key = "";
//todo 支付寶公鑰
public static String alipay_public_key = "" ;
public static String notify_url = "";
//todo 同步通知
public static String return_url = "";
//todo 簽名方式
public static String sign_type = "RSA2";
//todo 字元編碼格式
public static String charset = "utf-8";
//todo 支付寶網關
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}
3、IDUtil 使用雪花算法生成18位訂單号
package springboot1.until;
import org.springframework.stereotype.Component;
@Component
public class IDUtil {
//todo 使用雪花算法 随機生成 18位 ID
public static String getId(){
try {
Thread.sleep(1);
}catch (Exception e){
e.printStackTrace();
}
SnowflakeIdWorker sf =new SnowflakeIdWorker(2,3);
long l =sf.nextId();
return String.valueOf(l);
}
}
4、AlipayServer 支付接口
package springboot1.server;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface AlipayServer {
void pay(HttpServletResponse response,HttpServletRequest request) throws IOException;
}
5、AlipayServerImpl 支付接口實作類
package springboot1.server.impl;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import springboot1.config.AlipayConfig;
import springboot1.server.AlipayServer;
import springboot1.until.IDUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@Service
@Slf4j
public class AlipayServerImpl implements AlipayServer {
@Override
public void pay(HttpServletResponse response,HttpServletRequest request) throws IOException {
response.setContentType("text/html;charset=utf-8"); //todo 内容類型
PrintWriter writer = response.getWriter();
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json",AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//todo 設定請求參數
AlipayTradePagePayRequest aliPayRequest = new AlipayTradePagePayRequest();
//todo 随機生成一個 18位訂單号
String order_number = IDUtil.getId();
//todo 設定付款金額
String total_amount = new String("159");
//todo 訂單名稱
String subject = ("小米智能手環6");
aliPayRequest.setBizContent("{\"out_trade_no\":\"" + order_number + "\","
+ "\"total_amount\":\"" + total_amount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
String result = null;
try {
result = alipayClient.pageExecute(aliPayRequest).getBody();
}catch (Exception e){
e.printStackTrace();
}
writer.println(result);
log.info("傳回結果={}",result);
}
}
6、AlipayController 支付控制器類
package springboot1.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springboot1.server.AlipayServer;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/alipayController")
public class AlipayController {
@Resource
private AlipayServer alipayServer;
@RequestMapping("/payMent")
public void payMent(HttpServletResponse response,HttpServletRequest request){
try {
alipayServer.pay(response,request);
}catch (Exception e){
e.printStackTrace();
}
}
@RequestMapping("/")
public String toTest(){
return "index";
}
}
7、結果
