<?php

/**
 * 九游创建预订单
 * 支付前客户端签名计算服务类
 * <br>客户端在支付前需调用CP服务端的签名生成方法，CP服务端将签名返回给客户端
 * <br><b>注意：此类主要为示例签名计算方法</b>
 * <br>具体实现需要CP依据自己与客户端通信的协议加密处理等，避免安全性问题
 */
// 导入uc_sdk
require_once __DIR__ . '/service/SDKServerService.php';
require_once __DIR__ . '/model/SDKException.php';
require_once __DIR__ . '/util/ConfigHelper.php';
require_once __DIR__ . '/util/LoggerHelper.php';
// 导入自定义库
include_once __DIR__ . '/../../../main.php';                                    # 导入game库
require_once __DIR__ . '/../Mo/payRequest.php';                                 # 导入通用订单请求结构
require_once __DIR__ . '/../Mo/resp.php';                                       # 导入通用返回值结构

use loyalsoft\HttpUtil;
use loyalsoft\JsonUtil;
use loyalsoft\CLog;

try {
    HttpUtil::PostOnly();                                                       # 要求客户端必须以post方式提交数据
    $str = HttpUtil::getQueryString();
//    $str = gzinflate($str);
    $data = JsonUtil::decode($str);                                             # 提取请求参数
    CLog::pay("[uc.pay.php] 请求签名:" . $str);                        # 日志
    $req = new PayRequest($data);
    if ($req != null) {
        $baseService = new BaseSDKService();
        $notInKey = array("roleName", "roleId", "grade", //                     # 定义签名时排除在外的key,即：指定key不参与签名
            "serverId", "signType", "sign");
//        $req->notifyUrl = ConfigHelper::getStrVal("sdkserver.game.notifyUrl"); // 采用智能提取方法
        $signSource = $baseService->getSignDataWithoutNotInKey($req->uc_GetData2Sign(), $notInKey)
                . ConfigHelper::getStrVal("sdkserver.game.apikey");             # 组装签名原文
        $req->sign = md5($signSource);                                          # MD5加密签名
        if ($req->InserDataBase()) {                                            # 将订单数据写入数据库
            echo Resp::ok($req);                                                # 修改返回值,只返回签名数据
            CLog::pay("[uc.pay.php] 创建订单:" . $req);                # 日志
        } else {
            echo Resp::err(1, "创建订单失败!");
            CLog::pay("[uc.pay.php] 创建订单失败:" . $req);            # 日志
        }
    } else {
        echo Resp::err(1, "提取参数异常");
        CLog::pay("[uc.pay.php] 提取参数异常:");                       # 日志
    }
} catch (SDKException $e) {
    echo Resp::err($e->getCode(), $e->getMessage());
    CLog::pay("[uc.pay.php] :" . $e->getMessage());                   # 日志
}