package com.ruoyi.common.pay.wx.config;

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.service.payments.app.AppService;
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.refund.RefundService;
import com.wechat.pay.java.service.transferbatch.TransferBatchService;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 微信支付配置
 * @author 辉
 * 2024/3/11
 */
@Configuration
@Getter
public class WxPayConfig {

    // 小程序id
    @Value("${wx.pay.appId}")
    private String appId;

    // 商户id
    @Value("${wx.pay.merchantId}")
    private String merchantId;

    // apiV3私钥
    @Value("${wx.pay.apiV3Key}")
    private String apiV3Key;

    // 通知回调地址
    @Value("${wx.pay.notifyUrl}")
    private String notifyUrl;

    // 退款通知回调地址
    @Value("${wx.pay.refundNotifyUrl}")
    private String refundNotifyUrl;

    // 私钥证书路径
    @Value("${wx.pay.privateKeyPath}")
    private String privateKeyPath;

    // 证书序列号
    @Value("${wx.pay.merchantSerialNumber}")
    private String merchantSerialNumber;

    @Bean
    public AppService appService () {
        // 初始化商户配置
        Config config = new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
                        .privateKeyFromPath(privateKeyPath)
                        .merchantSerialNumber(merchantSerialNumber)
                        .apiV3Key(apiV3Key)
                        .build();
        // 初始化服务
        return new AppService.Builder().config(config).build();
    }

    @Bean
    public JsapiService jsapiService() {
        // 初始化商户配置
        Config config = new RSAAutoCertificateConfig.Builder()
                .merchantId(merchantId)
                // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
                .privateKeyFromPath(privateKeyPath)
                .merchantSerialNumber(merchantSerialNumber)
                .apiV3Key(apiV3Key)
                .build();
        // 初始化服务
        return new JsapiService.Builder().config(config).build();
    }

    @Bean
    public JsapiServiceExtension jsapiServiceExtension() {
        // 初始化商户配置
        Config config = new RSAAutoCertificateConfig.Builder()
                .merchantId(merchantId)
                // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
                .privateKeyFromPath(privateKeyPath)
                .merchantSerialNumber(merchantSerialNumber)
                .apiV3Key(apiV3Key)
                .build();
        // 初始化服务
        return new JsapiServiceExtension
                .Builder()
                .config(config)
                .signType("RSA") // 不填默认为RSA
                .build();
    }

    @Bean
    public RefundService refundService() {
        // 初始化商户配置
        Config config = new RSAAutoCertificateConfig.Builder()
                .merchantId(merchantId)
                // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
                .privateKeyFromPath(privateKeyPath)
                .merchantSerialNumber(merchantSerialNumber)
                .apiV3Key(apiV3Key)
                .build();
        // 初始化服务
        return new RefundService
                .Builder()
                .config(config)
                .build();
    }

    // 微信通知解析器
    @Bean
    public NotificationParser notificationParser() {
        NotificationConfig config = new RSAAutoCertificateConfig.Builder()
                .merchantId(merchantId)
                .privateKeyFromPath(privateKeyPath)
                .merchantSerialNumber(merchantSerialNumber)
                .apiV3Key(apiV3Key)
                .build();
        return new NotificationParser(config);
    }

}
