docs: 使用 vitepress && 迁移至主库 (#650)

This commit is contained in:
yansongda 2022-08-22 15:22:34 +08:00 committed by GitHub
parent 8d4be495df
commit eba51880c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
85 changed files with 6285 additions and 3 deletions

3
.gitattributes vendored
View File

@ -1,6 +1,7 @@
/tests export-ignore
/.github export-ignore
/.phpunit.cache
/.phpunit.cache export-ignore
/docs export-ignore
.gitattributes export-ignore
.gitignore export-ignore
phpunit.php export-ignore

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) yansongda <me@yansongda.cn>
Copyright (c) 2017 yansongda <me@yansongda.cn>
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
@ -17,4 +17,4 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

3
web/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
node_modules/
.vitepress/dist/
yarn-error.log

29
web/.vitepress/config.ts Normal file
View File

@ -0,0 +1,29 @@
import { defineConfig } from 'vitepress';
import nav from './nav';
import sidebar from "./sidebar";
export default defineConfig({
lang: 'zh-CN',
title: 'Pay',
description: '让支付开发更简单',
lastUpdated: true,
head: [
['link', { rel: 'icon', href: '/images/icon.png' }]
],
themeConfig: {
logo: '/images/logo2.png',
nav: nav,
sidebar: sidebar,
socialLinks: [
{ icon: 'github', link: 'https://github.com/yansongda/pay' },
],
editLink: {
pattern: 'https://github.com/yansongda/pay/edit/master/web/:path',
text: 'Edit this page on GitHub'
},
footer: {
message: 'Released under the MIT License.',
copyright: 'Copyright © 2017-present yansongda'
}
}
})

26
web/.vitepress/nav.ts Normal file
View File

@ -0,0 +1,26 @@
export default [
{ text: 'Home', link: '/' },
{
text: '版本',
items: [
{
text: '停止维护',
items: [
{ text: 'v1.x', link: '/docs/v1/', activeMatch: '^/docs/v1/' }
]
},
{
text: '安全支持',
items: [
{ text: 'v2.x', link: '/docs/v2/', activeMatch: '^/docs/v2/' }
]
},
{
text: '积极开发中',
items: [
{ text: 'v3.x', link: '/docs/v3/', activeMatch: '^/docs/v3/' }
]
}
]
}
]

15
web/.vitepress/sidebar.ts Normal file
View File

@ -0,0 +1,15 @@
// @ts-ignore
import path from 'path'
import versions from "./versions";
let sidebars = versions.reduce(
(sidebars, version) => ({
...sidebars,
[`/docs/${version}/`]: require(path.join(
__dirname, `../docs/${version}/sidebar`
))
}),
{}
);
export default sidebars;

View File

@ -0,0 +1,79 @@
<template>
<div class="authorize">
<div class="container">
<h2>授权</h2>
<h3>类库</h3>
<p>
<a href="https://github.com/yansongda/pay">yansongda/pay</a> 项目采用 MIT 协议开源发布任何人均可在遵循 MIT 协议的情况下随意使用
</p>
<h3>文档</h3>
<p>
网站 <a href="https://pay.yansongda.cn">pay.yansongda.cn</a>包括但不限于 `pay.yansongda.cn` 域名下所有文字图片 <a href="https://creativecommons.org/licenses/by/4.0/deed.zh">CC BY SA 4.0 国际许可协议</a>授权
</p>
</div>
</div>
</template>
<script>
export default {
name: "HomeAuthorize"
}
</script>
<style lang="scss" scoped>
@media (min-width: 640px) {
.authorize {
padding: 0 48px;
}
}
@media (min-width: 960px) {
.authorize {
padding: 0 64px;
}
}
.authorize {
margin-top: 50px;
padding: 0 24px;
}
.container {
max-width: 1152px;
margin: 0 auto;
p {
display: block;
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0;
margin-inline-end: 0;
}
a {
font-weight: 500;
color: #3eaf7c;
text-decoration: none;
overflow-wrap: break-word;
}
h1, h2, h3, h4, h5, h6 {
font-weight: 600;
line-height: 1.25;
}
h2 {
font-size: 1.65rem;
padding-bottom: .3rem;
border-bottom: 1px solid #eaecef;
}
h3 {
font-size: 1.35rem;
display: block;
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0;
margin-inline-end: 0;
}
}
</style>

View File

@ -0,0 +1,61 @@
<template>
<div class="home">
<div class="container">
<img src="/images/logo.png" alt="pay logo">
<p class="action">
<a href="/docs/v3/" class="action-button primary">快速上手-></a>
</p>
</div>
</div>
</template>
<script>
export default {
name: "HomePrimary"
}
</script>
<style lang="scss" scoped>
@media (min-width: 640px) {
.home {
padding: 0 48px;
}
}
@media (min-width: 960px) {
.home {
padding: 0 64px;
}
}
.home {
margin-bottom: 50px;
padding: 0 24px;
}
.container {
max-width: 1152px;
text-align: center;
margin: 0 auto;
img {
display: inline-block;
}
.action .action-button {
display: inline-block;
font-size: 1.2rem;
padding: .8rem 1.6rem;
border-width: 2px;
border-style: solid;
border-radius: 4px;
transition: background-color var(--t-color);
box-sizing: border-box;
&.primary {
color: #fff;
background-color: #3eaf7c;
border-color: #3eaf7c;
}
}
}
</style>

View File

@ -0,0 +1,14 @@
import { h } from 'vue'
import DefaultTheme from 'vitepress/theme'
import HomePrimary from './components/HomePrimary.vue'
import HomeAuthorize from './components/HomeAuthorize.vue'
export default {
...DefaultTheme,
Layout() {
return h(DefaultTheme.Layout, null, {
'home-hero-before': () => h(HomePrimary),
'home-features-after': () => h(HomeAuthorize)
})
}
}

View File

@ -0,0 +1 @@
export default ['v3', 'v2', 'v1'];

967
web/docs/v1/index.md Normal file
View File

@ -0,0 +1,967 @@
# v1 版本
**注意v1.x 版本已 EOF请大家尽快迁移到 v3 版本!**
开发了多次支付宝与微信支付后,很自然产生一种反感,惰性又来了,想在网上找相关的轮子,可是一直没有找到一款自己觉得逞心如意的,要么使用起来太难理解,要么文件结构太杂乱,只有自己撸起袖子干了。
**说明,请先熟悉支付宝说明文档!!**
欢迎 Star欢迎 PR
laravel 扩展包请 [https://github.com/yansongda/laravel-pay](https://github.com/yansongda/laravel-pay)
## 特点
- 命名不那么乱七八糟
- 隐藏开发者不需要关注的细节
- 根据支付宝、微信最新 API 开发而成
- 高度抽象的类免去各种拼json与xml的痛苦
- 符合 PSR 标准,你可以各种方便的与你的框架集成
- 文件结构清晰易理解,可以随心所欲添加本项目中没有的支付网关
- 方法使用更优雅,不必再去研究那些奇怪的的方法名或者类名是做啥用的
## 运行环境
- PHP 5.6+
- composer
## 支持的支付网关
由于各支付网关参差不齐,所以我们抽象了两个方法 `driver()``gateway()`。
两个方法的作用如下:
`driver()` 确定支付平台,如 `alipay`,`wechat`;
`gateway()` 确定支付网关。通过此方法,确定支付平台下的支付网关。例如,支付宝下有 「电脑网站支付」「手机网站支付」「APP 支付」三种支付网关,通过传入 `web`,`wap`,`app` 确定。
详细思路可以查看源代码。
### 1、支付宝
- 电脑支付
- 手机网站支付
- APP 支付
- 刷卡支付
- 扫码支付
SDK 中对应的 driver 和 gateway 如下表所示:
| driver | gateway | 描述 |
| :----: | :-----: | :-------: |
| alipay | web | 电脑支付 |
| alipay | wap | 手机网站支付 |
| alipay | app | APP 支付 |
| alipay | pos | 刷卡支付 |
| alipay | scan | 扫码支付 |
| alipay | transfer | 帐户转账(可用于平台用户提现) |
### 2、微信
- 公众号支付
- 小程序支付
- H5 支付
- 扫码支付
- 刷卡支付
- APP 支付
SDK 中对应的 driver 和 gateway 如下表所示:
| driver | gateway | 描述 |
| :----: | :-----: | :-------: |
| wechat | mp | 公众号支付 |
| wechat | miniapp | 小程序支付 |
| wechat | wap | H5 支付 |
| wechat | scan | 扫码支付 |
| wechat | pos | 刷卡支付 |
| wechat | app | APP 支付 |
| wechat | transfer | 企业付款 |
## 支持的方法
所有网关均支持以下方法
- pay(array $config_biz)
说明:支付接口
参数:数组类型,订单业务配置项,包含 订单号,订单金额等
返回mixed 详情请看「支付网关配置说明与返回值」一节。
- refund(array|string $config_biz, $refund_amount = null)
说明:退款接口
参数:`$config_biz` 为字符串类型仅对`支付宝支付`有效,此时代表订单号,第二个参数为退款金额。
返回mixed 退款成功,返回 服务器返回的数组;否则返回 false
- close(array|string $config_biz)
说明:关闭订单接口
参数:`$config_biz` 为字符串类型时代表订单号,如果为数组,则为关闭订单业务配置项,配置项内容请参考各个支付网关官方文档。
返回mixed 关闭订单成功,返回 服务器返回的数组;否则返回 false
- find(string $out_trade_no)
说明:查找订单接口
参数:`$out_trade_no` 为订单号。
返回mixed 查找订单成功,返回 服务器返回的数组;否则返回 false
- verify($data, $sign = null)
说明:验证服务器返回消息是否合法
参数:`$data` 为服务器接收到的原始内容,`$sign` 为签名信息,当其为空时,系统将自动转化 `$data` 为数组,然后取 `$data['sign']`
返回mixed 验证成功,返回 服务器返回的数组;否则返回 false
## 安装
```shell
composer require "yansongda/pay:^1.0"
```
## 使用说明
### 0、一个完整的例子:
```php
<?php
namespace App\Http\Controllers;
use Yansongda\Pay\Pay;
use Illuminate\Http\Request;
class PayController extends Controller
{
protected $config = [
'alipay' => [
'app_id' => '2016082000295641',
'notify_url' => 'http://yansongda.cn/alipay_notify.php',
'return_url' => 'http://yansongda.cn/return.php',
'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB',
'private_key' => 'MIIEpAIBAAKCAQEAs6+F2leOgOrvj9jTeDhb5q46GewOjqLBlGSs/bVL4Z3fMr3p+Q1Tux/6uogeVi/eHd84xvQdfpZ87A1SfoWnEGH5z15yorccxSOwWUI+q8gz51IWqjgZxhWKe31BxNZ+prnQpyeMBtE25fXp5nQZ/pftgePyUUvUZRcAUisswntobDQKbwx28VCXw5XB2A+lvYEvxmMv/QexYjwKK4M54j435TuC3UctZbnuynSPpOmCu45ZhEYXd4YMsGMdZE5/077ZU1aU7wx/gk07PiHImEOCDkzqsFo0Buc/knGcdOiUDvm2hn2y1XvwjyFOThsqCsQYi4JmwZdRa8kvOf57nwIDAQABAoIBAQCw5QCqln4VTrTvcW+msB1ReX57nJgsNfDLbV2dG8mLYQemBa9833DqDK6iynTLNq69y88ylose33o2TVtEccGp8Dqluv6yUAED14G6LexS43KtrXPgugAtsXE253ZDGUNwUggnN1i0MW2RcMqHdQ9ORDWvJUCeZj/AEafgPN8AyiLrZeL07jJz/uaRfAuNqkImCVIarKUX3HBCjl9TpuoMjcMhz/MsOmQ0agtCatO1eoH1sqv5Odvxb1i59c8Hvq/mGEXyRuoiDo05SE6IyXYXr84/Nf2xvVNHNQA6kTckj8shSi+HGM4mO1Y4Pbb7XcnxNkT0Inn6oJMSiy56P+CpAoGBAO1O+5FE1ZuVGuLb48cY+0lHCD+nhSBd66B5FrxgPYCkFOQWR7pWyfNDBlmO3SSooQ8TQXA25blrkDxzOAEGX57EPiipXr/hy5e+WNoukpy09rsO1TMsvC+v0FXLvZ+TIAkqfnYBgaT56ku7yZ8aFGMwdCPL7WJYAwUIcZX8wZ3dAoGBAMHWplAqhe4bfkGOEEpfs6VvEQxCqYMYVyR65K0rI1LiDZn6Ij8fdVtwMjGKFSZZTspmsqnbbuCE/VTyDzF4NpAxdm3cBtZACv1Lpu2Om+aTzhK2PI6WTDVTKAJBYegXaahBCqVbSxieR62IWtmOMjggTtAKWZ1P5LQcRwdkaB2rAoGAWnAPT318Kp7YcDx8whOzMGnxqtCc24jvk2iSUZgb2Dqv+3zCOTF6JUsV0Guxu5bISoZ8GdfSFKf5gBAo97sGFeuUBMsHYPkcLehM1FmLZk1Q+ljcx3P1A/ds3kWXLolTXCrlpvNMBSN5NwOKAyhdPK/qkvnUrfX8sJ5XK2H4J8ECgYAGIZ0HIiE0Y+g9eJnpUFelXvsCEUW9YNK4065SD/BBGedmPHRC3OLgbo8X5A9BNEf6vP7fwpIiRfKhcjqqzOuk6fueA/yvYD04v+Da2MzzoS8+hkcqF3T3pta4I4tORRdRfCUzD80zTSZlRc/h286Y2eTETd+By1onnFFe2X01mwKBgQDaxo4PBcLL2OyVT5DoXiIdTCJ8KNZL9+kV1aiBuOWxnRgkDjPngslzNa1bK+klGgJNYDbQqohKNn1HeFX3mYNfCUpuSnD2Yag53Dd/1DLO+NxzwvTu4D6DCUnMMMBVaF42ig31Bs0jI3JQZVqeeFzSET8fkoFopJf3G6UXlrIEAQ==',
],
];
public function index()
{
$config_biz = [
'out_trade_no' => time(),
'total_amount' => '1',
'subject' => 'test subject',
];
$pay = new Pay($this->config);
return $pay->driver('alipay')->gateway()->pay($config_biz);
}
public function return(Request $request)
{
$pay = new Pay($this->config);
return $pay->driver('alipay')->gateway()->verify($request->all());
}
public function notify(Request $request)
{
$pay = new Pay($this->config);
if ($pay->driver('alipay')->gateway()->verify($request->all())) {
// 请自行对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号
// 2、判断total_amount是否确实为该订单的实际金额即商户订单创建时的金额
// 3、校验通知中的seller_id或者seller_email) 是否为out_trade_no这笔单据的对应的操作方有的时候一个商户可能有多个seller_id/seller_email
// 4、验证app_id是否为该商户本身。
// 5、其它业务逻辑情况
file_put_contents(storage_path('notify.txt'), "收到来自支付宝的异步通知\r\n", FILE_APPEND);
file_put_contents(storage_path('notify.txt'), '订单号:' . $request->out_trade_no . "\r\n", FILE_APPEND);
file_put_contents(storage_path('notify.txt'), '订单金额:' . $request->total_amount . "\r\n\r\n", FILE_APPEND);
} else {
file_put_contents(storage_path('notify.txt'), "收到异步通知\r\n", FILE_APPEND);
}
echo "success";
}
}
```
```php
<?php
namespace App\Http\Controllers;
use Yansongda\Pay\Pay;
use Illuminate\Http\Request;
class PayController extends Controller
{
protected $config = [
'wechat' => [
'app_id' => 'wxb3f6xxxxxxxxxx',
'mch_id' => '1457xxxxx2',
'notify_url' => 'http://yansongda.cn/wechat_notify.php',
'key' => 'mF2suE9sU6Mk1Cxxxxxxxxxx45',
'cert_client' => './apiclient_cert.pem',
'cert_key' => './apiclient_key.pem',
],
];
public function index()
{
$config_biz = [
'out_trade_no' => 'e2',
'total_fee' => '1', // **单位:分**
'body' => 'test body',
'spbill_create_ip' => '8.8.8.8',
'openid' => 'onkVf1FjWS5SBIihS-123456_abc',
];
$pay = new Pay($this->config);
return $pay->driver('wechat')->gateway('mp')->pay($config_biz);
}
public function notify(Request $request)
{
$pay = new Pay($this->config);
$verify = $pay->driver('wechat')->gateway('mp')->verify($request->getContent());
if ($verify) {
file_put_contents('notify.txt', "收到来自微信的异步通知\r\n", FILE_APPEND);
file_put_contents('notify.txt', '订单号:' . $verify['out_trade_no'] . "\r\n", FILE_APPEND);
file_put_contents('notify.txt', '订单金额:' . $verify['total_fee'] . "\r\n\r\n", FILE_APPEND);
} else {
file_put_contents(storage_path('notify.txt'), "收到异步通知\r\n", FILE_APPEND);
}
echo "success";
}
}
```
### 1、准备配置参数
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
],
];
$config_biz = [
'out_trade_no' => '12', // 订单号
'total_amount' => '13', // 订单金额,单位:元,**微信支付,单位:分**
'subject' => 'test subject', // 订单商品标题
];
```
### 2、在代码中使用
```php
<?php
$pay = new Pay($config);
return $pay->driver('alipay')->gateway('web')->pay($config_biz);
```
## 错误
使用非跳转接口(如, `refund` 接口,`close` 接口)时,如果在调用相关支付网关 API 时有错误产生,会抛出 `GatewayException` 错误,可以通过 `$e->getMessage()` 查看,同时,也可通过 `$e->raw` 查看调用 API 后返回的原始数据,该值为数组格式。
## 支付网关配置说明与返回值
由于支付网关不同,每家参数参差不齐,为了方便,我们抽象定义了两个参数:`$config`,`$config_biz`,分别为全局参数,业务参数。但是,所有配置参数均为官方标准参数,无任何差别。
「业务参数」为订单相关的参数,「全局参数」为除订单相关参数以外的全局性参数。
具体参数列表请查看每个支付网关的使用说明。
### 1、支付宝 - 电脑网站支付
#### 最小配置参数
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
],
];
$config_biz = [
'out_trade_no' => '12', // 订单号
'total_amount' => '13', // 订单金额,单位:元
'subject' => 'test subject', // 订单商品标题
];
```
#### 所有配置参数
所有参数均为官方标准参数,无任何差别。[点击这里](https://docs.open.alipay.com/common/105901 '支付宝官方文档') 查看官方文档。
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
'return_url' => '', // 同步通知 url*强烈建议加上本参数*
'notify_url' => '', // 异步通知 url*强烈建议加上本参数*
],
];
$config_biz = [
'out_trade_no' => '',
'total_amount' => '',
'subject' => '',
// 订单描述
'body' => '',
// 订单包含的商品列表信息Json格式 {"show_url":"https://或http://打头的商品的展示地址"} ,在支付时,可点击商品名称跳转到该地址
'goods_detail' => '',
// 该笔订单允许的最晚付款时间逾期将关闭交易。取值范围1m15d。m-分钟h-小时d-天1c-当天1c-当天的情况下无论交易何时创建都在0点关闭。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。该参数在请求到支付宝时开始计时。
'timeout_express' => '',
// 禁用渠道,用户不可用指定渠道支付当有多个渠道时用“,”分隔注与enable_pay_channels互斥
'disable_pay_channels' => '',
// 可用渠道,用户只能在指定渠道范围内支付当有多个渠道时用“,”分隔注与disable_pay_channels互斥
'enable_pay_channels' => '',
// 公用回传参数如果请求时传递了该参数则返回给商户时会回传该参数。支付宝只会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝
'passback_params' => '',
// 业务扩展参数,详见 [业务扩展参数说明](https://docs.open.alipay.com/#kzcs)
'extend_params' => '',
// 商品主类型0—虚拟类商品1—实物类商品默认虚拟类商品不支持使用花呗渠道
'goods_type' => '',
// 获取用户授权信息,可实现如免登功能。获取方法请查阅:用户信息授权
'auth_token' => '',
/**
* PC扫码支付的方式支持前置模式和跳转模式。
*
* 前置模式是将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以iframe方式请求支付宝页面。具体分为以下几种
* 0订单码-简约前置模式对应iframe宽度不能小于600px高度不能小于300px
* 1订单码-前置模式对应iframe宽度不能小于300px高度不能小于600px
* 3订单码-迷你前置模式对应iframe宽度不能小于75px高度不能小于75px
* 4订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小。
*
* 跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。
* 2订单码-跳转模式
*/
'qr_pay_mode' => '',
// 商户自定义二维码宽度 注qr_pay_mode=4时该参数生效
'qrcode_width' => ''
];
```
#### 返回值
- pay()
类型string
说明:该接口返回跳转到支付宝支付的 Html 代码。
### 2、支付宝 - 手机网站支付
#### 最小配置参数
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
],
];
$config_biz = [
'out_trade_no' => '12', // 订单号
'total_amount' => '13', // 订单金额,单位:元
'subject' => 'test subject', // 订单商品标题
];
```
#### 所有配置参数
该网关大部分参数和 「电脑支付」 相同,具体请参考 [官方文档](https://docs.open.alipay.com/203/107090/ '支付宝手机网站支付文档')
#### 返回值
- pay()
类型string
说明:该接口返回跳转到支付宝支付的 Html 代码。
### 3、支付宝 - APP 支付
#### 最小配置参数
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'notify_url' => '', // 支付宝异步通知地址
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
],
];
$config_biz = [
'out_trade_no' => '12', // 订单号
'total_amount' => '13', // 订单金额,单位:元
'subject' => 'test subject', // 订单商品标题
];
```
#### 所有配置参数
该网关大部分参数和 「电脑支付」 相同,具体请参考 [官方文档](https://docs.open.alipay.com/204/105465/ '支付宝APP支付文档')
#### 返回值
- pay()
类型string
说明:该接口返回用于客户端调用的 orderString 字符串,可直接供 APP 客户端调用,客户端调用方法不在此文档讨论范围内,[Android 用户请看这里](https://docs.open.alipay.com/204/105300/)[Ios 用户请看这里](https://docs.open.alipay.com/204/105299/)。
### 4、支付宝 - 刷卡支付
#### 最小配置参数
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
],
];
$config_biz = [
'out_trade_no' => '12', // 订单号
'total_amount' => '13', // 订单金额,单位:元
'subject' => 'test subject', // 订单商品标题
'auth_code' => '123456', // 授权码
];
```
#### 所有配置参数
该网关大部分参数和 「电脑支付」 相同,具体请参考 [官方文档](https://docs.open.alipay.com/api_1/alipay.trade.pay ' 支付宝APP支付文档')
#### 返回值
- pay()
类型array|bool
说明:该接口成功时返回服务器响应的数组;验签失败返回 false。
### 5、支付宝 - 扫码支付
#### 最小配置参数
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'notify_url' => '', // 支付宝异步通知地址
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
],
];
$config_biz = [
'out_trade_no' => '12', // 订单号
'total_amount' => '13', // 订单金额,单位:元
'subject' => 'test subject', // 订单商品标题
];
```
#### 所有配置参数
该网关大部分参数和 「电脑支付」 相同,具体请参考 [官方文档](https://docs.open.alipay.com/api_1/alipay.trade.precreate ' 支付宝APP支付文档')
#### 返回值
- pay()
类型string
说明:该接口返回二维码链接,可以通过其他库转换为二维码供用户扫描。
### 6、支付宝 - 帐户转账
#### 最小配置参数
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
],
];
$config_biz = [
'out_biz_no' => '', // 订单号
'payee_type' => 'ALIPAY_LOGONID', // 收款方账户类型(ALIPAY_LOGONID | ALIPAY_USERID)
'payee_account' => 'demo@sandbox.com', // 收款方账户
'amount' => '10', // 转账金额
];
```
#### 所有配置参数
```php
<?php
$config = [
'alipay' => [
'app_id' => '', // 支付宝提供的 APP_ID
'ali_public_key' => '', // 支付宝公钥1行填写
'private_key' => '', // 自己的私钥1行填写
],
];
$config_biz = [
'out_biz_no' => '', // 订单号
'payee_type' => 'ALIPAY_LOGONID', // 收款方账户类型(ALIPAY_LOGONID | ALIPAY_USERID)
'payee_account' => 'demo@sandbox.com', // 收款方账户
'amount' => '10', // 转账金额
'payer_show_name' => '未寒', // 付款方姓名
'payee_real_name' => '张三', // 收款方真实姓名
'remark' => '张三', // 转账备注
];
```
[官方文档](https://doc.open.alipay.com/docs/api.htm?apiId=1321&docType=4 ' 单笔转账到支付宝账户接口')
#### 返回值
- pay()
类型array|bool
说明:该接口成功时返回服务器响应的数组;验签失败返回 false。
### 7、微信 - 公众号支付
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'app_id' => '', // 公众号APPID
'mch_id' => '', // 微信商户号
'notify_url' => '',
'key' => '', // 微信支付签名秘钥
'cert_client' => './apiclient_cert.pem', // 客户端证书路径,退款时需要用到
'cert_key' => './apiclient_key.pem', // 客户端秘钥路径,退款时需要用到
],
];
$config_biz = [
'out_trade_no' => '', // 订单号
'total_fee' => '', // 订单金额,**单位:分**
'body' => '', // 订单描述
'spbill_create_ip' => '', // 支付人的 IP
'openid' => '', // 支付人的 openID
];
```
#### 所有配置参数
所有参数均为官方标准参数,无任何差别。[点击这里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 '微信支付官方文档') 查看官方文档。
```php
<?php
$config = [
'wechat' => [
'endpoint_url' => 'https://apihk.mch.weixin.qq.com/', // optional, default 'https://api.mch.weixin.qq.com/'
'app_id' => '', // 公众号APPID
'mch_id' => '', // 微信商户号
'notify_url' => '',
'key' => '', // 微信支付签名秘钥
'cert_client' => './apiclient_cert.pem', // 客户端证书路径,退款时需要用到
'cert_key' => './apiclient_key.pem', // 客户端秘钥路径,退款时需要用到
],
];
$config_biz = [
'out_trade_no' => '', // 订单号
'total_fee' => '', // 订单金额,**单位:分**
'body' => '', // 订单描述
'spbill_create_ip' => '', // 支付人的 IP
'openid' => '', // 支付人的 openID
// 自定义参数,可以为终端设备号(门店号或收银设备ID)PC网页或公众号内支付可以传"WEB"
'device_info' => '',
// 商品详细描述,对于使用单品优惠的商户,改字段必须按照规范上传,详见“单品优惠参数说明”
'detail' => '',
// 附加数据在查询API和支付通知中原样返回可作为自定义参数使用。
'attach' => '',
// 符合ISO 4217标准的三位字母代码默认人民币CNY详细列表请参见货币类型
'fee_type' => '',
// 订单生成时间格式为yyyyMMddHHmmss如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
'time_start' => '',
// 订单失效时间格式为yyyyMMddHHmmss如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则注意最短失效时间间隔必须大于5分钟
'time_expire' => '',
// 订单优惠标记,使用代金券或立减优惠功能时需要的参数,说明详见代金券或立减优惠
'goods_tag' => '',
// trade_type=NATIVE时即扫码支付此参数必传。此参数为二维码中包含的商品ID商户自行定义。
'product_id' => '',
// 上传此参数no_credit--可限制用户不能使用信用卡支付
'limit_pay' => '',
// 该字段用于上报场景信息目前支持上报实际门店信息。该字段为JSON对象数据对象格式为{"store_info":{"id": "门店ID","name": "名称","area_code": "编码","address": "地址" }} ,字段详细说明请点击行前的+展开
'scene_info' => '',
];
```
#### 返回值
- pay()
类型array
说明:返回用于 微信内H5调起支付 的所需参数数组。后续调用不在本文档讨论范围内,具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)。
后续调用举例:
```html
<script type="text/javascript">
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"<?php echo $pay['appId']; ?>", //公众号名称,由商户传入
"timeStamp":"<?php echo $pay['timeStamp']; ?>", //时间戳自1970年以来的秒数
"nonceStr":"<?php echo $pay['nonceStr']; ?>", //随机串
"package":"<?php echo $pay['package']; ?>",
"signType":"<?php echo $pay['signType']; ?>", //微信签名方式:
"paySign":"<?php echo $pay['paySign']; ?>" //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示res.err_msg将在用户支付成功后返回 ok但并不保证它绝对可靠。
}
);
}
$(function(){
$('#pay').click(function(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
})
});
</script>
```
### 8、微信 - 小程序支付
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'miniapp_id' => '', // 小程序APPID
'mch_id' => '', // 微信商户号
'notify_url' => '',
'key' => '', // 微信支付签名秘钥
'cert_client' => './apiclient_cert.pem', // 客户端证书路径,退款时需要用到
'cert_key' => './apiclient_key.pem', // 客户端秘钥路径,退款时需要用到
],
];
$config_biz = [
'out_trade_no' => '', // 订单号
'total_fee' => '', // 订单金额,**单位:分**
'body' => '', // 订单描述
'spbill_create_ip' => '', // 支付人的 IP
'openid' => '', // 支付人的 openID
];
```
#### 所有配置参数
由于「小程序支付」和「公众号支付」都使用的是 JSAPI所以除了 APPID 一个使用的是公众号的 APPID 一个使用的是 小程序的 APPID 以外,该网关所有参数和 「公众号支付」 相同,具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1)。
#### 返回值
- pay()
类型array
说明:返回用于 小程序调起支付API 的所需参数数组。后续调用不在本文档讨论范围内,具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3)。
### 9、微信 - H5 支付
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'app_id' => '', // 微信公众号 APPID
'mch_id' => '', // 微信商户号
'return_url' => '', // *此配置选项可选*,注意,该跳转 URL 只有跳转之意,没有同步通知功能
'notify_url' => '',
'key' => '', // 微信支付签名秘钥
'cert_client' => './apiclient_cert.pem', // 客户端证书路径,退款时需要用到
'cert_key' => './apiclient_key.pem', // 客户端秘钥路径,退款时需要用到
],
];
$config_biz = [
'out_trade_no' => '', // 订单号
'total_fee' => '', // 订单金额,**单位:分**
'body' => '', // 订单描述
'spbill_create_ip' => '', // 支付人的 IP
];
```
#### 所有配置参数
所有配置项和前面支付网关相差不大,请[点击这里查看](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1).
#### 返回值
- pay()
类型string
说明:返回微信支付中间页网址,可直接 302 跳转。
### 10、微信 - 扫码支付
这里使用「模式二」进行扫码支付,具体请[参考这里](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5)
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'app_id' => '', // 微信公众号 APPID
'mch_id' => '', // 微信商户号
'notify_url' => '',
'key' => '', // 微信支付签名秘钥
'cert_client' => './apiclient_cert.pem', // 客户端证书路径,退款时需要用到
'cert_key' => './apiclient_key.pem', // 客户端秘钥路径,退款时需要用到
],
];
$config_biz = [
'out_trade_no' => '', // 订单号
'total_fee' => '', // 订单金额,**单位:分**
'body' => '', // 订单描述
'spbill_create_ip' => '', // 调用 API 服务器的 IP
'product_id' => '', // 订单商品 ID
];
```
#### 所有配置参数
所有配置项和前面支付网关相差不大,请[点击这里查看](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1)
#### 返回值
- pay()
类型string
说明:返回微信支付二维码 URL 地址,可直接将此 url 生成二维码,展示给用户进行扫码支付。
### 11、微信 - 刷卡支付
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'app_id' => '', // 公众号 APPID
'mch_id' => '', // 微信商户号
'key' => '', // 微信支付签名秘钥
'cert_client' => './apiclient_cert.pem', // 客户端证书路径,退款时需要用到
'cert_key' => './apiclient_key.pem', // 客户端秘钥路径,退款时需要用到
],
];
$config_biz = [
'out_trade_no' => '', // 订单号
'total_fee' => '', // 订单金额,**单位:分**
'body' => '', // 订单描述
'spbill_create_ip' => '', // 支付人的 IP
'auth_code' => '', // 授权码
];
```
#### 所有配置参数
该网关所有参数和其它支付网关基本相同,具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1)。
#### 返回值
- pay()
类型array
说明:返回用于服务器返回的数组。返回参数请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1)。
### 12、微信 - APP 支付
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'appid' => '', // APPID
'mch_id' => '', // 微信商户号
'notify_url' => '',
'key' => '', // 微信支付签名秘钥
'cert_client' => './apiclient_cert.pem', // 客户端证书路径,退款时需要用到
'cert_key' => './apiclient_key.pem', // 客户端秘钥路径,退款时需要用到
],
];
$config_biz = [
'out_trade_no' => '', // 订单号
'total_fee' => '', // 订单金额,**单位:分**
'body' => '', // 订单描述
'spbill_create_ip' => '', // 支付人的 IP
];
```
#### 所有配置参数
该网关所有参数和其它支付网关相同相同,具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)。
#### 返回值
- pay()
类型array
说明:返回用于 小程序调起支付API 的所需参数数组。后续调用不在本文档讨论范围内,具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)。
### 12、微信 - 企业付款
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'appid' => '', // APPID
'mch_id' => '', // 微信商户号
'key' => '', // 微信支付签名秘钥
'cert_client' => './apiclient_cert.pem', // 客户端证书路径,退款时需要用到
'cert_key' => './apiclient_key.pem', // 客户端秘钥路径,退款时需要用到
],
];
$config_biz = [
'partner_trade_no' => '', //商户订单号
'openid' => '', //收款人的openid
'check_name' => 'NO_CHECK', //NO_CHECK不校验真实姓名\FORCE_CHECK强校验真实姓名
// 're_user_name'=>'张三', //check_name为 FORCE_CHECK 校验实名的时候必须提交
'amount' => 100, //企业付款金额,单位为分
'desc' => '帐户提现', //付款说明
'spbill_create_ip' => '192.168.0.1', //发起交易的IP地址
];
```
#### 所有配置参数
具体请看 [官方文档](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。
#### 返回值
- pay()
类型array
说明:返回用于 支付结果 的数组。具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。
### 13、微信 - 发放裂变红包
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'app_id'=>'wxaxxxxxxxx',
'mch_id' => '1442222202',
'key' => 'ddddddddddddddd',
'cert_client' => 'D:\php\xxx\application\wxpay\cert\apiclient_cert.pem',
'cert_key' => 'D:\php\xxx\application\wxpay\cert\apiclient_key.pem',
],
];
$config_biz = [
'wxappid'=>'wxaxxxxxxxx',
'mch_billno' => 'hb'.time(),
'send_name'=>'萌点云科技',//商户名称
're_openid'=>'ogg5JwsssssssssssCdXeD_S54',//用户openid
'total_amount' =>333, // 付款金额,单位分
'wishing'=>'提前祝你狗年大吉',//红包祝福语
'client_ip'=>'192.168.0.1',//调用接口的机器Ip地址
'total_num'=>'3',//红包发放总人数
'act_name'=>'提前拜年',//活动名称
'remark'=>'提前祝你狗年大吉,苟富贵勿相忘!', //备注
'amt_type'=>'ALL_RAND',//ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额
];
$pay = new Pay($config);
try
{
$res= $pay->driver('wechat')->gateway('groupredpack')->pay($config_biz);
}catch (Exception $e){
}
```
#### 所有配置参数
具体请看 [官方文档](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4)。
#### 返回值
- pay()
类型array
说明:返回用于 支付结果 的数组。具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4)。
### 14、微信 - 发放普通红包
#### 最小配置参数
```php
<?php
$config = [
'wechat' => [
'app_id'=>'wxaxxxxxxxx',
'mch_id' => '1442222202',
'key' => 'ddddddddddddddd',
'cert_client' => 'D:\php\xxx\application\wxpay\cert\apiclient_cert.pem',
'cert_key' => 'D:\php\xxx\application\wxpay\cert\apiclient_key.pem',
],
];
$config_biz = [
'wxappid'=>'wxaxxxxxxxx',
'mch_billno' => 'hb'.time(),
'send_name'=>'萌点云科技',//商户名称
're_openid'=>'ogg5JwsssssssssssCdXeD_S54',//用户openid
'total_amount' =>100, // 付款金额,单位分
'wishing'=>'提前祝你狗年大吉',//红包祝福语
'client_ip'=>'192.168.0.1',//调用接口的机器Ip地址
'total_num'=>'1',//红包发放总人数
'act_name'=>'提前拜年',//活动名称
'remark'=>'提前祝你狗年大吉,苟富贵勿相忘!', //备注
];
$pay = new Pay($config);
try
{
$res= $pay->driver('wechat')->gateway('redpack')->pay($config_biz);
}catch (Exception $e){
}
```
#### 所有配置参数
具体请看 [官方文档](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3)。
#### 返回值
- pay()
类型array
说明:返回用于 支付结果 的数组。具体请 [参考这里](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3)。
## 代码贡献
由于测试及使用环境的限制,本项目中只开发了「支付宝」和「微信支付」的相关支付网关。
如果您有其它支付网关的需求,或者发现本项目中需要改进的代码,**_欢迎 Fork 并提交 PR_**
## LICENSE
MIT

