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

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. js源码-自定义数组的pop和shift方法

    本文将自定义_pop和_shift来模拟数组的pop和shift方法 _pop: /* *js中数组的pop方法:删除数组的最后一个元素,把数组的长度减1,并且返回删除的这个元素:如果数组为空,则po ...

  2. Centos设置网络(固定IP)

    简介 设置为桥接模式,即将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络. 配置 虚拟机设置为桥接模式 进入网络配置文件, ...

  3. C++中三种正则表达式比较(C regex,C ++regex,boost regex)

    工作需要用到C++中的正则表达式,以下三种正则可供参考 1,C regex #include <regex.h> #include <iostream> #include &l ...

  4. nginx开发: 模块nginx_tcp_proxy_module

    nginx支持ws\wss连接,接入nginx_tcp_proxy_module模块 nginx版本1.14.2,在nginx_tcp_proxy_module模块中的上下行数据接口中处理数据解包与打 ...

  5. springboot实现分布式锁(spring integration,redis)

    Springboot实现分布式锁(Spring Integration+Redis) 一.在项目的pom.xml中添加相关依赖 1)Spring Integration依赖 <dependenc ...

  6. 简单实现支付密码输入框 By HL

    密码输入框在微信,支付宝中比较常见 主要功能点 1.6位(或者N位)密码输入框封装

  7. Docker的数据管理(上)

    Docker的数据管理(上) 1.管理docker容器中数据 2.容器互联(使用centos镜像) 1.管理docker容器中数据: 管理Docker 容器中数据主要有两种方式:数据卷(Data Vo ...

  8. ansible-playbook实现MySQL的二进制部署

    1.ansible服务器配置 1.1 安装ansible # yum -y install ansible 1.2 配置主机清单文件 # vi /etc/ansible/hosts [local] 1 ...

  9. 读源码【读mybatis的源码的思路】

    ✿ 需要掌握的编译器知识 ★ 编译器为eclipse为例子 调试准备工作(步骤:Window -> Show View ->...): □ 打开调试断点Breakpoint: □ 打开变量 ...

  10. CSRF跨站请求伪造漏洞分析

    CSRF 现在的网站都有利用CSRF令牌来防止CSRF,就是在请求包的字段加一个csrf的值,防止csrf,要想利用该漏洞,要和xss组合起来,利用xss获得该csrf值,在构造的请求中将csrf值加 ...