【Uniapp】支付链转二维码

╰+攻爆jí腚メ 2024-04-20 22:25 176阅读 0赞

前言


提示:这个是一个很小的项目,大概30分钟就能搞定
在这里插入图片描述
实现方式:输入支付代码,存储到对应的数据库表中,二维码访问一个PHP文件通过id来进行重定向,这样就可以使每张二维码都是固定的,替换二维码内容也只需改数据库的即可

文章目录

  • 前言
  • 一、设计UI界面
  • 二、设计数据库
  • 三、设计接口
    • 列表接口
    • 数据更新接口
  • 四、设计重定向访问页面
  • 四、解决跨域问题
    • 第一步
    • 第二步
    • 第三步
  • 总结

提示:以下代码需要导入B-ui插件,或者在页面顶部直接下载资源即可

一、设计UI界面

在这里插入图片描述
在这里插入图片描述

  1. index.vue
  2. <template>
  3. <view>
  4. <view class="b-popup " v-if="showPopup" :class="[directionClass,{'b-popup-round':round},{'b-popup-animation':animation}]">
  5. <view class="b-popup-shade" @click="showPopup = false"></view>
  6. <view class="b-popup-content">
  7. <!-- 你的内容写在这里 -->
  8. <view class="b-p-32" style="width: 500rpx;height: 300rpx;display: flex;flex-direction: column;justify-content: center;align-items: center;">
  9. <input placeholder="填入新的支付代码" v-model="update_url" style="background-color: #ccc;height: 80rpx;width: 487rpx;" />
  10. <view style="margin-top: 20rpx;">
  11. <button class="b-btn b-btn-blue" @click="update__()">确认</button>
  12. <button class="b-btn b-btn-red" @click="show(false)" style="margin-left: 50rpx;">取消</button>
  13. </view>
  14. </view>
  15. </view>
  16. </view>
  17. <!-- <view class="b-flex-x b-bg-white b-p-32">
  18. <image src="/static/logo.png" mode="aspectFit" class="logo b-radius-8"></image>
  19. <view class="b-flex-item b-ml-32">
  20. <view class="b-text-B b-text-48 b-text-black">支付链接转二维码 v{
  21. {BuiVersion}}</view>
  22. <view class="b-font-24 b-mt-8 b-text-black-dd">@园游会永不打烊</view>
  23. </view>
  24. </view> -->
  25. <!-- <view class="b-flex-grow b-ml-32" style="width: 680rpx;">
  26. <input type="text" class="b-form-input" placeholder="请输入名称" style="width: 680rpx;" v-model="name">
  27. </view> -->
  28. <!-- <view class="b-bg-white b-pl-32 b-pr-32 b-pt-24 b-pb-24">
  29. <button class="b-btn b-btn-blue b-btn-block b-btn-lg" @click="upload()">上传图片</button>
  30. </view> -->
  31. <view class="b-pt-32 b-pr-32 b-pl-32 b-pb-24 b-text-black-dd">列表</view>
  32. <view class="b-list-user b-bg-white">
  33. <view class="b-list-item"
  34. v-for="(item,index) in list" :key="index">
  35. <view class="b-flex-x">
  36. <view class="b-icon b-text-black-d">
  37. <image src="/static/tabBar/api.png" mode="widthFix" style="width: 50rpx;height: 50rpx;"></image>
  38. </view>
  39. <view style="font-size:20rpx;">位置{
  40. {item.id}}</view>
  41. </view>
  42. <view class="btns-box">
  43. <button class="b-btn b-btn-blue b-btn-sm" @click="jumps_edit(item.id)">修改URL</button>
  44. <button class="b-btn b-btn-blue b-btn-sm" style="margin-left: 10rpx;" @click="jumps(item.id)">生成</button>
  45. <!-- <button class="b-btn b-btn-blue b-btn-sm" style="margin-left: 10rpx;" @click="delete_(item.id)">删</button> -->
  46. </view>
  47. </view>
  48. </view>
  49. <view class="b-p-32 b-text-black-dd b-text-c b-text-20">
  50. <view>欢迎使用 B-ui </view>
  51. <view class="b-mt-8" 园游会永不打烊</view>
  52. </view>
  53. </view>
  54. </template>
  55. <script>
  56. export default {
  57. data() {
  58. return {
  59. select_id:'',
  60. update_url:'',
  61. showPopup:false,
  62. directionClass:"",
  63. round:true,
  64. animation:true,
  65. name:"",
  66. BuiVersion:"",
  67. list:[],
  68. }},
  69. onLoad() {
  70. this.BuiVersion = uni.Bui.version;
  71. this.get_list();
  72. },
  73. methods: {
  74. update__(){
  75. let that=this;
  76. uni.request({
  77. url: 'https://*****/update.php',
  78. data: {
  79. url:that.update_url,
  80. id:that.select_id
  81. },
  82. method: 'POST',
  83. header: {
  84. 'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
  85. },
  86. success: (res) => {
  87. if (res.data.code==200) {
  88. uni.showToast({
  89. title:res.data.msg
  90. })
  91. } else{
  92. uni.showToast({
  93. title:res.data.msg
  94. })
  95. }
  96. this.update_url='';
  97. that.showPopup=false;
  98. }
  99. })
  100. },
  101. show(status = true){
  102. this.showPopup = status;
  103. this.update_url='';
  104. },
  105. get_list(){
  106. let that=this;
  107. uni.request({
  108. url: 'https://*****/get_list.php',
  109. data: {
  110. },
  111. method: 'POST',
  112. header: {
  113. 'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
  114. },
  115. success: (res) => {
  116. console.log(res.data)
  117. that.list=res.data.data;
  118. }
  119. })
  120. },
  121. jump(path){
  122. uni.navigateTo({
  123. url:'/pages/video/video?path='+path
  124. })
  125. },
  126. jumps(path){
  127. console.log(path)
  128. uni.navigateTo({
  129. url:'/pages/qrcode/qrcode?path='+path
  130. })
  131. },
  132. jumps_edit(id){
  133. let that=this;
  134. that.select_id=id;
  135. that.showPopup = true;
  136. }
  137. }
  138. }
  139. </script>
  140. <style lang="scss">
  141. .logo{
  142. width: 140rpx;
  143. height: 140rpx;
  144. }
  145. .line-top{
  146. border-top: #eee solid 1px;
  147. }
  148. </style>
  149. qrcode.vue
  150. <template xlang="wxml">
  151. <view class="container">
  152. <view class="qrimg">
  153. <view class="qrimg-i">
  154. <tki-qrcode v-if="ifShow" cid="qrcode1" ref="qrcode" :val="val" :size="size" :unit="unit" :background="background" :foreground="foreground" :pdground="pdground" :icon="icon" :iconSize="iconsize" :lv="lv" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
  155. </view>
  156. <!-- <view class="qrimg-i">
  157. <tki-qrcode v-if="ifShow" cid="qrcode2" ref="qrcode2" val="第二个二维码" :size="size" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
  158. </view> -->
  159. </view>
  160. <view class="uni-padding-wrap uni-common-mt">
  161. <view class="uni-title">设置二维码大小</view>
  162. </view>
  163. <view class="body-view">
  164. <slider :value="size" @change="sliderchange" min="50" max="500" show-value />
  165. </view>
  166. <view class="uni-padding-wrap">
  167. <view class="btns">
  168. <button type="primary" @tap="selectIcon">选择二维码图标</button>
  169. <button type="primary" @tap="creatQrcode">生成二维码</button>
  170. <button type="primary" @tap="saveQrcode">保存到图库</button>
  171. <!-- <button type="warn" @tap="clearQrcode">清除二维码</button>
  172. <button type="warn" @tap="ifQrcode">显示隐藏二维码</button> -->
  173. </view>
  174. </view>
  175. </view>
  176. </template>
  177. <script>
  178. import tkiQrcode from '@/components/tki-qrcode/tki-qrcode.vue'
  179. export default {
  180. data() {
  181. return {
  182. ifShow: true,
  183. val: '', // 要生成的二维码值
  184. size: 300, // 二维码大小
  185. unit: 'upx', // 单位
  186. background: '#ffffff', // 背景色
  187. foreground: '#252625', // 前景色
  188. pdground: '#252625', // 角标色
  189. icon: '', // 二维码图标/static/logo.jpg
  190. iconsize: 40, // 二维码图标大小
  191. lv: 3, // 二维码容错级别 , 一般不用设置,默认就行
  192. onval: false, // val值变化时自动重新生成二维码
  193. loadMake: true, // 组件加载完成后自动生成二维码
  194. src: '' // 二维码生成后的图片地址或base64
  195. }
  196. },
  197. methods: {
  198. sliderchange(e) {
  199. this.size = e.detail.value
  200. },
  201. creatQrcode() {
  202. this.$refs.qrcode._makeCode()
  203. },
  204. saveQrcode() {
  205. this.$refs.qrcode._saveCode()
  206. },
  207. qrR(res) {
  208. this.src = res
  209. },
  210. clearQrcode() {
  211. this.$refs.qrcode._clearCode()
  212. this.val = ''
  213. },
  214. ifQrcode() {
  215. this.ifShow = !this.ifShow
  216. },
  217. selectIcon() {
  218. let that = this
  219. uni.chooseImage({
  220. count: 1, //默认9
  221. sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  222. sourceType: ['album'], //从相册选择
  223. success: function (res) {
  224. that.icon = res.tempFilePaths[0]
  225. setTimeout(() => {
  226. that.creatQrcode()
  227. }, 100);
  228. // console.log(res.tempFilePaths);
  229. }
  230. });
  231. }
  232. },
  233. components: {
  234. tkiQrcode
  235. },
  236. onLoad(options) {
  237. let that = this;
  238. that.val="https://******/location.php?id="+options.path
  239. },
  240. }
  241. </script>
  242. <style>
  243. /* @import "../../../common/icon.css"; */
  244. .container {
  245. display: flex;
  246. flex-direction: column;
  247. width: 100%;
  248. }
  249. .qrimg {
  250. display: flex;
  251. justify-content: center;
  252. }
  253. .qrimg-i{
  254. margin-right: 10px;
  255. }
  256. slider {
  257. width: 100%;
  258. }
  259. input {
  260. width: 100%;
  261. margin-bottom: 20upx;
  262. }
  263. .btns {
  264. display: flex;
  265. flex-direction: column;
  266. width: 100%;
  267. }
  268. button {
  269. width: 100%;
  270. margin-top: 10upx;
  271. }
  272. </style>