1
web/docs/v1/sidebar.js Normal file
View File

@ -0,0 +1 @@
exports = module.exports = []

View File

@ -0,0 +1,25 @@
# 接收回调
| 方法名 | 参数 | 返回值 |
|:------:|:---:|:----------:|
| verify | 无 | Collection |
使用的加密方式为支付宝官方推荐的 **RSA2**,目前只支持这一种加密方式,且没有支持其他加密方式的计划。
## 例子
```php
$result = $alipay->verify();
// 是的,你没有看错,就是这么简单!
// return $alipay->success()->send(); // laravel 框架直接 return $alipay->success();
```
## 配置参数
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,25 @@
# 取消
| 方法名 | 参数 | 返回值 |
|:------:|:-------------------:|:----------:|
| cancel | string/array $order | Collection |
## 例子
```php
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $alipay->cancel($order);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_1/alipay.trade.cancel/),查看「请求参数」一栏。
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,27 @@
# 关闭
| 方法名 | 参数 | 返回值 |
|:-----:|:-------------------:|:----------:|
| close | string/array $order | Collection |
## 例子
```php
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $alipay->close($order);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_1/alipay.trade.close/),查看「请求参数」一栏。
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,27 @@
# 下载对账单
| 方法名 | 参数 | 返回值 |
|:--------:|:------------------:|:------:|
| download | string/array $bill | string |
## 例子
```php
$bill = [
'bill_date' => '2016-04-05', // 2016-04
'bill_type' => 'trade'
];
// $bill = '2016-04-05';
$url = $alipay->download($bill);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_15/alipay.data.dataservice.bill.downloadurl.query),查看「请求参数」一栏。
## 返回值
返回 string 类型。直接返回账单下载链接。

View File

@ -0,0 +1,48 @@
# 查询
| 方法名 | 参数 | 返回值 |
|:----:|:--------------------------------------:|:----------:|
| find | string/array $order, string/null $type | Collection |
## 查询普通支付订单
```php
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $alipay->find($order);
```
## 查询退款订单
```php
$order = [
'out_trade_no' => '1514027114',
'out_request_no' => '1514027114'
];
$result = $alipay->find($order, 'refund');
```
## 查询转账订单
```php
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $alipay->find($order, 'transfer');
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_1/alipay.trade.query/),查看「请求参数」一栏。
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,90 @@
# 概述
**请先熟悉 支付宝支付 开发文档!**
使用的加密方式为支付宝官方推荐的 **RSA2**,目前只支持这一种加密方式,且没有支持其他加密方式的计划。
## 快速上手
```php
use Yansongda\Pay\Pay;
$config = [
'app_id' => '2016082000295641',
'notify_url' => 'http://yansongda.cn/notify.php',
'return_url' => 'http://yansongda.cn/return.php',
'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB',
'private_key' => 'MIIEpAIBAAKCAQEAs6+F2leOgOrvj9jTeDhb5q46GewOjqLBlGSs/bVL4Z3fMr3p+Q1Tux/6uogeVi/eHd84xvQdfpZ87A1SfoWnEGH5z15yorccxSOwWUI+q8gz51IWqjgZxhWKe31BxNZ+prnQpyeMBtE25fXp5nQZ/pftgePyUUvUZRcAUisswntobDQKbwx28VCXw5XB2A+lvYEvxmMv/QexYjwKK4M54j435TuC3UctZbnuynSPpOmCu45ZhEYXd4YMsGMdZE5/077ZU1aU7wx/gk07PiHImEOCDkzqsFo0Buc/knGcdOiUDvm2hn2y1XvwjyFOThsqCsQYi4JmwZdRa8kvOf57nwIDAQABAoIBAQCw5QCqln4VTrTvcW+msB1ReX57nJgsNfDLbV2dG8mLYQemBa9833DqDK6iynTLNq69y88ylose33o2TVtEccGp8Dqluv6yUAED14G6LexS43KtrXPgugAtsXE253ZDGUNwUggnN1i0MW2RcMqHdQ9ORDWvJUCeZj/AEafgPN8AyiLrZeL07jJz/uaRfAuNqkImCVIarKUX3HBCjl9TpuoMjcMhz/MsOmQ0agtCatO1eoH1sqv5Odvxb1i59c8Hvq/mGEXyRuoiDo05SE6IyXYXr84/Nf2xvVNHNQA6kTckj8shSi+HGM4mO1Y4Pbb7XcnxNkT0Inn6oJMSiy56P+CpAoGBAO1O+5FE1ZuVGuLb48cY+0lHCD+nhSBd66B5FrxgPYCkFOQWR7pWyfNDBlmO3SSooQ8TQXA25blrkDxzOAEGX57EPiipXr/hy5e+WNoukpy09rsO1TMsvC+v0FXLvZ+TIAkqfnYBgaT56ku7yZ8aFGMwdCPL7WJYAwUIcZX8wZ3dAoGBAMHWplAqhe4bfkGOEEpfs6VvEQxCqYMYVyR65K0rI1LiDZn6Ij8fdVtwMjGKFSZZTspmsqnbbuCE/VTyDzF4NpAxdm3cBtZACv1Lpu2Om+aTzhK2PI6WTDVTKAJBYegXaahBCqVbSxieR62IWtmOMjggTtAKWZ1P5LQcRwdkaB2rAoGAWnAPT318Kp7YcDx8whOzMGnxqtCc24jvk2iSUZgb2Dqv+3zCOTF6JUsV0Guxu5bISoZ8GdfSFKf5gBAo97sGFeuUBMsHYPkcLehM1FmLZk1Q+ljcx3P1A/ds3kWXLolTXCrlpvNMBSN5NwOKAyhdPK/qkvnUrfX8sJ5XK2H4J8ECgYAGIZ0HIiE0Y+g9eJnpUFelXvsCEUW9YNK4065SD/BBGedmPHRC3OLgbo8X5A9BNEf6vP7fwpIiRfKhcjqqzOuk6fueA/yvYD04v+Da2MzzoS8+hkcqF3T3pta4I4tORRdRfCUzD80zTSZlRc/h286Y2eTETd+By1onnFFe2X01mwKBgQDaxo4PBcLL2OyVT5DoXiIdTCJ8KNZL9+kV1aiBuOWxnRgkDjPngslzNa1bK+klGgJNYDbQqohKNn1HeFX3mYNfCUpuSnD2Yag53Dd/1DLO+NxzwvTu4D6DCUnMMMBVaF42ig31Bs0jI3JQZVqeeFzSET8fkoFopJf3G6UXlrIEAQ==',
'log' => [ // optional
'file' => './logs/alipay.log',
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
// 'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
];
// 支付
$order = [
'out_trade_no' => time(),
'total_amount' => '1',
'subject' => 'test subject - 测试',
];
$alipay = Pay::alipay($config)->web($order);
return $alipay->send();// laravel 框架中请直接 `return $alipay`
// 退款
$order = [
'out_trade_no' => '1514027114',
'refund_amount' => '0.01',
];
$result = Pay::alipay($config)->refund($order); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。
// 查询
$result = Pay::alipay($config)->find('out_trade_no_123456'); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。
// 取消
$result = Pay::alipay($config)->cancel('out_trade_no_123456'); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。
// 关闭
$result = Pay::alipay($config)->close('out_trade_no_123456'); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。
// 验证服务器数据
$alipay = Pay::alipay($config)
// 是的,验签就这么简单!
$data = $alipay->verify(); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$data->xxx` 访问服务器返回的数据。
$alipay->success()->send(); // 向支付宝服务器确认接收到的数据。laravel 框架中请直接 `return $alipay->success()`
```
## 服务商模式
在原有 config 配置基础上mode 设为 `service`新增 pid 参数。具体如下:
```php
$config=[
//省略上述参数
...
'mode' => 'service',//设为service
'pid' => '2016082000295641',//这里填写支付服务商的pid信息
];
```
## 注意
后续文档中,如果没有特别说明, `$alipay` 均代表`Pay::alipay($config)`

191
web/docs/v2/alipay/pay.md Normal file
View File

@ -0,0 +1,191 @@
# 支付
支付宝支付目前支持 7 种支付方法,对应的支付 method 如下:
| method | 说明 | 参数 | 返回值 |
|:--------:|:------:|:------------:|:----------:|
| web | 电脑支付 | array $order | Response |
| wap | 手机网站支付 | array $order | Response |
| app | APP 支付 | array $order | Response |
| pos | 刷卡支付 | array $order | Collection |
| scan | 扫码支付 | array $order | Collection |
| transfer | 账户转账 | array $order | Collection |
| mini | 小程序支付 | array $order | Collection |
## 电脑支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'test subject-测试订单',
// 'http_method' => 'GET' // 如果想在 wap 支付时使用 GET 方式提交,请加上此参数。默认使用 POST 方式提交
];
return $alipay->web($order)->send(); // laravel 框架中请直接 return $alipay->web($order)
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/270/alipay.trade.page.pay),查看「请求参数」一栏。
## 手机网站支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'test subject-测试订单',
// 'http_method' => 'GET' // 如果想在 wap 支付时使用 GET 方式提交,请加上此参数。默认使用 POST 方式提交
];
return $alipay->wap($order)->send(); // laravel 框架中请直接 return $alipay->wap($order)
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/203/107090/),查看「请求参数」一栏。
## APP 支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'test subject-测试订单',
];
// 将返回字符串,供后续 APP 调用,调用方式不在本文档讨论范围内,请参考官方文档。
return $alipay->app($order)->send(); // laravel 框架中请直接 return $alipay->app($order)
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/204/105465/),查看「请求参数」一栏。
## 刷卡支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'test subject-刷卡支付',
'auth_code' => '289756915257123456',
];
$result = $alipay->pos($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_1/alipay.trade.pay),查看「请求参数」一栏。
## 扫码支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'test subject-刷卡支付',
];
$result = $alipay->scan($order);
//二维码内容: $qr = $result->qr_code;
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_1/alipay.trade.precreate),查看「请求参数」一栏。
## 账户转账
### 例子
```php
$order = [
'out_biz_no' => time(),
'trans_amount' => '0.01',
'product_code' => 'TRANS_ACCOUNT_NO_PWD',
'payee_info' => [
'identity' => 'ghdhjw7124@sandbox.com',
'identity_type' => 'ALIPAY_LOGON_ID',
],
];
$result = $alipay->transfer($order);
```
### 查询转账订单
```php
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $alipay->find($order, 'transfer');
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_28/alipay.fund.trans.uni.transfer/),查看「请求参数」一栏。
## 小程序支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'subject' => 'test subject-小程序支付',
'total_amount' => '0.01',
'buyer_id' => 2088622190161234,
];
$result = $alipay->mini($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_1/alipay.trade.create/),查看「请求参数」一栏。
小程序支付接入文档:[https://docs.alipay.com/mini/introduce/pay](https://docs.alipay.com/mini/introduce/pay)。
## 返回值
**各支付方法返回值请顶部表格**
返回只会返回两种类型 `Symfony\Component\HttpFoundation\Response``Yansongda\Supports\Collection`
* 返回 Response 类型时,可以通过 `return $response->send()` 直接进行返回laravel 框架中使用请直接`return $response`
* 返回 Collection 类型时,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,26 @@
# 退款
| 方法名 | 参数 | 返回值 |
|:------:|:------------:|:----------:|
| refund | array $order | Collection |
## 退款操作
```php
$order = [
'out_trade_no' => '1514027114',
'refund_amount' => '0.01',
];
$result = $alipay->refund($order);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_1/alipay.trade.refund),查看「请求参数」一栏。
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,23 @@
# 确认回调
| 方法名 | 参数 | 返回值 |
|:-------:|:---:|:--------:|
| success | 无 | Response |
## 例子
```php
// $result = $alipay->verify();
return $alipay->success()->send(); // laravel 框架直接 return $alipay->success();
```
## 订单配置参数
## 返回值
返回 Response 类型,可以通过`return $response->send();` 进行返回;如果在 laravel 框架中,可直接 `return $response;`

13
web/docs/v2/contribute.md Normal file
View File

@ -0,0 +1,13 @@
# 代码贡献
由于测试及使用环境的限制,本项目中只开发了「支付宝」和「微信支付」的相关支付网关。
如果您有其它支付网关的需求,或者发现本项目中需要改进的代码,**_欢迎 Fork 并提交 PR_**
## 赏一杯瑞幸吧
![pay](/images/pay.jpg)
## LICENSE
MIT

View File

@ -0,0 +1,74 @@
# 事件说明
## 支付开始
- 事件类Yansongda\Pay\Events\PayStarting::class
- 说明:此事件将在最开始进行支付时进行抛出。此时 SDK 只进行了相关初始化操作,其它所有操作均未开始。
- 额外数据:
- $driver (支付机构)
- $gateway (支付网关)
- $params (传递的原始参数)
## 支付初始化完毕
- 事件类Yansongda\Pay\Events\PayStarted
- 说明:此事件将在所有参数处理完毕时抛出。
- 额外数据:
- $driver (支付机构)
- $gateway (支付网关)
- $endpoint (支付的 url endpoint)
- $payload (数据)
## 开始调用API
- 事件类Yansongda\Pay\Events\ApiRequesting
- 说明:此事件将在请求支付方的 API 前抛出。
- 额外数据:
- $driver (支付机构)
- $gateway (支付网关)
- $endpoint (支付的 url endpoint)
- $payload (数据)
## 调用API结束
- 事件类Yansongda\Pay\Events\ApiRequested
- 说明:此事件将在请求支付方的 API 完成之后抛出。
- 额外数据:
- $driver (支付机构)
- $gateway (支付网关)
- $endpoint (支付的 url endpoint)
- $result (请求后的返回数据)
## 验签失败
- 事件类Yansongda\Pay\Events\SignFailed
- 说明:此事件将在签名验证失败时抛出。
- 额外数据:
- $driver (支付机构)
- $gateway (支付网关)
- $data (验签数据)
## 收到通知
- 事件类Yansongda\Pay\Events\RequestReceived
- 说明:此事件将在收到支付方的请求(通常在异步通知或同步通知)时抛出
- 额外数据:
- $driver (支付机构)
- $gateway (支付网关)
- $data (收到的数据)
## 调用其它方法
- 事件类Yansongda\Pay\Events\MethodCalled
- 说明:此事件将在调用除 PAYMETHOD 方法(例如,查询订单,退款,取消订单)时抛出
- 额外数据:
- $driver (支付机构)
- $gateway (调用方法)
- $endpoint (支付的 url endpoint)
- $payload (数据)

View File

@ -0,0 +1,9 @@
# 概述
:::tip
v2.6.0-beta.1 及以上可用
:::
在支付过程中,可能会想监听一些事件,好同时处理一些其它任务。
SDK 使用 [symfony/event-dispatcher](https://github.com/symfony/event-dispatcher) 组件进行事件的相关操作。

View File

@ -0,0 +1,32 @@
# 事件使用
::: tip
使用事件系统前,确保已初始化 pay。即调用了 `Pay::xxx($config)`
:::
```php
<?php
use Yansongda\Pay\Events;
use Yansongda\Pay\Events\PayStarting;
// 1. 新建一个监听器
class PayStartingListener
{
public function sendEmail(PayStarting $event)
{
// 可以直接通过 $event 获取事件的额外数据,例如:
// 支付提供商: $event->driver // alipay/wechat
// 支付 gateway$event->gateway // app/web/pos/scan ...
// 支付传递的参数:$event->params
// coding to send email...
}
}
// 2. 添加监听器
Events::addListener(PayStarting::class, [new PayStartingListener(), 'sendEmail']);
// 3. 喝杯咖啡
```

123
web/docs/v2/index.md Normal file
View File

@ -0,0 +1,123 @@
# 快速入门
该文档为 v2.x 版本,如果您想找 v1.x 版本文档,请点击[https://github.com/yansongda/pay/tree/v1](https://github.com/yansongda/pay/tree/v1)
**注意v1.x 与 v2.x 版本不兼容**
开发了多次支付宝与微信支付后,很自然产生一种反感,惰性又来了,想在网上找相关的轮子,可是一直没有找到一款自己觉得逞心如意的,要么使用起来太难理解,要么文件结构太杂乱,只有自己撸起袖子干了。
**!!请先熟悉 支付宝/微信 说明文档!!请具有基本的 debug 能力!!**
欢迎 Star欢迎 PR
laravel 扩展包请 [https://github.com/yansongda/laravel-pay](https://github.com/yansongda/laravel-pay)
QQ交流群690027516
---
## 特点
- 丰富的事件系统
- 命名不那么乱七八糟
- 隐藏开发者不需要关注的细节
- 根据支付宝、微信最新 API 开发而成
- 高度抽象的类免去各种拼json与xml的痛苦
- 符合 PSR 标准,你可以各种方便的与你的框架集成
- 文件结构清晰易理解,可以随心所欲添加本项目中没有的支付网关
- 方法使用更优雅,不必再去研究那些奇怪的的方法名或者类名是做啥用的
## 支持的支付方法
### 1、支付宝
- 电脑支付
- 手机网站支付
- APP 支付
- 刷卡支付
- 扫码支付
- 账户转账
- 小程序支付
| method | 描述 |
| :-------: | :-------: |
| web | 电脑支付 |
| wap | 手机网站支付 |
| app | APP 支付 |
| pos | 刷卡支付 |
| scan | 扫码支付 |
| transfer | 帐户转账 |
| mini | 小程序支付 |
### 2、微信
- 公众号支付
- 小程序支付
- H5 支付
- 扫码支付
- 刷卡支付
- APP 支付
- 企业付款
- 普通红包
- 分裂红包
| method | 描述 |
| :-----: | :-------: |
| mp | 公众号支付 |
| miniapp | 小程序支付 |
| wap | H5 支付 |
| scan | 扫码支付 |
| pos | 刷卡支付 |
| app | APP 支付 |
| transfer | 企业付款 |
| redpack | 普通红包 |
| groupRedpack | 分裂红包 |
## 支持的方法
所有网关均支持以下方法
- find(array/string $order)
说明:查找订单接口
参数:`$order` 为 `string` 类型时,请传入系统订单号,对应支付宝或微信中的 `out_trade_no` `array` 类型时,参数请参考支付宝或微信官方文档。
返回:查询成功,返回 `Yansongda\Supports\Collection` 实例,可以通过 `$colletion->xxx``$collection['xxx']` 访问服务器返回的数据。
异常:`GatewayException` 或 `InvalidSignException`
- refund(array $order)
说明:退款接口
参数:`$order` 数组格式,退款参数。
返回:退款成功,返回 `Yansongda\Supports\Collection` 实例,可以通过 `$colletion->xxx``$collection['xxx']` 访问服务器返回的数据。
异常:`GatewayException` 或 `InvalidSignException`
- cancel(array/string $order)
说明:取消订单接口
参数:`$order` 为 `string` 类型时,请传入系统订单号,对应支付宝或微信中的 `out_trade_no` `array` 类型时,参数请参考支付宝或微信官方文档。
返回:取消成功,返回 `Yansongda\Supports\Collection` 实例,可以通过 `$colletion->xxx``$collection['xxx']` 访问服务器返回的数据。
异常:`GatewayException` 或 `InvalidSignException`
- close(array/string $order)
说明:关闭订单接口
参数:`$order` 为 `string` 类型时,请传入系统订单号,对应支付宝或微信中的 `out_trade_no` `array` 类型时,参数请参考支付宝或微信官方文档。
返回:关闭成功,返回 `Yansongda\Supports\Collection` 实例,可以通过 `$colletion->xxx``$collection['xxx']` 访问服务器返回的数据。
异常:`GatewayException` 或 `InvalidSignException`
- verify()
说明:验证服务器返回消息是否合法
返回:验证成功,返回 `Yansongda\Supports\Collection` 实例,可以通过 `$colletion->xxx``$collection['xxx']` 访问服务器返回的数据。
异常:`GatewayException` 或 `InvalidSignException`
- PAYMETHOD(array $order)
说明:进行支付;具体支付方法名称请参考「支持的支付方法」一栏
返回:成功,返回 `Yansongda\Supports\Collection` 实例,可以通过 `$colletion->xxx``$collection['xxx']` 访问服务器返回的数据或 `Symfony\Component\HttpFoundation\Response` 实例,可通过 `return $response->send()`(laravel 框架中直接 `return $response`) 返回,具体请参考文档。
异常:`GatewayException` 或 `InvalidSignException`
## 错误
如果在调用相关支付网关 API 时有错误产生,会抛出 `GatewayException`,`InvalidSignException` 错误,可以通过 `$e->getMessage()` 查看,同时,也可通过 `$e->raw` 查看调用 API 后返回的原始数据,该值为数组格式。
## 所有异常
* Yansongda\Pay\Exceptions\InvalidGatewayException ,表示使用了除本 SDK 支持的支付网关。
* Yansongda\Pay\Exceptions\InvalidSignException ,表示验签失败。
* Yansongda\Pay\Exceptions\InvalidConfigException ,表示缺少配置参数,如,`ali_public_key`, `private_key` 等。
* Yansongda\Pay\Exceptions\GatewayException ,表示支付宝/微信服务器返回的数据非正常结果,例如,参数错误,对账单不存在等。

View File

@ -0,0 +1,13 @@
# 安装
## 运行环境
- PHP 7.0+ (v2.8.0 开始 >= 7.1.3)
- composer
> php5 请使用 v1.x 版本[https://github.com/yansongda/pay/tree/v1.x](https://github.com/yansongda/pay/tree/v1.x)
## 安装方式
```shell
composer require yansongda/pay:^2.10 -vvv
```

View File

@ -0,0 +1,26 @@
# 日志系统
SDK 自带日志系统,如果需要指定日志文件或日志级别,请 config 中传入下列参数。如果不传入,默认为 `warning` 级别,日志路径在 `sys_get_temp_dir().'/logs/yansongda.pay.log' `
## 配置
```php
'log' => [
'file' => './logs/pay.log', // 请注意权限
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily daily 时将按时间自动划分文件.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
```
## 使用
:::tip
使用日志功能前,请先确认已经使用过支付等功能进行了初始化!
:::
```php
use Yansongda\Pay\Log;
Log::debug('Paying...', $order->all());
```

29
web/docs/v2/others/faq.md Normal file
View File

@ -0,0 +1,29 @@
# FAQ
1. 支付宝支付成功,但是对返回数据验签老是失败。
绝大部分问题都是配置问题,首先请确认 **正确填写了支付宝公钥(注意不是应用公钥)**
如果还没解决,请参考 github 的 issue[https://github.com/yansongda/pay/issues/73](https://github.com/yansongda/pay/issues/73)
如果仍然没解决,请检查您所使用的框架是否对 get/post 数据进行了增加,请自行处理好 Nginx/Apache 对框架的 URL 重写问题
2. 我是做 API 的,怎样可以不用 send 出 Response 中的内容?
返回的 Response 中,`$response->getContent()` 可获取内容RedirectResponse 中,`$response->getTargetUrl()` 可获取跳转链接JsonResponse 中,`$response->getContent()` 可获取Json。
3. cURL error 60: SSL certificate problem: unable to get local issuer certificate
服务器环境配置问题。
请参考 [https://github.com/yansongda/pay/issues/16](https://github.com/yansongda/pay/issues/16)
4. 是否支持其他支付平台?比如:银联、京东。
由于使用限制,暂不支持。
**欢迎 PR**
5. 支付宝是否支持 AES 等加密方式?
因为支付宝推荐 RSA2 ,所以不推荐也不支持除 **RSA2** 以外的任何加密方式!

149
web/docs/v2/quickUsage.md Normal file
View File

@ -0,0 +1,149 @@
# 快速上手
## 支付宝
```php
<?php
namespace App\Http\Controllers;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;
class PayController
{
protected $config = [
'app_id' => '2016082000295641',
'notify_url' => 'http://yansongda.cn/notify.php',
'return_url' => 'http://yansongda.cn/return.php',
'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB',
// 加密方式: **RSA2**
'private_key' => 'MIIEpAIBAAKCAQEAs6+F2leOgOrvj9jTeDhb5q46GewOjqLBlGSs/bVL4Z3fMr3p+Q1Tux/6uogeVi/eHd84xvQdfpZ87A1SfoWnEGH5z15yorccxSOwWUI+q8gz51IWqjgZxhWKe31BxNZ+prnQpyeMBtE25fXp5nQZ/pftgePyUUvUZRcAUisswntobDQKbwx28VCXw5XB2A+lvYEvxmMv/QexYjwKK4M54j435TuC3UctZbnuynSPpOmCu45ZhEYXd4YMsGMdZE5/077ZU1aU7wx/gk07PiHImEOCDkzqsFo0Buc/knGcdOiUDvm2hn2y1XvwjyFOThsqCsQYi4JmwZdRa8kvOf57nwIDAQABAoIBAQCw5QCqln4VTrTvcW+msB1ReX57nJgsNfDLbV2dG8mLYQemBa9833DqDK6iynTLNq69y88ylose33o2TVtEccGp8Dqluv6yUAED14G6LexS43KtrXPgugAtsXE253ZDGUNwUggnN1i0MW2RcMqHdQ9ORDWvJUCeZj/AEafgPN8AyiLrZeL07jJz/uaRfAuNqkImCVIarKUX3HBCjl9TpuoMjcMhz/MsOmQ0agtCatO1eoH1sqv5Odvxb1i59c8Hvq/mGEXyRuoiDo05SE6IyXYXr84/Nf2xvVNHNQA6kTckj8shSi+HGM4mO1Y4Pbb7XcnxNkT0Inn6oJMSiy56P+CpAoGBAO1O+5FE1ZuVGuLb48cY+0lHCD+nhSBd66B5FrxgPYCkFOQWR7pWyfNDBlmO3SSooQ8TQXA25blrkDxzOAEGX57EPiipXr/hy5e+WNoukpy09rsO1TMsvC+v0FXLvZ+TIAkqfnYBgaT56ku7yZ8aFGMwdCPL7WJYAwUIcZX8wZ3dAoGBAMHWplAqhe4bfkGOEEpfs6VvEQxCqYMYVyR65K0rI1LiDZn6Ij8fdVtwMjGKFSZZTspmsqnbbuCE/VTyDzF4NpAxdm3cBtZACv1Lpu2Om+aTzhK2PI6WTDVTKAJBYegXaahBCqVbSxieR62IWtmOMjggTtAKWZ1P5LQcRwdkaB2rAoGAWnAPT318Kp7YcDx8whOzMGnxqtCc24jvk2iSUZgb2Dqv+3zCOTF6JUsV0Guxu5bISoZ8GdfSFKf5gBAo97sGFeuUBMsHYPkcLehM1FmLZk1Q+ljcx3P1A/ds3kWXLolTXCrlpvNMBSN5NwOKAyhdPK/qkvnUrfX8sJ5XK2H4J8ECgYAGIZ0HIiE0Y+g9eJnpUFelXvsCEUW9YNK4065SD/BBGedmPHRC3OLgbo8X5A9BNEf6vP7fwpIiRfKhcjqqzOuk6fueA/yvYD04v+Da2MzzoS8+hkcqF3T3pta4I4tORRdRfCUzD80zTSZlRc/h286Y2eTETd+By1onnFFe2X01mwKBgQDaxo4PBcLL2OyVT5DoXiIdTCJ8KNZL9+kV1aiBuOWxnRgkDjPngslzNa1bK+klGgJNYDbQqohKNn1HeFX3mYNfCUpuSnD2Yag53Dd/1DLO+NxzwvTu4D6DCUnMMMBVaF42ig31Bs0jI3JQZVqeeFzSET8fkoFopJf3G6UXlrIEAQ==',
'log' => [ // optional
'file' => './logs/alipay.log',
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
];
public function index()
{
$order = [
'out_trade_no' => time(),
'total_amount' => '1',
'subject' => 'test subject - 测试',
];
$alipay = Pay::alipay($this->config)->web($order);
return $alipay->send();// laravel 框架中请直接 `return $alipay`
}
public function return()
{
$data = Pay::alipay($this->config)->verify(); // 是的,验签就这么简单!
// 订单号:$data->out_trade_no
// 支付宝交易号:$data->trade_no
// 订单总金额:$data->total_amount
}
public function notify()
{
$alipay = Pay::alipay($this->config);
try{
$data = $alipay->verify(); // 是的,验签就这么简单!
// 请自行对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号
// 2、判断total_amount是否确实为该订单的实际金额即商户订单创建时的金额
// 3、校验通知中的seller_id或者seller_email) 是否为out_trade_no这笔单据的对应的操作方有的时候一个商户可能有多个seller_id/seller_email
// 4、验证app_id是否为该商户本身。
// 5、其它业务逻辑情况
Log::debug('Alipay notify', $data->all());
} catch (\Exception $e) {
// $e->getMessage();
}
return $alipay->success()->send();// laravel 框架中请直接 `return $alipay->success()`
}
}
```
## 微信
```php
<?php
namespace App\Http\Controllers;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;
class PayController
{
protected $config = [
'appid' => 'wxb3fxxxxxxxxxxx', // APP APPID
'app_id' => 'wxb3fxxxxxxxxxxx', // 公众号 APPID
'miniapp_id' => 'wxb3fxxxxxxxxxxx', // 小程序 APPID
'mch_id' => '14577xxxx',
'key' => 'mF2suE9sU6Mk1Cxxxxxxxxxxx',
'notify_url' => 'http://yanda.net.cn/notify.php',
'cert_client' => './cert/apiclient_cert.pem', // optional退款等情况时用到
'cert_key' => './cert/apiclient_key.pem',// optional退款等情况时用到
'log' => [ // optional
'file' => './logs/wechat.log',
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
'mode' => 'dev', // optional, dev/hk;当为 `hk` 时,为香港 gateway。
];
public function index()
{
$order = [
'out_trade_no' => time(),
'total_fee' => '1', // **单位:分**
'body' => 'test body - 测试',
'openid' => 'onkVf1FjWS5SBIixxxxxxx',
];
$pay = Pay::wechat($this->config)->mp($order);
// $pay->appId
// $pay->timeStamp
// $pay->nonceStr
// $pay->package
// $pay->signType
}
public function notify()
{
$pay = Pay::wechat($this->config);
try{
$data = $pay->verify(); // 是的,验签就这么简单!
Log::debug('Wechat notify', $data->all());
} catch (\Exception $e) {
// $e->getMessage();
}
return $pay->success()->send();// laravel 框架中请直接 `return $pay->success()`
}
}
```

62
web/docs/v2/sidebar.js Normal file
View File

@ -0,0 +1,62 @@
exports = module.exports = [
{
text: '快速入门',
collapsible: true,
items: [
{ text: '安装', link: '/docs/v2/installation'},
{ text: '快速上手', link: '/docs/v2/quickUsage'},
{ text: '贡献', link: '/docs/v2/contribute'}
]
},
{
text: '支付 - 支付宝',
collapsible: true,
items: [
{ text: '概述', link: '/docs/v2/alipay/index'},
{ text: '支付', link: '/docs/v2/alipay/pay'},
{ text: '查询', link: '/docs/v2/alipay/find'},
{ text: '取消', link: '/docs/v2/alipay/cancel'},
{ text: '关闭', link: '/docs/v2/alipay/close'},
{ text: '退款', link: '/docs/v2/alipay/refund'},
{ text: '接收回调', link: '/docs/v2/alipay/callback'},
{ text: '确认回调', link: '/docs/v2/alipay/response'}
]
},
{
text: '支付 - 微信',
collapsible: true,
items: [
{ text: '概述', link: '/docs/v2/wechat/index'},
{ text: '支付', link: '/docs/v2/wechat/pay'},
{ text: '查询', link: '/docs/v2/wechat/find'},
{ text: '取消', link: '/docs/v2/wechat/cancel'},
{ text: '关闭', link: '/docs/v2/wechat/close'},
{ text: '退款', link: '/docs/v2/wechat/refund'},
{ text: '接收回调', link: '/docs/v2/wechat/callback'},
{ text: '确认回调', link: '/docs/v2/wechat/response'}
]
},
{
text: '事件系统',
collapsible: true,
items: [
{ text: '概述', link: '/docs/v2/events/index'},
{ text: '说明', link: '/docs/v2/events/class'},
{ text: '使用', link: '/docs/v2/events/usage'}
]
},
{
text: '日志系统',
collapsible: true,
items: [
{ text: '使用', link: '/docs/v2/logger/usage'}
]
},
{
text: '其它',
collapsible: true,
items: [
{ text: 'FAQ', link: '/docs/v2/others/faq'}
]
}
];

View File

@ -0,0 +1,38 @@
# 接收回调
| 方法名 | 参数 | 返回值 |
|:------:|:---:|:----------:|
| verify | 无 | Collection |
## 支付异步通知验证
```php
$result = $wechat->verify();
// 是的,你没有看错,就是这么简单!
// return $wechat->success()->send(); // laravel 框架直接 return $wechat->success();
```
## 退款异步通知验证
:::tip
v2.4.0 及以上可用
:::
```php
$result = $wechat->verify(null, true);
// 是的,你没有看错,就是这么简单!
// return $wechat->success()->send(); // laravel 框架直接 return $wechat->success();
```
## 配置参数
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,7 @@
# 取消
微信官方无此 API请调用 close 关闭订单。
## 异常
Yansongda\Pay\Exceptions\GatewayException Wechat Do Not Have Cancel API! Plase use Close API!

View File

@ -0,0 +1,31 @@
# 关闭
| 方法名 | 参数 | 返回值 |
|:-----:|:-------------------:|:----------:|
| close | string/array $order | Collection |
## 例子
```php
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $wechat->close($order);
```
## 订单配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3),查看「请求参数」一栏。
### APP/小程序订单关闭
如果您需要关闭 `APP/小程序` 的订单,请传入参数:`['type' => 'app']`/`['type' => 'miniapp']`
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,68 @@
# 查询
| 方法名 | 参数 | 返回值 |
|:----:|:--------------------------------------:|:----------:|
| find | string/array $order, string/null $type | Collection |
## 查询普通支付订单
```php
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $wechat->find($order);
```
## 查询退款订单
```php
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $wechat->find($order, 'refund');
```
## 查询企业付款订单
:::tip
v2.7.8 及以上可用
:::
```php
$order = [
'partner_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = $wechat->find($order, 'transfer');
```
## 订单配置参数
### 查询订单
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2),查看「请求参数」一栏。
### 查询退款订单
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5),查看「请求参数」一栏。
### 查询企业付款订单
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3),查看「请求参数」一栏。
### APP/小程序查询
如果您需要查询 `APP/小程序` 的订单,请传入参数:`['type' => 'app']`/`['type' => 'miniapp']`
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

109
web/docs/v2/wechat/index.md Normal file
View File

@ -0,0 +1,109 @@
# 概述
**请先熟悉 微信支付 开发文档!**
## 快速上手
```php
use Yansongda\Pay\Pay;
$config = [
'appid' => 'wxb3fxxxxxxxxxxx', // APP APPID
'app_id' => 'wxb3fxxxxxxxxxxx', // 公众号 APPID
'miniapp_id' => 'wxb3fxxxxxxxxxxx', // 小程序 APPID
'mch_id' => '145776xxxx',
'key' => 'mF2suE9sU6Mk1CxxxxIxxxxx',
'notify_url' => 'http://yanda.net.cn',
'cert_client' => './cert/apiclient_cert.pem', // optional, 退款,红包等情况时需要用到
'cert_key' => './cert/apiclient_key.pem',// optional, 退款,红包等情况时需要用到
'log' => [ // optional
'file' => './logs/wechat.log',
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
// 'mode' => 'dev',
];
// 支付
$order = [
'out_trade_no' => time(),
'body' => 'subject-测试',
'total_fee' => '1',
'openid' => 'onkVf1FjWS5SBxxxxxxxx',
];
$result = Pay::wechat($config)->mp($order);
// 退款
$order = [
'out_trade_no' => '1514192025',
'out_refund_no' => time(),
'total_fee' => '1',
'refund_fee' => '1',
'refund_desc' => '测试退款haha',
];
$result = Pay::wechat($config)->refund($order); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。
// 查询
$result = Pay::wechat($config)->find('out_trade_no_123456'); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。
// 取消
微信未提供取消订单接口,访问此接口将抛出 `GatewayException` 异常。
// 关闭
$result = Pay::wechat($config)->close('out_trade_no_123456'); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。
// 验证服务器数据
$wechat = Pay::wechat($config)
// 是的,验签就这么简单!
$data = $wechat->verify(); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$data->xxx` 访问服务器返回的数据。
$wechat->success()->send(); // 向微信服务器确认接收到的数据。laravel 框架中请直接 `return $wechat->success()`
```
## 服务商模式
> {info} 版本要求: version >= 2.1.0
config 配置参数如下。
```php
$config = [
'appid' => 'wxb3fxxxxxxxxxxx', // APP APPID
'app_id' => 'wxb3fxxxxxxxxxxx', // 公众号 APPID
'miniapp_id' => 'wxb3fxxxxxxxxxxx', // 小程序 APPID
'sub_appid' => 'wxb3fxxxxxxxxxxx', // 子商户 APP APPID
'sub_app_id' => 'wxb3fxxxxxxxxxxx', // 子商户 公众号 APPID
'sub_miniapp_id' => 'wxb3fxxxxxxxxxxx', // 子商户 小程序 APPID
'mch_id' => '146xxxxxx', // 商户号
'sub_mch_id' => '146xxxxxx', // 子商户商户号
'key' => '4e538260xxxxxxxxxxxxxxxxxxxxxx', // 主商户 key
'notify_url' => 'http://yanda.net.cn/notify.php',
'cert_client' => './cert/apiclient_cert.pem', // optional退款等情况时用到
'cert_key' => './cert/apiclient_key.pem',// optional退款等情况时用到
'log' => [ // optional
'file' => './logs/wechat.log',
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily daily 时将按时间自动划分文件.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'mode' => 'service',
]
```
**说明:** 处于服务商模式下的时候,`appid`、`app_id`、`miniapp_id` 均为**主商户**的信息,`sub_` 开头的为**子服务商**的信息
详细请参考 [https://github.com/yansongda/pay/pull/82](https://github.com/yansongda/pay/pull/82)
## 注意
后续文档中,如果没有特别说明, `$wechat` 均代表`Pay::wechat($config)`

249
web/docs/v2/wechat/pay.md Normal file
View File

@ -0,0 +1,249 @@
# 支付
微信支付目前支持 9 种支付方法,对应的支付 method 如下:
| method | 说明 | 参数 | 返回值 |
|:------------:|:------:|:------------:|:------------:|
| mp | 公众号支付 | array $order | Collection |
| wap | 手机网站支付 | array $order | Response |
| app | APP 支付 | array $order | JsonResponse |
| pos | 刷卡支付 | array $order | Collection |
| scan | 扫码支付 | array $order | Collection |
| transfer | 账户转账 | array $order | Collection |
| miniapp | 小程序支付 | array $order | Collection |
| redpack | 普通红包 | array $order | Collection |
| groupRedpack | 裂变红包 | array $order | Collection |
## 公众号支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'body' => 'subject-测试',
'total_fee' => '1',
'openid' => 'onkVf1FjWS5SBxxxxxxxx',
];
$result = Pay::wechat($config)->mp($order);
// 返回 Collection 实例。包含了调用 JSAPI 的所有参数如appIdtimeStampnonceStrpackagesignTypepaySign 等;
// 可直接通过 $result->appId, $result->timeStamp 获取相关值。
// 后续调用不在本文档讨论范围内,请自行参考官方文档。
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1),查看「请求参数」一栏。
## 手机网站支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'body' => 'subject-测试',
'total_fee' => '1',
];
return $wechat->wap($order)->send(); // laravel 框架中请直接 return $wechat->wap($order)
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1),查看「请求参数」一栏。
## APP 支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'body' => 'subject-测试',
'total_fee' => '1',
];
// 后续 APP 调用,调用方式不在本文档讨论范围内,请参考官方文档。
return $wechat->app($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1),查看「请求参数」一栏。
## 刷卡支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'body' => 'subject-测试',
'total_fee' => '1',
'auth_code' => '1354804793001231564897',
];
$result = $wechat->pos($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1),查看「请求参数」一栏。
## 扫码支付
### 例子
```php
$order = [
'out_trade_no' => time(),
'body' => 'subject-测试',
'total_fee' => '1',
];
// 扫码支付使用 模式二
$result = $wechat->scan($order);
// 二维码内容: $qr = $result->code_url;
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1),查看「请求参数」一栏。
## 账户转账
### 例子
```php
$order = [
'partner_trade_no' => '', //商户订单号
'openid' => '', //收款人的openid
'check_name' => 'NO_CHECK', //NO_CHECK不校验真实姓名\FORCE_CHECK强校验真实姓名
// 're_user_name'=>'张三', //check_name为 FORCE_CHECK 校验实名的时候必须提交
'amount' => '1', //企业付款金额,单位为分
'desc' => '帐户提现', //付款说明
];
$result = $wechat->transfer($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2),查看「请求参数」一栏。
### 使用 APP/小程序 账号转账
如果您需要通过 `APP/小程序` 的商户账号appid进行转账请传入参数`['type' => 'app']`/`['type' => 'miniapp']`
### !注意!
如果您在队列中使用,请自行传参 `spbill_create_ip`
## 小程序
### 例子
```php
$order = [
'out_trade_no' => time(),
'body' => 'subject-测试',
'total_fee' => '1',
'openid' => 'onkVf1FjWS5SBxxxxxxxx',
];
$result = $wechat->miniapp($order);
// 返回 Collection 实例。包含了调用 JSAPI 的所有参数如appIdtimeStampnonceStrpackagesignTypepaySign 等;
// 可直接通过 $result->appId, $result->timeStamp 获取相关值。
// 后续调用不在本文档讨论范围内,请自行参考官方文档。
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1),查看「请求参数」一栏。
## 普通红包
### 例子
```php
$order = [
'mch_billno' => '商户订单号',
'send_name' => '商户名称',
'total_amount' => '1',
're_openid' => '用户openid',
'total_num' => '1',
'wishing' => '祝福语',
'act_name' => '活动名称',
'remark' => '备注',
];
$result = $wechat->redpack($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3),查看「请求参数」一栏。
### !注意!
如果您在队列中使用,请自行传参 `client_ip`
## 裂变红包
### 例子
```php
$order = [
'mch_billno' => '商户订单号',
'send_name' => '商户名称',
'total_amount' => '1',
're_openid' => '用户openid',
'total_num' => '3',
'wishing' => '祝福语',
'act_name' => '活动名称',
'remark' => '备注',
];
$result = $wechat->groupRedpack($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign`, `spbill_create_ip` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4),查看「请求参数」一栏。
## 返回值
**各支付方法返回值请参考顶部表格**
返回只会返回两种类型 `Symfony\Component\HttpFoundation\Response``Yansongda\Supports\Collection`
* 返回 Response 类型时,可以通过 `return $response->send()` 直接进行返回laravel 框架中使用请直接`return $response`
* 返回 Collection 类型时,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,34 @@
# 退款
| 方法名 | 参数 | 返回值 |
|:------:|:------------:|:----------:|
| refund | array $order | Collection |
## 退款操作
```php
$order = [
'out_trade_no' => '1514192025',
'out_refund_no' => time(),
'total_fee' => '1',
'refund_fee' => '1',
'refund_desc' => '测试退款haha',
];
$result = $wechat->refund($order);
```
## 订单配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4),查看「请求参数」一栏。
### APP/小程序退款
如果您需要退 `APP/小程序` 的订单,请传入参数:`['type' => 'app']`/`['type' => 'miniapp']`
## 返回值
返回 Collection 类型,可以通过 `$collection->xxx` 得到服务器返回的数据。

