SpringBoot整合支付宝支付
支付宝支付
1.首先在工程导入相关的maven依赖
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.11.33.ALL</version>
</dependency>
2.下载支付宝密钥生成器或者在web端生成密钥
3.在沙箱应用中点击把自己生成的应用公钥 复制到设置/查看生成支付宝公钥
4.下载支付宝支付demo,把里面的AlipayConfig(这里我已经给你们拿到了,你们自己复制到工程里面就可以了)
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 = "";
// 商户私钥,您的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 = "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.alipay.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填成你沙箱应用的app_id
这里的商户私钥merchant_private_key复制之前下载的密钥生成器里面的密钥
这里的支付宝公钥alipay_public_key复制之前生成的公钥
注意把下面的那个支付宝网关改成你沙箱应用的网关
这时候启动项目可能会出现编码集错误的问题:问题就是AlipayConfig类你可能不是UTF-8格式的更改一下即可(如果是UTF-8建议再次更改一下)
5.现在开始编码直接在controller里面编写接口
package com.star.controller;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.star.config.AlipayConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @author pengxin
* @version 1.0
* @date 2021/1/26 10:09
*/
@RestController
@Slf4j
public class AlipayController {
/**
* 统一收单下单并支付页面接口
*/
@RequestMapping("/alipay")
public void pay(String price, String name,HttpServletResponse response) throws Exception {
DefaultAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,AlipayConfig.sign_type);
AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();
alipayTradePagePayRequest.setReturnUrl(AlipayConfig.return_url);//跳页面
alipayTradePagePayRequest.setNotifyUrl(AlipayConfig.notify_url);//跳方法
//模拟参数
Map<String,Object> map = new HashMap<>();
map.put("out_trade_no",System.currentTimeMillis());//订单号
map.put("product_code","FAST_INSTANT_TRADE_PAY");//PC端支付方式
map.put("total_amount",price+".00");//交易金额
map.put("subject",name);//商品名称
String string = JSONObject.toJSONString(map);
log.info("模拟数据"+string);
alipayTradePagePayRequest.setBizContent(string);
String body = alipayClient.pageExecute(alipayTradePagePayRequest).getBody();
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(body);
response.getWriter().flush();
response.getWriter().close();
}
/**
* 统一收单交易退款接口
*/
@RequestMapping("/refund")
public void refund(HttpServletResponse response) throws Exception {
DefaultAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,AlipayConfig.sign_type);
AlipayTradeRefundRequest alipayTradeRefundRequest = new AlipayTradeRefundRequest();
alipayTradeRefundRequest .setReturnUrl(AlipayConfig.return_url);//跳页面
alipayTradeRefundRequest .setNotifyUrl(AlipayConfig.notify_url);//跳方法
Map<String,Object> map = new HashMap<>();
//map.put("trade_no",);//支付宝交易号
map.put("out_trade_no",123456789);//订单号
map.put("refund_amount",88.88);//退款金额
String string = JSONObject.toJSONString(map);
log.info("退款数据"+string);
alipayTradeRefundRequest.setBizContent(string);
String body = alipayClient.pageExecute(alipayTradeRefundRequest).getBody();
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(body);
response.getWriter().flush();
response.getWriter().close();
}
}
这里面的有些参数是必须要填写的,详情请见支付宝官网的API(以下是我列举的例子)这些必选的必须要填写
6.最后启动项目就可以了这里的账户名就是你的沙箱账号和密码