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

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

进行浏览器付款:

微信小程序书简易支付的更多相关文章

  1. 微信小程序实现简易留言板

    微信小程序现在很火,于是也就玩玩,做了一个简易的留言板,让大家看看,你们会说no picture you say a j8 a,好吧先上图. 样子就是的,功能一目了然,下面我们就贴实现的代码,首先是H ...

  2. 让你的微信小程序具有在线支付功能

    前言 最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过 ...

  3. 微信小程序 textarea 简易解决方案

    微信小程序中textarea没有bindchange事件,所以无法在输入时给变量赋值. 虽然可以使用bindblur事件,但是绑定bindblur事件,如果再点击按钮,则先执行完按钮事件后,再去执行b ...

  4. 强力推荐微信小程序之简易计算器,很适合小白程序员

    原文链接:https://mp.weixin.qq.com/s/gYF7GjTRpeZNoKPAPI9aXA 1 概述 前几日QQ群里的朋友问我有没有计算器小程序案例,今天我们说下小程序计算器,然后就 ...

  5. 微信小程序开发简易计算器改进版

    微信小程序开发计算器有多种方法,但是大部分代码比较复杂.不容易理解.本案例进行了改进,主要是组件bindtap属性绑定的自定义函数clickBtn(),采用了switch语句,使得代码结构更加清晰,学 ...

  6. 微信小程序-登陆、支付、模板消息

    wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要 ...

  7. 微信小程序发布与支付

    一.小程序的发布流程 小程序协同工作和发布官网链接 1.背景 小程序的平台里,开发者完成开发之后,需要在开发者工具提交小程序的代码包,然后在小程序后台发布小程序. 2.流程 上传代码 代码管理服务器上 ...

  8. 微信小程序-制作简易豆瓣笔记

    demo截图: 图书:      电影:        共工欲善其事,必先利其器: 小程序编辑器下载地址 : https://mp.weixin.qq.com/debug/wxadoc/dev/dev ...

  9. [转]微信小程序 c#后台支付结果回调

    本文转自:http://www.cnblogs.com/weizhiing/p/7700723.html 又为大家带来简单的c#后台支付结果回调方法,首先还是要去微信官网下载模板(WxPayAPI), ...

随机推荐

  1. Halcon视觉入门芯片识别

    Halcon视觉入门芯片识别 需求 有如下图的一个摆盘,摆盘的方格中摆放芯片,一个格子中只放一个,我们需要知道每个方格中是否有芯片去指导我们将芯片放到空的方格中. 分析 通过图片分析得出 我们感兴趣的 ...

  2. vue3 最长递增子序列 diff优化

    //vue3优化版(回头我会完善下算法思路) function getSequence(arr) { const p = arr.slice() const result = [0] let i, j ...

  3. SSH 远程访问及控制 ( 早上好,我是派大星,上帝派来爱你的那颗星)

    远程访问及控制 1.SSH远程管理,TCP Wrappers访问控制 2.配置密钥对验证 1.SSH远程管理,TCP访问控制 SSH是一种安全通道协议,主要用来实现字符界面的远程登录.远程复制等功能: ...

  4. k8s之PV、PVC

    目录 一.PVC和PV 1.1 PV概念 1.2 PVC概念 1.3 PV与PVC之间的关系 1.4 两种PV的提供方式 二.基于nfs创建静态PV资源和PVC资源 2.1 配置nfs存储(192.1 ...

  5. java链式创建json对象

    我们主要介绍一下:java中如何通过最简单的方式实现链式创建json对象,解决创建json代码臃肿的问题. 1.假设我们要创建一个json对象格式如下: { "code": 0, ...

  6. Docker名词解释

    http://www.runoob.com/docker/docker-architecture.html  

  7. Netty核心原理

    Netty核心原理 1. Netty介绍 1.1 原生NIO存在的问题 NIO的类库和API使用繁杂 需要具备其他额外的技能,如java多线程编程等才能编写出高质量的NIO程序 开发工作量和难度都非常 ...

  8. R数据分析:数据清洗的思路和核心函数介绍

    好多同学把统计和数据清洗搞混,直接把原始数据发给我,做个统计吧,这个时候其实很大的工作量是在数据清洗和处理上,如果数据很杂乱,清洗起来是很费工夫的,反而清洗好的数据做统计分析常常就是一行代码的事情. ...

  9. 利用shell脚本使用kubeadm部署kubenetes 1.18.6集群环境

    # README # 此脚本需要在master节点上使用 # 注意root密码,请提前修改 # 个人实验环境,注意机器最低配置:master(2G内存,1cpu2核心,否则集群会创建失败),node( ...

  10. NFS共享Nginx网页根目录(自动部署)

    IP HOSTNAME SERVICE SYSTEM 192.168.131.132 proxy-nfs nginx+nfs-server CentOS 7.6 192.168.131.131 ngi ...