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

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. bom案例1-div拖拽

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

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

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

  3. Fastjson的JSONObject.toJSON()解析复杂对象发生内存泄漏问题

    这可能是fastjson的一个bug,我使用最新版依然存在该问题. 在用做报表功能的时候,发现一旦单元格过多,大概有80-100个单元格,就会发生程序假死,CPU持续占用超过90%,内存持续占用超90 ...

  4. docker 介绍及安装操作

    docker 介绍及安装操作 1.docker概述 2.docker安装及操作 1.docker概述: Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源 是在L ...

  5. (Elementui) el-tree 中英文过滤以及搜索到父子显示子节点,搜索到子节点显示父节点(filter-node-method)

    案例下载:https://gitee.com/tudoumlp/just1.git   (vue-ele-demo) 在项目中,会遇到树节点的搜索,中文和英文搜索,以及搜索到父节点匹配的时候同步显示该 ...

  6. MySQL中 BETWEEN ... AND ...

    MySQL中 BETWEEN ... AND ... 1. 准备测试数据 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...

  7. Ubuntu service 命令

    启动指定服务 sudo service 服务名 start 停止指定服务 sudo service 服务名 stop 重启指定服务 sudo service 服务名 start 查看所有服务 sudo ...

  8. Solution -「AGC 034C」Tests

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{l_n\},\{r_n\},\{b_n\},X\),求最小的 \(s\),使得存在非负整数序列 \(\ ...

  9. CentOS7下修改默认网卡名为eth0的方法

    1.修改网卡配置文件中的 DEVICE=参数的,关于eth0 [root@ansheng ~ ]# cd /etc/sysconfig/network-scripts/ [root@ansheng n ...

  10. 6.Flink实时项目之业务数据分流

    在上一篇文章中,我们已经获取到了业务数据的输出流,分别是dim层维度数据的输出流,及dwd层事实数据的输出流,接下来我们要做的就是把这些输出流分别再流向对应的数据介质中,dim层流向hbase中,dw ...