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");