相关连接
电脑网站支付产品介绍 - 支付宝文档中心 (alipay.com)
实现步骤
- maven引入依赖
- AliPayClient配置类,用于支付,退款等请求的客户端
代码实现
引入sdk
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.8.73.ALL</version>
</dependency>
配置类的实现
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AlipayConfig {
//获取nacos配置文件的数
@Value("${alipay_url}")
private String alipay_url;
//私钥 由支付宝平台助手生成
@Value("${app_private_key}")
private String app_private_key;
@Value("${app_id}")
private String app_id; // app_id = app_id{2021001163617452}
//下的那请求传参的数据类型
public final static String format="json";
public final static String charset="utf-8";
public final static String sign_type="RSA2";
// 返回的同步回调地址
public static String return_payment_url;
// 返回异步回调地址
public static String notify_payment_url;
// 当同步回调成功之后,给用户展示哪个页面!
public static String return_order_url;
// 支付宝公钥
public static String alipay_public_key;
/**
* 因为当前变量是 static 修饰的 所以不能直接用 @Value赋值
* 所以现在给上面四个变量赋值的话 需要使用方法赋值
*/
@Value("${alipay_public_key}")
public void setAlipay_public_key(String alipay_public_key) {
AlipayConfig.alipay_public_key = alipay_public_key;
}
@Value("${return_payment_url}")
public void setReturn_url(String return_payment_url) {
AlipayConfig.return_payment_url = return_payment_url;
}
@Value("${notify_payment_url}")
public void setNotify_url(String notify_payment_url) {
AlipayConfig.notify_payment_url = notify_payment_url;
}
@Value("${return_order_url}")
public void setReturn_order_url(String return_order_url) {
AlipayConfig.return_order_url = return_order_url;
}
/**
* 当前使用 AlipayClient 发送下单,退款等请求
*/
@Bean
public AlipayClient alipayClient(){
AlipayClient alipayClient = new DefaultAlipayClient(alipay_url, app_id, app_private_key, format, charset, alipay_public_key, sign_type);
return alipayClient;
}
}
支付代码示例:当前支付逻辑是根据 orderId 获取 orderInfo,然后支付请求传参 并没有进行拆单操作
统一收单下单并支付页面接口 - 支付宝文档中心 (alipay.com) 每个参数代表什么意思 可以从这里查看
/**
* 下单支付
* @param orderId
* @return
* @throws AlipayApiException
*/
@Override
public String createAliPay(Long orderId) throws AlipayApiException {
//下单支付需要订单详情和订单明细数据
OrderInfo orderInfo = orderFeignClient.getOrderInfo(orderId);
//如果获取的订单是已关闭 或者 已支付的 就不需要支付了 这里根据业务需要做相应的校验
if ("CLOSED".equals(orderInfo.getOrderStatus()) || "PAID".equals(orderInfo.getOrderStatus())){
return "订单已付款或已经关闭!";
}
//付款的时候 还要保存交易记录
paymentService.savePaymentInfo(orderInfo, PaymentType.ALIPAY.name());
/**
* 开始进行支付操作
* 阿里请求客户端
* 请求参数封装
*/
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 异步回调地址!
request.setNotifyUrl(AlipayConfig.notify_payment_url);
// 同步回调地址!
request.setReturnUrl(AlipayConfig.return_payment_url);
//请求参数封装
JSONObject param = new JSONObject();
param.put("out_trade_no", orderInfo.getOutTradeNo()); //自定义的订单号
param.put("total_amount", 0.01); // 一分钱!交易金额 支付的单位是 元
// param.put("total_amount", orderInfo.getTotalAmount());
param.put("subject", orderInfo.getTradeBody()); //标题
param.put("product_code", "FAST_INSTANT_TRADE_PAY");
//********这里说明一下 这是设置二维码的过期时间(绝对超时时间) 设置10分钟后过期**********
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE,10);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date_expire = simpleDateFormat.format(calendar.getTime());
param.put("time_expire", date_expire);
// 订单绝对超时时间
// time_expire 绝对超时时间!
// timeout_express 相对超时时间!
// bizContent.put("timeout_express", "90m"); 订单绝对超时时间
//// 商品明细信息,按需传入 orderDetail;
//JSONArray goodsDetail = new JSONArray();
//JSONObject goods1 = new JSONObject();
//goods1.put("goods_id", "goodsNo1");
//goods1.put("goods_name", "子商品1");
//goods1.put("quantity", 1);
//goods1.put("price", 0.01);
//goodsDetail.add(goods1);
//bizContent.put("goods_detail", goodsDetail);
//// 扩展信息,按需传入
//JSONObject extendParams = new JSONObject();
//extendParams.put("sys_service_provider_id", "2088511833207846");
//bizContent.put("extend_params", extendParams);
request.setBizContent(param.toString());
//发送支付的请求 会自动跳转到二维码界面
String body = alipayClient.pageExecute(request).getBody();
//返回支付结果 每一个步骤根据自己的业务逻辑 进行相应的改动
return body;
}
退款代码:这里只做了简单的封装
统一收单交易退款接口 - 支付宝文档中心 (alipay.com)
/**
* 支付宝退款
* 通过自定义商户订单号 或者阿里产生的订单号进行退款
* 建议使用阿里产生的订单号进行退款
* @param orderId
* @return
*/
@Override
public Boolean refund(Long orderId) {
OrderInfo orderInfo = this.orderFeignClient.getOrderInfo(orderId);
// AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", orderInfo.getOutTradeNo()); //商户自定义的订单号
bizContent.put("refund_amount", 0.01); //退款的金额
bizContent.put("out_request_no", "HZ01RF001"); //
//// 返回参数选项,按需传入
//JSONArray queryOptions = new JSONArray();
//queryOptions.add("refund_detail_item_list");
//bizContent.put("query_options", queryOptions);
request.setBizContent(bizContent.toString());
AlipayTradeRefundResponse response = null;
try {
response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
if(response.isSuccess()){
System.out.println("调用成功");
return true;
} else {
System.out.println("调用失败");
return false;
}
}