View File

@ -0,0 +1,23 @@
# 确认回调
| 方法名 | 参数 | 返回值 |
|:-------:|:---:|:--------:|
| success | 无 | Response |
## 使用方法
```php
// $result = $wechat->verify();
return $wechat->success()->send(); // laravel 框架直接 return $wechat->success();
```
## 配置参数
## 返回值
返回 Response 类型,可以通过`return $response->send();` 进行返回;如果在 laravel 框架中,可直接 `return $response;`

View File

@ -0,0 +1,42 @@
# 接收支付宝回调
| 方法名 | 参数 | 返回值 |
|:--------:|:------------------------------:|:----------:|
| callback | 无/array/ServerRequestInterface | Collection |
使用的加密方式为支付宝官方推荐的 **RSA2**,目前只支持这一种加密方式,且没有支持其他加密方式的计划。
## 例子
```php
Pay::config($this->config);
// 是的,你没有看错,就是这么简单!
$result = Pay::alipay()->callback();
```
## 参数
### 第一个参数
#### `null`
如果您没有传参,或传 `null``yansongda/pay` 会自动识别支付宝的回调请求并处理,通过 `Collection` 实例返回支付宝的处理参数
:::warning
建议仅在 php-fpm 下使用swoole 方式请使用 `ServerRequestInterface` 参数传递方式
:::
#### `ServerRequestInterface`
推荐在 swoole 环境下传递此参数,传递此参数后, yansongda/pay 会自动进行后续处理
#### `array`
也可以自行解析请求参数,传递一个 array 会自动进行后续处理
### 第二个参数
第二个参数主要是传递相关自定义变量的,类似于 `web()` 中的 `_config` / `_method` 等参数。
例如,如果你想在回调的时候使用非默认配置,则可以 `Pay::alipay()->callback(null, ['_config' => 'yansongda'])` 切换为 `yansongda` 这个租户的配置信息。

