<?php

ini_set('date.timezone', 'Asia/Shanghai');
error_reporting(E_ERROR);

/**
 * 接收YSDK服务端的通知(发货(元宝)并扣除游戏币)
 * @version
 *          1.0.0 Created at 2017-12-30. by --gwang
 * @author gwang (mail@wanggangzero.cn)
 * @copyright ? 2017-12-30, SJZ LoyalSoft Corporation & gwang. All rights reserved.
 *
 */
// 导入应用宝支付库
require_once __DIR__ . '/ysdks/Api.php';
require_once __DIR__ . '/ysdks/Ysdk.php';
require_once __DIR__ . '/ysdks/Payments.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 'config.yyb.php';                                                  # 配置文件

// 签名算法

use loyalsoft\CLog;
use loyalsoft\HttpUtil;
use loyalsoft\pay\OrderNotice;

$tag = "[notify.yyb]";                                                          # 日志标签


try {
    CLog::pay("$tag 收到支付回调: " . HttpUtil::getQueryString());
    $params = HttpUtil::getQueryParas();                                        # 提取参数
    // v3验签
    $method = $_SERVER['REQUEST_METHOD'];                                       # 腾讯的请求方法
    $url = $_SERVER["REQUEST_URI"];
    $cfg = config_for_yyb::Inst('qq');                                         # 这里不知道是来自微信还是QQ,都用QQ的appkey
    $sig_new = "";
//    CLog::pay($tag . ": $method $url");
//    $sig = urldecode($params['sig']);
//    CLog::pay($tag . "sig: $sig");
//    if (!$cfg->cee_verify_sig($method, $params, $url, $sig_new)) {              # v3签名校验失败!
//        CLog::pay("$tag v3签名校验失败! $sig_new");
//        exit(payResp::err(3, 'v3签名校验失败'));
//    }
//    $par = new YSDK_Notify_m();
//    loyalsoft\CommUtil::loadObject($params, $par);                              # 转换

    $order = OrderNotice::Parse_ysdkOrder($params);                              # 将参数归一化到order

    if ($order != null) {
        if ($order->Check()) {                                                  # 订单校验, 1代表支付成功
            if ($order->status == 1) {                                          # 订单状态是成功
                $order->UpdateOrderStatus();                                    # 更新订单状态,->已付款
                echo payResp::ok();
                loyalsoft\TapDBUtil::PushPayEvent($order, 'yyb');               # 向tapdb推送充值记录

                CLog::pay("$tag [发货] 订单: " . $order->cpOrderId . ", 金额: " . $order->amount);
            } else if ($order->status == 2) {                                   # status为2(failed)的情况
                $order->UpdateOrderStatus();                                    # 直接更新订单状态,->支付失败
                echo payResp::err(999, 'closed!');                                 # ps. 与曹强约定999代表成功取消订单
                CLog::pay("$tag [不发货] 订单: " . $order->cpOrderId);
            } else {
                echo payResp::err(-1, '未知的支付状态');
                CLog::pay("$tag [处理结果]: FAILURE (未知的支付状态)");            # 日志
            }
        } else {
            CLog::pay("$tag [处理结果]:" . "FAILURE 后台订单校验失败");            # 日志
            echo payResp::err(1, '后台订单校验失败');
        }
    } else {  # 请求参数
        CLog::pay("$tag [处理结果]:" . "FAILURE 通知参数提取失败");                # 日志
        echo payResp::err(1, '通知参数解析失败!');
    }
} catch (Exception $e) {
    CLog::pay($tag . $e->getMessage());                                         # 日志
    echo payResp::err(2, $e->getMessage());
}

