/** * 调用后台接口 * @param PBMessage $pb_obj * @param PBMessage $ret_obj * @return bool */ public static function request(PBMessage $pb_obj, PBMessage $ret_obj, &$result_code = '', &$result_info = '', &$potalseq = '', &$card_info = array()) { if (!isset($pb_obj->name)) { return FALSE; } // serialize $string = pack('a20nn', $pb_obj->name, 0, 1) . $pb_obj->SerializeToString(); $pkg = pack('N', strlen($string)) . $string; if (empty(static::$dns_object) or !isset(static::$dns_object->ip) or !isset(static::$dns_object->port)) { static::log_buy_info("DNS解析出错"); return FALSE; } //建立TCP连接 $client = new TP_NetClient_TCP(); if (@$client->connect(static::$dns_object->ip, static::$dns_object->port, self::PORTAL_TIMEOUT)) { $client->send($pkg); //发包 $ret = @$client->recv(); //收包 } else { static::log_buy_info("建立TCP连接出错"); return FALSE; } $arr = @unpack('Nlen/a20name/ncode/nver', substr($ret, 0, 28)); if (!isset($arr) or $arr['len'] <= 0) { static::log_buy_info("解析回包错误"); return FALSE; } $data = substr($ret, 28, $arr['len']); $ret_obj->parseFromString($data); $potalseq = $ret_obj->head()->PortalSeq(); //如果请求为pay if ($pb_obj->head()->CmdCode() == 'PAY') { $a = $ret_obj->product(); if (empty($a)) { static::log_buy_info("payans 中的product数据为空!\n "); } else { //$card_no = $ret_obj->product()->productparamlist('CardIdList'); //$card_no = $ret_obj->product()->productparamlist(1)->value(); for ($i = 0; $i < $ret_obj->product()->productparamlist_size(); $i++) { $key = $ret_obj->product()->productparamlist($i)->key(); if ($key == 'CardIdList') { $card_info['card_no'] = $ret_obj->product()->productparamlist($i)->value(); static::log_buy_info("card_no信息:" . $card_info['card_no']); break; } } $point = $ret_obj->product()->storagelistpoint(); if ($ret_obj->product()->storageinfolist_size() > 0) { $card_info['storage_type'] = $ret_obj->product()->storageinfolist($point)->storagetype(); static::log_buy_info("storagetype 信息:" . $card_info['storage_type']); } } } //请求失败 if ($ret_obj->head()->CmdCode() != $pb_obj->head()->CmdCode() or $ret_obj->head()->ResultCode() != 0) { $result_code = $ret_obj->head()->ResultCode(); $result_info = $ret_obj->head()->ResultInfo(); //static::log_buy_info("\nResultCode:".$ret_obj->head()->ResultCode()."|Errorcode:".$ret_obj->head()->Errorcode()."|Errinfo:".$ret_obj->head()->Errinfo()); //echo '<pre>', $ret_obj->head()->ResultCode(), "\n", $ret_obj->head()->Errorcode(), "\n", $ret_obj->head()->Errinfo(); return FALSE; } return TRUE; }