View File

@ -0,0 +1,22 @@
# 取消订单
| 方法名 | 参数 | 返回值 |
|:------:|:-------------------:|:----------:|
| cancel | string/array $order | Collection |
## 例子
```php
Pay::config($this->config);
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = Pay::alipay()->cancel($order);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.cancel),查看「请求参数」一栏。

View File

@ -0,0 +1,19 @@
# 关闭订单
| 方法名 | 参数 | 返回值 |
|:-----:|:-------------------:|:----------:|
| close | string/array $order | Collection |
## 例子
```php
Pay::config($this->config);
$result = Pay::alipay()->close([
'out_trade_no' => '1623161325',
]);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.close),查看「请求参数」一栏。

View File

@ -0,0 +1,27 @@
# 下载对账单
| 方法名 | 参数 | 返回值 |
|:--------:|:------------------:|:------:|
| download | string/array $bill | string |
## 例子
```php
$bill = [
'bill_date' => '2016-04-05', // 2016-04
'bill_type' => 'trade'
];
// $bill = '2016-04-05';
$url = $alipay->download($bill);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://docs.open.alipay.com/api_15/alipay.data.dataservice.bill.downloadurl.query),查看「请求参数」一栏。
## 返回值
返回 string 类型。直接返回账单下载链接。

View File

@ -0,0 +1,54 @@
# 查询订单
| 方法名 | 参数 | 返回值 |
|:----:|:-------------------:|:----------:|
| find | string/array $order | Collection |
## 查询普通支付订单
```php
Pay::config($this->config);
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = Pay::alipay()->find($order);
```
## 查询退款订单
```php
Pay::config($this->config);
$order = [
'out_trade_no' => '1514027114',
'out_request_no' => '1514027114',
'_type' => 'refund',
];
$result = Pay::alipay()->find($order);
```
## 查询转账订单
```php
Pay::config($this->config);
$order = [
'out_trade_no' => '1514027114',
'_type' => 'transfer'
];
$result = Pay::alipay()->find($order);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考以下地址,查看「请求参数」一节。
- 支付订单:[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.query)
- 退款订单:[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.fastpay.refund.query)
- 转账订单:[这里](https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.order.query)

137
web/docs/v3/alipay/more.md Normal file
View File

