package com.ruoyi.system.service.impl;

import com.alipay.api.*;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.ruoyi.system.domain.ali.AliPayBean;
import com.ruoyi.system.domain.wx.WxPayV3Bean;
import com.ruoyi.system.service.IAlipayService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Map;

/**
 * @Author: tjf
 * @Date: 2024/1/18 10:04
 * @Describe:
 */
@Service
public class AlipayServiceImpl implements IAlipayService {
    @Resource
    private AliPayBean aliPayBean;
    /**
     * 支付宝开放平台接收 request请求对象后
     * @return
     */
    @Override
    public String tradeCreate(AlipayTradeWapPayModel model) throws Exception {
        //封装签名过程
        AlipayConfig alipayConfig = new AlipayConfig();
        alipayConfig.setServerUrl(aliPayBean.getGatewayUrl());
        alipayConfig.setAppId(aliPayBean.getAppId());
        alipayConfig.setPrivateKey(aliPayBean.getMerchantPrivateKey());
        alipayConfig.setFormat("json");
        alipayConfig.setAlipayPublicKey(aliPayBean.getPublicKey());
        alipayConfig.setCharset("UTF-8");
        alipayConfig.setSignType("RSA2");
        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
        ////支付宝公共参数
        AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
        ///同步跳转地址，仅支持http/https
        request.setReturnUrl(aliPayBean.getReturnUrl());
        //封装参数
        /*产品码。 商家和支付宝签约的产品码。 枚举值（点击查看签约情况）：
         QUICK_WAP_WAY：手机网站支付产品。 默认值为 QUICK_WAP_WAY。*/
        model.setProductCode("QUICK_WAP_WAY");
        model.setOutTradeNo("DMGT"+System.currentTimeMillis());
        //商户订单号。 由商家自定义，64个字符以内，仅支持字母、数字、下划线且需保证在商户端不重复。
/*        model.setOutTradeNo("70501111111S001111119");
        model.setTotalAmount("9.00");
        model.setSubject("大乐透");
        model.setProductCode("QUICK_WAP_WAY");
        model.setSellerId("2088102147948060");*/
        request.setBizModel(model);

        //执行请求,调用支付宝
        AlipayTradeWapPayResponse response = alipayClient.pageExecute(request, "POST");
        // 如果需要返回GET请求，请使用
        // AlipayTradeWapPayResponse response = alipayClient.pageExecute(request, "GET");
        String pageRedirectionData = response.getBody();
        System.out.println(pageRedirectionData);
        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
            // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
            // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
            // System.out.println(diagnosisUrl);
        }
        return pageRedirectionData;
    }

    @Override
    public String tradeNotify(Map<String, String> params) {
        String result = "failure";
        try {
            //异步通知验签
            boolean signVerified = AlipaySignature.rsaCheckV1(params,
                    aliPayBean.getPublicKey(),
                    AlipayConstants.CHARSET_UTF8,
                    AlipayConstants.SIGN_TYPE_RSA2);
            if (!signVerified) {
                // TODO 验签失败则记录异常日志，并在response中返回failure.
                System.out.println("支付成功,异步通知验签失败!");
                return result;
            }
            System.out.println("支付成功,异步通知验签成功!");
            //TODO 验签成功后，按照支付结果异步通知中的描述，对支付结果中的业务内容进行二次校验
            //1.验证out_trade_no 是否为商家系统中创建的订单号
            String outTradeNo = params.get("out_trade_no");
            //2.判断 total_amount 是否确实为该订单的实际金额
            String totalAmount = params.get("total_amount");
            //3.校验通知中的 seller_id是否为 out_trade_no 这笔单据的对应的操作方
            String sellerId = params.get("seller_id");
            if (!sellerId.equals(aliPayBean.getSellerId())) {
                System.out.println("商家PID校验失败");

                return result;
            }
            //4.验证 app_id 是否为该商家本身
            String appId = params.get("app_id");
            if (!appId.equals(aliPayBean.getAppId())){
                System.out.println("app_id校验失败");
                return result;
            }
            //在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功
            String tradeStatus = params.get("trade_status");
            if (!"TRADE_SUCCESS".equals(tradeStatus) && !"TRADE_FINISHED".equals(tradeStatus)){
                System.out.println("未支付成功");
                return result;
            }
            //TODO 处理自身业务
            result = "success";
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return result;
    }
}
