Files
xk-api-yii/common/services/WechatService.php
2024-09-19 11:32:39 +08:00

101 lines
3.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace common\services;
use common\helpers\FuncHelper;
use EasyWeChat\Factory;
use yii\base\Exception;
class WechatService
{
private static $instance = null;
public $app;
public $wechat;
public $payment;
private function __clone()
{
}
private function __construct($module = null)
{
// if ($module) {
// // 获取另一个模块的实例的配置内容
// \Yii::setAlias("@{$module}", dirname(dirname(__DIR__)) . "/{$module}");
// $params = include \Yii::getAlias("@{$module}/config/params-local.php");
// $config = $params['wechat'];
// } else {
$config = \Yii::$app->params['wechat'];
// }
// ... 在应用配置之前初始化
if(!$config['app_id'] || !$config['app_secret'] || !$config['merchant_id'] || !$config['merchant_key'] || !$config['apiclient_cert'] || !$config['apiclient_key']){
throw new \Exception('请设置支付配置');
}
if ($config['apiclient_cert'] && $config['apiclient_key']) {
list($sslCer, $sslKey) = $this->generatePem($config['apiclient_cert'], $config['apiclient_key']);
}
$app_id = $config['app_id'];
$app_secret = $config['app_secret'];
$mch_id = $config['merchant_id'];
$key = $config['merchant_key'];
$cert_path = $sslCer;
$key_path = $sslKey;
$config = [
'app_id' => $app_id,
'secret' => $app_secret,
// 下面为可选项
// 指定 API 调用返回结果的类型array(default)/collection/object/raw/自定义类名
'response_type' => 'array',
'log' => [
'level' => 'debug',
'file' => \Yii::getAlias('@member').'/runtime/wechat.log',
],
//支付参数
'mch_id' => $mch_id,
'key' => $key, // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
'cert_path' => $cert_path, // XXX: 绝对路径!!!!
'key_path' => $key_path, // XXX: 绝对路径!!!!
];
\Yii::error('支付参数:'.json_encode($config));
$this->wechat = Factory::officialAccount($config);//公众号
$this->app = Factory::miniProgram($config);//小程序
$this->payment = Factory::payment($config);//支付
}
public static function getInstance($module = null)
{
if(empty(self::$instance)){
self::$instance = new self($module);
}
return self::$instance;
}
/**
* @param $cert_pem
* @param $key_pem
*/
private function generatePem($cert_pem, $key_pem)
{
$pemDir = \Yii::$app->runtimePath . '/pem';
FuncHelper::make_dir($pemDir);
$certPemFile = $pemDir . '/' . md5($cert_pem);
if (!file_exists($certPemFile)) {
file_put_contents($certPemFile, $cert_pem);
}
$keyPemFile = $pemDir . '/' . md5($key_pem);
if (!file_exists($keyPemFile)) {
file_put_contents($keyPemFile, $key_pem);
}
return [$certPemFile, $keyPemFile];
}
}