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

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. 记录常见的问题:encodeURICompnent 解码过程中出现空格 以及 第三方app中使用schema 唤起app

    window.location.href 跳转的时候使用了encodeURIComponent编码了部分参数,但是在第三方app中出现了编码过后的参数换行和空格的情况(部分第三方应用或者java程序) ...

  2. Java中Type接口及其子类

    简介 Type是Java 编程语言中所有类型的公共高级接口,和Object不同,Object是所有类的父类,即Object是Type的父类. 分类 原始类型(Class):不仅仅包含我们平常所指的类, ...

  3. JDBC 操作预编译语句中LIKE模糊匹配怎么用

    问题描述 在使用JDBC 预编译执行语句时,遇到一个问题,那就是在含有LIKE的查询语句时,我到底怎么使用匹配符%._呢. 如: SELECT * FROM "+LQ_USERS+" ...

  4. onerror事件捕获网页中的错误

    转载请注明来源:https://www.cnblogs.com/hookjc/ <html><head><script type="text/javascrip ...

  5. JavaScript与java语法区别

    网页中各种技术的作用 感谢大佬:https://blog.csdn.net/RookiexiaoMu_a/article/details/89052768 HTML 制作网页的结构 CSS 美化网页 ...

  6. 什么是Segue

    Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue) Segue的属性 每一个Segue对象,都有3个属性唯一标识@property (non ...

  7. 连接docker里面的mysql失败解决

    场景:在虚拟机的docker容器中安装latest版本的mysql之后,在宿主机中使用navicat连接虚拟机中的mysql出现下图报错: 解决方法: 1.首先docker ps命令查看正在运行的容器 ...

  8. kebernet--新手填坑

    1.安装好kubernet之后,新建rc后,里面的容器一直ImagePullBackOff ,镜像无法拉取: ----需要配置docker镜像为国内镜像,记得在各个Node上都要配置!!! vim / ...

  9. HEAAN库学习

    本文主要学习HEAAN同态库,选择最老的一版:地址,最新版在:位置,HEAAN是CKKS17论文的主要代码复现. 版本 1.地址这是最老的一版,对应的论文CKKS17 2.在1的基础上,实现了boot ...

  10. Solution -「AGC 019E」「AT 2704」Shuffle and Swap

    \(\mathcal{Description}\)   Link.   给定 \(01\) 序列 \(\{A_n\}\) 和 \(\{B_n\}\),其中 \(1\) 的个数均为 \(k\).记 \( ...