mAmountTypes[$quality] ?? []; $key = "{$amount}-{$card_type}"; if(array_key_exists($key,$maps)) { $params = $maps[$key]; return [$params['goods_id'], round($params['price'],2)]; } else { return []; } } private function req_params(string $order_sn, string $product_code) { $params['AppKey'] = config::APP_KEY; $params['TimesTamp'] = time(); $params['ProductCode'] = 'PLM100024'; //产品编码需传入 $params['BuyCount'] = 1; $params['MOrderID'] = $order_sn; $params['CustomerIP'] = config::API_IP; $params['IsCallback'] = 1; $params['CallBackUrl'] = config::NOTIFY_URL; $params['Version'] = '1.0'; return $params; } //直充提单 public function add($card_no, $card_type, $amount, $params) { $order_sn = $params['order_sn']; $product_code = $params['product_code']; $params = $this->req_params($order_sn,$product_code); $params['ChargeAccount'] = $card_no; $params['ChargeAccountType'] = 1;//账号类型1 手机号,2 QQ号,3 微信号 $sign = $this->sign($params); $params['Sign'] = $sign; $resp = http_request(config::ORDER_URL, $params); if (empty($resp)) { return [false, '网络错误', true]; } else { Log::record($resp, Log::DEBUG); $resp = json_decode($resp, true); if (empty($resp)) { return [false, '网络错误', true]; } elseif ($resp['Code'] == 999) { return [true, $resp['OrderModel']['OrderId'], false]; } else { return [false, $resp['Msg'], false]; } } } public function CardOrderAdd($card_no, $card_type, $amount, $params) { $order_sn = $params['order_sn']; $product_code = $params['product_code']; $params = $this->req_params($order_sn,$product_code); $params['PublicKey'] = $this->CT_RSA($params['order_id']); $sign = $this->sign($params); $params['Sign'] = $sign; $resp = http_request(config::CARD_ORDER_URL, $params); if (empty($resp)) { return [false, '网络错误', true]; } else { Log::record($resp, Log::DEBUG); $resp = json_decode($resp, true); if (empty($resp)) { return [false, '网络错误', true]; } elseif ($resp['Code'] == 999) { return [true, $resp['OrderModel']['OrderId'], false]; } else { return [false, $resp['Msg'], false]; } } } private function CT_RSA($order_id) { //创建公私钥 $res = openssl_pkey_new(); //获取私钥 openssl_pkey_export($res, $private_key); //获取公钥 $public_key = openssl_pkey_get_details($res)['key']; $rsa = [ 'public_key' => $public_key, 'private_key' => $private_key, ]; $rsa_json = json_encode($rsa); Log::record("rsa info : {$rsa_json}"); //公钥私钥与订单绑定,加rsa字段 $updata['public_key'] = $public_key; $updata['private_key'] = $private_key; Model('refill_order')->edit($order_id, $updata); return $public_key; } public function query($refill_info) { $params['AppKey'] = config::APP_KEY; $params['TimesTamp'] = time(); $params['MOrderID'] = $refill_info['order_sn']; $params['Version'] = '1.0'; $content = config::APP_KEY . $params['TimesTamp'] . $params['Version'] . $params['MOrderID'] . config::App_Secret; $params['Sign'] = strtoupper(md5($content)); $resp = http_request(config::QUERY_URL, $params); if (empty($resp)) { return [false, '网络错误', []]; } else { Log::record($resp, Log::DEBUG); $resp = json_decode($resp, true); if (empty($resp)) { return [false, '网络错误', []]; } elseif ($resp['Code'] == 999) { $status = intval($resp['Data']['OrderState']); $card_data = []; if ($status === 2) { if(!empty($resp['Data']['CardData'])) { $private_key = $refill_info['private_key']; $cards = $this->rsa_decode($resp['Data']['CardData'],$private_key); $card_data = []; foreach ($cards as $card) { $card_data[] = json_decode($card, true); } //需返回卡密信息 } $order_state = ORDER_STATE_SUCCESS; } elseif ($status === 3) { $order_state = ORDER_STATE_CANCEL; } elseif (in_array($status, [1,4])) { $order_state = ORDER_STATE_SEND; } else { return [false, $resp['Message'], $card_data]; } return [true, $order_state, $card_data]; } else { return [false, $resp['Message'], []]; } } } private function rsa_decode($card_data,$private_key) { $res = openssl_pkey_get_private($private_key); //使用私钥解密数据 openssl_private_decrypt($card_data, $decrypted, $res); return $decrypted; } private function sign($params) { $content = config::APP_KEY . $params['BuyCount'] . $params['CallBackUrl'] . $params['ChargeAccount'] . $params['CustomerIP'] . $params['MOrderID']; $content .= $params['ProductCode'] . $params['TimesTamp'] . $params['Version'] . config::App_Secret; return strtoupper(md5($content)); } }