yansongda / pay

可能是我用过的最优雅的 Alipay/WeChat/Unipay/江苏银行 的支付 SDK 扩展包了
http://pay.yansongda.cn
MIT License
4.98k stars 1.02k forks source link

在larave项目 自定义本扩展插件访问某接口 该如何自定义呢 例如访问阿里接口 ant.merchant.expand.indirect.image.upload #1005

Open mathuse opened 1 week ago

mathuse commented 1 week ago

Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like A clear and concise description of what you want to happen.

Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered.

Additional context Add any other context or screenshots about the feature request here.

yansongda commented 1 week ago

1、掌握原理

2、参考以下代码

mathuse commented 1 week ago

请问你的阿里接口是基于阿里的SDK还是自构建请求呢?因为对参数有不同要求 https://opendocs.alipay.com/open/028py4

mathuse commented 1 week ago

1、掌握原理

2、参考以下代码

请问你的阿里接口是基于阿里的SDK还是自构建请求呢?因为对参数有不同要求 https://opendocs.alipay.com/open/028py4

mathuse commented 1 week ago

我的是web 阿里支付通方案 里面有上传图片的接口 ant.merchant.expand.indirect.image.upload 我用的是laravel 框架 安装了你这个包,怎么重写才能比较好的实现自定义你的包的插件呢 例如在app/ 目录里自定义一个目录 Pluge 然后创建实现文件 uploadImage.php 有没有更完善的例子呢 谢谢

mathuse commented 1 week ago

怎么传图上来,图片提交上来,打不开。已经参照着插件代码例子做了,最后报错: 参数异常: [App\YansongdaPayCustomPlugins\Alipay\AlipayUploadImagePlugin] 插件未实现 PluginInterface 在调用 $result = app('alipay_zft')->pay($allPlugins, $params); 时出现

代码: 在app/YansongdaPayCustomPlugins/Alipay/ImageUploadPlugin.php <?php

// 支付宝接口 ant.merchant.expand.indirect.image.upload(图片上传)

// https://opendocs.alipay.com/open/028py4

// 注意: // 本接口为文件上传类接口,与普通OpenAPI接口的入参构造格式不同,如果您没有使用官方SDK发起OpenAPI调用,自行构造HTTP请求时, // 需要使用multipart/form-data格式发起请求,注意以下事项: // 1. 文件参数单独作为一个part,key为参数名,内容为文件,需要携带完整文件名(例如:Content-Disposition: form-data; // name="file_content"; filename="example.png"),缺少文件名或后缀,会提示为类型错误。 // 2. 其余参数,对于v2版本的协议,公共参数需要使用query传入,业务参数使用query或body传入,使用body时每个字段作为一个单独part; // v3协议需要按接口约定位置传入

declare(strict_types=1);

namespace App\YansongdaPayCustomPlugins\Alipay;

use Closure; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Direction\ResponseDirection; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\ServiceNotFoundException; use Yansongda\Artful\Logger; use Yansongda\Artful\Rocket; use Yansongda\Pay\Traits\SupportServiceProviderTrait;

class AlipayUploadImagePlugin implements PluginInterface { use SupportServiceProviderTrait;

/**
 * @throws ContainerException
 * @throws ServiceNotFoundException
 */
public function assembly(Rocket $rocket, Closure $next): Rocket
{
    Logger::debug('[Alipay][Pay][Web][UploadImagePlugin] 插件开始装载', ['rocket' => $rocket]);

    $this->loadAlipayServiceProvider($rocket);

    $rocket->setDirection(ResponseDirection::class)
        ->mergePayload([
            'charset' => 'utf-8',
            'sign_type' => 'RSA2', // 商户生成签名字符串所使用的签名算法类型
            'method' => 'ant.merchant.expand.indirect.image.upload',
            'biz_content' => $rocket->getParams(),
        ]);

    Logger::info('[Alipay][Pay][Web][UploadImagePlugin] 插件装载完毕', ['rocket' => $rocket]);

    return $next($rocket);
}

} 在vendor/yansongda/pay/src/Shortcut/Alipay/AppShortcut.php有:

declare(strict_types=1); namespace Yansongda\Pay\Shortcut\Alipay; use Yansongda\Artful\Contract\ShortcutInterface; use Yansongda\Artful\Plugin\ParserPlugin; use Yansongda\Pay\Plugin\Alipay\V2\AddPayloadSignaturePlugin; use Yansongda\Pay\Plugin\Alipay\V2\FormatPayloadBizContentPlugin; use Yansongda\Pay\Plugin\Alipay\V2\Pay\App\PayPlugin; use Yansongda\Pay\Plugin\Alipay\V2\ResponseInvokeStringPlugin; use Yansongda\Pay\Plugin\Alipay\V2\StartPlugin; use App\YansongdaPayCustomPlugins\Alipay\AlipayUploadImagePlugin; class AppShortcut implements ShortcutInterface { public function getPlugins(array $params): array { return [ StartPlugin::class, PayPlugin::class, FormatPayloadBizContentPlugin::class, AddPayloadSignaturePlugin::class, ResponseInvokeStringPlugin::class, ParserPlugin::class, AlipayUploadImagePlugin::class, ]; } }

mathuse commented 1 week ago

在vendor/yansongda/pay/src/Shortcut/Alipay/AppShortcut.php有:

declare(strict_types=1); namespace Yansongda\Pay\Shortcut\Alipay; use Yansongda\Artful\Contract\ShortcutInterface; use Yansongda\Artful\Plugin\ParserPlugin; use Yansongda\Pay\Plugin\Alipay\V2\AddPayloadSignaturePlugin; use Yansongda\Pay\Plugin\Alipay\V2\FormatPayloadBizContentPlugin; use Yansongda\Pay\Plugin\Alipay\V2\Pay\App\PayPlugin; use Yansongda\Pay\Plugin\Alipay\V2\ResponseInvokeStringPlugin; use Yansongda\Pay\Plugin\Alipay\V2\StartPlugin; use App\YansongdaPayCustomPlugins\Alipay\AlipayUploadImagePlugin; class AppShortcut implements ShortcutInterface { public function getPlugins(array $params): array { return [ StartPlugin::class, PayPlugin::class, FormatPayloadBizContentPlugin::class, AddPayloadSignaturePlugin::class, ResponseInvokeStringPlugin::class, ParserPlugin::class, AlipayUploadImagePlugin::class, ]; } }