一:准备工作
1:登录支付宝开放平台
2:点击控制台
3:点击沙箱环境
4:沙箱应用
5:沙箱账号,分为商户账号和买家账号
6:点击沙箱工具可以下载沙箱支付宝到手机,方便手机扫码支付
二:支付宝api文档地址
选择电脑网站支付,也可以选择其他的app支付,手机网站支付等等,这次对接的是电脑网站支付
三:引入maven依赖
<!--支付宝支付--> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.38.85.ALL</version> </dependency>
四:对接 alipay.trade.page.pay(统一收单下单并支付页面接口)
示例代码:
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
//异步接收地址,仅支持http/https,公网可访问
request.setNotifyUrl("");
//同步跳转地址,仅支持http/https
request.setReturnUrl("");
/******必传参数******/
JSONObject bizContent = new JSONObject();
//商户订单号,商家自定义,保持唯一性
bizContent.put("out_trade_no", "20210817010101004");
//支付金额,最小值0.01元
bizContent.put("total_amount", 0.01);
//订单标题,不可使用特殊符号
bizContent.put("subject", "测试商品");
//电脑网站支付场景固定传值FAST_INSTANT_TRADE_PAY
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
五:常量类
public class constant {
/**
* 支付宝网址
*/
public static final String serverUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
/**
* appId
*/
public static final String appId = "";
/**
* 应用私钥:
*/
public static final String privateKey = "";
/**
* format
*/
public static final String format = "JSON";
/**
* charset
*/
public static final String charset = "UTF-8";
/**
* 应用公钥
*/
public static final String alipayPublicKey = "";
/**
* 签名方式
*/
public static final String signType = "RSA2";
/**
* 异步返回
*/
public static final String NotifyUrl = " http://c45fjq.natappfree.cc/pay/alpay";
/**
* 同步返回
*/
public static final String ReturnUrl = "http://localhost:9999/pay/pcfh";
/**
* 支付宝公钥
*/
public static final String PublicKey="";
}
解析常量类里面的数据和获取方式:
serverUrl:是支付宝进行支付的网址
appId:商户id,获取方式
format=json
charset=utf-8
signType=RSA2
这三个值是默认值,不会改变
privateKey
alipayPublicKey
PublicKey
这三个值是:应用私钥,应用公钥,支付宝公钥,获取方式
ReturnUrl:同步返回地址,支付成功之后页面自动跳转的页面
NotifyUrl:异步通知,用于支付宝回调通知商户
六:创建订单表
CREATE TABLE `sys_orders` (
`order_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`commodity_name` varchar(50) DEFAULT NULL COMMENT '商品名称',
`customer_name` varchar(100) DEFAULT NULL COMMENT '顾客姓名',
`order_date` date DEFAULT NULL COMMENT '订单日期',
`total_amount` decimal(10,2) DEFAULT NULL COMMENT '订单总金额',
`order_state` varchar(2) DEFAULT NULL COMMENT '订单状态(1:支付成功,2:支付失败,3:取消交易,4:已退款)',
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8;
创建订单表CRUD,自行解决
七:支付流程图
八:发起支付
@RequestMapping("/pc")
public void payPc(String orderId, HttpServletResponse httpServletResponse) {
try {
//根据订单id查询订单信息
SysOrders sysOrders = sysOrdersService.selectOne( orderId );
AlipayClient alipayClient = new DefaultAlipayClient(
constant.serverUrl,
constant.appId,
constant.privateKey,
constant.format,
constant.charset,
constant.alipayPublicKey,
constant.signType
);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
//异步接收地址,仅支持http/https,公网可访问
//request.setNotifyUrl( constant.NotifyUrl );
//同步跳转地址,仅支持http/https
// request.setReturnUrl( constant.ReturnUrl );
/******必传参数******/
JSONObject bizContent = new JSONObject();
//商户订单号,商家自定义,保持唯一性
bizContent.put( "out_trade_no", sysOrders.getOrderId() );
//支付金额,最小值0.01元
bizContent.put( "total_amount", sysOrders.getTotalAmount() );
//订单标题,不可使用特殊符号
bizContent.put( "subject", sysOrders.getCommodityName() );
//电脑网站支付场景固定传值FAST_INSTANT_TRADE_PAY
bizContent.put( "product_code", "FAST_INSTANT_TRADE_PAY" );
request.setBizContent( bizContent.toString() );
AlipayTradePagePayResponse response = alipayClient.pageExecute( request );
if (response.isSuccess()) {
String body = response.getBody();
httpServletResponse.setContentType( "text/html;charset=utf-8" );
PrintWriter writer = httpServletResponse.getWriter();
writer.write( "<!DOCTYPE html>\n" +
"<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>" );
writer.write( response.getBody() );
writer.write( "</body>\n" +
"</html>" );
writer.flush();
writer.close();
System.out.println( "调用创建订单接口成功" );
} else {
System.out.println( "调用创建订单接口失败" );
}
} catch (Exception e) {
e.printStackTrace();
}
}
调用支付接口创建订单基本信息,用httpServletResponse返回给前端
九:测试
数据库新增一条订单信息,
浏览器调用支付接口,传入订单id
账号是沙箱账号中的买家账号和买家密码,注意,不能填写为商户账号和商户密码
输入账号选择下一步
输入支付密码,同在沙箱环境沙箱账号买家信息中
支付成功,等待几秒之后会跳转到同步通知这个网址,这个网址可以是本地的,可以使用localhost,在常量类的同步通知中配置