123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <?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/resp.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");
|