You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.0 KiB
156 lines
5.0 KiB
<?php |
|
/** |
|
* @copyright ©2018 浙江禾匠信息科技 |
|
* @author Lu Wei |
|
* @link http://www.zjhejiang.com/ |
|
* Created by IntelliJ IDEA |
|
* Date Time: 2018/8/3 11:49 |
|
*/ |
|
|
|
namespace app\models\alipay; |
|
|
|
use Alipay\Key\AlipayKeyPair; |
|
use app\models\Option; |
|
use app\modules\mch\models\MchModel; |
|
use Alipay\Exception\AlipayException; |
|
use Alipay\AlipayCurlRequester; |
|
|
|
class MpConfig extends MchModel |
|
{ |
|
public $store_id; |
|
|
|
public $app_id; |
|
public $alipay_public_key; |
|
public $app_public_key; |
|
public $app_private_key; |
|
public $cs_tnt_inst_id; |
|
public $cs_scene; |
|
|
|
const OPTION_KEY = 'alipay_mp_config'; |
|
|
|
public function rules() |
|
{ |
|
return [ |
|
[['app_id', 'alipay_public_key', 'app_public_key', 'app_private_key', 'cs_tnt_inst_id', 'cs_scene'], 'trim'], |
|
[['app_id', 'alipay_public_key', 'app_private_key'], 'required'], |
|
['alipay_public_key', function ($attr) { |
|
// key自动添加 -----BEGIN PUBLIC KEY-----&&-----END PUBLIC KEY-----&&换行符 |
|
|
|
$begin_str = '-----BEGIN PUBLIC KEY-----'; |
|
$end_str = '-----END PUBLIC KEY-----'; |
|
$key = $this->alipay_public_key; |
|
|
|
$key = $this->pregReplaceAll('/---.*---/', '', $key); |
|
$key = trim($key); |
|
$key = str_replace("\n", '', $key); |
|
$key = str_replace("\r\n", '', $key); |
|
$key = str_replace("\r", '', $key); |
|
$key = wordwrap($key, 64, "\r\n", true); |
|
|
|
if (mb_stripos($key, $begin_str) === false) { |
|
$key = $begin_str . "\r\n" . $key; |
|
} |
|
if (mb_stripos($key, $end_str) === false) { |
|
$key = $key . "\r\n" . $end_str; |
|
} |
|
$this->alipay_public_key = $key; |
|
}], |
|
['app_private_key', function ($attr) { |
|
// key自动添加 -----BEGIN RSA PRIVATE KEY-----&&-----END RSA PRIVATE KEY-----&&换行符 |
|
$begin_str = '-----BEGIN RSA PRIVATE KEY-----'; |
|
$end_str = '-----END RSA PRIVATE KEY-----'; |
|
$key = $this->app_private_key; |
|
|
|
$key = $this->pregReplaceAll('/---.*---/', '', $key); |
|
$key = trim($key); |
|
$key = str_replace("\n", '', $key); |
|
$key = str_replace("\r\n", '', $key); |
|
$key = str_replace("\r", '', $key); |
|
$key = wordwrap($key, 64, "\r\n", true); |
|
|
|
if (mb_stripos($key, $begin_str) === false) { |
|
$key = $begin_str . "\r\n" . $key; |
|
} |
|
if (mb_stripos($key, $end_str) === false) { |
|
$key = $key . "\r\n" . $end_str; |
|
} |
|
$this->app_private_key = $key; |
|
}], |
|
]; |
|
} |
|
|
|
public function attributeLabels() |
|
{ |
|
return [ |
|
'app_id' => '小程序AppID', |
|
'alipay_public_key' => '支付宝公钥', |
|
'app_public_key' => '应用公钥', |
|
'app_private_key' => '应用私钥', |
|
'cs_tnt_inst_id' => '云客服TntInstId', |
|
'cs_scene' => '云客服Scene', |
|
]; |
|
} |
|
|
|
public function save() |
|
{ |
|
if (!$this->validate()) { |
|
return $this->getErrorResponse(); |
|
} |
|
$data = $this->attributes; |
|
unset($data['store_id']); |
|
Option::set(self::OPTION_KEY, $data, $this->store_id); |
|
return [ |
|
'code' => 0, |
|
'msg' => '保存成功。', |
|
]; |
|
} |
|
|
|
/** |
|
* 根据 Store Id 获取其配置实例 |
|
* |
|
* @param string|int $storeId |
|
* @return static |
|
*/ |
|
public static function get($storeId) |
|
{ |
|
$instance = new static(); |
|
$instance->store_id = $storeId; |
|
|
|
$data = Option::get(self::OPTION_KEY, $storeId); |
|
if ($data != null) { |
|
$instance->attributes = (array)$data; |
|
} |
|
|
|
return $instance; |
|
} |
|
|
|
/** |
|
* 返回支付宝 AopClient |
|
* |
|
* @return \Alipay\AopClient |
|
*/ |
|
public function getClient() |
|
{ |
|
if ($this->app_id == null) { |
|
throw new \InvalidArgumentException('支付宝小程序 appid 为空,请检查是否配置支付宝小程序'); |
|
} |
|
try { |
|
$kp = AlipayKeyPair::create($this->app_private_key, $this->alipay_public_key); |
|
} catch (AlipayException $ex) { |
|
throw new \InvalidArgumentException('支付宝小程序密钥异常,请检查是否配置支付宝小程序'); |
|
} |
|
$requester = new AlipayCurlRequester([ |
|
CURLOPT_CONNECTTIMEOUT => 5, |
|
CURLOPT_TIMEOUT => 10, |
|
]); |
|
return new \Alipay\AopClient($this->app_id, $kp, null, $requester); |
|
} |
|
|
|
private function pregReplaceAll($find, $replacement, $s) |
|
{ |
|
while (preg_match($find, $s)) { |
|
$s = preg_replace($find, $replacement, $s); |
|
} |
|
return $s; |
|
} |
|
}
|
|
|