微信小程序书简易支付

 

这里结合了上一篇的手机号登录接下来的实现功能

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

 进行浏览器付款:

 

 

 

 

 

 

 

 

posted @   王越666  阅读(214)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示