二、设计数据库

在这里插入图片描述


三、设计接口

列表接口

固定位置在数据库即可,前端刷新出来通过id进行操作

  1. get_list.php
  2. <?php
  3. // 假设你已经建立了数据库连接 $conn
  4. // 这里我们假设数据库表名为 url_list
  5. include 'conn.php';
  6. // 查询数据库,获取数据
  7. $query = "SELECT * FROM url_list";
  8. $result = $conn->query($query);
  9. // 检查查询结果是否成功
  10. if (!$result) {
  11. die(
  12. json_encode(
  13. array(
  14. 'code' => 500,
  15. 'msg' => '查询失败',
  16. ),
  17. JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
  18. )
  19. );
  20. }
  21. // 将查询结果转换为关联数组
  22. $data = array();
  23. while ($row = mysqli_fetch_assoc($result)) {
  24. $data[] = $row;
  25. }
  26. // 释放查询结果资源
  27. mysqli_free_result($result);
  28. // 输出JSON格式的数据
  29. die(
  30. json_encode(
  31. array(
  32. 'code' => 200,
  33. 'data' => $data,
  34. 'msg' => '查询成功',
  35. ),
  36. JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
  37. )
  38. );
  39. ?>

数据更新接口

既然要实现,不更改二维码替换内容,那数据库的数据需要改变,就不得不弄一个能修改的操作

  1. update.php
  2. <?php
  3. include 'conn.php';
  4. if ($_POST) {
  5. $url=$_POST['url'];
  6. $id=$_POST['id'];
  7. $sql="UPDATE `url_list` SET `url` = '$url' WHERE `id` = '$id'";
  8. $res=$conn->query($sql);
  9. die(
  10. json_encode(
  11. array(
  12. 'code' => 200,
  13. 'msg' => '更改成功'
  14. ),480)
  15. );
  16. } else {
  17. die(
  18. json_encode(
  19. array(
  20. 'code' => 100,
  21. 'msg' => '请求失败'
  22. ),480)
  23. );
  24. }

