_key = $key; } public static function instance($key) { if (self::$self == null) { self::$self = new self($key); } return self::$self; } /** * 构造sign签名参数 * @param array $params * @return bool|string */ public function makeSign($params) { if (!empty($params)) { ksort($params); $str = ''; foreach ($params as $k => $v) { if ($v == '' || $k == 'signature') { continue; } $str .= $k . '=' . $v . '&'; } return strtolower(md5($str . md5($this->_key))); } return false; } /** * 验证sign签名参数 * @param array $params * @return bool */ public function verifySign($params) { if (empty($params['signature'])) { LogService::info('signature参数不存在,现在支付签名校验失败'); return false; } $originalSign = $params['signature']; $sign = $this->makeSign($params); if ($originalSign != $sign) { LogService::info('signature参数有误,现在支付签名校验失败'); return false; } else { LogService::info('signature参数成功,现在支付签名校验成功'); return true; } } /** * 现在支付调用API接口 * @param $data 加密前的明文参数 * @param $payInfo 支付信息 * @param $goodsInfo 商品信息 * @param $orderInfo 订单信息 * @param int $loopIndex 循环调用API的次数 * @return \Psr\Http\Message\ResponseInterface * @throws Exception */ public function payIpaynowApi($data, $payInfo, $goodsInfo, $orderInfo, $loopIndex = 1) { $payUrl = ApiConstants::IPAYNOW_PAY_URL; $ipaynowApiStartTime = microtime(true); try { $client = new Http([ 'connect_timeout' => 10, 'timeout' => 30, 'http_errors' => true, //抛出异常 true是 false否 'verify' => false, //不验证ssl证书 'curl' => [ CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_1 ], ]); $result = $client->post($payUrl, ['form_params' => $data]); $ipaynowApiEndTime = microtime(true); $apiRunTime = round($ipaynowApiEndTime - $ipaynowApiStartTime, 3); if ($result->getStatusCode() != '200') { LogService::error(sprintf('ipaynow_create_order_fail!wxpay_id:%s,wxpay_name:%s,mch_id:%s,channel_id:%s,user_id:%s,money:%s,good_id:%s,out_trade_no:%s,api_run_time:%s s,loop_index:%s,errmessage:%s', $payInfo['id'], $payInfo['name'], $payInfo['quartet_merchant_id'], $orderInfo['admin_id'], $orderInfo['user_id'], $goodsInfo['money'], $orderInfo['goods_id'], $orderInfo['out_trade_no'], $apiRunTime, $loopIndex, json_encode(var_export($result, true), JSON_UNESCAPED_UNICODE))); LogService::error('现在支付平台订单创建失败!订单内容1: ' . json_encode(var_export($data, true), JSON_UNESCAPED_UNICODE) . " 现在支付平台返回内容: " . json_encode(var_export($result, true), JSON_UNESCAPED_UNICODE)); throw new Exception('订单创建失败,请重新下单!'); } else { $resStr = $result->getBody()->getContents(); parse_str($resStr, $result); $verifyResponseResult = $this->verifySign($result); if ($result['responseCode'] != 'A001' || !$verifyResponseResult) { LogService::error(sprintf('ipaynow_create_order_fail!wxpay_id:%s,wxpay_name:%s,mch_id:%s,channel_id:%s,user_id:%s,money:%s,good_id:%s,out_trade_no:%s,api_run_time:%s s,loop_index:%s,errmessage:%s', $payInfo['id'], $payInfo['name'], $payInfo['quartet_merchant_id'], $orderInfo['admin_id'], $orderInfo['user_id'], $goodsInfo['money'], $orderInfo['goods_id'], $orderInfo['out_trade_no'], $apiRunTime, $loopIndex, $result['responseMsg'])); LogService::error('现在支付平台订单创建失败!订单内容2:' . json_encode(var_export($data, true)) . " 现在支付平台返回错误码: " . $result['responseCode']); throw new Exception('订单创建失败,请重新下单!'); } } LogService::info(sprintf('ipaynow_create_order_success!wxpay_id:%s,wxpay_name:%s,mch_id:%s,channel_id:%s,user_id:%s,money:%s,good_id:%s,out_trade_no:%s,api_run_time:%s s,loop_index:%s', $payInfo['id'], $payInfo['name'], $payInfo['quartet_merchant_id'], $orderInfo['admin_id'], $orderInfo['user_id'], $goodsInfo['money'], $orderInfo['goods_id'], $orderInfo['out_trade_no'], $apiRunTime, $loopIndex)); return $result; } catch (GuzzleException $exception) { $ipaynowApiEndTime = microtime(true); $apiRunTime = round($ipaynowApiEndTime - $ipaynowApiStartTime, 3); LogService::error(sprintf('ipaynow_create_order_fail!wxpay_id:%s,wxpay_name:%s,mch_id:%s,channel_id:%s,user_id:%s,money:%s,good_id:%s,out_trade_no:%s,api_run_time:%s s,loop_index:%s,errmessage:%s', $payInfo['id'], $payInfo['name'], $payInfo['quartet_merchant_id'], $orderInfo['admin_id'], $orderInfo['user_id'], $goodsInfo['money'], $orderInfo['goods_id'], $orderInfo['out_trade_no'], $apiRunTime, $loopIndex, $exception->getMessage())); LogService::error('现在支付平台订单创建失败!订单内容3: ' . json_encode(var_export($data, true), JSON_UNESCAPED_UNICODE)); LogService::error($exception->getMessage()); LogService::error($exception->getTraceAsString()); if ($loopIndex <= ApiConstants::LOOP_EXEC_API_COUNT) { $loopIndex++; return $this->payIpaynowApi($data, $payInfo, $goodsInfo, $orderInfo, $loopIndex); } throw new Exception('订单创建失败,请重新下单!'); } } }