<?php
declare (strict_types=1);
namespace app\api\controller;

use app\Request;
use app\BaseController;
use app\model\api\PayTrade;
use library\services\UtilService;
use library\utils\WxpayV2 as wxpayApi;
use library\utils\weixinPay as wxpayApiV3;
use app\model\api\Sys as SysModel;
use WeChatPay\Transformer;
use app\lib\OrderLib;
use think\Exception;

class Pay extends BaseController{
    /**
     * 微信支付V2异步反馈
     * @param Request $request
     * @return boolean
     */
    public function wxpayNotify(Request $request){
        $logfile = app()->getRootPath().'public/log/wxnotify.log';
        $xmlData = $request->getInput();
        if(empty($xmlData)){
            return false;
        }
//        $weixinConfig = (new SysModel)->getWeixinConfig();
//        file_put_contents($logfile, PHP_EOL.date("Y-m-d H:i:s").PHP_EOL.$xmlData.PHP_EOL,FILE_APPEND | LOCK_EX);
        $wxpay = new wxpayApi();
//        $wxpay = new wxpayApi($weixinConfig);
        //回调验签
        $res = $wxpay->notifyCheckSign($xmlData);
        if(!$res || empty($res["data"])){
            return false;
        }
        $result=$res["data"];
        //验证返回信息
        if(empty($result["return_code"]) || $result["return_code"]!="SUCCESS"){
            return false;
        }
        //验证支付信息
        if(empty($result["result_code"]) || $result["result_code"]!="SUCCESS"){
            return false;
        }
        //查询订单
        $out_trade_no   = $result["out_trade_no"];
        $data = $wxpay->searchOrderQuery($out_trade_no);
        if(empty($data)){
            return false;
        }
        //支付成功
        if($data["trade_state"]=="SUCCESS"){
            $payDataInfo = [
                'totalMoney' =>empty($data["total_fee"])      ? "未返回" : $data["total_fee"]/100,
                'payMoney'   =>empty($data["cash_fee"])       ? "未返回" : $data["cash_fee"]/100,
                'payTradeNo' =>empty($data["transaction_id"]) ? "未返回" : $data["transaction_id"],
                'outTradeNo' =>empty($data["out_trade_no"])   ? "未返回" : $data["out_trade_no"],
                "tradeStatus"=>empty($data["trade_state"])    ? "未返回" : $data["trade_state"],
                "payTime"    =>empty($data["time_end"])       ? "未返回" : $data["time_end"],
                "attach"     =>empty($data["attach"])         ? "未返回" : $data["attach"],
            ];
            $pay_json = json_encode($payDataInfo);
            (new OrderLib)->orderPay($out_trade_no, $pay_json);
        }
    }
     /**
     * 微信支付V3异步反馈
     * @param Request $request
     * @return boolean
     */
    public function wxpayNotifyV3(Request $request){
        $post = UtilService::getMore([
            ['id', ''],
            ['create_time', ''],
            ['event_type',''],
            ['resource_type', ''],
            ['resource',[]],
            ['summary', ''],
        ], $request);
        if(empty($post["event_type"]) || $post["event_type"] != "TRANSACTION.SUCCESS"){
            return false;
        }
        if(empty($post["resource_type"]) || $post["resource_type"]!="encrypt-resource"){
            return false;
        }
        if(empty($post["resource"])){
            return false;
        }
        $wxpay = new wxpayApiV3();
        $result = $wxpay->aesGcmDecrypt([
            "associated_data"=>$post["resource"]["associated_data"],
            "nonce"=>$post["resource"]["nonce"],
            "ciphertext"=>$post["resource"]["ciphertext"],
        ]);
        
        if(!$result){
            return false;
        }
        //商家内部订单号
        $out_trade_no   = $result["out_trade_no"];
        $res = $wxpay->searchOrder($out_trade_no);
        if(!$res){
            return false;
        }
        $data = json_decode($res,true);
        //支付成功
        if($data["trade_state"]=="SUCCESS"){
            $payDataInfo = [
                    'totalMoney' =>(empty($data["amount"]) || empty($data["amount"]["total"]))      ?"未返回":$data["amount"]["total"]/100,
                    'payMoney'   =>(empty($data["amount"]) || empty($data["amount"]["payer_total"]))?"未返回":$data["amount"]["payer_total"]/100,
                    'payTradeNo' =>empty($data["transaction_id"]) ? "未返回" : $data["transaction_id"],
                    'outTradeNo' =>empty($data["out_trade_no"])   ? "未返回" : $data["out_trade_no"],
                    "tradeStatus"=>empty($data["trade_state"])    ? "未返回" : $data["trade_state"],
                    "payTime"    =>empty($data["success_time"])   ? "未返回" : $data["success_time"],
            ];
            $pay_json = json_encode($payDataInfo);
            (new OrderLib)->orderPay($out_trade_no, $pay_json);
        }
    }

}