四、设计重定向访问页面

上述工作都做完了,现在就差重定向页面。什么是重定向?

重定向是指将一个网页、URL或文件请求从一个位置转发到另一个位置的过程。在互联网和计算机领域,重定向是一种常见的技术,用于将用户从一个网址或链接导向到另一个网址或链接。

重定向通常有两种类型:

  1. 服务器端重定向:当用户访问一个网页或URL时,服务器会检测到这个请求,并根据预先设定的规则,将用户的请求从原始网址转发到新的目标网址。这个过程是在服务器端完成的,用户通常无法察觉到重定向的发生。服务器端重定向是通过HTTP状态码实现的,如301永久重定向、302临时重定向等。
  2. 客户端重定向:这种重定向是通过网页上的特定代码(通常是JavaScript或HTML的标签)来实现的。当用户访问一个网页时,网页上的代码会检测到用户的请求,并将用户自动导向到新的目标网址。客户端重定向可以通过页面刷新或页面跳转来实现。
    重定向在网站管理和维护中有多种用途。一些常见的应用包括:
  3. 网址更改:当网站的URL发生变化时,可以使用重定向将原始URL导向到新的URL,以确保用户仍能够访问到所需内容。
  4. 域名重定向:当网站的域名更改或网站需要多个域名来访问时,可以使用重定向将用户从一个域名导向到另一个域名。
  5. 错误页面处理:当用户访问一个不存在的页面或出现错误时,可以使用重定向将用户引导到一个有效的页面,或者返回一个合适的错误信息。
  6. 流量管理:通过重定向,网站管理员可以控制特定页面的访问量,将用户导向不同的内容或服务。

