微信小程序书简易支付
这里结合了上一篇的手机号登录接下来的实现功能
https://www.cnblogs.com/xiaoyantongxue/p/15472915.html
登录后进入课程选择页面
1:数据库填入数据
2:laravel创建控制器,模型,定义路由
控制器代码:
//书列表 public function index() { $data = Book::paginate(4); return ['code' => 00, 'meg' => 'ok', 'data' => $data]; }
模型代码:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Book extends Model { // protected $table='book'; public $timestamps=false; }
路由:
//书籍展示 Route::get('book','admin\BookController@index');
接下来,将数据发送至小程序端js页面
// pages/book/book.js Page({ /** * 页面的初始数据 */ data: { books:[] }, /** * 生命周期函数--监听页面加载 * 将book表数据渲染至小程序页面中 */ onLoad: function (options) { wx.request({ url: 'http://www.laravel7.com/book', //仅为示例,并非真实的接口地址 header: { 'content-type': 'application/json' // 默认值 }, success:res=> { // 数据渲染 let book=res.data.data.data; // 数据赋值 // console.log(book); this.setData({ books:book }) } }) }, // 点击支付触发事件: onclick(evt){ //获取参数book_id let book_id=evt.target.dataset.id; //获取参数书价格 let price=evt.target.dataset.price; wx.request({ url: 'http://www.laravel7.com/order', //仅为示例,并非真实的接口地址 header: { 'content-type': 'application/json' // 默认值 }, method:'POST', // 发送数据id和书名 data:{ book_id,price }, success:res=> { // 后端判断支付的书的数量是否书表中够 if(res.data.code==400){ wx.showToast({ title: '图书太少啦,再看看其他吧', }) } // 后端处理完成,进行订单支付页面,也就是支付宝支付页, if(res.data.code==200){ wx.switchTab({ url: '/pages/pay/pay', }) } } }) } })
小程序无法调用支付页面,所以跳转当支付点击后进入订单确认页面,进行浏览器复制地址进行支付,从而跳转 /pages/pay/pay
<!--pages/pay/pay.wxml-->
<text>
请复制以上网址进行支付
</text>
点击支付将价格,book_id,user_id发送至后台进行订单的生成:
路由:
Route::post('order','admin\BookController@order');
控制器方法:
// 支付订单 public function order(Request $request) { // 接受书id $book_id=$request->post('book_id'); // 接受书价格 $price=$request->post('price'); $params['book_id']=$book_id; $params['price']=$price; // 默认的用户id,这里我是 $params['user_id']=1; // 买的书籍,这里我也是默认买了一本 $num=1; // 生成订单 $order_no='bk'.date('YmdHis').sprintf("%'.09d",$params['user_id']).mt_rand(1000,9999); $params['order_no']=$order_no; // book表中的book_num -1 $bookinfo= Book::where('id',$params['book_id'])->first(); // 启动事务 DB::beginTransaction(); if ($bookinfo->book_num<$num){ return ['code' => 400, 'meg' => '图书太少啦', 'data' => ''] ; } try { //书籍表根据详情book_id将书数量减一 DB::table('book')->where('id',$book_id)->decrement('book_num',$num); //添加至订单表 Orders::create($params); // 事务提交 DB::commit(); return ['code' =>200, 'meg' => '确认订单页面', 'data' => '']; }catch (\Exception $e){ // 事务回滚 DB::rollBack(); return ['code' =>500, 'meg' => 'ok', 'data' => '']; } }
效果:
结合以上结果:
1:首先,在支付宝官方下载SDK和DEMO:
链接:
2:进行下载
3:下载下来将文件进行解压;并复制至Libs/alipay 目录下以方便与引入
4:实行代码参考:
小程序页面进行支付
<!--pages/pay/pay.wxml--> <text> 请复制以上网址进行支付 http://yan.311025.vip/pay/1, </text>
接下来们就是书写laravel路由
//同步 Route::get('async','admin\BookController@index'); //异步 Route::post('notify','admin\BookController@notify'); //进行支付 Route::get('pay/{id}','admin\BookController@pay');
然后控制器方法
<?php namespace App\Http\Controllers\admin; use App\Http\Controllers\Controller; use App\Libs\AlipayLip; use App\Models\Book; use App\Models\Orders; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Libs\alipay; class BookController extends Controller { //书列表 public function index() { $data = Book::paginate(4); return ['code' => 00, 'meg' => 'ok', 'data' => $data]; } // 支付订单 public function order(Request $request) { // 接受书id $book_id = $request->post('book_id'); // 接受书价格 $price = $request->post('price'); $params['book_id'] = $book_id; $params['price'] = $price; // 默认的用户id,这里我是 $params['user_id'] = 1; // 买的书籍,这里我也是默认买了一本 $num = 1; // 生成订单 $order_no = 'bk' . date('YmdHis') . sprintf("%'.09d", $params['user_id']) . mt_rand(1000, 9999); $params['order_no'] = $order_no; // book表中的book_num -1 $bookinfo = Book::where('id', $params['book_id'])->first(); // 启动事务 DB::beginTransaction(); if ($bookinfo->book_num < $num) { return ['code' => 400, 'meg' => '图书太少啦', 'data' => '']; } try { //书籍表根据详情book_id将书数量减一 DB::table('book')->where('id', $book_id)->decrement('book_num', $num); //添加至订单表 $order=Orders::create($params); // 事务提交 DB::commit(); return ['code' => 200, 'meg' => '确认订单页面', 'data' =>$order]; } catch (\Exception $e) { // 事务回滚 DB::rollBack(); return ['code' => 500, 'meg' => 'ok', 'data' => '']; } } //支付 public function pay(Request $request, int $id) { include_once app_path() . '/Libs/alipay/wappay/service/AlipayTradeService.php'; include_once app_path() . '/Libs/alipay/wappay/buildermodel/AlipayTradeWapPayContentBuilder.php'; include_once app_path() . '/Libs/alipay/config.php'; $orderInfo = Orders::where('id', $id)->first(); if(!$orderInfo) { return 'error info'; } $body = $orderInfo['price'] . '元'; $subject = $orderInfo['book_id']; $out_trade_no = $orderInfo['order_no']; $total_amount = $orderInfo['price']; $timeout_express = '5m'; //5分钟 $payRequestBuilder = new \AlipayTradeWapPayContentBuilder(); $payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject); $payRequestBuilder->setOutTradeNo($out_trade_no); $payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setTimeExpress($timeout_express); $payResponse = new \AlipayTradeService($config); $result = $payResponse->wapPay($payRequestBuilder, $config['return_url'], $config['notify_url']); return $result; } //异步 public function notify(Request $request) { include_once app_path() . '/Libs/alipay/wappay/service/AlipayTradeService.php'; include_once app_path() . '/Libs/alipay/wappay/buildermodel/AlipayTradeWapPayContentBuilder.php'; include_once app_path() . '/Libs/alipay/config.php'; $arr=$request->post(); $alipaySevice = new \AlipayTradeService($config); $alipaySevice->writeLog(var_export($arr,true)); $result = $alipaySevice->check($arr); /* 实际验证过程建议商户添加以下校验。 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) 4、验证app_id是否为该商户本身。 */ if($result) {//验证成功 //商户订单号 $out_trade_no = $arr['out_trade_no']; //支付宝交易号 $trade_no = $arr['trade_no']; //交易状态 $trade_status = $arr['trade_status']; if ($arr['trade_status'] == 'TRADE_SUCCESS') { file_put_contents(public_path().'/test.txt',$out_trade_no); Order::where('order_code',$out_trade_no)->update(['status'=>1]); } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— echo "success"; //请不要修改或删除 }else { //验证失败 echo "fail"; //请不要修改或删除 } } //同步 public function async() { echo 'ok'; } }
这样我们进行访问:
http://yan.311025.vip/pay/1
进行浏览器付款:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现