我们使用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不存在(因为已经执行).
但有时候一切顺利,没有任何问题或滞后.
我正在使用Laravel Passport来访问我的API的某些部分到第三方应用程序.
但是,我也通过自己的第一方原生Android应用程序使用自己的API.因此,在这种情况下,我查看整个互联网以获得最佳实践,但是仍然坚持得出结论.
以下是我发现的可能性:
我可以按照用户凭据密码授予流程.
在这种情况下,我需要传递一个client_secret和client_id授权服务器.为了保证他们的安全,我不能在我的移动应用程序的源代码中编写它们(APK可以解密...).
所以,我有两个选择.
在调用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)
使用中间件调用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个请求/秒.
为了重用代码,我在名为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) 在我的项目中,我在 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 种不同的资源,这不是我所期望的......
潜在的解决方法 …
我将Livewire和Alpine与Laravel 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) 我正在使用 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 …
我发现很多文章都在谈论如何将native native整合到现有的android应用程序中.但它们都没有解释如何从反应本机代码中获取结果,以便直接在Java android源代码中使用它.
解释:我有一个做出特定工作的本机应用程序,并在弹出窗口中显示结果.我想整合这个应用程序(进行必要的修改),以便能够将这个特定的结果导入我的Android Java源代码,而不是将其显示到反应原生弹出窗口中.
我搜索了所有的互联网,但没有发现这一点.
我曾经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
我使用带有样式的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。
所以,我minzoom从15改为10,并且我也interpolate将使用线性插值的东西从10改为15.05。
这是最终的代码:
map.addLayer({
'id': '3d-buildings',
'source': 'composite',
'source-layer': 'building', …Run Code Online (Sandbox Code Playgroud) 我的本地服务器上有 MySQL 和 Laravel,采用默认配置,时区是 GMT+2。
我没有触及 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:
显示 UTC (GMT+0) 时间 16:34。
现在我尝试更改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) 我有一个以自动增量 ID 作为主键的数据库表。
对于该表的每条记录,我最多可以有 3 个文件,这些文件可以公开,因此随机文件名生成不是强制性的,并且这些文件是可选的。
我想我有两种可能的解决方案:
将随机生成的文件名存储在 3 个可为空的 varchar 列中,并将所有文件存储在同一位置:
不要存储文件名,而是将它们放在特定的文件夹中,并以与主键值相同的名称命名:
通过最后一个解决方案,我知道uploads/a/1.jpg属于 记录ID 1,并且是类型为 的文件a。但我必须检查该文件是否存在,因为这些文件是可选的。
您认为这一切有什么好的做法吗?或者也许有更好的方法?
database database-design file-upload directory-structure file-storage
laravel ×6
php ×5
javascript ×3
alpine.js ×1
android ×1
curl ×1
database ×1
ecmascript-6 ×1
es6-modules ×1
file-storage ×1
file-upload ×1
frontend ×1
java ×1
laravel-5.4 ×1
laravel-mix ×1
mapbox ×1
mapbox-gl ×1
mapbox-gl-js ×1
mysql ×1
oauth-2.0 ×1
payment ×1
paypal ×1
php-carbon ×1
react-native ×1
sass ×1
security ×1
tinker ×1
validation ×1