From 663be8f39f1aa813446c73213a473c1d62f15724 Mon Sep 17 00:00:00 2001 From: Xubx <1827135378@qq.com> Date: Tue, 3 Sep 2024 23:14:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E3=80=81=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + page/component/address/address.js | 6 +- page/component/index.js | 72 ++++++++++++++++++++ page/component/login/login.js | 10 +-- page/component/orders/orders.js | 106 +++++++++++++++++++++++------- page/component/user/user.js | 5 +- 6 files changed, 165 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index c3e8488..27fae26 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "license": "ISC", "dependencies": { "@vant/weapp": "^1.11.6", + "js-md5": "^0.8.3", "tdesign-miniprogram": "^1.6.0" } } diff --git a/page/component/address/address.js b/page/component/address/address.js index ceb85b6..22efc14 100644 --- a/page/component/address/address.js +++ b/page/component/address/address.js @@ -16,7 +16,7 @@ Page({ url: baseUrl + "/user/getById", method: "GET", data: { - id: 3, + openId: wx.getStorageSync('openid'), }, success(res) { self.setData({ @@ -36,14 +36,14 @@ Page({ formSubmit(e) { console.log(e, "e") const value = e.detail.value + value.openId = wx.getStorageSync('openid'); if (value.username && value.phone && value.address) { //保存地址 wx.request({ url: baseUrl + "/user/addOrUpdate", method: "POST", data: { - ...value, - openId: wx.getStorageSync('openid'), + ...value }, success(res) { console.log(res) diff --git a/page/component/index.js b/page/component/index.js index b63b6ab..deb7121 100644 --- a/page/component/index.js +++ b/page/component/index.js @@ -10,6 +10,8 @@ Page({ }, onLoad() { var self = this + self.checkUserProfile() + self.getUserProfile()// //获取openId /** * 发起请求获取商品列表信息 */ @@ -23,4 +25,74 @@ Page({ }, }) }, + /** + * 检查本地缓存中是否有用户信息 + */ + checkUserProfile() { + const userInfo = wx.getStorageSync('userInfo'); + if (userInfo) { + // 如果有用户信息,直接设置数据 + this.setData({ + thumb: userInfo.avatarUrl, + nickname: userInfo.nickName, + }); + } else { + //如果本地没有存储用户信息,则通过openId查数据库中是否已经注册 + wx.request({ + url: app.globalData.baseUrl + "/user/getById", + method: "GET", + data: { + openId: wx.getStorageSync('openid'), + }, + success(res) { + console.log(res.data.data) + // 将用户信息存到 StorageSync + const userInfo = { + avatarUrl: res.data.data.avatarUrl, + nickName: res.data.data.username + }; + wx.setStorageSync('userInfo', userInfo); // 存储到本地 + }, + fail: (err) => { + // 没有用户信息,提示用户登录授权 + wx.showModal({ + title: '温馨提示', + content: '请先登录!', + showCancel: false, + success: (res) => { + if (res.confirm) { + console.log(res) + wx.navigateTo({ + url: '/page/component/login/login', + }); + } + } + }); + } + }) + + } + }, + //获取openId + getUserProfile() { + //通过wx.login()获取登录凭证code + wx.login({ + success: (res) => { + const wxConfig = { + appid: "wx865aefa5a7115ae0", + secret: "3f9849429894435abc935eea88178dfd", + code: res.code + } + wx.request({ + url: "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxConfig.appid + "&secret=" + wxConfig.secret + "&code=" + wxConfig.code + "&js_code=" + wxConfig.code + '&grant_type=authorization_code', + success: (res) => { + wx.setStorageSync('openid', res.data.openid); + }, + fail: (err) => { + console.error('wx.login 失败', err); + } + }) + }, + }) + }, }) diff --git a/page/component/login/login.js b/page/component/login/login.js index 6fdd43d..6e8e8c6 100644 --- a/page/component/login/login.js +++ b/page/component/login/login.js @@ -24,7 +24,7 @@ Page({ this.setData({ avatarUrl: permanentAvatarUrl, }); - + }, fail: (err) => { console.error('上传失败', err); @@ -46,12 +46,12 @@ Page({ return; } //将用户信息存到StorageSync - // 将用户信息存到 StorageSync - const userInfo = { + // 将用户信息存到 StorageSync + const userInfo = { avatarUrl: avatarUrl, nickName: nickname - }; - wx.setStorageSync('userInfo', userInfo); // 存储到本地 + }; + wx.setStorageSync('userInfo', userInfo); // 存储到本地 // 将数据发送到后端 wx.request({ url: app.globalData.baseUrl + "/user/addOrUpdate", // 替换为你的后端接口地址 diff --git a/page/component/orders/orders.js b/page/component/orders/orders.js index 134659f..fa24f47 100644 --- a/page/component/orders/orders.js +++ b/page/component/orders/orders.js @@ -1,5 +1,7 @@ const app = getApp() const baseUrl = app.globalData.baseUrl +const md5 = require('js-md5'); + // page/component/orders/orders.js Page({ onLoad: function (options) { @@ -19,6 +21,10 @@ Page({ hasAddress: false, total: 0, orders: {}, + config: { + appid: "wx865aefa5a7115ae0", + key: "d5a58d44588b42cbbe01daa5cfa4e792" + } // {id:1,title:'新鲜芹菜 半斤',image:'/image/s5.png',num:4,price:0.01}, // {id:2,title:'素米 500g',image:'/image/s6.png',num:1,price:0.03} }, @@ -51,17 +57,42 @@ Page({ total: total, }) }, + timeStamp: function () { + return parseInt(new Date().getTime() / 1000) + '' + }, + /* 随机数 */ + randomString: function () { + var chars = 'A2345678'; + var maxPos = chars.length; + var pwd = ''; + for (var i = 0; i < 32; i++) { + pwd += chars.charAt(Math.floor(Math.random() * maxPos)); + } + return pwd; + }, + // 调起支付签名 这里我不太明白,虽然前面加载签名和后面验证,但里面加了随机数为什么验证还能通过我没还转过 弯来,希望大家能搞明白吧,到时候可不要吝啬留言讲解一下下 + MixedencryMD5: function (data, randomString, timeStamp) { + const payString = "appId=" + this.data.config.appid + + "&nonceStr=" + randomString + + "&package=prepay_id=" + "data.prepay_id" + + "&signType=MD5" + + "&timeStamp=" + timeStamp + + "&key=" + this.data.config.key; + + const hash = md5(payString); // 使用 md5 进行签名 + console.log(hash); + return hash; + }, toPay() { - const self = this - // 假设订单信息在 this.data.orders 中 - const orderData = this.data.orders - // TODO 用户id暂时写死 - orderData.userId = 1 - orderData.status = 1 - console.log(orderData) - //先生成订单 + const self = this; + const orderData = this.data.orders; + + // 假设用户ID暂时写死 + orderData.userId = 1; + orderData.status = 1; + + // 生成订单并请求支付 wx.request({ - // TODO 未测试 url: baseUrl + "/order/addOrUpdate", // 替换为你的后端API地址 method: "POST", data: { @@ -76,17 +107,49 @@ Page({ title: "订单已提交", icon: "success", duration: 2000, - }) - // 跳转到用户页面 - wx.switchTab({ - url: "/page/component/user/user", - }) + }); + + // 假设服务器返回的支付信息中包含 prepay_id + const paymentInfo = res.data.paymentInfo; // 服务器返回的支付信息,包含 prepay_id 等 + + // 生成支付签名等所需的参数(最好在服务器生成) + const time = self.timeStamp() + const randomString = self.randomString(); + const parSigns = self.MixedencryMD5(paymentInfo, randomString, time); + + // 发起支付请求 + wx.requestPayment({ + timeStamp: time, + nonceStr: randomString, + package: "prepay_id=" + "paymentInfo.prepay_id", + signType: "MD5", + paySign: parSigns, + success(ress) { + console.log('支付成功', ress); + // 支付成功后的处理,跳转到用户页面或其他页面 + wx.switchTab({ + url: "/page/component/user/user", + }); + }, + fail(ress) { + console.log('支付失败', ress); + wx.showToast({ + title: "支付失败,请重试", + icon: "none", + duration: 2000, + }); + }, + complete(ress) { + console.log('支付流程结束', ress); + } + }); + } else { wx.showToast({ title: "提交失败", icon: "none", duration: 2000, - }) + }); } }, fail() { @@ -94,16 +157,9 @@ Page({ title: "请求失败", icon: "none", duration: 2000, - }) + }); }, - }) - wx.showModal({ - title: "提示", - content: "本系统只做演示,支付系统已屏蔽", - text: "center", - complete() { - // 发送订单数据到后端 - }, - }) + }); }, + }) diff --git a/page/component/user/user.js b/page/component/user/user.js index 38059aa..c2f88a1 100644 --- a/page/component/user/user.js +++ b/page/component/user/user.js @@ -11,7 +11,7 @@ Page({ onLoad() { this.checkUserProfile(); // 检查并获取用户信息 - this.getUserProfile(); + // this.getUserProfile(); }, /** @@ -33,7 +33,8 @@ Page({ showCancel: false, success: (res) => { if (res.confirm) { - wx.switchTab({ + console.log(res) + wx.navigateTo({ url: '/page/component/login/login', }); }