verify($params) === false) { return json_encode($this->errbody("签名不成功",$params)); } $action = $params['action']; $chargeType = intval($params['chargeType']); if ($action != 'CZ') { return json_encode($this->errbody("不支持该业务",$params)); } //业务类型 //0:话费 1:Q币 2:QQ会员 3:游戏 //4:水电气 5:流量 6:票务 7:固话 8:宽带 9:油卡 if ($chargeType !== 0 && $chargeType !== 9) { return json_encode($this->errbody("不支持该类型业务",$params)); } $mchid = config::MCHID; Model('merchant_query')->add_info(config::MCHID, $params['chargeId'], json_encode($params)); $mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]); $userid = intval($mchinfo['admin_id']); [$code, $msg] = RefillFactory::instance()->add($mchid, $userid, $params['chargeCash'], $params['chargeAcct'], $params['chargeId'], config::MCH_NOTIFY_URL); $ret = $this->retbody($code, $msg, $params); return json_encode($ret); } private function errbody($msg,$params) { //交易结果 0:未处理 1:充值成功 2:充值结果不确定 3:充值失败 $retCode = 3; $retDetail = $msg; $result = [ 'action' => 'CZ', 'chargeId' => $params['chargeId'], 'retCode' => $retCode, 'retDetail' => $retDetail, 'retRsn' => $params['retRsn']]; $body = "{$params['chargeId']}{$retCode}{$params['retRsn']}" . config::BridgeKey; $sign = md5($body); $result['sign'] = $sign; return $result; } private function retbody($code, $msg, $params) { //交易结果 0:未处理 1:充值成功 2:充值结果不确定 3:充值失败 if ($code === true) { $retCode = 0; $retDetail = '定单已接收'; } else { $retCode = 3; $retDetail = $msg; } $result = [ 'action' => 'CZ', 'chargeId' => $params['chargeId'], 'retCode' => $retCode, 'retDetail' => $retDetail, 'retRsn' => $params['retRsn']]; $body = "{$params['chargeId']}{$retCode}{$params['retRsn']}" . config::BridgeKey; $sign = md5($body); $result['sign'] = $sign; return $result; } public function notify($params) { $proxy = new refill_proxy(config::MCH_KEY); [$verify, $data] = $proxy->notify($params); $mchid = config::MCHID; if ($verify) { $body = $this->notify_body($data); if ($body === false) { return true; } $header = ['Content-Type: application/json']; $encode = mb_detect_encoding($body, ['GB2312','GBK','UTF-8']); $body = mb_convert_encoding($body,$encode, 'GBK'); $resp = http_post_data(config::BridgeNotifyURL, $body, $header); if ($resp === false) { $url = config::BridgeNotifyURL; Log::record("通知mchid = {$mchid} {$url}失败", Log::ERR); return false; } else { return true; } } else { Log::record("内部回调签名错误 mchid = {$mchid}", Log::ERR); return false; } } private function notify_body($params) { $mch_ordersn = $params['order_sn']; $query_info = Model('merchant_query')->query_info(config::MCHID, $mch_ordersn); if (empty($query_info)) { $mchid = config::MCHID; Log::record("查不到mchid={$mchid},mch_order:{$mch_ordersn}的原始订单信息", Log::ERR); return false; } else { $query_info = json_decode($query_info['request'], true); } $success = $params['state'] == 'SUCCESS'; $retCode = $success ? 1 : 3; $body = [ "action" => "CZ", "chargeId" => $query_info['chargeId'], "retCode" => $retCode, "retDetail" => $retCode == 1 ? "充值成功" : "充值失败", "retRsn" => $query_info['retRsn'], "userContent" => "", "retCost" => number_format($this->getCost(config::MCHID, $mch_ordersn), 3,'.',''), "retBalance" => number_format($this->getBalance(config::MCHID), 3,'.',''), "retCash" => number_format($query_info['chargeCash'], 3,'.','') ]; $sign = md5("{$body['chargeId']}{$body['retCode']}{$body['retRsn']}" . config::BridgeKey); $body['sign'] = $sign; return json_encode($body); } private function getBalance($mchid) { try { $mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]); $userid = intval($mchinfo['admin_id']); $info = new member_info($userid); return round($info->available_predeposit(), 3); } catch (Exception $ex) { Log::record("Bridge getBalance mchid={$mchid} what : {$ex->getMessage()}", Log::ERR); return 0.000; } } private function getCost($mchid, $mch_ordersn) { $refill_order = Model('refill_order'); $items = $refill_order->getOrderInfo(['mchid' => $mchid, 'mch_order' => $mch_ordersn, 'inner_status' => 0]); if (!empty($items)) { $order = $items[0]; return $order['mch_amount']; } else { return 0; } } private function verify($params) { //md5(chargeId + chargeAcct + var1 + var2 + var3 + var4 + chargeCash + md5key) $keys = ['chargeId', 'chargeAcct', 'var1', 'var2', 'var3', 'var4', 'chargeCash']; $body = ""; foreach ($keys as $key) { $body .= $params[$key] ?? ""; } $body .= config::BridgeKey; $sign = md5($body); Log::record("body={$body} sign={$sign} , orgsign={$params['sign']}",Log::DEBUG); return $params['sign'] == $sign; } }