小编Mar*_*arc的帖子

PHP Paypal Auth/Capture NVP集成故障

背景:

我们使用NVP集成和php-curl实现了Paypal授权和捕获流程.
完整的流程在PayPal开发者网站上有描述:https://developer.paypal.com/webapps/developer/docs/classic/express-checkout/ht_ec-singleAuthPayment-curl-etc/

在我们的网站上,当前的支付方案是:
- 首先,用户点击按钮发起支付授权,在PayPal网站上重定向他(具有payaction =授权的SetExpressCheckout)
- 如果用户成功确认PayPal网站上的付款,他被重定向到我们网站的特定成功页面
- 这个"成功页面" 从PayPal网站获取一个令牌和一个PayerID,然后我们调用GetExpressCheckoutDetails来检查状态和这个授权的数量
- 如果一切正常,我们告诉PayPal确认此授权(DoExpressCheckoutPayment with paymentaction = Authorization),我们获得一个授权ID存储到我们的数据库中
- 稍后,其他人可以使用我们存储的授权ID点击按钮来解决交易(DoCapture)

其他信息:

根据PayPal文档:

PayPal三天授予100%的授权资金
如果有未决的(未结算的)授权,买家和商家的账户将无法关闭
https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-导向/ authcapture /

在我们的网站上,如果授权在24小时内未得到解决,则授权将自动失效.(使用crontab)

问题:

最后一部分出现问题(当我们调用"确认"功能时):当用户点击"确认"按钮时,似乎有时卷曲请求花费时间从PayPal返回交易ID.
当发生这种情况时,用户通常关闭网页,PayPal确认授权(从而转账)但我们的网站没有得到通知,因为下面的代码(来自下面的"源代码"部分)尚未执行或达成:

if ($transaction_id) {
    /*
     * [...]
     * Everything is ok, payment has been performed
     * so we do everything to give our user what he asked for
     */
} else {
    // Error : No transaction id
}
Run Code Online (Sandbox Code Playgroud)

因为脚本在获得curl响应之前停止了.
此外,如果我们再次尝试点击该按钮,PayPal会告诉我们授权ID不存在(因为已经执行).

但有时候一切顺利,没有任何问题或滞后.

源代码: …

php payment curl paypal express-checkout

18
推荐指数
2
解决办法
629
查看次数

Laravel Passport为第一方应用授予Flow

我正在使用Laravel Passport来访问我的API的某些部分到第三方应用程序.

但是,我也通过自己的第一方原生Android应用程序使用自己的API.因此,在这种情况下,我查看整个互联网以获得最佳实践,但是仍然坚持得出结论.

以下是我发现的可能性:

可能性#01

我可以按照用户凭据密码授予流程.
在这种情况下,我需要传递一个client_secretclient_id授权服务器.为了保证他们的安全,我不能在我的移动应用程序的源代码中编写它们(APK可以解密...).

所以,我有两个选择.

可能性#01 - 选择A.

在调用oauth端点之前,通过我自己的服务器代理并注入秘密:

$proxy = Request::create('/oauth/token', 'post', [
    'grant_type' => 'password',
    'client_id' => 1,
    'client_secret' => 'myownclientsecretishere',
    'username' => $username,
    'password' => $password
]);
$proxy->headers->set('Accept', 'application/json');
$response = app()->handle($proxy);
Run Code Online (Sandbox Code Playgroud)

可能性#01 - 选择B.

使用中间件调用oauth端点时注入秘密:

