This commit is contained in:
xl
2023-11-13 23:52:41 +08:00
parent 494a7e48c0
commit d64ffe4b07
7 changed files with 265 additions and 93 deletions
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace wchat\common;
use JetBrains\PhpStorm\ArrayShape;
class AppConfig
{
/**
* @var string
*/
protected string $appId = '';
/**
* @var string
*/
protected string $appSecret = '';
/**
* @var PayConfig
*/
protected PayConfig $payConfig;
/**
* @var int
*/
protected int $type;
/**
* @var array|string[]
*/
#[ArrayShape(['token' => 'string', 'secret' => 'string', 'unionId' => 'string'])]
protected array $notice = ['token' => '', 'secret' => '', 'unionId' => ''];
/**
* @param object $app
* @return static
*/
public static function instance(object $app): static
{
$model = new static();
$model->appId = $app->appId;
$model->appSecret = $app->appSecret;
$model->type = $app->type;
$model->payConfig = PayConfig::parse($app->pay);
return $model;
}
/**
* @return bool
*/
public function typeIsApp(): bool
{
return $this->type === 3;
}
}
+22
View File
@@ -22,6 +22,12 @@ abstract class Multiprogramming implements Progaram
protected string $errorMsg = '';
/**
* @var PayConfig
*/
protected PayConfig $payConfig;
/**
* @param $message
* @param int $code
@@ -74,6 +80,22 @@ abstract class Multiprogramming implements Progaram
$this->config = $config;
}
/**
* @return PayConfig
*/
public function getPayConfig(): PayConfig
{
return $this->payConfig;
}
/**
* @param PayConfig $payConfig
*/
public function setPayConfig(PayConfig $payConfig): void
{
$this->payConfig = $payConfig;
}
/**
* @return \wchat\common\Config
+12 -63
View File
@@ -2,81 +2,30 @@
namespace wchat\common;
use JetBrains\PhpStorm\ArrayShape;
use wchat\common\libs\Aliyun;
use wchat\common\libs\Qq;
use wchat\common\libs\Wx;
class PayConfig
{
/**
* @var array|string[]
* @var Qq
*/
#[ArrayShape(["appId" => "string", "mchCa" => "string", "mchId" => "string", "mchKey" => "string", "mchCert" => "string", "appSecret" => "string", "mchSecret" => "string"])]
protected array $qq = ["appId" => "", "mchCa" => "", "mchId" => "", "mchKey" => "", "mchCert" => "", "appSecret" => "", "mchSecret" => ""];
public Qq $qq;
/**
* @var array|string[]
* @var Wx
*/
#[ArrayShape(["appId" => "string", "mchId" => "string", "schema" => "string", "mchKey" => "string", "secret" => "string", "mchCert" => "string", "appSecret" => "string", "SerialNumber" => "string"])]
protected array $wx = ["appId" => "", "mchId" => "", "schema" => "", "mchKey" => "", "secret" => "", "mchCert" => "", "appSecret" => "", "SerialNumber" => ""];
public Wx $wx;
/**
* @var array|string[]
* @var Aliyun
*/
#[ArrayShape(["appId" => "string", "appKey" => "string", "appSecret" => "string", "aliPubSecret" => "string", "appPubSecret" => "string", "aliRootSecret" => "string", "openFileState" => "string"])]
protected array $ali = ["appId" => "", "appKey" => "", "appSecret" => "", "aliPubSecret" => "", "appPubSecret" => "", "aliRootSecret" => "", "openFileState" => "0"];
/**
* @return array|string[]
*/
#[ArrayShape(["appId" => "string", "mchCa" => "string", "mchId" => "string", "mchKey" => "string", "mchCert" => "string", "appSecret" => "string", "mchSecret" => "string"])] public function getQq(): array
{
return $this->qq;
}
/**
* @param array|string[] $qq
*/
public function setQq(array $qq): void
{
$this->qq = $qq;
}
/**
* @return array|string[]
*/
#[ArrayShape(["appId" => "string", "mchId" => "string", "schema" => "string", "mchKey" => "string", "secret" => "string", "mchCert" => "string", "appSecret" => "string", "SerialNumber" => "string"])] public function getWx(): array
{
return $this->wx;
}
/**
* @param array|string[] $wx
*/
public function setWx(array $wx): void
{
$this->wx = $wx;
}
/**
* @return array|string[]
*/
#[ArrayShape(["appId" => "string", "appKey" => "string", "appSecret" => "string", "aliPubSecret" => "string", "appPubSecret" => "string", "aliRootSecret" => "string", "openFileState" => "string"])]
public function getAli(): array
{
return $this->ali;
}
/**
* @param array|string[] $ali
*/
public function setAli(array $ali): void
{
$this->ali = $ali;
}
public Aliyun $ali;
/**
@@ -89,9 +38,9 @@ class PayConfig
$pay = json_decode($pay, true);
}
$model = new static();
foreach ($pay as $key => $value) {
$model->$key = $value;
}
$model->ali = \Kiri::configure(new Aliyun(), $pay['ali']);
$model->qq = \Kiri::configure(new Qq(), $pay['qq']);
$model->wx = \Kiri::configure(new Wx(), $pay['wx']);
return $model;
}
+50
View File
@@ -0,0 +1,50 @@
<?php
namespace wchat\common\libs;
class Aliyun
{
/**
* @var string
*/
public string $appId;
/**
* @var string
*/
public string $mchCa;
/**
* @var string
*/
public string $mchId;
/**
* @var string
*/
public string $mchKey;
/**
* @var string
*/
public string $mchCert;
/**
* @var string
*/
public string $appSecret;
/**
* @var string
*/
public string $mchSecret;
}
+50
View File
@@ -0,0 +1,50 @@
<?php
namespace wchat\common\libs;
class Qq
{
/**
* @var string
*/
public string $appId;
/**
* @var string
*/
public string $mchCa;
/**
* @var string
*/
public string $mchId;
/**
* @var string
*/
public string $mchKey;
/**
* @var string
*/
public string $mchCert;
/**
* @var string
*/
public string $appSecret;
/**
* @var string
*/
public string $mchSecret;
}
+56
View File
@@ -0,0 +1,56 @@
<?php
namespace wchat\common\libs;
class Wx
{
/**
* @var string
*/
public string $appId;
/**
* @var string
*/
public string $mchId;
/**
* @var string
*/
public string $schema;
/**
* @var string
*/
public string $mchKey;
/**
* @var string
*/
public string $secret;
/**
* @var string
*/
public string $mchCert;
/**
* @var string
*/
public string $appSecret;
/**
* @var string
*/
public string $serialNumber;
}
+4 -24
View File
@@ -5,6 +5,7 @@ namespace wchat\wx\V3;
use Exception;
use OpenSSLAsymmetricKey;
use Psr\Http\Message\RequestInterface;
use wchat\common\PayConfig;
use wchat\wx\SmallProgram;
use wchat\wx\V3\Notify\GoodsDetail;
use wchat\wx\V3\Notify\NotifyModel;
@@ -13,25 +14,6 @@ use wchat\wx\V3\Notify\PromotionDetail;
const KEY_TYPE_PUBLIC = 'public';
const KEY_TYPE_PRIVATE = 'private';
const LOCAL_FILE_PROTOCOL = 'file://';
const PKEY_PEM_NEEDLE = ' KEY-';
const PKEY_PEM_FORMAT = "-----BEGIN %1\$s KEY-----\n%2\$s\n-----END %1\$s KEY-----";
const PKEY_PEM_FORMAT_PATTERN = '#-{5}BEGIN ((?:RSA )?(?:PUBLIC|PRIVATE)) KEY-{5}\r?\n([^-]+)\r?\n-{5}END \1 KEY-{5}#';
const CHR_CR = "\r";
const CHR_LF = "\n";
const RULES = [
'private.pkcs1' => [PKEY_PEM_FORMAT, 'RSA PRIVATE', 16],
'private.pkcs8' => [PKEY_PEM_FORMAT, 'PRIVATE', 16],
'public.pkcs1' => [PKEY_PEM_FORMAT, 'RSA PUBLIC', 15],
'public.spki' => [PKEY_PEM_FORMAT, 'PUBLIC', 14],
];
const ASN1_OID_RSAENCRYPTION = '300d06092a864886f70d0101010500';
const ASN1_SEQUENCE = 48;
const CHR_NUL = "\0";
const CHR_ETX = "\3";
class WxV3PaymentNotify extends SmallProgram
{
@@ -46,7 +28,6 @@ class WxV3PaymentNotify extends SmallProgram
* @param string $event_type
* @param string $summary
* @param array $resource
* @param string $publicKey
*/
public function __construct(
public string $id = "EV-2018022511223320873",
@@ -54,8 +35,7 @@ class WxV3PaymentNotify extends SmallProgram
public string $resource_type = "encrypt-resource",
public string $event_type = "TRANSACTION.SUCCESS",
public string $summary = "支付成功",
public array $resource = [],
public string $publicKey = ''
public array $resource = []
)
{
}
@@ -74,7 +54,7 @@ class WxV3PaymentNotify extends SmallProgram
*/
public function verify(RequestInterface $request): bool
{
$platformPublicKeyInstance = $this->rsaFrom($this->publicKey, KEY_TYPE_PUBLIC);
$platformPublicKeyInstance = $this->rsaFrom($this->payConfig->wx->mchKey, KEY_TYPE_PUBLIC);
$inWechatpaySignature = $request->getHeaderLine('Wechatpay-Signature'); // 请根据实际情况获取
$inWechatpayTimestamp = $request->getHeaderLine('Wechatpay-Timestamp'); // 请根据实际情况获取
$inWechatpayNonce = $request->getHeaderLine('Wechatpay-Nonce'); // 请根据实际情况获取
@@ -147,7 +127,7 @@ class WxV3PaymentNotify extends SmallProgram
*/
public function decode($ciphertext, $nonce, $associated_data): bool
{
$data = $this->decrypt($ciphertext, $this->getConfig()->getMchKey(), $nonce, $associated_data);
$data = $this->decrypt($ciphertext, $this->payConfig->wx->secret, $nonce, $associated_data);
$this->notifyModel = new NotifyModel();
$this->notifyModel->amount = $data['amount'];
$this->notifyModel->payer = $data['payer'];