<?php
namespace Yurun\PaySDK\Weixin;
use Yurun\PaySDK\Base;
use Yurun\PaySDK\Lib\Encrypt\SHA256withRSA\Signer;
use Yurun\PaySDK\Lib\ObjectToArray;
use Yurun\PaySDK\WeixinRequestBase;
class SDKV3 extends Base
{
public $publicParams;
public $authorization;
public $sign;
public function __parseExecuteData($params, &$data, &$requestData, &$url)
{
$data = array_merge(ObjectToArray::parse($this->publicParams), ObjectToArray::parse($params));
unset($data['apiDomain'], $data['appID'], $data['businessParams'], $data['_apiMethod'], $data['key'], $data['_method'], $data['_isSyncVerify'], $data['certPath'], $data['keyPath'], $data['apiCertPath'], $data['certSerialNumber'], $data['needSignType'], $data['allowReport'], $data['reportLevel'], $data['needNonceStr'], $data['signType'], $data['needAppID'], $data['rsaPublicCertFile'], $data['rsaPublicCertContent'], $data['needMchID'], $data['_contentType']);
if ($params->needAppID)
{
if (isset($params->mch_appid))
{
if ('' === $params->mch_appid)
{
$data['mch_appid'] = $this->publicParams->appID;
}
}
else
{
$data['appid'] = $this->publicParams->appID;
}
}
if (!$params->needMchID)
{
unset($data['mch_id']);
}
if (isset($params->mchid) && '' === $params->mchid)
{
$data['mchid'] = $this->publicParams->mch_id;
unset($data['mch_id']);
}
if (isset($params->partnerid) && '' === $params->partnerid)
{
$data['partnerid'] = $this->publicParams->mch_id;
unset($data['mch_id']);
}
if (!$params->needSignType)
{
unset($data['sign_type']);
}
foreach ($data as $key => $value)
{
if (\is_object($value) && method_exists($value, 'toString'))
{
$data[$key] = $value->toString();
}
}
$this->authorization = $this->generateAuthorization($data, $params);
if (false === strpos($params->_apiMethod, '://'))
{
$url = $this->publicParams->apiDomain . $params->_apiMethod;
}
else
{
$url = $params->_apiMethod;
}
}
public function generateAuthorization($data, $params)
{
$timestamp = time();
$nonceStr = md5(mt_rand());
$this->sign = $this->sign([
'data' => $data,
'params' => $params,
'timestamp' => $timestamp,
'nonce_str' => $nonceStr,
]);
$this->http->header('Authorization', sprintf('WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",signature="%s",timestamp="%s",serial_no="%s"', $this->publicParams->mch_id, $nonceStr, $this->sign, $timestamp, $this->publicParams->certSerialNumber));
}
public function sign($data)
{
$content = $this->parseSignData($data);
return Signer::sign($content, $this->publicParams->certSerialNumber, openssl_get_privatekey(file_get_contents($this->publicParams->keyPath)))->getSign();
}
public function verifyCallback($data)
{
return false;
}
public function verifySync($params, $data, $response = null)
{
$content = $response->getHeaderLine('Wechatpay-Timestamp') . "\n"
. $response->getHeaderLine('Wechatpay-Nonce') . "\n"
. $response->getBody() . "\n";
$sign = $response->getHeaderLine('Wechatpay-Signature');
return Signer::verify($content, $sign, openssl_get_publickey(file_get_contents($this->publicParams->certPath)));
}
public function parseSignData($data)
{
$params = $data['params'];
return $params->_method . "\n"
. '/' . $params->_apiMethod . "\n"
. $data['timestamp'] . "\n"
. $data['nonce_str'] . "\n"
. (\in_array($params->_method, ['POST', 'PUT']) ? json_encode($data['data']) : '') . "\n";
}
public function execute($params, $format = 'JSON')
{
if (null !== $this->publicParams->certPath)
{
$this->http->sslCert($this->publicParams->certPath);
}
if (null !== $this->publicParams->keyPath)
{
$this->http->sslKey($this->publicParams->keyPath);
}
parent::execute($params, $format);
return $this->result;
}
protected function __checkResult($result)
{
return !isset($result['code']);
}
protected function __getError($result)
{
return isset($result['message']) ? $result['message'] : '';
}
protected function __getErrorCode($result)
{
return isset($result['code']) ? $result['code'] : '';
}
}