总之,重定向是一种有用的技术,能够为网站提供更好的用户体验和更有效的管理,可实现域名跳转。

我们通过对二维码的设置使每个栏位根据id来生成二维码,通过传递id给重定向文件,然后重定向文件去数据库查询最新的URL来实现跳转

  1. onLoad(options) {
  2. let that = this;
  3. that.val="https://******/location.php?id="+options.path
  4. },
  5. location.php
  6. <?php
  7. // 重定向的目标链接
  8. include("conn.php");
  9. if ($_GET['id']) {
  10. $id=$_GET['id'];
  11. $query = "SELECT url FROM `url_list` WHERE `id` = '$id'";
  12. $result = $conn->query($query);
  13. if ($result->num_rows > 0) {
  14. // If at least one row is found, extract the id
  15. $row = $result->fetch_assoc();
  16. $url = $row['url'];
  17. $redirect_url = $url;
  18. // 执行重定向
  19. header("Location: " . $redirect_url);
  20. } else {
  21. // If no data is found, display a message
  22. echo "没有数据";
  23. }
  24. // Don't forget to close the database connection after using it
  25. $conn->close();
  26. exit();
  27. } else {
  28. die("参数不合法");
  29. }
  30. ?>

四、解决跨域问题

第一步

打开manifest.json,勾选Https等其他如图
在这里插入图片描述

第二步

替换所有的域名http为https

第三步

服务端配置SSL证书,设置为强制
在这里插入图片描述

总结

以上就是今天记录的内容,本次项目很简单,是一个新手练手的项目,重定向解决办法就是保持协议一致,你也可以不按我的来,只要统一即可

?希望你能喜欢我的其他作品
《记一次云之家签到抓包》
《记一次视频抓包m3u8解密过程》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
《Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》

推荐专栏:

《Python爬虫脚本项目实战》

该专栏往期文章:
《【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)》

?如果感觉看完文章还不过瘾,欢迎查看我的其它专栏
?作者对python有很大的兴趣,完成过很多独立的项目:例如滇医通等等脚本,但是由于版权的原因下架了,爬虫这一类审核比较严谨,稍有不慎就侵权违规了,所以在保证质量的同时会对文章进行筛选

如果您对爬虫感兴趣请收藏或者订阅该专栏哦《Python爬虫脚本项目实战》,如果你有项目欢迎联系我,我会同步教程到本专栏!

?Python爬虫项目实战系列文章!!
⭐⭐欢迎订阅⭐⭐

【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)
【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

⭐⭐欢迎订阅⭐⭐
在这里插入图片描述

Python爬虫脚本项目实战
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,176人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Uniapp支付

    以上就是今天记录的内容,本次项目很简单,是一个新手练手的项目,重定向解决办法就是保持协议一致,你也可以不按我的来,只要统一即可?希望你能喜欢我的其他作品《记一次云之家签到...

    相关 微信支付

    二维码扫描支付 模式二    生成二维码时插入数据 返回订单状态ID (SetAttch 可以附加自定义数据。也就是订单状态ID  回调时候会用到)    支付成功后 根据