class InjectPasswordGrantSecret
{
    public function handle($request, Closure $next)
    {
        $request->request->add([
            'client_id' => 1,
            'client_secret' => 'myownclientsecretishere'
        ]);
        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是工作示例,但它们在资源方面也很贪婪.我尝试在本地计算机上使用Apache基准测试,我得到了9个请求/秒.

可能性#02

我可以关注个人访问资助.
这个看起来不像OAuth2中 …

php security oauth-2.0 laravel laravel-passport

12
推荐指数
1
解决办法
1294
查看次数

Laravel 5.4 - 如何为同一个自定义验证规则使用多个错误消息

为了重用代码,我在名为ValidatorServiceProvider的文件中创建了自己的验证器规则:

class ValidatorServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Validator::extend('checkEmailPresenceAndValidity', function ($attribute, $value, $parameters, $validator) {
            $user = User::where('email', $value)->first();

            // Email has not been found
            if (! $user) {
                return false;
            }

            // Email has not been validated
            if (! $user->valid_email) {
                return false;
            }

            return true;
        });
    }

    public function register()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用这样的规则:

public function rules()
{
    return [
        'email' => 'bail|required|checkEmailPresenceAndValidity'
    ];
}
Run Code Online (Sandbox Code Playgroud)

但是,我想为每个案例设置不同的错误消息,如下所示:

if (! $user) {
    $WHATEVER_INST->error_message = 'email …
Run Code Online (Sandbox Code Playgroud)

php validation laravel laravel-5.4

10
推荐指数
3
解决办法
6728
查看次数

Laravel Blade、Mix 和 SASS 资源版本共享

在我的项目中,我在 SASS 和 Blade 中使用了一些资源(主要是图像)。另外,我有一些资源只在 SASS 中使用,有些只在 Blade 中使用。

例如,我可以mix('images/logo.png')在 Blade 文件和background: url('../images/logo.png')SASS 文件中使用。

至于我的目录结构,我做了以下事情:

- resources
    - js
    - sass
    - images  // All images used by Blade, Sass, or both
    - fonts
Run Code Online (Sandbox Code Playgroud)

为了编译我的资源并将它们放在public文件夹中,我使用以下内容webpack.mix.js

mix.copy('resources/images/**/*.*', 'public/images');
mix.copy('resources/fonts/**/*.*', 'public/fonts');
mix.version('public/images/**/*.*');
mix.version('public/fonts/**/*.*');

mix.js('resources/js/app.js', 'public/js')
    .js('resources/js/vendor.js', 'public/js')
    .scripts([ // Old not ES6 JS
        'resources/js/tpl/core.min.js'
    ], 'public/js/core.min.js')
    .sass('resources/sass/app.scss', 'public/css')
    .sourceMaps()
    .version();
Run Code Online (Sandbox Code Playgroud)

结果,我在 app.css 中得到了那个 URL:

background: url(/images/logo.png?0e567ce87146d0353fe7f19f17b18aca);
Run Code Online (Sandbox Code Playgroud)

虽然我在渲染的 HTML 中得到另一个:

src="/images/logo.png?id=4d4e33eae039c367c8e9"
Run Code Online (Sandbox Code Playgroud)

它们被视为 2 种不同的资源,这不是我所期望的......

潜在的解决方法 …

frontend sass laravel laravel-blade laravel-mix

10
推荐指数
1
解决办法
1555
查看次数

在 Livewire 中强制重新加载整页

我将LivewireAlpineLaravel 8一起使用。

我有一个带有数据表(jQuery)和引导模式的页面。
该表填充了模型实例列表中的一些数据。
当我单击表中的按钮时,它会打开模式并允许编辑相应的记录。
这部分正在按预期工作。

然而,Datatable库与 Livewire 一起使用要困难得多,因此我决定将整个Datatable的范围限制在<div>withwire:ignore属性中。
因此,如果我想在进行修改后刷新数据表$refresh,我无法使用魔法,因为数据表当前的范围位于wire:ignore.

所以我正在考虑在编辑完成后重新加载整页,但我不知道如何做到这一点,return redirect()->back()不起作用......

这就是我的save方法,当模态编辑完成时调用该方法:

public function save()
{
    MyModel::where('id', $this->edited_id)->update([...]);
    $this->clearSelection();
    return redirect()->back(); // This is not working
}
Run Code Online (Sandbox Code Playgroud)

这是我的桌子:

<div wire:ignore>
    <table class="dt-table table">
        <thead>
            <tr>
                <th>Actions</th>
                <th>id</th>
                <th>name</th>
                <th>other</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($models as $m)
                <tr>
                    <td>
                        <button type="button" class="btn btn-primary" data-toggle="modal" …
Run Code Online (Sandbox Code Playgroud)

laravel laravel-livewire alpine.js

9
推荐指数
2
解决办法
3万
查看次数

为什么使用默认导入而不是命名导入时我的 ES6 webpack 包更大?

我正在使用 OpenLayers 6 并使用以下符号导入库的部分内容:

import { Map, View } from 'ol';
import { Vector as VectorSource } from 'ol/source';
import { Vector as VectorLayer } from 'ol/layer';
// More in other files [...]
Run Code Online (Sandbox Code Playgroud)

运行时,我的项目npm run dev得到一个9MB 的文件。

出于测试目的,我尝试用默认导入替换这些命名导入:

import Map from 'ol/Map';
import View from 'ol/View';
import VectorSource from 'ol/source/Vector';
import VectorLayer from 'ol/layer/Vector';
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,它将我的捆绑文件减少到6MB!它的重量减轻了 33%,这是为什么呢?命名导入不应该只导入模块的必需部分吗?

编辑 1

在@Bergi 评论之后,该库可在此处获得。我使用通过npm以下方式安装的最新版本:v6.4.2

编辑 2

正如@felixmosh 的回答所指出的,跑步npm run prod似乎可以减少尺寸差异。我得到了1KB …

javascript ecmascript-6 es6-modules

8
推荐指数
1
解决办法
220
查看次数

从一个集成到现有Android应用程序的react本机应用程序中获取结果

我发现很多文章都在谈论如何将native native整合到现有的android应用程序中.但它们都没有解释如何从反应本机代码中获取结果,以便直接在Java android源代码中使用它.

解释:我有一个做出特定工作的本机应用程序,并在弹出窗口中显示结果.我想整合这个应用程序(进行必要的修改),以便能够将这个特定的结果导入我的Android Java源代码,而不是将其显示到反应原生弹出窗口中.

我搜索了所有的互联网,但没有发现这一点.

javascript java android react-native

7
推荐指数
1
解决办法
1042
查看次数

来自 Amazon Linux 2 (Elastic Beanstalk) 的 Laravel 工匠修补匠

我曾经tinker使用以下命令在以前的 Amazon AMI 上执行:

sudo -E -u webapp php artisan tinker
Run Code Online (Sandbox Code Playgroud)

现在我正在使用PHP 7.4 on Amazon Linux 2,当我执行上述命令时,出现此错误:

Unable to create PsySH runtime directory. Make sure PHP is able to write to /run/user/1000 in order to continue.
Run Code Online (Sandbox Code Playgroud)

所以,为了测试,我给了这个文件夹的完全权限,然后再次执行我的命令:

sudo chmod 777 /run/user/1000
sudo -E -u webapp php artisan tinker
Run Code Online (Sandbox Code Playgroud)

实际上,没有错误,但是诸如RDS_PASSWORD或之类的环境变量RDS_DB_NAME未加载,因此无法执行数据库操作:

Psy Shell v0.10.4 (PHP 7.4.4 — cli) by Justin Hileman
>>> env('RDS_DB_NAME')
 => null
>>> User::first()
 Illuminate/Database/QueryException with message 'SQLSTATE[HY000] [2002] Connection refused …
Run Code Online (Sandbox Code Playgroud)

php amazon-web-services laravel amazon-elastic-beanstalk tinker

7
推荐指数
1
解决办法
637
查看次数

MapboxGL JS - 以较低的缩放级别显示 3d 建筑物

我使用带有样式的MapboxGL JS v2mapbox://styles/mapbox/streets-v11
我使用此代码在我的地图上显示3D 建筑物

map.addLayer({
    'id': '3d-buildings',
    'source': 'composite',
    'source-layer': 'building',
    'filter': ['==', 'extrude', 'true'],
    'type': 'fill-extrusion',
    'minzoom': 15,
    'paint': {
        'fill-extrusion-color': '#666',
        'fill-extrusion-height': ['interpolate', ['linear'], ['zoom'], 15, 0, 15.05, ['get', 'height']],
        'fill-extrusion-base': ['interpolate', ['linear'], ['zoom'], 15, 0, 15.05, ['get', 'min_height']],
        'fill-extrusion-opacity': 0.9,
    }
});
Run Code Online (Sandbox Code Playgroud)

它按预期工作,如本例所示

现在,我想要的是以较低的缩放级别加载这些建筑物,例如10而不是15
所以,我minzoom15改为10,并且我也interpolate将使用线性插值的东西从10改为15.05

这是最终的代码:

map.addLayer({
    'id': '3d-buildings',
    'source': 'composite',
    'source-layer': 'building', …
Run Code Online (Sandbox Code Playgroud)

javascript mapbox mapbox-gl mapbox-gl-js

7
推荐指数
1
解决办法
247
查看次数

Laravel 和 MySQL 时间戳值随 mysqld 配置而变化

我的本地服务器上有 MySQL 和 Laravel,采用默认配置,时区是 GMT+2。

测试1

我没有触及 MySQL 配置中的任何内容,而是在数据库上尝试了一些操作:

SELECT CURRENT_TIMESTAMP, UTC_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

结果:

CURRENT_TIMESTAMP       UTC_TIMESTAMP
2020-06-09 16:34:58     2020-06-09 14:34:58
Run Code Online (Sandbox Code Playgroud)

现在,我想在 Laravel 中请求这个原始数据:

id  device_id   lat        lng          alt     at      created_at               updated_at
1   10          10.000000  10.000000    NULL    NULL    2020-06-09 16:21:55      2020-06-09 16:21:55
Run Code Online (Sandbox Code Playgroud)

这是我使用的测试php artisan tinker

测试1

显示 UTC (GMT+0) 时间 16:34。

测试2

现在我尝试更改mysql的配置(在/etc/mysql/mysql.conf.d/mysqld.cnf),我设置了这个配置:

default_time_zone='+00:00'
Run Code Online (Sandbox Code Playgroud)

我重新启动我的服务器:

sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)

然后我再次尝试与上面相同的测试:

CURRENT_TIMESTAMP       UTC_TIMESTAMP
2020-06-09 14:42:46     2020-06-09 14:42:46
Run Code Online (Sandbox Code Playgroud)

现在,原始数据显示出不同的情况(从 16 小时到 14 小时):

id  device_id   lat        lng          alt     at      created_at               updated_at …
Run Code Online (Sandbox Code Playgroud)

php mysql laravel php-carbon

5
推荐指数
1
解决办法
742
查看次数

我应该将上传的文件名存储在数据库中吗?

我有一个以自动增量 ID 作为主键的数据库表。

对于该表的每条记录,我最多可以有 3 个文件,这些文件可以公开,因此随机文件名生成不是强制性的,并且这些文件是可选的。

我想我有两种可能的解决方案:

  • 将随机生成的文件名存储在 3 个可为空的 varchar 列中,并将所有文件存储在同一位置:

    • 列:a | 乙| C
    • 上传/f6se54fse654.jpg
  • 不要存储文件名,而是将它们放在特定的文件夹中,并以与主键值相同的名称命名:

    • 上传/a/1.jpg
    • 上传/b/1.jpg
    • 上传/c/1.jpg

通过最后一个解决方案,我知道uploads/a/1.jpg属于 记录ID 1,并且是类型为 的文件a。但我必须检查该文件是否存在,因为这些文件是可选的。

您认为这一切有什么好的做法吗?或者也许有更好的方法?

database database-design file-upload directory-structure file-storage

4
推荐指数
1
解决办法
1941
查看次数