<?php

/**
 * 接收1SDK后台通知(支付)
 * @version
 *          1.0.0 Created at 2018年5月5日. by --gwang
 * @author gwang (mail@wanggangzero.cn)
 * @copyright ? 2018-5-5, SJZ LoyalSoft Corporation & gwang. All rights reserved.
 *
 */
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__ . '/config_x7sy.php';                                      # 渠道参数
include_once __DIR__ . "/common.php";

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

try {
    CLog::pay("[notify.小七手游] 收到支付回调请求: " . HttpUtil::getQueryString());
    $cfg = config_x7sy::Inst();                                                 # 渠道参数配置信息
    define("PUBLIC_KEY", $cfg->RSA_pub);

    parse_str(HttpUtil::getQueryString(), $params);                             # 提取参数
    $post_sign_data = base64_decode($params['sign_data']);                      # 提取签名
    unset($params['sign_data']);                                                # 剔除签名
    ksort($params);                                                             # 按照参数名称的正序排序
    $sourcestr = http_build_query_noencode($params);                            # 对输入参数根据参数名排序，并拼接为key=value&key=value格式；
    $publicKey = ConvertPublicKey(PUBLIC_KEY);                                  # 对数据进行验签，注意对公钥做格式转换
    $verify = Verify($sourcestr, $post_sign_data, $publicKey);
    if ($verify != 1) {                                                         # 判断签名是否是正确
        CLog::pay("[notify.小七手游] 验签失败");
        ReturnResult('sign_data_verify_failed');
    }
//对加密的encryp_data进行解密
    $post_encryp_data_decode = base64_decode($params["encryp_data"]);
    $decode_encryp_data = PublickeyDecodeing($post_encryp_data_decode, $publicKey);
    parse_str($decode_encryp_data, $encryp_data_arr);
    if (!isset($encryp_data_arr["pay_price"]) || !isset($encryp_data_arr["guid"]) || !isset($encryp_data_arr["game_orderid"])) {
        ReturnResult('encryp_data_decrypt_failed');
    }
    $params += $encryp_data_arr;                                                # 将加密参数合并到参数中
    $order = OrderNotice::Parse_x7sy($params);                                  # 将参数归一化到order
    if ($order != null) {
        if ($order->Check()) {                                                  # 订单校验, 1代表支付成功
            if ($order->status == 1) {                                          # 订单状态是成功
                $order->UpdateOrderStatus();                                    # 更新订单状态,->已付款
                CLog::pay("[notify.小七手游] [发货] 订单: " . $order->cpOrderId . ", 金额: " . $order->amount);
            } else if ($order->status == 2) {                                   # status为2(failed)的情况
                $order->UpdateOrderStatus();                                    # 直接更新订单状态,->支付失败
                CLog::pay("[notify.小七手游] [不发货] 订单: " . $order->cpOrderId);
            } else {
                CLog::pay("[notify.小七手游][处理结果]: FAILURE (未知的支付状态)"); # 日志
                ReturnResult("failed:" . 'unKnown');
            }
            CLog::pay("[notify.小七手游][处理结果]:" . "SUCCESS");                # 日志
            ReturnResult("success");
        }
    }
    CLog::pay("[notify.小七手游][处理结果]:" . "FAILURE");                        # 日志
//    echo 'FAILURE'; //返回给sdk server的响应内容 ,对于重复多次通知失败的订单,请参考文档中通知机制。
    ReturnResult("failed:" . 'no order');
} catch (Exception $e) {
    CLog::pay("[notify.小七手游]" . $e->getMessage());                           # 日志
//    throw new exception($e->getMessage());
    ReturnResult("failed:" . 'exception: ' . $e->getMessage());
}
/////////////////////////////////////////////////////////////////////////
//$public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+zCNgOlIjhbsEhrGN7De2uYcfpwNmmbS6HYYI5KljuYNua4v7ZsQx5gTnJCZ+aaBqAIRxM+5glXeBHIwJTKLRvCxC6aD5Mz5cbbvIOrEghyozjNbM6G718DvyxD5+vQ5c0df6IbJHIZ+AezHPdiOJJjC+tfMF3HdX+Ng/VT80LwIDAQAB";
//define("PUBLIC_KEY", $public_key);
///* * **************************************************************************************************************************************************************************************************************************
//  这里是假设使用PHP的file_get_contents("php://input")方式获取到数据。获取到的数据格式是querystring形式并且数据是被编码过的，如：
//  encryp_data=NtPZfezR7l2cSq2%2BI2MYhODxtxFog6LEKayZuz2ssl5wIotdjnhUucQYjvytqogOiXvN6SbPw6BZCScxgqgyR0hNX0d6r2XLpAbsK9P0thuoyWhQusk%2FQiWvAQ3hmsADZ11F9GYRBTacaLRITW8gKxzUhjB73x4BrGhLjOhvGbY%3D&extends_info_data=%E6%89%A9%E5%B1%95%E5%8F%82%E6%95%B0&game_area=11&game_level=1&game_orderid=2018182571972272&game_role_id=%E6%89%80%E4%BB%A5%E5%8C%BAID&game_role_name=%E6%89%80%E4%BB%A5%E5%8C%BA%E5%90%8D%E7%A7%B0&sdk_version=2.0&subject=%E5%95%86%E5%93%81%E6%8F%8F%E8%BF%B0&xiao7_goid=2093061&sign_data=iR2PybCYT1E%2F1iU7gAvhTzpVQM9cEJwOy84XxEDVgg4L75jr1b6fZhlDuGiYG%2FM%2BoWBlRUAecEl3mpzfQ%2Fh%2FsnNMa9bGCDwzRNKsrlinAzo4kybV7PBqxCbePT1wNo%2FE3Pa%2FCaywCYB2Qe0y96Q7lhaRd955uQpx4eg2qFnXDgY%3D
//  需要将这种数据转换成键值对数组的形式，接着键值对反编码。如果是使用如PHP的$_POST和$_REQUEST等方式获取数据并且数据是没有被编码过的话，那么可以忽略当前步骤。
// * *************************************************************************************************************************************************************************************************************************** */
//$request_string = "encryp_data=NtPZfezR7l2cSq2%2BI2MYhODxtxFog6LEKayZuz2ssl5wIotdjnhUucQYjvytqogOiXvN6SbPw6BZCScxgqgyR0hNX0d6r2XLpAbsK9P0thuoyWhQusk%2FQiWvAQ3hmsADZ11F9GYRBTacaLRITW8gKxzUhjB73x4BrGhLjOhvGbY%3D&extends_info_data=%E6%89%A9%E5%B1%95%E5%8F%82%E6%95%B0&game_area=11&game_level=1&game_orderid=2018182571972272&game_role_id=%E6%89%80%E4%BB%A5%E5%8C%BAID&game_role_name=%E6%89%80%E4%BB%A5%E5%8C%BA%E5%90%8D%E7%A7%B0&sdk_version=2.0&subject=%E5%95%86%E5%93%81%E6%8F%8F%E8%BF%B0&xiao7_goid=2093061&sign_data=iR2PybCYT1E%2F1iU7gAvhTzpVQM9cEJwOy84XxEDVgg4L75jr1b6fZhlDuGiYG%2FM%2BoWBlRUAecEl3mpzfQ%2Fh%2FsnNMa9bGCDwzRNKsrlinAzo4kybV7PBqxCbePT1wNo%2FE3Pa%2FCaywCYB2Qe0y96Q7lhaRd955uQpx4eg2qFnXDgY%3D";
//parse_str($request_string, $post_data);
///* * **********************************
//  这里的对sign_data解64编码
// * ********************************** */
//$post_sign_data = base64_decode($post_data["sign_data"]);
///* * **********************************
//  因为sign_data是不加入签名里面的
// * ********************************** */
//unset($post_data["sign_data"]);
////按照参数名称的正序排序
//ksort($post_data);
////对输入参数根据参数名排序，并拼接为key=value&key=value格式；
//$sourcestr = http_build_query_noencode($post_data);
////对数据进行验签，注意对公钥做格式转换
//$publicKey = ConvertPublicKey(PUBLIC_KEY);
//$verify = Verify($sourcestr, $post_sign_data, $publicKey);
////判断签名是否是正确
//if ($verify != 1) {
//    ReturnResult('sign_data_verify_failed');
//}
////对加密的encryp_data进行解密
//$post_encryp_data_decode = base64_decode($post_data["encryp_data"]);
//$decode_encryp_data = PublickeyDecodeing($post_encryp_data_decode, $publicKey);
//parse_str($decode_encryp_data, $encryp_data_arr);
//if (!isset($encryp_data_arr["pay_price"]) || !isset($encryp_data_arr["guid"]) || !isset($encryp_data_arr["game_orderid"])) {
//    ReturnResult('encryp_data_decrypt_failed');
//}
///* * **********************************************************************************
//  这时候得到的$encryp_data_arr数组内容包含game_orderid、guid、pay_price 三个内容。
//  下面我们通过游戏订单号在数据库查找到下面内容：
// * *********************************************************************************** */
//$arr = array(
//    "game_area" => "11",
//    "game_orderid" => "2018182571972272",
//    "game_role_id" => "所以区ID",
//    "game_role_name" => "所以区名称",
//    "guid" => 1219663,
//    "xiao7_goid" => 2093061,
//    "pay_price" => "1.00"
//);
//$needCompareData = array(
//    "game_area" => "game_area error",
//    "game_orderid" => "game_orderid error",
//    "game_role_id" => "game_role_id error",
//    "game_role_name" => "game_role_name error",
//    "guid" => "guid error",
//    "xiao7_goid" => "xiao7_goid error",
//    "pay_price" => "pay_price error"
//);
//if (!isset($encryp_data_arr['game_orderid']) || $encryp_data_arr['game_orderid'] != $post_data['game_orderid']) {
//    ReturnResult("failed:" . $needCompareData["game_orderid"]);
//}
//$post_data += $encryp_data_arr;
//foreach ($needCompareData as $key => $value) {
//    if ($key == "pay_price") {
//        if (bccomp($post_data[$key], $arr[$key], 2) != 0) {
//            ReturnResult("failed:" . $value);
//        }
//    } else if ($arr[$key] != $post_data[$key]) {
//        ReturnResult("failed:" . $value);
//    }
//}
//ReturnResult("success");

