<?php
/**
 *
 * example目录下为简单的支付样例，仅能用于搭建快速体验微信支付使用
 * 样例的作用仅限于指导如何使用sdk，在安全上面仅做了简单处理， 复制使用样例代码时请慎重
 * 请勿直接直接使用样例对外提供服务
 *
 **/

require_once "lib/WxPay.Api.php";
require_once 'lib/WxPay.Notify.php';
require_once "lib/WxPay.Config.php";

use think\facade\Log;
use think\facade\Db;

class PayNotifyCallBack extends WxPayNotify
{
    //查询订单
    public function Queryorder($transaction_id)
    {
        $input = new WxPayOrderQuery();
        $input->SetTransaction_id($transaction_id);
        $result = WxPayApi::orderQuery($input);
        Log::write("query:" . json_encode($result));
        if (array_key_exists("return_code", $result)
            && array_key_exists("result_code", $result)
            && $result["return_code"] == "SUCCESS"
            && $result["result_code"] == "SUCCESS") {
            return true;
        }
        return false;
    }

    /**
     *
     * 回包前的回调方法
     * 业务可以继承该方法，打印日志方便定位
     * @param string $xmlData 返回的xml参数
     *
     **/
    public function LogAfterProcess($xmlData)
    {
        Log::write("call back， return xml:" . $xmlData);
        return;
    }

    //重写回调处理函数

    /**
     * @param WxPayNotifyResults $data 回调解释出的参数
     * @param WxPayConfigInterface $config
     * @param string $msg 如果回调处理失败，可以将错误信息输出到该方法
     * @return true回调出来完成不需要继续回调，false回调处理未完成需要继续回调
     */
    public function NotifyProcess($objData, &$msg)
    {
        Log::write('NotifyProcess 方法被调用', 'info');
        $data = $objData->GetValues();
        Log::write("微信回调参数:" . json_encode($data));
        if (!array_key_exists("attach", $data)
            || (array_key_exists("attach", $data) && empty($data['attach']))) {
            //TODO失败,不是支付成功的通知
            //如果有需要可以做失败时候的一些清理处理，并且做一些监控
            $msg = "异常异常";
            return false;
        }
        $attach = json_decode($data['attach'], true);
        $mch_id = $attach['mch_id'];
        $pay_type = $attach['pay_type'];
        $platform = $attach['platform'];
        $GLOBALS['mch_id'] = $mch_id;
        $GLOBALS['pay_type'] = $pay_type;
        $GLOBALS['platform'] = $platform;
        $out_trade_no = $data['out_trade_no'];
        $sys_pay_notify = Db::name('sys_pay_notify')->where('order_number', $out_trade_no)->find();
        //TODO 1、进行参数校验
        if (!array_key_exists("return_code", $data)
            || (array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {
            //TODO失败,不是支付成功的通知
            //如果有需要可以做失败时候的一些清理处理，并且做一些监控
            $msg = "异常异常";
            return false;
        }
        if (!array_key_exists("transaction_id", $data)) {
            $msg = "输入参数不正确";
            Log::write("输入参数不正确");
            return false;
        }

        $config = new WxPayConfig();
        //TODO 2、进行签名验证
        try {
            $checkResult = $objData->CheckSign($config);
            if ($checkResult == false) {
                //签名错误
                Log::write("微信签名错误...");
                return false;
            }
        } catch (Exception $e) {
            Log::write(json_encode($e));
        }
        //TODO 3、处理业务逻辑
        if (empty($sys_pay_notify)) {
            $pay_notify['mch_id'] = $mch_id;
            $pay_notify['order_number'] = $out_trade_no;
            $pay_notify['notify_message'] = json_encode($data);
            $pay_notify['create_time'] = time();
            Db::name('sys_pay_notify')->insert($pay_notify);
            //支付回调
            $param = ['out_trade_no' => $out_trade_no];
            \iyibai\services\HookService::call('SysOrderHook', 'payBusinessCallBack', $param);
        }
        return true;
    }
}

