<?php

include_once __DIR__ . '/../../../main.php';                                    # 导入game utils
include_once __DIR__ . '/../Mo/payResp.php';                                    # 导入通用返回值结构
include_once __DIR__ . '/../Mo/payRequest.php';                                 # 导入通用订单请求结构
require_once __DIR__ . '/../Mo/OrderNotice.php';                             # 导入通知数据接收模型

require_once __DIR__ . '/lib/HttpHelper.php';
require_once __DIR__ . '/lib/SignatureHelper.php';
//require_once __DIR__ . '/lib/Configuration.php';
//require_once __DIR__ . '/../tapdb/TapDBUtil.php';                               # tapdb上传
require_once __DIR__ . '/config_mi.php';                                        # 导入小米平台配置信息

use loyalsoft\CLog;
use loyalsoft\HttpUtil;

$tag = "notify.mi";
CLog::pay("[$tag] [收到通知]: " . HttpUtil::getQueryString());
$params = HttpUtil::getQueryParas();
//notify($params);
$notify = new notify();
echo( $notify->notify($params));

class notify {

    protected $values = array();

    /**
     * 接收订单通知接口
     */
    public function notify($request) {
        $reqparams = $request;
        $params = array();
        $httpHelper = new HttpHelper();
        foreach ($reqparams as $key => $value) {
            if ($key != 'signature') {
                $params[$key] = $httpHelper->urlDecode($value);
            }
        }
        $signature = $reqparams['signature'];
        $signObj = new SignatureHelper();
        $msg = '{"errcode":200}';
        if ($signObj->verifySignature($params, $signature, config_mi::SECRET_KEY)) {

//            if($this->queryOrder($userId, $cpOrderId))  # 主动去后台校验一下订单信息:=待完善
            //TODO:后续业务逻辑处理
            /**
             * 状态码:
              200 成功
              1506 cpOrderId 错误
              1515 appId 错误
              1516 uid 错误
              1525 signature 错误
              3515 订单信息不一致，用于和 CP 的订单校验
             */
            $result = $this->NotifyProcess($request, $msg);                     # 进入内部订单处理逻辑

            if ($result == true) {
                CLog::pay("[notify.mi][处理结果]: OK ($msg)");
            } else {
                CLog::pay("[notify.mi][处理结果]: fail! ($msg)");
            }
        } else {
            $msg = '{"errcode":1525}';
            CLog::pay("[notify.mi][处理结果]: $msg (验签失败) ");                     # 日志
        }
        return $msg;
    }

    public function NotifyProcess($data, &$msg) {

        if (!array_key_exists("cpOrderId", $data)) {
            $msg = $this->SetReturn(1506, "提取参数cpOrderId失败!");
            CLog::pay("[notify.mi] $msg");                                      # 日志
            return false;
        }

        $order = loyalsoft\pay\OrderNotice::Parse_mipayOrder($data);            # 提取参数
        CLog::pay($order);
        if ($order == null) {                                                   #
            $msg = $this->SetReturn(5055, "订单不存在!");
            CLog::pay("[notify.mi] $msg");                                      # 日志
            return false;
        }

        if (!$order->Check()) {                                                  # 订单校验,
            $msg = $this->SetReturn(3515, "订单校验失败");
            CLog::pay("[notify.mi] $msg");                                      # 日志
            return false;
        }
        if ($order->status == 2) {                                              # status为2(failed)的情况
            $order->UpdateOrderStatus();                                        # [数据库操作]直接更新订单状态,->支付失败
            $msg = $msg = $this->SetReturn(3515, "订单状态异常");
            CLog::pay("[notify.mi] 异常的订单状态, 此处微信验证已通过,为啥自己的验证不通过!!!" . $order->cpOrderId);
            return false;
        }
        if ($order->status == 1) {                                              # 订单状态是成功 1代表支付成功
            $order->UpdateOrderStatus();                                        # [数据库操作]更新订单状态,->已付款
//            $find = $order->dbOrder();
//            loyalsoft\TapDBUtil::PushPayEvent($order, 'wxpay', $find->product_id); # 向tapdb推送充值记录
            CLog::pay("[notify.mi] [发货] " . $order->cpOrderId . " >>> " . $order->amount);
            $msg = $this->SetReturn(200, "success");
            return true;
        }
        $msg = $this->SetReturn(5056, "未知的支付状态");
        CLog::pay("[notify.mi][处理结果]: FAILURE ($msg)");                     # 日志
        return false;
    }

    /**
     * 设置返回值
     * @param int $errcode
     * @param string $errMsg
     * @return string
     */
    function SetReturn($errcode, $errMsg) {
        return \loyalsoft\JsonUtil::encode(array('errcode' => $errcode, 'errMsg' => $errMsg));
    }

    /**
     * 查询订单接口
     * @param type $userId
     * @param type $cpOrderId
     */
    function queryOrder($userId, $cpOrderId) {

        $params = array('appId' => config_mi::APP_ID, 'uid' => $userId, 'cpOrderId' => $cpOrderId);
        $signObj = new SignatureHelper();

        $signature = $signObj->sign($params, config_mi::SECRET_KEY);

        $params['signature'] = $signature;

        $request = new HttpHelper();
        $response = $request->get(config_mi::QUERY_ORDER_URL, $params);

        //TODO: 后续业务逻辑处理
        echo $response;
    }

    /**
     * 获得用户的平台字符串
     * @return string
     */
    static function getPlatStr($uid) {
        if (strrpos($uid, '_') > 0) {
            return substr($uid, strrpos($uid, '_') + 1); # 提取平台字符串
        } else {
            return "";
        }
        //PS. substr() 函数返回字符串的一部分 strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。
    }
}
