// header("Content-type: text/html; charset=gb2312");
class Yeepay
{
protected $app;
protected $key;
protected $host;
protected $basePath;
protected $headers;
protected $debug;
protected $delimiter;
protected $logistics_info;
public function __construct($debug = false)
{
$this->app = '';
$this->key = '';
$this->host = '';
$this->basePath = '/open-platform/dtpay';
$this->debug = $debug;
$this->delimiter = uniqid();
$expires_time = session('expires_time');
if($expires_time < time()){
self::oauth();
}
$this->headers = session('oauth');
}
// 获取 TOKEN
public function oauth()
{
$request_url = $this->host . "/open-platform/blade-auth/oauth/token";
$postData = [
"grant_type" => "client_credentials",
];
$headers = [
'Authorization' => "Basic " . base64_encode($this->app .':' . $this->key),
'Content-Type' => "application/x-www-form-urlencoded",
'charset' => "UTF-8",
];
$result = Requests::post($request_url, $headers, $postData);
$oauth = json_decode($result->body,true);
$time = time();
$oauth['Blade-Auth'] = $oauth['access_token'];
unset($oauth['access_token']);
// 先缓存
session('oauth', $oauth);
session('expires_time', $time + $oauth['expires_in']);
Session::save(); // 这个很重要
return true;
}
/**
* 统一下单 - 【交易模块】
* @param $postData
* @return mixed
*/
public function prePay($postData)
{
// 在读取
$request_url = $this->host . $this->basePath . "/doc/v1/trade/pre-pay";
$headers = array_merge([
'Content-Type' => "application/json",
], $this->headers);
$result = Requests::post($request_url, $headers, $this->aes_encrypt($postData));
return json_decode($result->body,true);
}
/**
* 申请现金退款 - 【交易模块】
* @param $postData
* @return mixed
*/
public function refund($postData)
{
// 在读取
$request_url = $this->host . $this->basePath . "/doc/v1/trade/refund";
$headers = array_merge([
'Content-Type' => "application/json",
], $this->headers);
$result = Requests::post($request_url, $headers, $this->aes_encrypt($postData));
return json_decode($result->body,true);
}
/**
* 查询订单 - 【交易模块】
* @param $postData
* @return mixed
*/
public function payQuery($postData)
{
// 在读取
$request['url'] = $this->host . $this->basePath . "/doc/v1/trade/order/query";
$request['type'] = 'POST';
$data = ['data' => $this->aes_encrypt($postData)];
$request['data'] = self::buildData($data);
$request['headers'] = array_merge([
"Content-Type" => "multipart/form-data; boundary=" . $this->delimiter,
"Content-Length" => strlen($request['data'])
], $this->headers);
// $result = Requests::post($request['url'], $request['headers'], $data);
$result = Requests::request_multiple([$request]);
$result = $result[0];
return json_decode($result->body,true);
}
/**
* 解密
* @param $postData
* @return mixed
*/
public function aesDecrypt($postData)
{
return json_decode($this->aes_decrypt($postData), true);
}
/**【手动填充】
* 对称解密使用的算法为 AES-256-CBC
* @param string $data 需要加密的json
* @return string base64后的补齐明文字符串
*/
private function aes_encrypt(string $data){
return base64_encode(openssl_encrypt(self::padZero($data, 16),'aes-256-cbc', $this->key,OPENSSL_NO_PADDING, substr($this->key, 0, 16)));
}
/**
* 对密文进行解密
* @param string $data 需要解密的密文
* @return string 解密得到的明文
*/
private function aes_decrypt(string $data){
return self::subZero(openssl_decrypt(base64_decode($data),'aes-256-cbc', $this->key,OPENSSL_NO_PADDING, substr($this->key , 0 , 16)));
}
/**【手动填充】**
* 对需要加密的明文进行填充补位
* @param $data string 需要进行填充补位操作的明文
* @param $blockSize int 块大小为16个字节
* @return string 补齐明文字符串
*/
private function padZero(string $data, int $blockSize){
$pad = $blockSize - (strlen($data) % $blockSize);
return $data . str_repeat("\0", $pad);
}
/**【去除填充】**
* 对解密后的明文进行补位删除
* @param $text false|string 解密后的明文
* @return false|string 删除填充补位后的明文
*/
private function subZero($text)
{
$pad = ord(substr($text, -1));
if ($pad < 1 || $pad > 32) {
$pad = 0;
}
return substr($text, 0, (strlen($text) - $pad));
}
private function buildData($param){
$data = '';
$eol = "\r\n";
// $upload = $param['upload'];
// unset($param['upload']);
foreach ($param as $name => $content) {
$data .= "--" . $this->delimiter . "\r\n"
. 'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n"
. $content . "\r\n";
}
// 拼接文件流
// $data .= "--" . $this->delimiter . $eol
// . 'Content-Disposition: form-data; name="upload"; filename="' . $param['filename'] . '"' . "\r\n"
// . 'Content-Type:application/octet-stream'."\r\n\r\n";
// $data .= $upload . "\r\n";
$data .= "--" . $this->delimiter . "--\r\n";
return $data;
}
}
本文为原创文章,转载请注明出处!
admin:支持一下,感谢分享!,+10,