DouGinWai


  • 首页

  • 归档

简单使用Laravel队列

发表于 2019-07-31

需求

有一个需求需要将表格中的作品从oss服务器拉取下来,因为这个任务耗时较长,就想尝试一下laravel的异步队列的功能,用户请求拉取的时候,立即返回请求成功,拉取任务在服务器异步进行。

配置环境

.env文件中设置QUEUE_CONNECTION=database,设置队列驱动,这里使用的框架是laravel 5.8,不同版本配置不同,本文使用database。

下面迁移jobs数据表,待执行的任务会记录在该表中。

php artisan queue:table

php artisan migrate

创建任务

php artisan make:job DownloadPic

执行以上命令,会在app/jobs目录下生成一个队列的任务类,生成的类实现了 Illuminate\Contracts\Queue\ShouldQueue 接口,这意味着这个任务将会被推送到队列中,而不是同步执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;


class DownloadPic implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

private $list =[];

/**
* Create a new job instance.
*
* @return void
*/
public function __construct($list)
{
//
$this->list = $list;
}

/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
foreach($this->list as $item){
//执行耗时的任务
}
}
}

此任务类被调用默认执行handle()方法

分发任务

新建一个Controller,将调用方法分配给一个路由,执行任务类的dispatch方法分发任务。

1
2
3
4
5
6
public function download()
{
$list = StampDesign::get();
DownloadPic::dispatch($list);;
echo 'OK';
}

运行队列处理器

php artisan queue:work

执行该命令,开始持续监听队列

运行

访问download的路由,将下载任务推送到队列,队列处理器监听到队列的更新,将记录写在jobs表,执行队列任务,执行完成,删除jobs表中的已完成记录。

使用easywechat开发小程序支付

发表于 2019-01-16

准备工作

  1. 一个认证小程序
  2. 一个商户号

需要以上2个账号,开发小程序支付需要的这两个账号

一种流程是先申请小程序认证,通过认证后在小程序后台申请新的商户号,或者绑定现有商户号。

另外一种,先申请一个公众平台并且是服务号,必须服务号因为微信支付只支援服务号。服务号通过之后,左侧菜单栏有一个小程序管理模块,可以将服务号关联小程序,或者快速认证小程序。这里快速注册并认证小程序,可能就是使用服务号的认证资料,达到快速认证的效果。而且注册认证小程序和微信支付认证可以同步进行。对于需要公众号,小程序和商户号3个平台的,此流程会比较高效。

Example

2个账号开通之后

需要获得以下参数

1.小程序的appid

2.小程序的appsecret

3.小程序的token

4.商户号merchant_id

5.商户号key (自定义的32位数字字母组合)

开发代码

根据项目需要,引入相应的EasyWechat版本,以下以EasyWechat 3.1为示例

引入EasyWechat之后,先配置参数

1
2
3
4
5
6
7
8
9
10
11
12
13

protected function option()
{
return [
'app_id' => 'appid', //小程序APPid
'secret' => 'appsecret', //小程序appsecret
'payment' => [
'merchant_id' => 'mechant_id', //商户号
'key' => 'key', //商户号key
'notify_url' => 'http://www.abc.com/notify' //回调地址
]
];
}

支付代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public function pay()
{
$order_num = I('post.order_num', '');
//根据订单号获取订单详情 $orderDetail

$options = $this->option();//获取配置信息
$app = new \EasyWeChat\Foundation\Application($options);//使用配置信息创建app实例
$payment = $app->payment;
//支付体,填写支付信息
$attributes = [
'openid' => 'openid', //支付用户的openid
'trade_type' => 'JSAPI', //支付类型
'body' => 'iPhone X',
'detail' => 'iPhone X 金色 256G',
'out_trade_no' => $order_num,//支付的订单号,此号可与本地数据库订单号一致
'total_fee' => 100 //支付金额,单位分,1元即100
];
$order = new Order($attributes); //根据填写信息创建订单
$result = $payment->prepare($order); //预支付,检验支付信息等是否合法
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS') {
$prepayId = $result->prepay_id; //校验成功获得预支付id
$config = $payment->configForPayment($prepayId, false); //返回预支付结果,供前端调用支付
//支付成功后返回$config给前端
}
}

回调代码,回调接口是用户支付之后,由微信服务器通知支付结果的接口,这里返回的是xml格式的通知,开发者应该处理好通知结果,并及时反馈给微信服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

public function notify()
{
$options = $this->option(); //获取配置信息
$app = new \EasyWeChat\Foundation\Application($options);

$response = $app->payment->handleNotify(function ($notify, $successful) {
//这里由EasyWechat处理好xml格式通知后,将信息封装在$notify上
$order_num = $notify->out_trade_no; //获得支付时我们设定的交易订单号

// 下面是使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单 $orderDetail

if (!$orderDetail) { // 如果订单不存在 或者 订单已经支付过了
return "订单号:{$order_num} 订单不存在"; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
}
// 如果订单存在
// 检查订单是否已经更新过支付状态
if ($orderDetail['payment_status'] == 1) { // 假设订单字段“支付时间”不为空代表已经支付
return true; // 已经支付成功了就不再更新了
}
// 用户是否支付成功
if ($successful) {
// 此处 不是已经支付状态则修改为已经支付状态 更新支付时间为当前时间

} else { // 用户支付失败
}
return true; // 返回处理完成
});
$response->send();
}

first post

发表于 2018-03-23

first log

welcome

DouGinWai

3 日志
1 标签
RSS
© 2019 DouGinWai
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
PV UV page