SpringCloud整合pc端支付宝支付2----业务代码篇

289 阅读3分钟
相关连接

电脑网站支付产品介绍 - 支付宝文档中心 (alipay.com)

实现步骤
  1. maven引入依赖
  2. 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;
    }
}
欧克,今天的笔记就写到这里吧,如果需要相关的数据,请看上一篇 (还没写。。。。。)