@ -0,0 +1,137 @@
# 更多方便的插件
得益于 yansongda/pay 的基础架构和良好的插件机制,
您可以自有的使用任何内置插件和自定义插件调用支付宝的任何 API。
诸如签名、API调用、解密、验签、解包等基础插件已经内置在 Pay 中,
您可以使用 `Pay::alipay()->mergeCommonPlugins(array $plugins)` 来获取调用 API 所必须的常用插件
首先,查找你想使用的插件,然后
```php
Pay::config($config);
$params = [
'out_trade_no' => '1514027114',
];
$allPlugins = Pay::alipay()->mergeCommonPlugins([QueryPlugin::class]);
$result = Pay::alipay()->pay($allPlugins, $params);
```
关于插件的详细介绍,如果您感兴趣,可以参考 [这篇说明文档](/docs/v3/kernel/plugin.md)
## 账务API插件
### 下载对账单
- `Yansongda\Pay\Plugin\Alipay\Data\BillDownloadUrlQueryPlugin`
### 申请电子回单
- `Yansongda\Pay\Plugin\Alipay\Data\BillEreceiptApplyPlugin`
### 查询电子回单状态
- `Yansongda\Pay\Plugin\Alipay\Data\BillEreceiptQueryPlugin`
## 生活缴费API插件
### 缴费直连代扣订单支付状态查询
- `Yansongda\Pay\Plugin\Alipay\Ebpp\PdeductBillStatusPlugin`
### 公共事业缴费直连代扣扣款支付接口
- `Yansongda\Pay\Plugin\Alipay\Ebpp\PdeductPayPlugin`
### 缴费直连代扣签约
- `Yansongda\Pay\Plugin\Alipay\Ebpp\PdeductSignAddPlugin`
### 缴费直连代扣取消签约
- `Yansongda\Pay\Plugin\Alipay\Ebpp\PdeductSignCancelPlugin`
## 资金API插件
### 支付宝资金账户资产查询接口
- `Yansongda\Pay\Plugin\Alipay\Fund\AccountQueryPlugin`
### 资金授权冻结接口
- `Yansongda\Pay\Plugin\Alipay\Fund\AuthOrderFreezePlugin`
### 资金授权解冻接口
- `Yansongda\Pay\Plugin\Alipay\Fund\AuthOrderUnfreezePlugin`
### 查询转账订单接口
- `Yansongda\Pay\Plugin\Alipay\Fund\TransOrderQueryPlugin`
### 转账业务单据查询接口
- `Yansongda\Pay\Plugin\Alipay\Fund\TransCommonQueryPlugin`
### 资金转账页面支付接口
- `Yansongda\Pay\Plugin\Alipay\Fund\TransPagePayPlugin`
:::warning
该插件需配合 `HtmlResponsePlugin` 插件一起使用
:::
### 单笔转账接口
- `Yansongda\Pay\Plugin\Alipay\Fund\TransUniTransferPlugin`
### 单笔转账到银行账户接口
- `Yansongda\Pay\Plugin\Alipay\Fund\TransTobankTransferPlugin`
## 工具类API
### 换取授权访问令牌
- `Yansongda\Pay\Plugin\Alipay\Tools\SystemOauthTokenPlugin`
### 换取应用授权令牌
- `Yansongda\Pay\Plugin\Alipay\Tools\OpenAuthTokenAppPlugin`
### 查询某个应用授权AppAuthToken的授权信息
- `Yansongda\Pay\Plugin\Alipay\Tools\OpenAuthTokenAppQueryPlugin`
## 会员API
### 支付宝会员授权信息查询接口
- `Yansongda\Pay\Plugin\Alipay\User\InfoSharePlugin`
### 支付宝个人协议页面签约接口
- `Yansongda\Pay\Plugin\Alipay\User\AgreementPageSignPlugin`
:::warning
该插件需配合 `HtmlResponsePlugin` 插件一起使用
:::
### 支付宝个人代扣协议查询接口
- `Yansongda\Pay\Plugin\Alipay\User\AgreementQueryPlugin`
### 支付宝个人代扣协议解约接口
- `Yansongda\Pay\Plugin\Alipay\User\AgreementUnsignPlugin`
### 周期性扣款协议执行计划修改接口
- `Yansongda\Pay\Plugin\Alipay\User\AgreementExecutionPlanModifyPlugin`
### 协议由普通通用代扣协议产品转移到周期扣协议产品
- `Yansongda\Pay\Plugin\Alipay\User\AgreementTransferPlugin`

208
web/docs/v3/alipay/pay.md Normal file
View File

@ -0,0 +1,208 @@
# 支付
支付宝支付目前直接内置支持 7 种快捷方式支付方法,对应的支付 method 如下:
| method | 说明 | 参数 | 返回值 |
|:--------:|:------:|:------------:|:----------:|
| web | 电脑支付 | array $order | Response |
| wap | 手机网站支付 | array $order | Response |
| app | APP 支付 | array $order | Response |
| pos | 刷卡支付 | array $order | Collection |
| scan | 扫码支付 | array $order | Collection |
| transfer | 账户转账 | array $order | Collection |
| mini | 小程序支付 | array $order | Collection |
更多接口调用请参考后续文档
## 电脑支付
### 例子
```php
Pay::config($this->config);
return Pay::alipay()->web([
'out_trade_no' => ''.time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 1',
]);
```
#### GET 方式提交
为您考虑到了这一点,如果您想使用 GET 方式提交请求,可以在参数中增加 `['_method' => 'get']` 即可,例如
```php
Pay::config($this->config);
return Pay::alipay()->web([
'out_trade_no' => ''.time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 1',
'_method' => 'get',
]);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay),查看「请求参数」一栏。
## 手机网站支付
### 例子
```php
Pay::config($this->config);
return Pay::alipay()->wap([
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
'quit_url' => 'https://yansongda.cn',
]);
```
#### GET 方式提交
为您考虑到了这一点,如果您想使用 GET 方式提交请求,可以在参数中增加 `['_method' => 'get']` 即可,例如
```php
Pay::config($this->config);
return Pay::alipay()->wap([
'out_trade_no' => ''.time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 1',
'_method' => 'get',
]);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay),查看「请求参数」一栏。
## APP 支付
### 例子
```php
Pay::config($this->config);
// 后续 APP 调用方式不在本文档讨论范围内,请参考官方文档。
return Pay::alipay()->app([
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
]);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay),查看「请求参数」一栏。
## 小程序支付
### 例子
```php
Pay::config($this->config);
$result = Pay::alipay()->mini([
'out_trade_no' => time().'',
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
'buyer_id' => '2088622190161234',
]);
return $result->get('trade_no'); // 支付宝交易号
// return $result->trade_no;
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.create/),查看「请求参数」一栏。
小程序支付接入文档:[https://docs.alipay.com/mini/introduce/pay](https://opendocs.alipay.com/mini/introduce/pay)。
## 刷卡支付
### 例子
```php
Pay::config($this->config);
$result = Pay::alipay()->pos([
'out_trade_no' => time(),
'auth_code' => '284776044441477959',
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
]);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.pay),查看「请求参数」一栏。
## 扫码支付
### 例子
```php
Pay::config($this->config);
$result = Pay::alipay()->scan([
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
]);
return $result->qr_code; // 二维码 url
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`product_code` 等参数。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.precreate),查看「请求参数」一栏。
## 账户转账
### 例子
```php
Pay::config($this->config);
$result = Pay::alipay()->transfer([
'out_biz_no' => '202106051432',
'trans_amount' => '0.01',
'product_code' => 'TRANS_ACCOUNT_NO_PWD',
'biz_scene' => 'DIRECT_TRANSFER',
'payee_info' => [
'identity' => 'ghdhjw7124@sandbox.com',
'identity_type' => 'ALIPAY_LOGON_ID',
'name' => '沙箱环境'
],
]);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer),查看「请求参数」一栏。
:::tip
转账查询等,请参考 [查询](/docs/v3/alipay/find.md)
:::

View File

@ -0,0 +1,20 @@
# 退款
| 方法名 | 参数 | 返回值 |
|:------:|:------------:|:----------:|
| refund | array $order | Collection |
## 退款操作
```php
Pay::config($this->config);
$result = Pay::alipay()->refund([
'out_trade_no' => '1623160012',
'refund_amount' => '0.01',
]);
```
## 配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://opendocs.alipay.com/apis/api_1/alipay.trade.refund),查看「请求参数」一栏。

View File

@ -0,0 +1,19 @@
# 确认回调
| 方法名 | 参数 | 返回值 |
|:-------:|:---:|:--------:|
| success | 无 | Response |
## 例子
```php
Pay::config($config);
// $result = Pay::alipay()->callback();
return Pay::alipay()->success();
```
## 订单配置参数

45
web/docs/v3/index.md Normal file
View File

@ -0,0 +1,45 @@
# 介绍
<p align="center">
<a href="https://pay.yansongda.cn" target="_blank" rel="noopener noreferrer"><img width="200" src="https://pay.yansongda.cn/images/logo.png" alt="Logo"></a>
</p>
该文档为 v3 版本的文档,如果您正在使用 v2.x 版本的 SDK请您传送至 [这里](/docs/v2/)。
v3 版与 v2 版在底层有很大的不同,基础架构做了重新的设计,更易扩展,使用起来更方便。
## 前言
开发了多次支付宝与微信支付后,很自然产生一种反感,惰性又来了,想在网上找相关的轮子,可是一直没有找到一款自己觉得逞心如意的,要么使用起来太难理解,要么文件结构太杂乱,只有自己撸起袖子干了。
欢迎 Star欢迎 PR
hyperf 扩展包请 [传送至这里](https://github.com/yansongda/hyperf-pay)
laravel 扩展包请 [传送至这里](https://github.com/yansongda/laravel-pay)
yii 扩展包请 [传送至这里](https://github.com/guanguans/yii-pay)
## 特点
- 多租户支持
- Swoole 支持
- 灵活的插件机制
- 丰富的事件系统
- 命名不那么乱七八糟
- 隐藏开发者不需要关注的细节
- 根据支付宝、微信最新 API 开发而成
- 高度抽象的类免去各种拼json与xml的痛苦
- 文件结构清晰易理解,可以随心所欲添加本项目中没有的支付网关
- 方法使用更优雅,不必再去研究那些奇怪的的方法名或者类名是做啥用的
- 内置自动获取微信公共证书方法,再也不用再费劲去考虑第一次获取证书的的问题了
- 符合 PSR2、PSR3、PSR4、PSR7、PSR11、PSR14、PSR18 等各项标准,你可以各种方便的与你的框架集成
## 运行环境
- PHP 7.3+ (v3.1.0 开始需 7.4+)
- composer
## LICENSE
MIT

View File

@ -0,0 +1,4 @@
# 🧪Pipeline
yansongda/pay 最主要的 plugin 机制,其实就是借助于 `pipeline` 来实现的,
网络上有很多关于 pipeline 的说明,在此不再赘述,感兴趣的同学可以查阅相关资料。

View File

@ -0,0 +1,364 @@
# 🔌Plugin
得益于 pipelinePay 中的所有数据变换都通过 plugin 来实现,
同时 Pay 中也内置了很多常用的 Plugin因此使用方式非常灵活简单。
其实大家经常使用的 「网站支付」「小程序支付」「查询订单」 等均属于自定义插件,只不过这类插件已经内置在 yansongda/pay 中了,不需要您额外开发即可使用。
## 定义
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Contract;
use Closure;
use Yansongda\Pay\Rocket;
interface PluginInterface
{
public function assembly(Rocket $rocket, Closure $next): Rocket;
}
```
## 详细说明
### 支付宝电脑支付
以支付宝的电脑支付为例,我们知道,支付宝电脑支付首先需要 组装(assembly) 一系列支付宝要求的参数,
然后,需要以 form 表单,或者 GET 的方式请求支付宝的地址,这样才能跳转到支付宝的电脑支付页面进行支付。
所以除了支付宝公共的生成签名、验签、调用支付宝API 等等公共的事情以外,我们还需要两个 Plugin
- 组装参数 Plugin
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Alipay\Trade;
use Closure;
use Yansongda\Pay\Contract\PluginInterface;
use Yansongda\Pay\Logger;
use Yansongda\Pay\Parser\ResponseParser;
use Yansongda\Pay\Rocket;
class PagePayPlugin implements PluginInterface
{
public function assembly(Rocket $rocket, Closure $next): Rocket
{
Logger::info('[alipay][PagePayPlugin] 插件开始装载', ['rocket' => $rocket]);
$rocket->setDirection(ResponseParser::class)
->mergePayload([
'method' => 'alipay.trade.page.pay',
'biz_content' => array_merge(
['product_code' => 'FAST_INSTANT_TRADE_PAY'],
$rocket->getParams()
),
]);
Logger::info('[alipay][PagePayPlugin] 插件装载完毕', ['rocket' => $rocket]);
return $next($rocket);
}
}
```
这个 Plugin 的目的就是为了组装一系列支付宝所需要的参数,同时,由于电脑支付是不需要后端 http 调用支付宝接口的,
只需要一个浏览器的响应,所以,我们把 🚀 的 `Direction` 设置成了 `ResponseParser::class`
- 跳转响应 Plugin
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Alipay;
use Closure;
use GuzzleHttp\Psr7\Response;
use Yansongda\Pay\Contract\PluginInterface;
use Yansongda\Pay\Logger;
use Yansongda\Pay\Rocket;
use Yansongda\Supports\Arr;
use Yansongda\Supports\Collection;
class HtmlResponsePlugin implements PluginInterface
{
public function assembly(Rocket $rocket, Closure $next): Rocket
{
Logger::info('[alipay][HtmlResponsePlugin] 插件开始装载', ['rocket' => $rocket]);
/* @var Rocket $rocket */
$rocket = $next($rocket);
$radar = $rocket->getRadar();
$response = 'GET' === $radar->getMethod() ?
$this->buildRedirect($radar->getUri()->__toString(), $rocket->getPayload()) :
$this->buildHtml($radar->getUri()->__toString(), $rocket->getPayload());
$rocket->setDestination($response);
Logger::info('[alipay][HtmlResponsePlugin] 插件装载完毕', ['rocket' => $rocket]);
return $rocket;
}
protected function buildRedirect(string $endpoint, Collection $payload): Response
{
$url = $endpoint.'?'.Arr::query($payload->all());
$content = sprintf('<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="refresh" content="0;url=\'%1$s\'" />
<title>Redirecting to %1$s</title>
</head>
<body>
Redirecting to %1$s.
</body>
</html>', htmlspecialchars($url, ENT_QUOTES)
);
return new Response(302, ['Location' => $url], $content);
}
protected function buildHtml(string $endpoint, Collection $payload): Response
{
$sHtml = "<form id='alipay_submit' name='alipay_submit' action='".$endpoint."' method='POST'>";
foreach ($payload->all() as $key => $val) {
$val = str_replace("'", '&apos;', $val);
$sHtml .= "<input type='hidden' name='".$key."' value='".$val."'/>";
}
$sHtml .= "<input type='submit' value='ok' style='display:none;'></form>";
$sHtml .= "<script>document.forms['alipay_submit'].submit();</script>";
return new Response(200, [], $sHtml);
}
}
```
在处理好支付宝所需要的参数之后按照其它正常逻辑应该调用支付宝API获取数据了
但是由于 电脑支付 不是直接调用支付宝API的
所以,这里使用了 `后置 plugin` 处理组装相关 html 代码进行 post 或者 GET 请求访问支付宝电脑支付页面。
最后,得益于 🚀 的 `Direction` 机制,最终返回给你的就是一个符合 PSR7 规范的 `Response` 对象了,
您可以集成到任何符合相关规范的框架中。
### 支付宝查询订单
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Alipay\Trade;
use Yansongda\Pay\Plugin\Alipay\GeneralPlugin;
class QueryPlugin extends GeneralPlugin
{
protected function getMethod(): string
{
return 'alipay.trade.query';
}
}
```
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Alipay;
use Closure;
use Yansongda\Pay\Contract\PluginInterface;
use Yansongda\Pay\Logger;
use Yansongda\Pay\Rocket;
abstract class GeneralPlugin implements PluginInterface
{
public function assembly(Rocket $rocket, Closure $next): Rocket
{
Logger::info('[alipay][GeneralPlugin] 通用插件开始装载', ['rocket' => $rocket]);
$rocket->mergePayload([
'method' => $this->getMethod(),
'biz_content' => $rocket->getParams(),
]);
Logger::info('[alipay][GeneralPlugin] 通用插件装载完毕', ['rocket' => $rocket]);
return $next($rocket);
}
abstract protected function getMethod(): string;
}
```
通过以上代码,我们大概能明白,查询订单的 `QueryPlugin` 插件,继承了 `GeneralPlugin` 这个常用插件,
通过支付宝官方文档,我们知道,查询订单的 API 将传参中的 method 改为了 `alipay.trade.query`,其它参数均是个性化参数,和入参有关,
因此,我们在做查询订单时,是需要简单的把 method 按要求更改即可,是不是很简单?
### 微信查询订单
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\Common;
use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
class QueryPlugin extends GeneralPlugin
{
/**
* @throws \Yansongda\Pay\Exception\ContainerDependencyException
* @throws \Yansongda\Pay\Exception\ContainerException
* @throws \Yansongda\Pay\Exception\ServiceNotFoundException
* @throws \Yansongda\Pay\Exception\InvalidParamsException
*/
protected function getUri(Rocket $rocket): string
{
$config = get_wechat_config($rocket->getParams());
$payload = $rocket->getPayload();
if (is_null($payload->get('transaction_id'))) {
throw new InvalidParamsException(InvalidParamsException::MISSING_NECESSARY_PARAMS);
}
return 'v3/pay/transactions/id/'.
$payload->get('transaction_id').
'?mchid='.$config->get('mch_id', '');
}
protected function getMethod(): string
{
return 'GET';
}
protected function doSomething(Rocket $rocket): void
{
$rocket->setPayload(null);
}
}
```
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat;
use Closure;
use Psr\Http\Message\RequestInterface;
use Yansongda\Pay\Contract\PluginInterface;
use Yansongda\Pay\Logger;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Provider\Wechat;
use Yansongda\Pay\Request;
use Yansongda\Pay\Rocket;
abstract class GeneralPlugin implements PluginInterface
{
/**
* @throws \Yansongda\Pay\Exception\ServiceNotFoundException
* @throws \Yansongda\Pay\Exception\ContainerException
* @throws \Yansongda\Pay\Exception\ContainerDependencyException
*/
public function assembly(Rocket $rocket, Closure $next): Rocket
{
Logger::info('[wechat][GeneralPlugin] 通用插件开始装载', ['rocket' => $rocket]);
$rocket->setRadar($this->getRequest($rocket));
$this->doSomething($rocket);
Logger::info('[wechat][GeneralPlugin] 通用插件装载完毕', ['rocket' => $rocket]);
return $next($rocket);
}
/**
* @throws \Yansongda\Pay\Exception\ContainerDependencyException
* @throws \Yansongda\Pay\Exception\ContainerException
* @throws \Yansongda\Pay\Exception\ServiceNotFoundException
*/
protected function getRequest(Rocket $rocket): RequestInterface
{
return new Request(
$this->getMethod(),
$this->getUrl($rocket),
$this->getHeaders(),
);
}
protected function getMethod(): string
{
return 'POST';
}
/**
* @throws \Yansongda\Pay\Exception\ContainerDependencyException
* @throws \Yansongda\Pay\Exception\ContainerException
* @throws \Yansongda\Pay\Exception\ServiceNotFoundException
*/
protected function getUrl(Rocket $rocket): string
{
$config = get_wechat_config($rocket->getParams());
return Wechat::URL[$config->get('mode', Pay::MODE_NORMAL)].
$this->getUri($rocket);
}
protected function getHeaders(): array
{
return [
'Content-Type' => 'application/json',
];
}
abstract protected function doSomething(Rocket $rocket): void;
abstract protected function getUri(Rocket $rocket): string;
}
```
支付宝和微信的 `QueryPlugin``GeneralPlugin` 有些许不一样不过都是为了高度抽象出支付运营商的API。
通过微信官方文档,我们知道,查询订单的 API 将传参中的 url 是随参数变化而变化的,因此我们抽象出了 `getUri` 等方法,方便做各种请求上的调整。
## 通用插件
Pay 内部已经集成了很多通用插件,如 加密,签名,调用支付宝/微信接口等。
只需要简单的使用以下代码即可获取通用插件
```php
$allPlugins = Pay::alipay()->mergeCommonPlugins([QueryPlugin::class]);
```
## 最终调用
在拿到所有的插件之后,就可以愉快的进行调用获取最后的数据了。
```php
$result = Pay::alipay()->pay($allPlugins, $params);
```
代码中的 `$params` 为调用 API 所需要的其它参数。

View File

@ -0,0 +1,90 @@
# 🚀Rocket
yansongda/pay 将 `输入参数`、`请求`、`原始响应`、`最终响应` 抽象成了一种类型 `Rocket`
在 Pay 项目中,所有的数据扭转都是通过 Rocket 来实现的。
`Rocket` 也是由不同的属性组成的,现一一道来
## 📡 Radar
可以理解为是 🚀 的 `雷达`,负责导航使用。
该属性,实际上最终为一个 `\Psr\Http\Message\RequestInterface` 对象,
具体到项目,默认情况下,就是 `\Yansongda\Pay\Request`
所有需要请求支付供应商 API 的方法,最终都会使用这个 📡 ,去调用 http 接口请求支付供应商的 API。
## 🛠 Params
该属性为 `array`,实际存储的就是输入的所有参数。
例如 查询退款 中的
```php
[
'out_trade_no' => '1514027114',
'out_request_no' => '1514027114',
'_type' => 'refund',
];
```
Pay 项目中,将所有以 _下划线_ 开始的参数都定义为 `特殊参数`,此类参数 **一定不会在 payload 中出现**
仅会用于特殊参数判断。
## ⚙️ Payload
该属性类型为 `\Yansongda\Supports\Collection`,是 🚀 的 `有效载荷`
实际存储的是所有需要请求给支付供应商的所有参数。
:::warning
注意payload 和 params 是不一样的params 存储的是原封不动的输入参数payload 是经过一系列插件 "过滤" 后的 有效载荷。
:::
## 🗝 Direction
🚀 的方向。
实际的作用为:把控最终请求需要解包的类型
例如,支付宝电脑支付中,其最终返回的是一个 `Response` 对象,不需要直接后端 http 请求支付宝接口的,
所以当使用支付宝电脑支付时,其 Direction 为 `Yansongda\Pay\Parser\ResponseParser::class`
绝大多数情况下,均默认为:`Yansongda\Pay\Parser\CollectionParser::class`
## 🌟 Destination
🚀 的目的地。
实际作用为:最终返回的类
`Destination``Direction` 密切相关。 `Direction` 直接决定这 `Destination` 的值和类型。
- 当 Direction 为 CollectionParser 时
Destination 最终返回的是 Collection 对象
- 当 Direction 为 ResponseParser 时
Destination 最终返回的是 Response 对象
- 当 Direction 为 ArrayParser 时
Destination 最终返回的是 array 数组
- 当 Direction 为 JsonParser 时
Destination 最终返回的是 string
- 当 Direction 为 NoHttpRequestParser 时
Destination 最终返回的是 原样的 Radar
- 当 Direction 为 OriginResponseParser 时
Destination 最终返回的是 Rocket 中的 DestinationOrigin
## ✨ DestinationOrigin
🚀 的原始目的地。
实际作用为:当请求支付供应商的 http 接口后的原始 Response

View File

