微信支付开发-前端api实现

一、操作流程图

二、代码实现

<?php
/*** 数字人答题业务流* User: 龙哥·三年风水* Date: 2024/9/11* Time: 14:59*/
namespace app\controller\shuziren;
use app\controller\Base;
use app\model\param\QuestionParam as PQPModel;
use app\model\answer\QuestionBank;
use app\model\answer\QuestionOpt;
use app\model\answer\StatisticsAnswer;
use app\service\WechatPayNative;
use Redis\Redis;
use app\model\answer\QuestionPrize;
use app\model\answer\QuestionOrder;
use Rabbit\order\Delayed\Pro;
class Answer extends Base
{// 获取答题public function index(){$questParam = PQPModel::dataFind(['id' => 1],'answer_number,answer_accuracy');$allList = QuestionBank::getAll(['status' => 1],'id','create_time DESC');if(count($allList) < $questParam['answer_number'])return error('题目数量不够');$answerArr = array_rand(array_column($allList,'id'),$questParam['answer_number']);$answerList = [];foreach($answerArr as $k => $v){$answerList[$k]['id'] = $k + 1;$answerList[$k]['title'] = QuestionBank::dataFind(['id' => $v],'title',false);$answerList[$k]['opt'] = QuestionOpt::getAll(['bank_id' => $v],'opt,content,is_correct','id ASC');}$data['list'] = $answerList;$data['answer_accuracy'] = $questParam['answer_accuracy'];return success($data);}// 记录答题public function statistics(){$param = $this->request->param();$validate = new \app\validate\answer\StatisticsAnswer;if (!$validate->check($param))return error($validate->getError());//验证参数$questParam = PQPModel::dataFind(['id' => 1],'answer_number,answer_interval_period');if(($param['correct_rate'] + $param['error_rate']) != $questParam['answer_number'])return error('非法操作');//验证参数$data['digitized_human_id'] = $this->token;$data['digitized_human_name'] = $param['digitized_human_name'];$data['correct_rate'] = $param['correct_rate'];$data['error_rate'] = $param['error_rate'];$data['id_card'] = $param['id_card'];$data['involved_date'] = date('Y-m-d',time());$data['status'] = 1;$data['create_time'] = date('Y-m-d H:i:s',time());$data['update_time'] = date('Y-m-d H:i:s',time());StatisticsAnswer::save($data,[]);$res = [];if((int)$questParam['answer_interval_period'] > 0){$redis = Redis::select(config('cache.stores.redis.other_db'));$keyLog = 'answer_'.$param['id_card'];$answerLog = $redis->get($keyLog);if(empty($answerLog)){$redis->setex($keyLog,(int)$questParam['answer_interval_period']*24*3600,1);$res['receive_prize'] = 0;$res['order_no'] = create_order();}else{$res['receive_prize'] = $redis->ttl($keyLog);$res['order_no'] = '';}}return success($res);}// 获取奖品public function prize(){$idCard = $this->request->param('id_card','');if(empty($idCard))return error('参数错误');$redis = Redis::select(config('cache.stores.redis.other_db'));$keyLog = 'answer_'.$idCard;$answerLog = $redis->get($keyLog);if(empty($answerLog))return error('非法访问');$data = QuestionPrize::dataFind(['id' => 1,'status' => 1],'id,prize_name,prize_price,postage_price,prize_picture',true);return success($data);}// 创建订单public function order(){$param = $this->request->param();$validate = new \app\validate\answer\QuestionOrder;if(!$validate->check($param))return error($validate->getError());//验证参数$redis = Redis::select(config('cache.stores.redis.other_db'));$keyLog = 'answer_'.$param['id_card'];$answerLog = $redis->get($keyLog);if(empty($answerLog))return error('非法访问');$prizeName = QuestionPrize::dataFind(['id' => $param['prize_id'],'status' => 1],'prize_name',false);if(empty($prizeName))return error('奖品走丢咯~~~~~');$data['digitized_human_id'] = $this->token;$data['order_no'] = $param['order_no'];$data['consignee_name'] = $param['consignee_name'];$data['consignee_phone'] = $param['consignee_phone'];$data['prize_name'] = $prizeName;$data['area'] = $param['area'];$data['details_addr'] = $param['details_addr'];$data['id_card'] = $param['id_card'];$data['receipt_status'] = 1;$data['express_company'] = '';$data['express_number'] = '';$data['status'] = 1;$data['create_time'] = date('Y-m-d H:i:s',time());$data['update_time'] = date('Y-m-d H:i:s',time());$res = QuestionOrder::save($data,[]);Pro::pushSend($res,20*60);return success([],'操作成功');}//获取支付二维码public function orderPayment(){$orderNo = $this->request->param('order_no');if(empty($orderNo))return error('参数错误');$receiptStatus = QuestionOrder::dataFind(['order_no' => $orderNo],'receipt_status',false);if($receiptStatus != 1)return error('没有未支付订单');$postagePrice = QuestionPrize::dataFind(['id' => 1,'status' => 1],'postage_price',false);$res = [];if($postagePrice > 0){$postagePrice = 0.01;$nativeService = new WechatPayNative();$res = $nativeService->pay_payment($orderNo,$postagePrice);}return success($res,'操作成功');}//获取支付结果public function orderPaymentResult(){$orderNo = $this->request->param('order_no');if(empty($orderNo))return error('参数错误');$receiptStatus = QuestionOrder::dataFind(['order_no' => $orderNo],'receipt_status',false);return success(['receipt_status' => empty($receiptStatus) ? 0 : $receiptStatus],'操作成功');}//重新生成订单号public function answerOrderRepeat(){$orderNo = $this->request->param('order_no');if(empty($orderNo))return error('参数错误');$res = QuestionOrder::dataFind(['order_no' => $orderNo],'id,receipt_status',true);if(!empty($res)){if($res['receipt_status'] == 4){$orderNo = create_order();QuestionOrder::save(['order_no' =>  $orderNo,'receipt_status'   =>  1],['id'    =>  $res['id']]);Pro::pushSend($res['id'],20*60);}}return success(['order_no' =>  $orderNo]);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/426193.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】【力扣】83.删除排序链表中的重复元素

题目 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输出&#…

电脑录屏工具哪个好用?推荐新手几款实用工具介绍

现在不管是录个教学视频教教别人&#xff0c;还是直播游戏给粉丝看&#xff0c;或者是展示你的产品&#xff0c;都得用到它。但是市面上的录屏软件多得让人眼花缭乱&#xff0c;新手可能一看就懵了。别急&#xff0c;今天我就给你介绍几个特别好用的电脑录屏工具&#xff0c;不…

Java之线程篇四

目录 volatile关键字 volatile保证内存可见性 代码示例 代码示例2-&#xff08;volatile&#xff09; volatile不保证原子性 synchronized保证内存可见性 wait()和notify() wait()方法 notify() 理解notify()和notifyAll() wait和sleep的对比 volatile关键字 volati…

国家标准参编周期一般是多久?参编的流程有哪些?

在当今快速发展的时代&#xff0c;标准的重要性日益凸显。国家标准作为规范行业发展、保障产品质量、促进技术进步的重要依据&#xff0c;吸引着众多企业积极参与其中。而国家标准参编&#xff0c;为企业提供了一个提升自身竞争力、展示技术实力的良好平台。那么&#xff0c;国…

第k个排列 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;E卷D卷C卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 给定参数n&#xff0c;从1到n会有n个整数:1,2,3,.,n&#xff0c;这n个数字共有 n!种排列。按大小顺序升序列出所有排列情况&#xff0c;并-一标记&#xff0c;当n3时,所有排列…

vscode任务配置之tasks.json

目录 用途说明 用途1&#xff1a;配置编译任务 1.生成task.json文件 2.编辑task.json文件 3.运行任务 用途2&#xff1a;给一个脚本文件配置任务 1.生成task.json文件 2.编辑task.json文件 3.运行任务 用途说明 在VS Code中配置任务主要涉及到task.json文件的编辑&am…

Java学习Day42:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的&#xff0c;但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标&#xff1a; 小案例&#xff1a; 1.导入依赖 spring-context: 提供 Spring 框架的核心功能&#xff0c;如依赖注入、事件发布和其他应用上…

面试真题-TCP的三次握手

TCP的基础知识 TCP头部 面试题&#xff1a;TCP的头部是多大&#xff1f; TCP&#xff08;传输控制协议&#xff09;的头部通常是固定的20个字节长&#xff0c;但是根据TCP选项&#xff08;Options&#xff09;的不同&#xff0c;这个长度可以扩展。TCP头部包含了许多关键的字…

ollama安装(ubuntu20.04)

Ollama是一款开源的自然语言处理工具&#xff0c;它可以帮助开发者快速构建文本处理应用。 ollama官网: https://ollama.ai/ 一、ollama 自动安装 linux统一采用sh脚本安装&#xff0c;一个命令行搞定。 curl -fsSL https://ollama.com/install.sh | sh二、ollama 手动安装 o…

ros学习笔记.4 Path Planning Part 2 (避障)

避障是如何工作的什么是局部规划器&#xff1f;什么是局部成本图&#xff1f;路径规划回顾如何使用动态重新配置和其他 Rviz 工具 局部规划器 一旦全局规划器计算出要遵循的路径&#xff0c;该路径就会发送给局部规划器。然后&#xff0c;局部规划器将执行全局规划的每个部分&…

spring中对于servlet API的封装---springWeb

目录 一.springweb概述 二.springweb的特点 三.springweb的运行流程 四.springweb组件 五.springweb的搭建 1.导包 2.配置 DispatcherServlet 3.开启 springweb 注解 4.处理器的搭建 六.springweb注解 七.springweb拦截器 1.拦截器概述 2.拦截器的实现 (1)添加 servelt api 依赖…

详解:冒泡排序

1.是什么 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成…

望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会

9月13日&#xff0c;CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题&#xff0c;汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表&#xff0c;共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…

C++ List (带你一篇文章搞定C++中的List类)

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 数据结构习题_LaNzikinh篮子的博客-CSDN博客 初阶数据结构_LaNzikinh篮子的博客-CSDN博客 收入专栏&#xff1a;C_LaNzikinh篮子的博客-CSDN博客 其他专…

flask项目初始化

1、初始环境 python3.8 2、flask文档地址&#xff1a;https://flask.palletsprojects.com/en/latest/installation/#install-flask 3、初始化项目 $ mkdir myproject $ cd myproject $ python3 -m venv .venv $ . .venv/bin/activate $ pip install Flask4、打开项目mypr…

Pycharm出现Please specify a different SDK name报错,但是看不到重名环境解决方案

这句话的意思是出现了重名的环境 &#xff0c;一般情况下删除重名的环境即可解决问题。做法如下图所示 1&#xff0c;点击右上角齿轮→settings&#xff08;或者File→settings&#xff09;进入Python Interpreter 2.点击这个沙漏按键&#xff0c;你会发现多了几个环境&#x…

VScode相关问题与解决

VScode只是一个文档编辑器&#xff0c;类似于我们使用的记事本。我们在编辑完文档之后呢一定要保存。 文档编辑器加上它可以安装不同的插件&#xff0c;就可以进行程序开发。 1.写c文件时找不到头文件stdio.h 在linux下我们gcc命令来编译c文件时&#xff0c;会遇到找不到头文…

一文讲懂Mac中的环境变量

你是否曾经因为环境变量配置不当而浪费了宝贵的开发时间?你是否好奇为什么有时候在终端输入命令会提示"command not found",而有时候又能正常运行?如果你是一名Mac用户,并且希望真正掌握环境变量的奥秘,那么这篇文章将为你揭开Mac中环境变量的神秘面纱,帮助你成为一…

Java设计模式—面向对象设计原则(二) --------> 里氏代换原则 LSP (完整详解,附有代码+案列)

文章目录 里氏代换原则3.2.1 概述3.2.2 改进上述代码 里氏代换原则 里氏代换原则&#xff1a;Liskov Substitution Principle&#xff0c;LSP 3.2.1 概述 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则&#xff1a;任何基类可以出现的地方&#xff0c;子类一定…

html实现好看的多种风格手风琴折叠菜单效果合集(附源码)

文章目录 1.设计来源1.1 风格1 -图文结合手风琴1.2 风格2 - 纯图片手风琴1.3 风格3 - 导航手风琴1.4 风格4 - 双图手风琴1.5 风格5 - 综合手风琴1.6 风格6 - 简描手风琴1.7 风格7 - 功能手风琴1.8 风格8 - 全屏手风琴1.9 风格9 - 全屏灵活手风琴 2.效果和源码2.1 动态效果2.2 源…