个人开发者通过payjs接入微信支付
laravel
it书童
2020-02-18 13:44:59
0赞
0踩
4929阅读
0评论
个人网站要接入支付接口,微信支付无疑是首选,可是微信原生支付需要企业资质才能接入。由于我们只能借用第三方平台来实现,虽然多了些手续费,也是可接受的
本网站接入的第三方支付平台是 payJs,以下是关于如何在 laravel6 中接入 payJs 的完整 demo
环境准备
先按以下文章创建一个 laravel6 应用
然后,进入 payJs,注册成为会员,提交相关资料,当天就能审核通过
接着下载 payJs 官方扩展包 payjs-laravel
安装扩展包
$ composer require xhat/payjs-laravel
发布配置文件
$ php artisan vendor:publish --provider="Xhat\Payjs\PayjsServiceProvider"
在 .env
配置商户号
PAYJS_MCHID=商户号
PAYJS_KEY=密钥
将 config/payjs.php
修改为:
return [
'mchid' => env('PAYJS_MCHID'),
'key' => env('PAYJS_KEY'),
// 此地址一般无需更改
'api_url' => 'https://payjs.cn/api/',
];
生成订单表
生成订单 model,用于记录订单数据
$ php artisan make:model Models/Payment -m
在生成的迁移文件 *_create_payments_table
中定义字段:
public function up()
{
Schema::create('payments', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('trade_no')->comment('用户订单号');
$table->string('subject')->comment('订单简短描述');
$table->integer('amount')->comment('订单金额,单位:分');
$table->tinyInteger('is_paid')->default(0)->nullable()->comment('是否付款 0.否 1.是');
$table->timestamp('paid_at')->nullable()->comment('付款时间');
$table->timestamps();
});
}
执行迁移生成数据表:
$ php artisan migrate
将以下代码粘贴到 app/Models/Payment.php
class Payment extends Model
{
const PAY_NO = 0;
const PAY_YES = 1;
public static $payMap = [
self::PAY_NO => '否',
self::PAY_YES => '是',
];
protected $fillable = ['trade_no', 'is_paid', 'amount', 'subject'];
/**
* 是否已付款
* @return bool
*/
public function paid()
{
return $this->is_paid === Payment::PAY_YES;
}
}
定义路由
在 routes/web.php
添加以下关于支付的路由
// 调起支付表单
Route::get('/payment', 'HomeController@index')->name('paments.index');
// 写入支付订单,返回二维码
Route::post('/payment', 'PaymentController@store')->name('paments.index');
// 支付回调
Route::post('/payment/notify', 'PaymentController@notify')->name('payments.notify');
// 检查支付状态
Route::post('/payment/check', 'PaymentController@check')->name('payments.check');
支付控制器
生成控制器:
$ php artisan make:controller PaymentController
控制器包括以下逻辑
展示表单
用于展示前台页面,调起支付请求
public function index()
{
return view('payments.index', [
'price' => 1, // 单位为分
]);
}
生成订单
后端接收前台发起购买的请求,生成一个订单并返回支付二维码
public function store(Request $request)
{
$payment = Payment::create([
'trade_no' => time() . rand(9999, 100000),
'subject' => 'it书童付费文章订单',
'amount' => $request->price,
'is_paid' => Payment::PAY_NO,
]);
// 构造订单基础信息
$data = [
'body' => $payment->subject, // 订单标题
'total_fee' => $payment->amount, // 订单标题
'out_trade_no' => $payment->trade_no, // 订单号
'notify_url' => route('payments.notify'), // 异步通知地址
];
return Payjs::native($data);
}
异步回调
支付成功后,payJs 会请求我们设置的回调方法,需要在生产环境才能起作用,在回调方法中我们写具体的业务逻辑
public function notify()
{
$data = Payjs::notify();
// 记录回调的参数,用于调试
file_put_contents(public_path() . '/pay.txt', json_encode($data) . PHP_EOL, FILE_APPEND);
$payment = Payment::query()
->where('trade_no', $data['out_trade_no'])
->first();
if (is_null($payment)) {
exit();
}
if ($payment->paid()) {
exit();
}
if ($data['return_code'] == 1) {
$payment->is_paid = Payment::PAY_YES;
$payment->paid_at = now();
$payment->save();
return 'success';
}
}
检测支付状态
当用户在前端发起支付请求后,我们设置一个定时器轮循访问是否支付已成功,如果成功就自动刷新页面
public function check(Request $request)
{
$payment = Payment::query()->where('trade_no', $request->trade_no)->first();
if (is_null($payment)) {
return ['paid' => false];
}
if ($payment->paid()) {
return ['paid' => true];
}
return ['paid' => false];
}
构建前台表单
首先安装 sweetalert, 详情阅读 laravel 安装 sweetalert
然后创建 resources/views/payments/index.blade.php
文件,粘贴以下代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link href="{{ mix('css/app.css') }}" rel="stylesheet">
<title>payJs 支付 demo</title>
</head>
<body>
<div class="container mt-5">
<span class="mr-2">为保证文章质量,本文为...
- 上一篇: 胡斐那一刀究竟会不会劈下去
- 下一篇: 关于网站开通付费文章的尝试

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/442/personal-developers-access-wechat-payment-through-payjs
精品付费
个人开发者通过payjs接入微信支付
4929
0
这一次,真正掌握composer
2679
0
相关推荐
laravel隐性路由绑定
1176
0
laravel闪存flash
1116
0
laravel自定义404页面并给页面传值
1143
0
laravel用户认证
1338
0
laravel切换数据库
1308
0
laravel使用队列监控 Horizon
1910
0
laravel使用队列
2243
0
laravel-admin集成ueditor
1678
0
laravel N+1 问题捕杀神器
1401
0
使用 laravel6 创建应用
1451
0
laravel6路由
1132
0
laravel6事件
1098
0
laravel6图片上传
1290
0
laravel6生成并填充假数据
898
0
laravel 给路由命名加上前缀
1083
0