@ -0,0 +1,53 @@
# 💤快捷方式
Shortcut 即快捷方式,是一系列 Plugin 的组合,方便我们使用 Pay。
## 定义
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Contract;
interface ShortcutInterface
{
/**
* @author yansongda <me@yansongda.cn>
*
* @return \Yansongda\Pay\Contract\PluginInterface[]|string[]
*/
public function getPlugins(array $params): array;
}
```
## 详细说明
以我们刚刚在 [插件Plugin](/docs/v3/kernel/plugin.md) 中的例子来说明,
支付宝电脑支付,其实也是一种 快捷方式
```php
<?php
declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Alipay\Shortcut;
use Yansongda\Pay\Contract\ShortcutInterface;
use Yansongda\Pay\Plugin\Alipay\HtmlResponsePlugin;
use Yansongda\Pay\Plugin\Alipay\Trade\PagePayPlugin;
class WebShortcut implements ShortcutInterface
{
public function getPlugins(array $params): array
{
return [
PagePayPlugin::class,
HtmlResponsePlugin::class,
];
}
}
```
是不是灰常简单?

View File

@ -0,0 +1,91 @@
# 事件
在支付过程中,可能会想监听一些事件,好同时处理一些其它任务。
SDK 使用 [symfony/event-dispatcher](https://github.com/symfony/event-dispatcher) 组件进行事件的相关操作。
在使用之前,需要先确保安装了 `symfony/event-dispatcher` 组件,如果没有,请安装
```shell
composer require symfony/event-dispatcher
```
## 使用
::: tip
使用事件系统前,确保已初始化 pay。即调用了 `Pay::config($config)`
:::
```php
<?php
use Yansongda\Pay\Event;
use Yansongda\Pay\Event\PayStarted;
// 1. 新建一个监听器
class PayStartedListener
{
public function sendEmail(PayStarted $event)
{
// 可以直接通过 $event 获取事件的额外数据,例如:
// 支付传递的参数:$event->params
// coding to send email...
}
}
// 2. 添加监听器
Event::addListener(PayStarted::class, [new PayStartedListener(), 'sendEmail']);
// 3. 喝杯咖啡
```
## 事件
### 支付开始
- 事件类Yansongda\Pay\Event\PayStarted
- 说明:此事件将在支付进入核心流程时进行抛出。此时 SDK 只进行了相关初始化操作,其它所有操作均未开始。
- 额外数据:
- $rocket (相关参数)
- $plugins (所有使用的插件)
- $params (传递的原始参数)
### 支付完毕
- 事件类Yansongda\Pay\Event\PayFinish
- 说明:此事件将在所有参数处理完毕时抛出。
- 额外数据:
- $rocket (相关参数)
### 开始调用API
- 事件类Yansongda\Pay\Event\ApiRequesting
- 说明:此事件将在请求支付方的 API 前抛出。
- 额外数据:
- $rocket (相关参数)
### 调用API结束
- 事件类Yansongda\Pay\Event\ApiRequested
- 说明:此事件将在请求支付方的 API 完成之后抛出。
- 额外数据:
- $rocket (相关参数)
### 收到通知
- 事件类Yansongda\Pay\Event\CallbackReceived
- 说明:此事件将在收到支付方的请求(通常在异步通知或同步通知)时抛出
- 额外数据:
- $provider (支付机构)
- $contents (收到的数据)
- $params (自定义数据)
### 调用其它方法
- 事件类Yansongda\Pay\Event\MethodCalled
- 说明:此事件将在调用除 PAYMETHOD 方法(例如,查询订单,退款,取消订单)时抛出
- 额外数据:
- $provider (支付机构)
- $name (调用方法)
- $params (参数)

37
web/docs/v3/others/faq.md Normal file
View File

@ -0,0 +1,37 @@
# FAQ
1. 支付宝支付成功,但是对返回数据验签老是失败。
绝大部分问题都是配置问题,首先请确认 **正确填写了支付宝公钥(注意不是应用公钥)**
如果还没解决,请参考 github 的 issue[https://github.com/yansongda/pay/issues/73](https://github.com/yansongda/pay/issues/73)
如果仍然没解决,请检查您所使用的框架是否对 get/post 数据进行了增加,请自行处理好 Nginx/Apache 对框架的 URL 重写问题
2. 我是做 API 的,怎样可以获取 Response 中的内容?
返回的 Response 中,`(string) $response->getBody()` 可获取内容。详细请了解 PSR 规范。
3. cURL error 60: SSL certificate problem: unable to get local issuer certificate
服务器环境配置问题。
请参考 [https://github.com/yansongda/pay/issues/16](https://github.com/yansongda/pay/issues/16)
4. 是否支持其他支付平台?比如:银联、京东。
由于使用限制,暂不支持。
**欢迎 PR**
5. 支付宝是否支持 AES 等加密方式?
因为支付宝推荐 RSA2 ,所以不推荐也不支持除 **RSA2** 以外的任何加密方式!
6. 微信支付报错 Prepay Response Error: Missing PrepayId
预下单 失败了,一般是缺少参数或参数类型错误。可以自己捕获异常,看微信提示的详细信息,对照微信官方文档修改相关参数。
7. Get Wechat Public Cert Error
检查微信商户密钥mch_secret_key非 v2 秘钥

View File

@ -0,0 +1,46 @@
# 日志系统
## 配置
### 使用内置日志系统
:::tip
使用前,请确保已经安装了 `monolog/monolog`: `composer require monolog/monolog`
:::
SDK 自带日志系统,如果需要指定日志文件或日志级别,请 config 中传入下列参数。
如果不传入,则日志系统默认不启用。
```php
'logger' => [
'enable' => true,
'file' => './logs/pay.log', // 请注意权限
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily daily 时将按时间自动划分文件.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
```
### 使用外部日志系统
yansongda/pay 支持使用外部日志系统,只需要日志规范支持 PSR3 规范,实现了 `\Psr\Log\LoggerInterface` 即可。
```php
use Yansongda\Pay\Contract\LoggerInterface;
// $logger = 你的日志系统
Pay::set(LoggerInterface::class, $logger);
```
## 使用
:::tip
使用日志功能前,请先确认已经使用过支付等功能进行了初始化!
:::
```php
use Yansongda\Pay\Logger;
Logger::debug('Paying...', $order->all());
```

View File

@ -0,0 +1,7 @@
# 商业与企业服务
如果您有商业或企业技术支持服务的需求,以便您更轻松的使用 Pay您可以将您的需求信息整理好后发邮件给我如果合适我会及时联系您。
:::tip
我的联系方式: me@yansongda.cn
:::

View File

@ -0,0 +1,23 @@
# 线上交流
:::danger 注意
进群前请仔细看文档,文档相对来说已经很详细了。
没有人义务回答你的问题,没有人欠你的,所以线上交流请文明用语,首先学会智慧提问、友好交流。
:::
## Issue
[https://github.com/yansongda/pay/issues](https://github.com/yansongda/pay/issues)
## Discuss
[https://github.com/yansongda/pay/discussions](https://github.com/yansongda/pay/discussions)
## QQ 群
:::warning
资金原因,仅提供 500 人群,请仔细阅读文档后,按需加入
:::
群号690027516

View File

@ -0,0 +1,7 @@
# 参与开发
由于测试及使用环境的限制,本项目中只开发了「支付宝」和「微信支付」的相关支付网关。
如果您有其它支付网关的需求,或者发现本项目中需要改进的代码,**_欢迎 Fork 并提交 PR_**
参与开发前,请先仔细阅读 [核心架构](/docs/v3/kernel/rocket.md) 以便了解相关核心思想。

View File

@ -0,0 +1,43 @@
# 捐赠
Pay 项目采用 MIT 协议开源发布,任何人均可在遵循 MIT 协议的情况下随意使用。
但维护一个开源项目对于我来说并不容易,需要耗费大量时间、精力、财力。
如果这个项目给您带来了方便,希望您赞助开发与可持续性发展。
如果您愿意,请联系我,您的公司/个人赞助将展现在本页面上。
:::tip
我的联系方式: me@yansongda.cn
:::
## 赏一杯瑞幸吧
![pay](/images/pay.jpg)
## 不完全名单
### 企业
[![jetbrains](/images/jetbrains.png)](https://www.jetbrains.com/)
### 个人
排名按时间顺序
| 昵称 | 姓名 | 金额/用途 |
| ---- | ---- | --------- |
| 醒醒吧 | **平 | ¥10.00 |
| Akun | - | 提供微信支付测试资源帮助测试 |
| - | *坤 | ¥10.00 |
| - | *爆 | ¥66.00 |
| - | *洲 | ¥10.00 |
| - | *友 | ¥300.00 |
| 一杯小蓝 | *彦 | ¥16.80 |
| u*e | - | ¥11.00 |
| N*s | - | ¥10.00 |
| *虫 | - | ¥100.00 |
| - | **波 | ¥10.00 |
| *※ | - | ¥8.88 |
| 往** | - | ¥19.80 |
| 建*u | - | ¥17.60 |

View File

@ -0,0 +1,3 @@
# 更新记录
see: [CHANGELOG.md](https://github.com/yansongda/pay/blob/master/CHANGELOG.md) 或 [Release](https://github.com/yansongda/pay/releases)

View File

@ -0,0 +1,141 @@
# 支付宝快速入门
在初始化完毕后,就可以直接方便的享受 `yansongda/pay` 带来的便利了。
## 网页支付
```php
Pay::config($this->config);
return Pay::alipay()->web([
'out_trade_no' => ''.time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 1',
]);
```
## H5支付
```php
Pay::config($this->config);
return Pay::alipay()->wap([
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
'quit_url' => 'https://yansongda.cn',
]);
```
## APP 支付
```php
Pay::config($this->config);
return Pay::alipay()->app([
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
]);
```
## 小程序支付
```php
Pay::config($this->config);
$result = Pay::alipay()->mini([
'out_trade_no' => time().'',
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
'buyer_id' => '2088622190161234',
]);
return $result->get('trade_no'); // 支付宝交易号
// return $result->trade_no;
```
## 刷卡支付
```php
Pay::config($this->config);
$result = Pay::alipay()->pos([
'out_trade_no' => time(),
'auth_code' => '284776044441477959',
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
]);
```
## 扫码支付
```php
Pay::config($this->config);
$result = Pay::alipay()->scan([
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 01',
]);
return $result->qr_code; // 二维码 url
```
## 转账
```php
Pay::config($this->config);
$result = Pay::alipay()->transfer([
'out_biz_no' => '202106051432',
'trans_amount' => '0.01',
'product_code' => 'TRANS_ACCOUNT_NO_PWD',
'biz_scene' => 'DIRECT_TRANSFER',
'payee_info' => [
'identity' => 'ghdhjw7124@sandbox.com',
'identity_type' => 'ALIPAY_LOGON_ID',
'name' => '沙箱环境'
],
]);
```
## 退款
```php
Pay::config($this->config);
$result = Pay::alipay()->refund([
'out_trade_no' => '1623160012',
'refund_amount' => '0.01',
]);
```
## 查询订单
```php
Pay::config($this->config);
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = Pay::alipay()->find($order);
```
## 支付宝回调处理
```php
Pay::config($this->config);
$result = Pay::alipay()->callback();
```
## 响应支付宝回调
```php
Pay::config($this->config);
return Pay::alipay()->success();
```

View File

@ -0,0 +1,150 @@
# 初始化
初始化有两种方式,大家可根据自己的习惯选择合适的方式。
SDK 一旦初始化后,底层使用单例模式保存配置信息,所以,每次使用只需初始化一次即可,无需多次,后续重复初始化将不会生效
当然,您也可以使用 `_force` 参数强制初始化覆盖原来的配置项。
假设有以下配置文件:
```php
$config = [
'alipay' => [
'default' => [
// 必填-支付宝分配的 app_id
'app_id' => '2016082000295641',
// 必填-应用私钥 字符串或路径
'app_secret_cert' => 'MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCDRjOg5DnX+8L+rB8d2MbrQ30Z7JPM4hiDhawHSwQCQ7RlmQNpl6b/N6IrPLcPFC1uii179U5Il5xTZynfjkUyJjnHusqnmHskftLJDKkmGbSUFMAlOv+NlpUWMJ2A+VUopl+9FLyqcV+XgbaWizxU3LsTtt64v89iZ2iC16H6/6a3YcP+hDZUjiNGQx9cuwi9eJyykvcwhDkFPxeBxHbfwppsul+DYUyTCcl0Ltbga/mUechk5BksW6yPPwprYHQBXyM16Jc3q5HbNxh3660FyvUBFLuVWIBs6RtR2gZCa6b8rOtCkPQKhUKvzRMlgheOowXsWdk99GjxGQDK5W4XAgMBAAECggEAYPKnjlr+nRPBnnNfR5ugzH67FToyrU0M7ZT6xygPfdyijaXDb2ggXLupeGUOjIRKSSijDrjLZ7EQMkguFHvtfmvcoDTDFaL2zq0a3oALK6gwRGxOuzAnK1naINkmeOmqiqrUab+21emEv098mRGbLNEXGCgltCtz7SiRdo/pgIPZ1wHj4MH0b0K2bFG3xwr51EyaLXKYH4j6w9YAXXsTdvzcJ+eRE0Yq4uGPfkziqg8d0xXSEt90HmCGHKo4O2eh1w1IlBcHfK0F6vkeUAtrtAV01MU2bNoRU147vKFxjDOVBlY1nIZY/drsbiPMuAfSsodL0hJxGSYivbKTX4CWgQKBgQDd0MkF5AIPPdFC+fhWdNclePRw4gUkBwPTIUljMP4o+MhJNrHp0sEy0sr1mzYsOT4J20hsbw/qTnMKGdgy784bySf6/CC7lv2hHp0wyS3Es0DRJuN+aTyyONOKGvQqd8gvuQtuYJy+hkIoHygjvC3TKndX1v66f9vCr/7TS0QPywKBgQCXgVHERHP+CarSAEDG6bzI878/5yqyJVlUeVMG5OXdlwCl0GAAl4mDvfqweUawSVFE7qiSqy3Eaok8KHkYcoRlQmAefHg/C8t2PNFfNrANDdDB99f7UhqhXTdBA6DPyW02eKIaBcXjZ7jEXZzA41a/zxZydKgHvz4pUq1BdbU5ZQKBgHyqGCDgaavpQVAUL1df6X8dALzkuqDp9GNXxOgjo+ShFefX/pv8oCqRQBJTflnSfiSKAqU2skosdwlJRzIxhrQlFPxBcaAcl0VTcGL33mo7mIU0Bw2H1d4QhAuNZIbttSvlIyCQ2edWi54DDMswusyAhHxwz88/huJfiad1GLaLAoGASIweMVNuD5lleMWyPw2x3rAJRnpVUZTc37xw6340LBWgs8XCEsZ9jN4t6s9H8CZLiiyWABWEBufU6z+eLPy5NRvBlxeXJOlq9iVNRMCVMMsKybb6b1fzdI2EZdds69LSPyEozjkxdyE1sqH468xwv8xUPV5rD7qd83+pgwzwSJkCgYBrRV0OZmicfVJ7RqbWyneBG03r7ziA0WTcLdRWDnOujQ9orhrkm+EY2evhLEkkF6TOYv4QFBGSHfGJ0SwD7ghbCQC/8oBvNvuQiPWI8B+00LwyxXNrkFOxy7UfIUdUmLoLc1s/VdBHku+JEd0YmEY+p4sjmcRnlu4AlzLxkWUTTg==',
// 必填-应用公钥证书 路径
'app_public_cert_path' => '/Users/yansongda/pay/cert/appCertPublicKey_2016082000295641.crt',
// 必填-支付宝公钥证书 路径
'alipay_public_cert_path' => '/Users/yansongda/pay/cert/alipayCertPublicKey_RSA2.crt',
// 必填-支付宝根证书 路径
'alipay_root_cert_path' => '/Users/yansongda/pay/cert/alipayRootCert.crt',
'return_url' => 'https://yansongda.cn/alipay/return',
'notify_url' => 'https://yansongda.cn/alipay/notify',
// 选填-第三方应用授权token
'app_auth_token' => '',
// 选填-服务商模式下的服务商 id当 mode 为 Pay::MODE_SERVICE 时使用该参数
'service_provider_id' => '',
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
'mode' => Pay::MODE_NORMAL,
]
],
'wechat' => [
'default' => [
// 必填-商户号,服务商模式下为服务商商户号
'mch_id' => '',
// 必填-商户秘钥
'mch_secret_key' => '',
// 必填-商户私钥 字符串或路径
'mch_secret_cert' => '',
// 必填-商户公钥证书路径
'mch_public_cert_path' => '',
// 必填
'notify_url' => 'https://yansongda.cn/wechat/notify',
// 选填-公众号 的 app_id
'mp_app_id' => '2016082000291234',
// 选填-小程序 的 app_id
'mini_app_id' => '',
// 选填-app 的 app_id
'app_id' => '',
// 选填-合单 app_id
'combine_app_id' => '',
// 选填-合单商户号
'combine_mch_id' => '',
// 选填-服务商模式下,子公众号 的 app_id
'sub_mp_app_id' => '',
// 选填-服务商模式下,子 app 的 app_id
'sub_app_id' => '',
// 选填-服务商模式下,子小程序 的 app_id
'sub_mini_app_id' => '',
// 选填-服务商模式下子商户id
'sub_mch_id' => '',
// 选填-微信公钥证书路径, optional强烈建议 php-fpm 模式下配置此参数
'wechat_public_cert_path' => [
'45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
],
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE
'mode' => Pay::MODE_NORMAL,
]
],
'logger' => [
'enable' => false,
'file' => './logs/alipay.log',
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
];
```
## 初始化方式
### 方式一
直接调用 `config` 方法初始化
```php
Pay::config($config);
```
如果需要强制初始化覆盖配置信息
```php
Pay::config(array_merge($config, ['_force' => true]));
```
### 方式二
在每次实际调用时顺便初始化
```php
Pay::alipay($config)->web($order);
```
如果需要强制初始化覆盖配置信息
```php
Pay::alipay(array_merge($config, ['_force' => true]))->web($order);
```
## 配置切换
v3.x 版本开始,支持了多租户功能,所以,不同租户有不同的配置项,如果想要在使用时切换配置项怎么办呢?
其实很简单,传参时,加一个参数即可: `'_config' => 'default'`
例如,我们想在查询支付宝支付订单时,使用另外一个租户的配置文件
```php
Pay::config($this->config);
$order = [
'out_trade_no' => '1514027114',
'_config' => 'default', // 注意这一行
];
$result = Pay::alipay()->find($order);
```
## 关于微信公钥证书
微信支付公钥证书主要用于微信支付响应消息时的验签动作。
例如,当请求给微信支付服务器时,微信支付接收到请求会作出响应,系统在接收到响应后,需要验证这个响应是不是微信支付服务器官方发出的,以防止欺诈,这个验证的动作,就会使用到微信公钥证书。
关于微信公钥证书的详细介绍可以参考[微信官方文档](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml)
::: tip 常驻进程模式
如果您在 Swoole 等常驻进程下使用 Pay那您无需再配置 `wechat_public_cert_path` 参数Pay 会自动帮你搞定一切:从微信服务器获取最新证书并自动缓存配置。
:::
::: warning PHP-FPM 模式
如果您在 php-fpm 进程下使用 Pay强烈建议您手动配置 `wechat_public_cert_path` 参数。当然,您也可以不用配置,不过,您每次支付将从微信服务器获取最新的证书并验证,这将有性能上的损耗。
:::

View File

@ -0,0 +1,104 @@
# 安装
## 运行环境
- PHP 7.3+ (v3.1.0 开始需 7.4+)
- composer
## 安装总结
对于绝大多数用户而言,您只需要记住以下两个原则即可:
### hyperf/laravel 用户
```shell
composer require yansongda/pay:~3.1.0 -vvv
composer require guzzlehttp/guzzle:^7.0 # 默认情况下,此包框架已自带,无需额外安装
```
### 其它框架/无框架 用户
```shell
composer require yansongda/pay:~3.1.0 -vvv
composer require guzzlehttp/guzzle:^7.0
composer require php-di/php-di -W
```
## 详细安装介绍
```shell
composer require yansongda/pay:~3.1.0 -vvv
```
由于 `yansongda/pay` 支持 PSR2、PSR3、PSR4、PSR7、PSR11、PSR14、PSR18 等各项标准,因此这里额外介绍下 PSR-11、PSR-18 的安装与使用。
### 关于 ContainerPSR-11
::: tip
如果您看不懂这部分内容:
1、hyperf/laravel 用户直接忽略此部分内容;
2、其它用户包括 thinkphp 用户)在安装完 `Pay` 后直接无脑 `composer require php-di/php-di` 即可
:::
#### hyperf/laravel 用户
`Pay` 会自动复用框架内的 Container, 无需您任何额外操作。
#### 其它框架/无框架 用户
如果您不想操心那么多SDK 自带了一套开箱即用的 Container但仍然需要手动安装 php-di:
```shell
composer require php-di/php-di
```
如果您所使用的框架内有符合 `PSR-11``Container`,您需要在初始化 **之前**(即,调用 `Pay::config()` 方法之前)执行以下代码即可复用现有的 `Container`:
```php
use Yansongda\Pay\Pay;
use Yansongda\Pay\Contract\HttpClientInterface;
// $container = 您现有的 container
// 方法一:
Pay::setContainer($container);
Pay::config($config);
// 方法二:
Pay::config($config, function () use ($container) {
return $container;
});
```
### 关于 Guzzlehttp (PSR-18)
::: tip
如果您看不懂这部分内容:
在安装完 `Pay` 后直接无脑 `composer require guzzlehttp/guzzle:^7.0` 即可
:::
#### 使用默认的 Client
SDK 自带了一套开箱即用的 HTTP 客户端,但仍然需要手动安装 Guzzlehttp:
```shell
composer require guzzlehttp/guzzle:^7.0
```
#### 现有框架有 PSR-18 的 Client
如果您所使用的框架内有符合 `PSR-18``HTTP Client`,您需要在初始化 **之后**(即,调用 `Pay::config()` 方法后)执行以下代码即可复用现有的 `Client`:
```php
use Yansongda\Pay\Pay;
use Yansongda\Pay\Contract\HttpClientInterface;
// $client = 您现有的 http client
Pay::config($config);
Pay::set(HttpClientInterface::class, $client);
```

View File

@ -0,0 +1,62 @@
# 返回格式
通过 `yansongda/pay` 调用任何方法最终只可能返回三种格式
- `\Psr\Http\Message\MessageInterface`
- `\Yansongda\Supports\Collection`
- `array`
其中 `\Psr\Http\Message\MessageInterface` 最终 实例/接口 为
- `\GuzzleHttp\Psr7\Response`
:::tip
至于最终返回的到底是什么类型,和不同的方法而定
:::
## MessageInterface
### `\GuzzleHttp\Psr7\Response`
支付宝中
- `app()` APP 支付
- `web()` web 支付
- `wap()` wap 支付
- `success()` 响应回调
微信中
- `success()` 响应回调
均返回此类,在支持 PSR7 的框架中均可直接返回响应请求
:::tip Laravel 框架
laravel 框架中,自行安装 `symfony/psr-http-message-bridge` 即可支持返回相关响应数据
:::
:::warning ThinkPHP 框架
ThinkPHP 框架在 [https://github.com/top-think/framework/pull/2614](https://github.com/top-think/framework/pull/2614) 之后才支持 PSR7 规范,因此,之前的版本需要参考此 PR 自行解包进行处理返回数据
:::
## Collection
默认情况下,支付宝、微信所有 API 调用场景下绝大多数方法最终都返回的是 `Collection` 实例。
例如常用的「退款」「转账」「小程序支付」等。
`Collection` 类提供了常用的快捷方法,具体 API 可参考源代码 [yansongda/supports](https://github.com/yansongda/supports)
## array
API 调用场景下的返回类型,`array` 和 `Collection` 是可以自定义的,默认情况下均返回 `Collection` 实例。
如果想返回 array 类型的数据,只需要
```php
use Yansongda\Pay\Contract\ParserInterface;
use Yansongda\Pay\Parser\ArrayParser;
Pay::set(ParserInterface::class, ArrayParser::class);
```
是不是很简单方便?

View File

@ -0,0 +1,132 @@
# 微信快速入门
在初始化完毕后,就可以直接方便的享受 `yansongda/pay` 带来的便利了。
:::tip
`yansongda/pay` v3.x 版本直接支持 微信支付v3 版本,关于微信支付 v2/v3 版本区别,请参考[官方文档](https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml)
:::
## 公众号支付
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
'payer' => [
'openid' => 'onkVf1FjWS5SBxxxxxxxx',
],
];
$result = Pay::wechat()->mp($order);
// 返回 Collection 实例。包含了调用 JSAPI 的所有参数如appIdtimeStampnonceStrpackagesignTypepaySign 等;
// 可直接通过 $result->appId, $result->timeStamp 获取相关值。
// 后续调用不在本文档讨论范围内,请自行参考官方文档。
```
## 手机网站支付
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
'scene_info' => [
'payer_client_ip' => '1.2.4.8',
'h5_info' => [
'type' => 'Wap',
]
],
];
return Pay::wechat()->wap($order);
```
## APP 支付
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
];
// 将返回 json 格式,供后续 APP 调用,调用方式不在本文档讨论范围内,请参考官方文档。
return Pay::wechat()->app($order);
```
## 扫码支付
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
];
$result = Pay::wechat()->scan($order);
// 二维码内容: $qr = $result->code_url;
```
## 小程序
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
'currency' => 'CNY',
],
'payer' => [
'openid' => '123fsdf234',
]
];
$result = Pay::wechat()->mini($order);
// 返回 Collection 实例。包含了调用 JSAPI 的所有参数如appIdtimeStampnonceStrpackagesignTypepaySign 等;
// 可直接通过 $result->appId, $result->timeStamp 获取相关值。
// 后续调用不在本文档讨论范围内,请自行参考官方文档。
```
## 刷卡支付
:::warning
微信支付 v3 版 api 并不支持刷卡支付,后续将接入微信支付 v2 版 API敬请期待。如果确实有此需求可以使用 [Pay 的 v2 版](/docs/v2/wechat/)
:::
## 账户转账
:::warning
微信支付 v3 版 api 并不支持转账,后续将接入微信支付 v2 版 API敬请期待。如果确实有此需求可以使用 [Pay 的 v2 版](/docs/v2/wechat/)
:::
## 普通红包
:::warning
微信支付 v3 版 api 并不支红包,后续将接入微信支付 v2 版 API敬请期待。如果确实有此需求可以使用 [Pay 的 v2 版](/docs/v2/wechat/)
:::
## 裂变红包
:::warning
微信支付 v3 版 api 并不支持红包,后续将接入微信支付 v2 版 API敬请期待。如果确实有此需求可以使用 [Pay 的 v2 版](/docs/v2/wechat/)
:::

