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.jsapi.JsapiService;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.refund.RefundService;
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.annotation.Configuration;

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

    // 小程序id
    private String appId;

    // 商户id
    private String merchantId;

    // apiV3私钥
    private String apiV3Key;

    // 通知回调地址
    private String notifyUrl;

    // 退款通知回调地址
    private String refundNotifyUrl;

    // 私钥证书路径
    private String privateKeyPath;

    // 证书序列号
    private String merchantSerialNumber;


    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();
    }

    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();
    }

    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();
    }

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

}
