$OrderID, "Channel" => $Channel, "AccountID" => $AccountID, "ServerID" => intval($ServerID), "OrderInfo" => $OrderInfo, "OrderAmount" => $OrderAmount, "Createtime" => date("Y-m-d H:i:s"), "State" => 0, "SyncRet" => array(), ))) { return ""; } return $OrderID; } /** * 中心执行平台充值订单回调 * @param string $appID appID * @param string $OrderID cp订单ID * @param string $OrderIDSDK sp订单ID * @param string $AccountID sp账号,如果有区分渠道ID,需要组合上渠道ID * @param int $ServerID 区服ID * @param string $OrderInfo 商品编号 * @param string $OrderAmount 订单金额,精确到小数点后面两位,如果有区分支付金额及下单金额(原价),则参数格式为: "支付金额|下单金额" * @param string $payTime 支付时间,具体看sp是否有同步,没有的话传空即可,格式 Y-m-d H:i:s * @param string $checkCreate 是否检查订单号是否存在,如果有先创建订单的步骤,额需要传true进行检查,否则可不检查,直接等sp回调后插入订单信息 * @param string $checkFunc 额外逻辑函数名,根据不同平台对接sdk决定,默认参数传入 $dbOrderInfo * @param bool $repeat 是否补单 * @param array $extras 扩展数据,json字符串格式 * @return array {"errorcode":返回码, "errordesc":"描述信息"} 返回码为0时代表失败,1-成功,2-重复成功记录 */ function DoReceivePayOrder($appID, $OrderID, $OrderIDSDK, $AccountID, $ServerID, $OrderInfo, $OrderAmount, $payTime, $checkCreate, $checkFunc = null, $repeat = false, $extras = "") { \Logging\LogInfo("DoReceivePayOrder appID:" . $appID . " OrderID:" . $OrderID . " OrderIDSDK:" . $OrderIDSDK . " AccountID:" . $AccountID . " ServerID:" . $ServerID . " OrderInfo:" . $OrderInfo . " OrderAmount:" . $OrderAmount . " payTime:" . $payTime . " checkCreate:" . $checkCreate); if (!$OrderID) { $OrderID = $OrderIDSDK; } $OriginalAmount = $OrderAmount; // 下单金额 $ServerID = intval($ServerID); $returnArr = array("errorcode" => 0, "errordesc" => "failed"); if (!\DBOper\FindOne("PayOrder", array("OrderID" => $OrderID), $dbOrderInfo, null, false)) { $returnArr["errordesc"] = "failed:find error"; return $returnArr; } \Logging\LogInfo("dbOrderInfo:" . print_r($dbOrderInfo, true)); if ($checkCreate && !isset($dbOrderInfo)) { $returnArr["errordesc"] = "failed:orderID is not exist"; \Logging\LogWarn("orderID is not exist: OrderID:" . $OrderID); return $returnArr; } if ($checkFunc) { $errordesc = $checkFunc($dbOrderInfo); if ($errordesc) { $returnArr["errordesc"] = $errordesc; return $returnArr; } } // 有创建订单的,验证数据是否一致 if (isset($dbOrderInfo)) { // 已经处理过的订单 if (!$repeat && $dbOrderInfo["State"] == 1) { $returnArr["errorcode"] = 2; $returnArr["errordesc"] = "failed:repeat commit"; \Logging\LogWarn("repeat payorder: OrderID:" . $OrderID); return $returnArr; } if ($appID && $appID != $dbOrderInfo["Channel"]) { $returnArr["errordesc"] = "failed:order appID error"; return $returnArr; } $appID = $dbOrderInfo["Channel"]; if ($AccountID && $AccountID != $dbOrderInfo["AccountID"]) { $returnArr["errordesc"] = "failed:order AccountID error"; return $returnArr; } $AccountID = $dbOrderInfo["AccountID"]; if ($ServerID && $ServerID != $dbOrderInfo["ServerID"]) { $returnArr["errordesc"] = "failed:order ServerID error"; return $returnArr; } $ServerID = $dbOrderInfo["ServerID"]; if ($OrderAmount && $OrderAmount != $dbOrderInfo["OrderAmount"]) { $returnArr["errordesc"] = "failed:order OrderAmount error"; return $returnArr; } $OrderAmount = $dbOrderInfo["OrderAmount"]; if ($dbOrderInfo["OriginalAmount"]) { $OriginalAmount = $dbOrderInfo["OriginalAmount"]; } if ($OrderInfo && $OrderInfo != $dbOrderInfo["OrderInfo"]) { $returnArr["errordesc"] = "failed:order OrderInfo error"; return $returnArr; } $OrderInfo = $dbOrderInfo["OrderInfo"]; if ($dbOrderInfo["PayTime"]) { $payTime = $dbOrderInfo["PayTime"]; } if ($dbOrderInfo["Extras"]) { $extras = $dbOrderInfo["Extras"]; } } else { $amounts = explode("|", $OrderAmount); if (count($amounts) > 1) { $OrderAmount = $amounts[0]; $OriginalAmount = $amounts[1]; \Logging\LogInfo("OrderAmount:" . $OrderAmount . " OriginalAmount:" . $OriginalAmount); } } if (!$appID || !$AccountID || !$ServerID || !$OrderInfo || !$OrderAmount) { $returnArr["errordesc"] = "failed:order param error"; return $returnArr; } if (!$payTime) { $payTime = date("Y-m-d H:i:s"); } $setDBOrderData = array( "OrderID" => $OrderID, "OrderIDSDK" => $OrderIDSDK, "Channel" => $appID, "AccountID" => $AccountID, "ServerID" => $ServerID, "OrderInfo" => $OrderInfo, "OrderAmount" => $OrderAmount, // 中心的这个字段是实际支付金额 "OriginalAmount" => $OriginalAmount, "PayTime" => $payTime, "State" => 0, "SyncRet" => "", // 同步游戏服务器结果明细 "Extras" => $extras, ); $payData = array( "AccountID" => $AccountID, "RegionName" => "s" . $ServerID, "OrderAmount" => $OriginalAmount, // 同步给游戏服务器的这个是用原价 "BillNO" => $OrderID, "OrderInfo" => $OrderInfo, "OperatorID" => $appID, "Extras" => $extras, ); if (!isset($dbOrderInfo)) { $setDBOrderData["Createtime"] = date("Y-m-d H:i:s"); } $returnArr = SendExchangeToGameServers($appID, $ServerID, $appID, $payData); $setDBOrderData["UpdateTime"] = date("Y-m-d H:i:s"); switch ($returnArr["errorcode"]) { case 1: $setDBOrderData["State"] = 1; $setDBOrderData["SyncRet"] = $returnArr; break; case 2: $setDBOrderData["State"] = 1; $setDBOrderData["SyncRet"] = $returnArr; break; default: $setDBOrderData["State"] = 2; $setDBOrderData["SyncRet"] = $returnArr; $returnArr["errordesc"] = "failed:" . $returnArr["errordesc"]; break; } if (!\DBOper\Update("PayOrder", array("OrderID" => $OrderID), $setDBOrderData, false, true)) { $returnArr["errorcode"] = 0; $returnArr["errordesc"] = "failed:update error"; } else { \Logging\LogInfo("setDBOrderData:" . print_r($setDBOrderData, true)); } AddAccountFirstPay($appID, $AccountID, $setDBOrderData); return $returnArr; } /**添加平台账号首充 */ function AddAccountFirstPay($appID, $AccountID, $payOrderInfo) { $find = array("Channel" => $appID, "AccountID" => $AccountID); if (!\DBOper\FindOne("AccountFirstPay", $find, $findData, null, false)) { return; } if (isset($findData)) { // 已存在,不再重复添加 return; } $insArray = array( "Channel" => $appID, "AccountID" => $AccountID, "OrderID" => $payOrderInfo["OrderID"], "OrderIDSDK" => $payOrderInfo["OrderIDSDK"], "ServerID" => $payOrderInfo["ServerID"], "OrderInfo" => $payOrderInfo["OrderInfo"], "OrderAmount" => $payOrderInfo["OrderAmount"], // 中心的这个字段是实际支付金额 "OriginalAmount" => $payOrderInfo["OriginalAmount"], "PayTime" => $payOrderInfo["PayTime"], "PayYMD" => substr($payOrderInfo["PayTime"], 0, 10), "Extras" => $payOrderInfo["Extras"], ); \DBOper\Insert("AccountFirstPay", $insArray); } /** * 发送渠道回调充值到游戏服务器 * @param string $spid 渠道 * @param int $serverID 服务器ID * @param string $appID appID * @param array $payData 同步游戏服务器的充值数据 * array( * "AccountID" => 渠道账号, * "RegionName" => "s" . 区服ID, * "OrderAmount" => 充值金额,单位分, * "BillNO" => 订单编号, * "OrderInfo" => 商品编号, * "OperatorID" => $appID, * ); * @return array array("errorcode" => xxx, "errordesc" => "xxx") errorcode:1-成功,2-成功重复数据,其他失败 */ function SendExchangeToGameServers($spid, $serverID, $appID, $payData) { \Logging\LogInfo("SendExchangeToGameServers spid:" . $spid . " serverID:" . $serverID . " appID:" . $appID); $returnArr = array("errorcode" => 0, "errordesc" => "fail"); $serverIDArray = array($serverID); $serverPageInfo = \CommFunc\GetGameServerPageInfo($spid, $serverIDArray); if (count($serverPageInfo) <= 0) { $returnArr["errordesc"] = "not serverPageInfo"; return $returnArr; } // 目标角色对应游戏服务器gmtool地址 $serverPageValues = array_values($serverPageInfo); $pageUrl = $serverPageValues[0]["Page"]; if (!$pageUrl) { $returnArr["errordesc"] = "not page url"; return $returnArr; } if (!\CfgReader\ReadConfig()) { $returnArr["errordesc"] = "cfgreader error"; return $returnArr; } if ( !\CfgReader\GetConfigData("ExChange", "Key_" . $appID, $strKey) || !\CfgReader\GetConfigData("Config", "IsDecryptKey", $isDecryptKey) ) { $returnArr["errordesc"] = "not exChange appid key"; return $returnArr; } //如果配置了需要解密,对登录key进行解密 if ($isDecryptKey == 1) { $strKey = \CommFunc\GetDecodePsw($strKey); } \Logging\LogInfo("strKey: " . $strKey); $postUrl = str_replace("Server/Tool.php", "api/exchange/index.php", $pageUrl); \Logging\LogInfo("postUrl: " . $postUrl); $opqid = $payData['AccountID']; $orderID = $payData["BillNO"]; $orderAmount = $payData['OrderAmount']; $getServer_id = $payData['RegionName']; $sign = md5($opqid . $orderAmount . $orderID . $getServer_id . $strKey); $payData["Sign"] = $sign; \Logging\LogInfo("payData: " . print_r($payData, true)); $payretStr = \CommFunc\DoPost($postUrl, $payData); \Logging\LogInfo("payretStr: " . $payretStr); $ret = json_decode($payretStr, true); \Logging\LogInfo("ret: " . print_r($ret, true)); if (isset($ret)) { return $ret; } return $returnArr; }