79
web/docs/v3/sidebar.js Normal file
View File

@ -0,0 +1,79 @@
exports = module.exports = [
{
text: '概述',
collapsible: true,
items: [
{ text: '线上交流', link: '/docs/v3/overview/communication'},
{ text: '捐赠', link: '/docs/v3/overview/donate'},
{ text: '参与开发', link: '/docs/v3/overview/contribute'},
{ text: '更新记录', link: '/docs/v3/overview/versions'},
{ text: '商业与企业服务', link: '/docs/v3/overview/business'}
]
},
{
text: '快速入门',
collapsible: true,
items: [
{ text: '安装', link: '/docs/v3/quick-start/install'},
{ text: '初始化', link: '/docs/v3/quick-start/init'},
{ text: '支付宝', link: '/docs/v3/quick-start/alipay'},
{ text: '微信', link: '/docs/v3/quick-start/wechat'},
{ text: '返回格式', link: '/docs/v3/quick-start/return-format'}
]
},
{
text: '支付宝',
collapsible: true,
items: [
{ text: '支付', link: '/docs/v3/alipay/pay'},
{ text: '查询', link: '/docs/v3/alipay/find'},
{ text: '退款', link: '/docs/v3/alipay/refund'},
{ text: '关闭', link: '/docs/v3/alipay/close'},
{ text: '取消', link: '/docs/v3/alipay/cancel'},
{ text: '接收回调', link: '/docs/v3/alipay/callback'},
{ text: '确认回调', link: '/docs/v3/alipay/response'},
{ text: '更多便捷插件', link: '/docs/v3/alipay/more'},
]
},
{
text: '微信',
collapsible: true,
items: [
{ text: '支付', link: '/docs/v3/wechat/pay'},
{ text: '查询', link: '/docs/v3/wechat/find'},
{ text: '退款', link: '/docs/v3/wechat/refund'},
{ text: '关闭', link: '/docs/v3/wechat/close'},
{ text: '取消', link: '/docs/v3/wechat/cancel'},
{ text: '接收回调', link: '/docs/v3/wechat/callback'},
{ text: '确认回调', link: '/docs/v3/wechat/response'},
{ text: '更多便捷插件', link: '/docs/v3/wechat/more'}
]
},
{
text: '核心架构',
collapsible: true,
items: [
{ text: '🚀 Rocket', link: '/docs/v3/kernel/rocket'},
{ text: '🧪 Pipeline', link: '/docs/v3/kernel/pipeline'},
{ text: '🔌 Plugin', link: '/docs/v3/kernel/plugin'},
{ text: '💤 Shortcut', link: '/docs/v3/kernel/shortcut'}
]
},
{
text: '其它',
collapsible: true,
items: [
{ text: '事件', link: '/docs/v3/others/event'},
{ text: '日志', link: '/docs/v3/others/logger'},
{ text: 'FAQ', link: '/docs/v3/others/faq'},
]
},
{
text: '升级指南',
collapsible: true,
items: [
{ text: 'v3.1 升级指南', link: '/docs/v3/upgrade/v3.1'},
{ text: 'v3.0 升级指南', link: '/docs/v3/upgrade/v3.0'}
]
}
]

View File

@ -0,0 +1,28 @@
# v3.0 升级指南
## 配置文件调整
v3.0 版本由于支持了多租户,所以配置文件有所调整。
请参考 [初始化](/docs/v3/quick-start/init.md) 调整您的配置文件。
## 初始化方式调整(非必须,但推荐)
此项非必须,但是强烈推荐您更改调整
同样参考 [初始化](/docs/v3/quick-start/init.md) 的 **方式一** 调整您的配置初始化。
## 更改版本号
将 composer.json 的 yansongda/pay 版本号更改为 `~3.0.0`,随后 `composer update` 即可。
## break-change
见 [发布说明](/docs/v3/overview/versions.md)
## 微信API问题
v3.0 版本开始Pay 使用微信 v3.0 API因此 v3.0 API 中不支持的操作Pay v3.0 也不会支持,可以参考微信支付官方文档或 [https://github.com/yansongda/pay/issues/473](https://github.com/yansongda/pay/issues/473)
如果你强依赖微信支付中 v2 版本的API建议保持 Pay v2 版本不做升级操作

View File

@ -0,0 +1,25 @@
# v3.1 升级指南
## PHP 最低版本
v3.1 将 PHP 最低版本由 7.3 提高到了 7.4
## 更改版本号
将 composer.json 的 yansongda/pay 版本号更改为 `~3.1.0`,随后 `composer update` 即可。
## PSR-11 和 PSR-18
### hyperf/laravel 用户
无需任何操作
### 其它框架/无框架 用户
如果您使用其它框架 或 未使用任何框架,需额外执行以下命令:
```shell
composer require php-di/php-di
```
关于此部分的说明,可以额外查阅 [安装](/docs/v3/quick-start/install.md) 部分

View File

@ -0,0 +1,40 @@
# 接收回调
| 方法名 | 参数 | 返回值 |
|:--------:|:------------------------------:|:----------:|
| callback | 无/array/ServerRequestInterface | Collection |
## 例子
```php
Pay::config($this->config);
// 是的,你没有看错,就是这么简单!
$result = Pay::wechat()->callback();
```
## 参数
### 第一个参数
#### `null`
如果您没有传参,则 `yansongda/pay` 会自动识别微信的回调请求并进行验签解密处理,通过 `Collection` 实例返回微信的处理参数
:::warning
建议仅在 php-fpm 下使用swoole 方式请使用 `ServerRequestInterface` 参数传递方式
:::
#### `ServerRequestInterface`
推荐在 swoole 环境下传递此参数,传递此参数后, yansongda/pay 会自动进行后续处理
#### `array`
也可以自行解析请求参数,传递一个 array 会自动进行后续处理
### 第二个参数
第二个参数主要是传递相关自定义变量的,类似于 `web()` 中的 `_config` / `_method` 等参数。
例如,如果你想在回调的时候使用非默认配置,则可以 `Pay::wechat()->callback(null, ['_config' => 'yansongda'])` 切换为 `yansongda` 这个租户的配置信息。

View File

@ -0,0 +1,9 @@
# 取消订单
:::danger
微信官方无此 API请调用 close 关闭订单。
:::
## 异常
Yansongda\Pay\Exceptions\InvalidParamsException

View File

@ -0,0 +1,24 @@
# 关闭订单
| 方法名 | 参数 | 返回值 |
|:-----:|:-------------------:|:----------:|
| close | string/array $order | Collection |
## 例子
```php
Pay::config($config);
$order = [
'out_trade_no' => '1514027114',
];
// $order = '1514027114';
$result = Pay::wechat()->close($order);
```
## 订单配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_3.shtml),查看「请求参数」一栏。

View File

@ -0,0 +1,61 @@
# 查询订单
| 方法名 | 参数 | 返回值 |
|:----:|:-------------------:|:----------:|
| find | string/array $order | Collection |
## 查询支付订单
```php
Pay::config($config);
$order = [
'transaction_id' => '1217752501201407033233368018',
];
// $order = '1217752501201407033233368018';
$result = Pay::wechat()->find($order);
```
## 查询退款订单
```php
Pay::config($config);
$order = [
'transaction_id' => '1217752501201407033233368018',
'_type' => 'refund'
];
$result = Pay::wechat()->find($order);
```
## 查询合单支付订单
```php
Pay::config($config);
$order = [
'combine_out_trade_no' => '1217752501201407033233368018',
];
//$order = [
// 'transaction_id' => '1217752501201407033233368018',
// '_type' => 'combine',
//];
$result = Pay::wechat()->find($order);
```
## 订单配置参数
### 查询支付订单
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml),查看「请求参数」一栏。
### 查询退款订单
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_10.shtml),查看「请求参数」一栏。
### 查询合单支付订单
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_11.shtml),查看「请求参数」一栏。

244
web/docs/v3/wechat/more.md Normal file
View File

@ -0,0 +1,244 @@
# 更多方便的插件
得益于 yansongda/pay 的基础架构和良好的插件机制,
您可以自有的使用任何内置插件和自定义插件调用支付宝的任何 API。
诸如签名、API调用、解密、验签、解包等基础插件已经内置在 Pay 中,
您可以使用 `Pay::wechat()->mergeCommonPlugins(array $plugins)` 来获取调用 API 所必须的常用插件
首先,查找你想使用的插件,然后
```php
Pay::config($config);
$params = [
'transaction_id' => '1217752501201407033233368018',
];
$allPlugins = Pay::wechat()->mergeCommonPlugins([QueryPlugin::class]);
$result = Pay::wechat()->pay($allPlugins, $params);
```
关于插件的详细介绍,如果您感兴趣,可以参考 [这篇说明文档](/docs/v3/kernel/plugin.md)
## 资金应用-分账
### 添加分账接收方
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\AddReceiverPlugin`
### 请求分账
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\CreatePlugin`
### 删除分账接收方
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\DeleteReceiverPlugin`
### 查询剩余待分金额
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\QueryAmountsPlugin`
### 查询分账结果
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\QueryPlugin`
### 查询分账回退结果
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\QueryReturnPlugin`
### 请求分账回退
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\ReturnPlugin`
### 解冻剩余资金
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\UnfreezePlugin`
### 查询最大分账比例
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\QueryMerchantConfigsPlugin`
### 下载账单
- `Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\DownloadBillPlugin`
## 资金应用-转账到零钱
### 发起批量转账
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\CreatePlugin`
### 微信批次单号查询批次单
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\QueryBatchIdPlugin`
### 微信明细单号查询明细单
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\QueryBatchDetailIdPlugin`
### 商家批次单号查询批次单
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\QueryOutBatchNoPlugin`
### 商家明细单号查询明细单
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\QueryOutBatchDetailNoPlugin`
### 转账电子回单申请受理
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\CreateBillReceiptPlugin`
### 查询转账电子回单
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\QueryBillReceiptPlugin`
### 转账明细电子回单受理
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\CreateDetailReceiptPlugin`
### 查询转账明细电子回单受理结果
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\QueryBillReceiptPlugin`
### 下载电子回单
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\DownloadReceiptPlugin`
### 查询转账明细电子回单受理结果
- `\Yansongda\Pay\Plugin\Wechat\Fund\Transfer\QueryDetailReceiptPlugin`
### 查询账户实时余额
- `\Yansongda\Pay\Plugin\Wechat\Fund\Balance\QueryPlugin`
### 查询账户日终余额
- `\Yansongda\Pay\Plugin\Wechat\Fund\Balance\QueryDayEndPlugin`
## 营销工具-代金券
### 创建代金券批次
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\CreatePlugin`
### 暂停代金券批次
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\PausePlugin`
### 根据商户号查用户的券
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\QueryCouponDetailPlugin`
### 查询批次详情
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\QueryStockDetailPlugin`
### 查询代金券可用单品
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\QueryStockItemsPlugin`
### 查询代金券可用商户
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\QueryStockMerchantsPlugin`
### 下载批次退款明细
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\QueryStockRefundFlowPlugin`
### 条件查询批次列表
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\QueryStocksPlugin`
### 下载批次核销明细
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\QueryStockUseFlowPlugin`
### 根据商户号查用户的券
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\QueryUserCouponsPlugin`
### 重启代金券批次
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\RestartPlugin`
### 发放代金券批次
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\SendPlugin`
### 设置消息通知地址API
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\SetCallbackPlugin`
### 激活代金券批次
- `Yansongda\Pay\Plugin\Wechat\Marketing\Coupon\StartPlugin`
## 风险合规-消费者投诉
### 查询投诉单列表
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\QueryComplaintsPlugin`
### 查询投诉单详情
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\QueryComplaintDetailPlugin`
### 查询投诉协商历史
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\QueryComplaintNegotiationPlugin`
### 创建投诉通知回调地址
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\SetCallbackPlugin`
### 查询投诉通知回调地址
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\QueryCallbackPlugin`
### 更新投诉通知回调地址
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\UpdateCallbackPlugin`
### 删除投诉通知回调地址
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\DeleteCallbackPlugin`
### 回复用户
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\ResponseComplaintPlugin`
### 反馈处理完成
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\CompleteComplaintPlugin`
### 更新退款进度
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\UpdateRefundPlugin`
### 图片下载
- `Yansongda\Pay\Plugin\Wechat\Risk\Complaints\DownloadMediaPlugin`
## 服务商-行业方案
### 电商收付通(退款)
#### 申请退款
- `Yansongda\Pay\Plugin\Wechat\Ecommerce\Refund\ApplyPlugin`
#### 查询退款
- `Yansongda\Pay\Plugin\Wechat\Ecommerce\Refund\FindPlugin`
#### 查询垫付回补结果
- `Yansongda\Pay\Plugin\Wechat\Ecommerce\Refund\FindReturnAdvancePlugin`
#### 垫付退款回补
- `Yansongda\Pay\Plugin\Wechat\Ecommerce\Refund\ReturnAdvancePlugin`

249
web/docs/v3/wechat/pay.md Normal file
View File

@ -0,0 +1,249 @@
# 支付
微信支付目前直接内置支持 7 种快捷方式支付方法,对应的支付 method 如下:
| method | 说明 | 参数 | 返回值 |
|:------:|:------:|:------------:|:----------:|
| mp | 公众号支付 | array $order | Collection |
| wap | 手机网站支付 | array $order | Collection |
| app | APP 支付 | array $order | Collection |
| scan | 扫码支付 | array $order | Collection |
| mini | 小程序支付 | array $order | Collection |
## 公众号支付
### 例子
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
'payer' => [
'openid' => 'onkVf1FjWS5SBxxxxxxxx',
],
];
$result = Pay::wechat()->mp($order);
// 返回 Collection 实例。包含了调用 JSAPI 的所有参数如appIdtimeStampnonceStrpackagesignTypepaySign 等;
// 可直接通过 $result->appId, $result->timeStamp 获取相关值。
// 后续调用不在本文档讨论范围内,请自行参考官方文档。
```
:::warning 调起微信支付 timeStamp 参数问题
[微信支付](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml) 和 [微信](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#58) 两个文档所需要的参数不一致,微信支付中是 timeStamp, 微信调起的参数是 timestamp需要自行处理。
:::
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`appid``sign` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml),查看「请求参数」一栏。
## 手机网站支付
### 例子
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
'scene_info' => [
'payer_client_ip' => '1.2.4.8',
'h5_info' => [
'type' => 'Wap',
]
],
];
return Pay::wechat()->wap($order);
// $result->h5_url;
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_1.shtml),查看「请求参数」一栏。
### 调用支付
后续调起支付不再本文档讨论范围内,请参考[官方文档](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_4.shtml)
### 其它
#### 使用小程序的 app_id 关联 h5 支付
默认情况下H5 支付所使用的 appid 是微信公众号的 appid即配置文件中的 mp_app_id 参数,如果想使用关联的小程序的 appid则只需要在调用参数中增加 `['_type' => 'mini']` 即可,例如:
```php
$order = [
'_type' => 'mini', // 注意这一行
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
'scene_info' => [
'payer_client_ip' => '1.2.4.8',
'h5_info' => [
'type' => 'Wap',
]
],
];
```
## APP 支付
### 例子
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
];
// 将返回 Collection 实例,供后续 APP 调用,调用方式不在本文档讨论范围内,请参考官方文档。
return Pay::wechat()->app($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml),查看「请求参数」一栏。
### 调用支付
后续调起支付不再本文档讨论范围内,请参考[官方文档](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml)
## 扫码支付
### 例子
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
];
$result = Pay::wechat()->scan($order);
// 二维码内容: $qr = $result->code_url;
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml),查看「请求参数」一栏。
### 调用支付
后续调起支付不再本文档讨论范围内,请参考[官方文档](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_4.shtml)
## 小程序
### 例子
```php
Pay::config($config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
'currency' => 'CNY',
],
'payer' => [
'openid' => '123fsdf234',
]
];
$result = Pay::wechat()->mini($order);
// 返回 Collection 实例。包含了调用 JSAPI 的所有参数如appIdtimeStampnonceStrpackagesignTypepaySign 等;
// 可直接通过 $result->appId, $result->timeStamp 获取相关值。
// 后续调用不在本文档讨论范围内,请自行参考官方文档。
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`trade_type``appid``sign` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml),查看「请求参数」一栏。
### 调用支付
后续调起支付不再本文档讨论范围内,请参考[官方文档](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml)
## 账户转账
### 例子
```php
Pay::config($config);
$order = [
'out_batch_no' => time().'',
'batch_name' => 'subject-测试',
'batch_remark' => 'test',
'total_amount' => 1,
'total_num' => 1,
'transfer_detail_list' => [
[
'out_detail_no' => time().'-1',
'transfer_amount' => 1,
'transfer_remark' => 'test',
'openid' => 'MYE42l80oelYMDE34nYD456Xoy',
// 'user_name' => '闫嵩达' // 明文传参即可sdk 会自动加密
],
],
];
$result = Pay::wechat()->transfer($order);
```
### 订单配置参数
**所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`appid``sign` 等参数,大家只需传入订单类主观参数即可。
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transfer/chapter3_1.shtml),查看「请求参数」一节。
## 刷卡支付
:::warning
微信支付 v3 版 api 并不支持刷卡支付,后续将接入微信支付 v2 版 API敬请期待。如果确实有此需求可以使用 [Pay 的 v2 版](/docs/v2/wechat/)
:::
## 普通红包
:::warning
微信支付 v3 版 api 并不支红包,后续将接入微信支付 v2 版 API敬请期待。如果确实有此需求可以使用 [Pay 的 v2 版](/docs/v2/wechat/)
:::
## 裂变红包
:::warning
微信支付 v3 版 api 并不支持红包,后续将接入微信支付 v2 版 API敬请期待。如果确实有此需求可以使用 [Pay 的 v2 版](/docs/v2/wechat/)
:::

