_lastError; } /** * @param array $data * @return string 成功时 返回支付链接、失败时返回空字符串 并给 lastError 赋值 */ abstract public function createPayLink($data = array()); /** * 查单是否支付 * @param array $data * @param string $orderSn * @param float $money * @param string $partnerId * @return bool */ abstract public function queryOrder($data, &$orderSn, &$money, $partnerId); /** * @param string $orderSn 我方订单号 * @param string $tradeNo 支付方单号 * @param float $money 支付金额 * @param string $partnerId 商户号 * @return bool */ abstract public function notify(&$orderSn, &$tradeNo, &$money, $partnerId); /** * 根据支付方要求输出指定内容 */ abstract public function stopNotify(); /** * 发起http get 请求 * @param $url * @return string */ protected function httpGet($url, $data,) { try { $result = Http::withHeaders([ 'timeout' => 20, // 超时,单位秒. 'verify' => false, // 是否校验SSL证书. 'http_errors' => false, // 如果跟随http异常头部是否中断. 'debug' => false, // 是否启用调试模式. 'allow_redirects' => true, // 不跟随301/302跳转. ])->get($url, $data); if ($result->successful()) { return $result->body(); } } catch (\Exception $e) { return $e->getMessage(); } return ''; } /** * 发起 http post 请求 * @param $url * @param $data * @param $formType 1.post;2.json; * @return string */ protected function httpPost($url, $data, $formType = 1) { switch ($formType) { case 1: $asForm = 'asForm'; break; case 2: $asForm = 'asJson'; break; } try { $result = Http::withHeaders([ 'timeout' => 20, // 超时,单位秒. 'verify' => false, // 是否校验SSL证书. 'http_errors' => false, // 如果跟随http异常头部是否中断. 'debug' => false, // 是否启用调试模式. 'allow_redirects' => true, // 不跟随301/302跳转. ])->$asForm()->post($url, $data); if ($result->successful()) { return $result->body(); } } catch (\Exception $e) { logger($e->getMessage()); } return ''; } private static function _convertUnderline($str) { $string = ''; $arr = explode('_', $str); foreach ($arr as $value) { $string .= ucfirst(strtolower($value)); } return $string . 'Payment'; } /** * 签名算法 * * @param $data * @return string */ public function getSign($data, $splicing = true) { ksort($data); $md5str = ""; foreach ($data as $key => $val) { $md5str = $md5str . $key . "=" . $val . "&"; } if ($splicing === false) { $md5str = substr($md5str, 0, -1); } return $md5str; } /** * 构建rsa私钥 * * @param $privateKey * @return false|OpenSSLAsymmetricKey */ public function setupPrvKeySign($privateKey) { $pem = chunk_split($privateKey, 64, "\n"); $pem = "-----BEGIN RSA PRIVATE KEY-----\n" . $pem . "-----END RSA PRIVATE KEY-----\n"; $key = openssl_pkey_get_private($pem); return $key; } /** * 构建rsa共钥 * * @param $publicKey * @return false|OpenSSLAsymmetricKey */ public function setupPubKey($publicKey) { $pem = chunk_split($publicKey, 64, "\n"); $pem = "-----BEGIN PUBLIC KEY-----\n" . $pem . "-----END PUBLIC KEY-----"; $key = openssl_pkey_get_public($pem); return $key; } }