notify.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. /**
  3. * 接收1SDK后台通知(支付)
  4. * @version
  5. * 1.0.0 Created at 2018年5月5日. by --gwang
  6. * @author gwang (mail@wanggangzero.cn)
  7. * @copyright ? 2018-5-5, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  8. *
  9. */
  10. include_once __DIR__ . '/../../../main.php'; # 导入game utils
  11. include_once __DIR__ . '/../Mo/resp.php'; # 导入通用返回值结构
  12. include_once __DIR__ . '/../Mo/payRequest.php'; # 导入通用返回值结构
  13. require_once __DIR__ . '/../Mo/OrderNotice.php';
  14. require_once __DIR__ . '/config_x7sy.php'; # 渠道参数
  15. include_once __DIR__ . "/common.php";
  16. use loyalsoft\CLog;
  17. use loyalsoft\HttpUtil;
  18. use loyalsoft\pay\OrderNotice;
  19. try {
  20. CLog::pay("[notify.小七手游] 收到支付回调请求: " . HttpUtil::getQueryString());
  21. $cfg = config_x7sy::Inst(); # 渠道参数配置信息
  22. define("PUBLIC_KEY", $cfg->RSA_pub);
  23. parse_str(HttpUtil::getQueryString(), $params); # 提取参数
  24. $post_sign_data = base64_decode($params['sign_data']); # 提取签名
  25. unset($params['sign_data']); # 剔除签名
  26. ksort($params); # 按照参数名称的正序排序
  27. $sourcestr = http_build_query_noencode($params); # 对输入参数根据参数名排序,并拼接为key=value&key=value格式;
  28. $publicKey = ConvertPublicKey(PUBLIC_KEY); # 对数据进行验签,注意对公钥做格式转换
  29. $verify = Verify($sourcestr, $post_sign_data, $publicKey);
  30. if ($verify != 1) { # 判断签名是否是正确
  31. CLog::pay("[notify.小七手游] 验签失败");
  32. ReturnResult('sign_data_verify_failed');
  33. }
  34. //对加密的encryp_data进行解密
  35. $post_encryp_data_decode = base64_decode($params["encryp_data"]);
  36. $decode_encryp_data = PublickeyDecodeing($post_encryp_data_decode, $publicKey);
  37. parse_str($decode_encryp_data, $encryp_data_arr);
  38. if (!isset($encryp_data_arr["pay_price"]) || !isset($encryp_data_arr["guid"]) || !isset($encryp_data_arr["game_orderid"])) {
  39. ReturnResult('encryp_data_decrypt_failed');
  40. }
  41. $params += $encryp_data_arr; # 将加密参数合并到参数中
  42. $order = OrderNotice::Parse_x7sy($params); # 将参数归一化到order
  43. if ($order != null) {
  44. if ($order->Check()) { # 订单校验, 1代表支付成功
  45. if ($order->status == 1) { # 订单状态是成功
  46. $order->UpdateOrderStatus(); # 更新订单状态,->已付款
  47. CLog::pay("[notify.小七手游] [发货] 订单: " . $order->cpOrderId . ", 金额: " . $order->amount);
  48. } else if ($order->status == 2) { # status为2(failed)的情况
  49. $order->UpdateOrderStatus(); # 直接更新订单状态,->支付失败
  50. CLog::pay("[notify.小七手游] [不发货] 订单: " . $order->cpOrderId);
  51. } else {
  52. CLog::pay("[notify.小七手游][处理结果]: FAILURE (未知的支付状态)"); # 日志
  53. ReturnResult("failed:" . 'unKnown');
  54. }
  55. CLog::pay("[notify.小七手游][处理结果]:" . "SUCCESS"); # 日志
  56. ReturnResult("success");
  57. }
  58. }
  59. CLog::pay("[notify.小七手游][处理结果]:" . "FAILURE"); # 日志
  60. // echo 'FAILURE'; //返回给sdk server的响应内容 ,对于重复多次通知失败的订单,请参考文档中通知机制。
  61. ReturnResult("failed:" . 'no order');
  62. } catch (Exception $e) {
  63. CLog::pay("[notify.小七手游]" . $e->getMessage()); # 日志
  64. // throw new exception($e->getMessage());
  65. ReturnResult("failed:" . 'exception: ' . $e->getMessage());
  66. }
  67. /////////////////////////////////////////////////////////////////////////
  68. //$public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+zCNgOlIjhbsEhrGN7De2uYcfpwNmmbS6HYYI5KljuYNua4v7ZsQx5gTnJCZ+aaBqAIRxM+5glXeBHIwJTKLRvCxC6aD5Mz5cbbvIOrEghyozjNbM6G718DvyxD5+vQ5c0df6IbJHIZ+AezHPdiOJJjC+tfMF3HdX+Ng/VT80LwIDAQAB";
  69. //define("PUBLIC_KEY", $public_key);
  70. ///* * **************************************************************************************************************************************************************************************************************************
  71. // 这里是假设使用PHP的file_get_contents("php://input")方式获取到数据。获取到的数据格式是querystring形式并且数据是被编码过的,如:
  72. // 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
  73. // 需要将这种数据转换成键值对数组的形式,接着键值对反编码。如果是使用如PHP的$_POST和$_REQUEST等方式获取数据并且数据是没有被编码过的话,那么可以忽略当前步骤。
  74. // * *************************************************************************************************************************************************************************************************************************** */
  75. //$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";
  76. //parse_str($request_string, $post_data);
  77. ///* * **********************************
  78. // 这里的对sign_data解64编码
  79. // * ********************************** */
  80. //$post_sign_data = base64_decode($post_data["sign_data"]);
  81. ///* * **********************************
  82. // 因为sign_data是不加入签名里面的
  83. // * ********************************** */
  84. //unset($post_data["sign_data"]);
  85. ////按照参数名称的正序排序
  86. //ksort($post_data);
  87. ////对输入参数根据参数名排序,并拼接为key=value&key=value格式;
  88. //$sourcestr = http_build_query_noencode($post_data);
  89. ////对数据进行验签,注意对公钥做格式转换
  90. //$publicKey = ConvertPublicKey(PUBLIC_KEY);
  91. //$verify = Verify($sourcestr, $post_sign_data, $publicKey);
  92. ////判断签名是否是正确
  93. //if ($verify != 1) {
  94. // ReturnResult('sign_data_verify_failed');
  95. //}
  96. ////对加密的encryp_data进行解密
  97. //$post_encryp_data_decode = base64_decode($post_data["encryp_data"]);
  98. //$decode_encryp_data = PublickeyDecodeing($post_encryp_data_decode, $publicKey);
  99. //parse_str($decode_encryp_data, $encryp_data_arr);
  100. //if (!isset($encryp_data_arr["pay_price"]) || !isset($encryp_data_arr["guid"]) || !isset($encryp_data_arr["game_orderid"])) {
  101. // ReturnResult('encryp_data_decrypt_failed');
  102. //}
  103. ///* * **********************************************************************************
  104. // 这时候得到的$encryp_data_arr数组内容包含game_orderid、guid、pay_price 三个内容。
  105. // 下面我们通过游戏订单号在数据库查找到下面内容:
  106. // * *********************************************************************************** */
  107. //$arr = array(
  108. // "game_area" => "11",
  109. // "game_orderid" => "2018182571972272",
  110. // "game_role_id" => "所以区ID",
  111. // "game_role_name" => "所以区名称",
  112. // "guid" => 1219663,
  113. // "xiao7_goid" => 2093061,
  114. // "pay_price" => "1.00"
  115. //);
  116. //$needCompareData = array(
  117. // "game_area" => "game_area error",
  118. // "game_orderid" => "game_orderid error",
  119. // "game_role_id" => "game_role_id error",
  120. // "game_role_name" => "game_role_name error",
  121. // "guid" => "guid error",
  122. // "xiao7_goid" => "xiao7_goid error",
  123. // "pay_price" => "pay_price error"
  124. //);
  125. //if (!isset($encryp_data_arr['game_orderid']) || $encryp_data_arr['game_orderid'] != $post_data['game_orderid']) {
  126. // ReturnResult("failed:" . $needCompareData["game_orderid"]);
  127. //}
  128. //$post_data += $encryp_data_arr;
  129. //foreach ($needCompareData as $key => $value) {
  130. // if ($key == "pay_price") {
  131. // if (bccomp($post_data[$key], $arr[$key], 2) != 0) {
  132. // ReturnResult("failed:" . $value);
  133. // }
  134. // } else if ($arr[$key] != $post_data[$key]) {
  135. // ReturnResult("failed:" . $value);
  136. // }
  137. //}
  138. //ReturnResult("success");