View File

@ -0,0 +1,28 @@
# 退款
| 方法名 | 参数 | 返回值 |
|:------:|:------------:|:----------:|
| refund | array $order | Collection |
## 退款操作
```php
Pay::config($config);
$order = [
'out_trade_no' => '1514192025',
'out_refund_no' => time(),
'amount' => [
'refund' => 1,
'total' => 1,
'currency' => 'CNY',
],
];
$result = Pay::wechat()->refund($order);
```
## 订单配置参数
所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_9.shtml),查看「请求参数」一栏。

View File

@ -0,0 +1,19 @@
# 确认回调
| 方法名 | 参数 | 返回值 |
|:-------:|:---:|:--------:|
| success | 无 | Response |
## 例子
```php
Pay::config($config);
// $result = Pay::wechat()->callback();
return Pay::wechat()->success();
```
## 订单配置参数

18
web/index.md Normal file
View File

@ -0,0 +1,18 @@
---
layout: home
title: Pay - 让支付开发更简单
features:
- title: 简洁至上
details: 让我们用最少的代码写最复杂的功能,把更多时间花在游戏上。
- title: 集成最新API
details: 集成支付宝、微信最新API与时俱进不用担心老代码没人维护了。
- title: 统一标准
details: 符合最新 PSR 标准,方便你集成到各种其他框架中,无惧束缚。
- title: 丰富的事件系统
details: 可以 hook 到绝大部分场景,自己的代码自己掌握。
- title: 命名不那么乱七八糟
details: 命名统一,终于可以不用记那些烂七八糟的名称了。
- title: 文件结构清晰
details: 文件结构清晰,架构明了,欢迎 PR。
---

13
web/package.json Normal file
View File

@ -0,0 +1,13 @@
{
"scripts": {
"docs:dev": "vitepress dev",
"docs:build": "vitepress build",
"docs:serve": "vitepress serve"
},
"devDependencies": {
"@types/node": "^18.7.8",
"sass": "^1.54.5",
"vitepress": "^1.0.0-alpha.9",
"vue": "^3.2.37"
}
}

BIN
web/public/images/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
web/public/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
web/public/images/logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
web/public/images/pay.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

727
web/yarn.lock Normal file
View File

@ -0,0 +1,727 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@algolia/autocomplete-core@1.7.1":
version "1.7.1"
resolved "https://registry.npmmirror.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz#025538b8a9564a9f3dd5bcf8a236d6951c76c7d1"
integrity sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==
dependencies:
"@algolia/autocomplete-shared" "1.7.1"
"@algolia/autocomplete-preset-algolia@1.7.1":
version "1.7.1"
resolved "https://registry.npmmirror.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz#7dadc5607097766478014ae2e9e1c9c4b3f957c8"
integrity sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==
dependencies:
"@algolia/autocomplete-shared" "1.7.1"
"@algolia/autocomplete-shared@1.7.1":
version "1.7.1"
resolved "https://registry.npmmirror.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz#95c3a0b4b78858fed730cf9c755b7d1cd0c82c74"
integrity sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==
"@algolia/cache-browser-local-storage@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz#d5b1b90130ca87c6321de876e167df9ec6524936"
integrity sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==
dependencies:
"@algolia/cache-common" "4.14.2"
"@algolia/cache-common@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/cache-common/-/cache-common-4.14.2.tgz#b946b6103c922f0c06006fb6929163ed2c67d598"
integrity sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==
"@algolia/cache-in-memory@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz#88e4a21474f9ac05331c2fa3ceb929684a395a24"
integrity sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==
dependencies:
"@algolia/cache-common" "4.14.2"
"@algolia/client-account@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/client-account/-/client-account-4.14.2.tgz#b76ac1ba9ea71e8c3f77a1805b48350dc0728a16"
integrity sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==
dependencies:
"@algolia/client-common" "4.14.2"
"@algolia/client-search" "4.14.2"
"@algolia/transporter" "4.14.2"
"@algolia/client-analytics@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/client-analytics/-/client-analytics-4.14.2.tgz#ca04dcaf9a78ee5c92c5cb5e9c74cf031eb2f1fb"
integrity sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==
dependencies:
"@algolia/client-common" "4.14.2"
"@algolia/client-search" "4.14.2"
"@algolia/requester-common" "4.14.2"
"@algolia/transporter" "4.14.2"
"@algolia/client-common@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.14.2.tgz#e1324e167ffa8af60f3e8bcd122110fd0bfd1300"
integrity sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==
dependencies:
"@algolia/requester-common" "4.14.2"
"@algolia/transporter" "4.14.2"
"@algolia/client-personalization@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/client-personalization/-/client-personalization-4.14.2.tgz#656bbb6157a3dd1a4be7de65e457fda136c404ec"
integrity sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==
dependencies:
"@algolia/client-common" "4.14.2"
"@algolia/requester-common" "4.14.2"
"@algolia/transporter" "4.14.2"
"@algolia/client-search@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.14.2.tgz#357bdb7e640163f0e33bad231dfcc21f67dc2e92"
integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==
dependencies:
"@algolia/client-common" "4.14.2"
"@algolia/requester-common" "4.14.2"
"@algolia/transporter" "4.14.2"
"@algolia/logger-common@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/logger-common/-/logger-common-4.14.2.tgz#b74b3a92431f92665519d95942c246793ec390ee"
integrity sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==
"@algolia/logger-console@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/logger-console/-/logger-console-4.14.2.tgz#ec49cb47408f5811d4792598683923a800abce7b"
integrity sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==
dependencies:
"@algolia/logger-common" "4.14.2"
"@algolia/requester-browser-xhr@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz#a2cd4d9d8d90d53109cc7f3682dc6ebf20f798f2"
integrity sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==
dependencies:
"@algolia/requester-common" "4.14.2"
"@algolia/requester-common@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/requester-common/-/requester-common-4.14.2.tgz#bc4e9e5ee16c953c0ecacbfb334a33c30c28b1a1"
integrity sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==
"@algolia/requester-node-http@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz#7c1223a1785decaab1def64c83dade6bea45e115"
integrity sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==
dependencies:
"@algolia/requester-common" "4.14.2"
"@algolia/transporter@4.14.2":
version "4.14.2"
resolved "https://registry.npmmirror.com/@algolia/transporter/-/transporter-4.14.2.tgz#77c069047fb1a4359ee6a51f51829508e44a1e3d"
integrity sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==
dependencies:
"@algolia/cache-common" "4.14.2"
"@algolia/logger-common" "4.14.2"
"@algolia/requester-common" "4.14.2"
"@babel/parser@^7.16.4":
version "7.18.11"
resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9"
integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==
"@docsearch/css@3.2.1", "@docsearch/css@^3.2.1":
version "3.2.1"
resolved "https://registry.npmmirror.com/@docsearch/css/-/css-3.2.1.tgz#c05d7818b0e43b42f9efa2d82a11c36606b37b27"
integrity sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==
"@docsearch/js@^3.2.1":
version "3.2.1"
resolved "https://registry.npmmirror.com/@docsearch/js/-/js-3.2.1.tgz#d6856fb6223c7a47091640264d5144d59806bc30"
integrity sha512-H1PekEtSeS0msetR2YGGey2w7jQ2wAKfGODJvQTygSwMgUZ+2DHpzUgeDyEBIXRIfaBcoQneqrzsljM62pm6Xg==
dependencies:
"@docsearch/react" "3.2.1"
preact "^10.0.0"
"@docsearch/react@3.2.1":
version "3.2.1"
resolved "https://registry.npmmirror.com/@docsearch/react/-/react-3.2.1.tgz#112ad88db07367fa6fd933d67d58421d8d8289aa"
integrity sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==
dependencies:
"@algolia/autocomplete-core" "1.7.1"
"@algolia/autocomplete-preset-algolia" "1.7.1"
"@docsearch/css" "3.2.1"
algoliasearch "^4.0.0"
"@esbuild/linux-loong64@0.14.54":
version "0.14.54"
resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
"@types/node@^18.7.8":
version "18.7.8"
resolved "https://registry.npmmirror.com/@types/node/-/node-18.7.8.tgz#6bbf2be6fbf9c187a5040d4277d24a06a18957a1"
integrity sha512-/YP55EMK2341JkODUb8DM9O0x1SIz2aBvyF33Uf1c76St3VpsMXEIW0nxuKkq/5cxnbz0RD9cfwNZHEAZQD3ag==
"@types/web-bluetooth@^0.0.15":
version "0.0.15"
resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.15.tgz#d60330046a6ed8a13b4a53df3813c44942ebdf72"
integrity sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==
"@vitejs/plugin-vue@^3.0.3":
version "3.0.3"
resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.0.3.tgz#7e3e401ccb30b4380d2279d9849281413f1791ef"
integrity sha512-U4zNBlz9mg+TA+i+5QPc3N5lQvdUXENZLO2h0Wdzp56gI1MWhqJOv+6R+d4kOzoaSSq6TnGPBdZAXKOe4lXy6g==
"@vue/compiler-core@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.37.tgz#b3c42e04c0e0f2c496ff1784e543fbefe91e215a"
integrity sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/shared" "3.2.37"
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-dom@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz#10d2427a789e7c707c872da9d678c82a0c6582b5"
integrity sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==
dependencies:
"@vue/compiler-core" "3.2.37"
"@vue/shared" "3.2.37"
"@vue/compiler-sfc@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz#3103af3da2f40286edcd85ea495dcb35bc7f5ff4"
integrity sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.37"
"@vue/compiler-dom" "3.2.37"
"@vue/compiler-ssr" "3.2.37"
"@vue/reactivity-transform" "3.2.37"
"@vue/shared" "3.2.37"
estree-walker "^2.0.2"
magic-string "^0.25.7"
postcss "^8.1.10"
source-map "^0.6.1"
"@vue/compiler-ssr@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz#4899d19f3a5fafd61524a9d1aee8eb0505313cff"
integrity sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==
dependencies:
"@vue/compiler-dom" "3.2.37"
"@vue/shared" "3.2.37"
"@vue/devtools-api@^6.2.1":
version "6.2.1"
resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz#6f2948ff002ec46df01420dfeff91de16c5b4092"
integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
"@vue/reactivity-transform@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz#0caa47c4344df4ae59f5a05dde2a8758829f8eca"
integrity sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.37"
"@vue/shared" "3.2.37"
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@vue/reactivity@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.37.tgz#5bc3847ac58828e2b78526e08219e0a1089f8848"
integrity sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==
dependencies:
"@vue/shared" "3.2.37"
"@vue/runtime-core@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.37.tgz#7ba7c54bb56e5d70edfc2f05766e1ca8519966e3"
integrity sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==
dependencies:
"@vue/reactivity" "3.2.37"
"@vue/shared" "3.2.37"
"@vue/runtime-dom@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz#002bdc8228fa63949317756fb1e92cdd3f9f4bbd"
integrity sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==
dependencies:
"@vue/runtime-core" "3.2.37"
"@vue/shared" "3.2.37"
csstype "^2.6.8"
"@vue/server-renderer@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.37.tgz#840a29c8dcc29bddd9b5f5ffa22b95c0e72afdfc"
integrity sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==
dependencies:
"@vue/compiler-ssr" "3.2.37"
"@vue/shared" "3.2.37"
"@vue/shared@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.37.tgz#8e6adc3f2759af52f0e85863dfb0b711ecc5c702"
integrity sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==
"@vueuse/core@^9.1.0":
version "9.1.0"
resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.1.0.tgz#f0fb13fd99768c0eb617169a2d2c1cbd5f5a52eb"
integrity sha512-BIroqvXEqt826aE9r3K5cox1zobuPuAzdYJ36kouC2TVhlXvFKIILgFVWrpp9HZPwB3aLzasmG3K87q7TSyXZg==
dependencies:
"@types/web-bluetooth" "^0.0.15"
"@vueuse/metadata" "9.1.0"
"@vueuse/shared" "9.1.0"
vue-demi "*"
"@vueuse/metadata@9.1.0":
version "9.1.0"
resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.1.0.tgz#194d4bd47f7acb91e348c0f436e678ddf7ee235b"
integrity sha512-8OEhlog1iaAGTD3LICZ8oBGQdYeMwByvXetOtAOZCJOzyCRSwqwdggTsmVZZ1rkgYIEqgUBk942AsAPwM21s6A==
"@vueuse/shared@9.1.0":
version "9.1.0"
resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.1.0.tgz#d8459a45324f32fb05a2a56ed754637c3d0efaeb"
integrity sha512-pB/3njQu4tfJJ78ajELNda0yMG6lKfpToQW7Soe09CprF1k3QuyoNi1tBNvo75wBDJWD+LOnr+c4B5HZ39jY/Q==
dependencies:
vue-demi "*"
algoliasearch@^4.0.0:
version "4.14.2"
resolved "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-4.14.2.tgz#63f142583bfc3a9bd3cd4a1b098bf6fe58e56f6c"
integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==
dependencies:
"@algolia/cache-browser-local-storage" "4.14.2"
"@algolia/cache-common" "4.14.2"
"@algolia/cache-in-memory" "4.14.2"
"@algolia/client-account" "4.14.2"
"@algolia/client-analytics" "4.14.2"
"@algolia/client-common" "4.14.2"
"@algolia/client-personalization" "4.14.2"
"@algolia/client-search" "4.14.2"
"@algolia/logger-common" "4.14.2"
"@algolia/logger-console" "4.14.2"
"@algolia/requester-browser-xhr" "4.14.2"
"@algolia/requester-common" "4.14.2"
"@algolia/requester-node-http" "4.14.2"
"@algolia/transporter" "4.14.2"
anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
body-scroll-lock@^4.0.0-beta.0:
version "4.0.0-beta.0"
resolved "https://registry.npmmirror.com/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz#4f78789d10e6388115c0460cd6d7d4dd2bbc4f7e"
integrity sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==
braces@~3.0.2:
version "3.0.2"
resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
"chokidar@>=3.0.0 <4.0.0":
version "3.5.3"
resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
glob-parent "~5.1.2"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.6.0"
optionalDependencies:
fsevents "~2.3.2"
csstype@^2.6.8:
version "2.6.20"
resolved "https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda"
integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
esbuild-android-64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
esbuild-android-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
esbuild-darwin-64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
esbuild-darwin-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
esbuild-freebsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
esbuild-freebsd-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
esbuild-linux-32@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
esbuild-linux-64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
esbuild-linux-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
esbuild-linux-arm@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
esbuild-linux-mips64le@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
esbuild-linux-ppc64le@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
esbuild-linux-riscv64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
esbuild-linux-s390x@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
esbuild-netbsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
esbuild-openbsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
esbuild-sunos-64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
esbuild-windows-32@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
esbuild-windows-64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
esbuild-windows-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
esbuild@^0.14.47:
version "0.14.54"
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
optionalDependencies:
"@esbuild/linux-loong64" "0.14.54"
esbuild-android-64 "0.14.54"
esbuild-android-arm64 "0.14.54"
esbuild-darwin-64 "0.14.54"
esbuild-darwin-arm64 "0.14.54"
esbuild-freebsd-64 "0.14.54"
esbuild-freebsd-arm64 "0.14.54"
esbuild-linux-32 "0.14.54"
esbuild-linux-64 "0.14.54"
esbuild-linux-arm "0.14.54"
esbuild-linux-arm64 "0.14.54"
esbuild-linux-mips64le "0.14.54"
esbuild-linux-ppc64le "0.14.54"
esbuild-linux-riscv64 "0.14.54"
esbuild-linux-s390x "0.14.54"
esbuild-netbsd-64 "0.14.54"
esbuild-openbsd-64 "0.14.54"
esbuild-sunos-64 "0.14.54"
esbuild-windows-32 "0.14.54"
esbuild-windows-64 "0.14.54"
esbuild-windows-arm64 "0.14.54"
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
dependencies:
to-regex-range "^5.0.1"
fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
has@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
function-bind "^1.1.1"
immutable@^4.0.0:
version "4.1.0"
resolved "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
dependencies:
binary-extensions "^2.0.0"
is-core-module@^2.9.0:
version "2.10.0"
resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed"
integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==
dependencies:
has "^1.0.3"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
jsonc-parser@^3.0.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d"
integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==
magic-string@^0.25.7:
version "0.25.9"
resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
dependencies:
sourcemap-codec "^1.4.8"
nanoid@^3.3.4:
version "3.3.4"
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
picomatch@^2.0.4, picomatch@^2.2.1:
version "2.3.1"
resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
postcss@^8.1.10, postcss@^8.4.16:
version "8.4.16"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c"
integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==
dependencies:
nanoid "^3.3.4"
picocolors "^1.0.0"
source-map-js "^1.0.2"
preact@^10.0.0:
version "10.10.6"
resolved "https://registry.npmmirror.com/preact/-/preact-10.10.6.tgz#1fe62aecf93974b64e6a42e09ba1f00f93207d14"
integrity sha512-w0mCL5vICUAZrh1DuHEdOWBjxdO62lvcO++jbzr8UhhYcTbFkpegLH9XX+7MadjTl/y0feoqwQ/zAnzkc/EGog==
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
dependencies:
picomatch "^2.2.1"
resolve@^1.22.1:
version "1.22.1"
resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
dependencies:
is-core-module "^2.9.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
"rollup@>=2.75.6 <2.77.0 || ~2.77.0":
version "2.77.3"
resolved "https://registry.npmmirror.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12"
integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==
optionalDependencies:
fsevents "~2.3.2"
sass@^1.54.5:
version "1.54.5"
resolved "https://registry.npmmirror.com/sass/-/sass-1.54.5.tgz#93708f5560784f6ff2eab8542ade021a4a947b3a"
integrity sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
shiki@^0.11.1:
version "0.11.1"
resolved "https://registry.npmmirror.com/shiki/-/shiki-0.11.1.tgz#df0f719e7ab592c484d8b73ec10e215a503ab8cc"
integrity sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==
dependencies:
jsonc-parser "^3.0.0"
vscode-oniguruma "^1.6.1"
vscode-textmate "^6.0.0"
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
sourcemap-codec@^1.4.8:
version "1.4.8"
resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
dependencies:
is-number "^7.0.0"
vite@^3.0.8:
version "3.0.9"
resolved "https://registry.npmmirror.com/vite/-/vite-3.0.9.tgz#45fac22c2a5290a970f23d66c1aef56a04be8a30"
integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==
dependencies:
esbuild "^0.14.47"
postcss "^8.4.16"
resolve "^1.22.1"
rollup ">=2.75.6 <2.77.0 || ~2.77.0"
optionalDependencies:
fsevents "~2.3.2"
vitepress@^1.0.0-alpha.9:
version "1.0.0-alpha.9"
resolved "https://registry.npmmirror.com/vitepress/-/vitepress-1.0.0-alpha.9.tgz#3426c8c6da2a63a811356f27e42fb9d521038aeb"
integrity sha512-+VxgjflIcssbuyUBRYjZRpQ8w25v6XnIbXFmm9qwLVaqZdC0rN6qViEp7oRwA3HUlrGxj7GEzqQjW7xj4+E83w==
dependencies:
"@docsearch/css" "^3.2.1"
"@docsearch/js" "^3.2.1"
"@vitejs/plugin-vue" "^3.0.3"
"@vue/devtools-api" "^6.2.1"
"@vueuse/core" "^9.1.0"
body-scroll-lock "^4.0.0-beta.0"
shiki "^0.11.1"
vite "^3.0.8"
vue "^3.2.37"
vscode-oniguruma@^1.6.1:
version "1.6.2"
resolved "https://registry.npmmirror.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607"
integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==
vscode-textmate@^6.0.0:
version "6.0.0"
resolved "https://registry.npmmirror.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210"
integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==
vue-demi@*:
version "0.13.8"
resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.8.tgz#5c568fb3b4d8f848acc658dfccd3d875035b5653"
integrity sha512-Vy1zbZhCOdsmvGR6tJhAvO5vhP7eiS8xkbYQSoVa7o6KlIy3W8Rc53ED4qI4qpeRDjv3mLfXSEpYU6Yq4pgXRg==
vue@^3.2.37:
version "3.2.37"
resolved "https://registry.npmmirror.com/vue/-/vue-3.2.37.tgz#da220ccb618d78579d25b06c7c21498ca4e5452e"
integrity sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==
dependencies:
"@vue/compiler-dom" "3.2.37"
"@vue/compiler-sfc" "3.2.37"
"@vue/runtime-dom" "3.2.37"
"@vue/server-renderer" "3.2.37"
"@vue/shared" "3.2.37"