Добро пожаловать в этот блог! Извините, я слишком долго оставил остальные статьи на странице заказа. Я просто не мог придумать красивую страницу. Это моя собственная причудливая идея, хоть она и некрасивая, но вполне функциональная!!! Если у кого-то из друзей есть оптимизацияUIидеи могут быть реализованысуществовать Забрать со складаPR
спасибо всем!
В этой статье вы узнаете о моем заказестраница Строительство и заказыстраницаизинтерфейс Создайте, например, купите курсыстраница Оформил заказ, но не продолжилплатитьтогда оксуществоватьяиз Заказстраницапродолжай еще разплатить
、Также можно сделатьОтменить заказ
、Заказ на возврат
、Система таймаута заказа проактивная Отменить заказ
Жду очков знаний.Приходите и учитесь~
💗 На этот раз речь пойдет о фронтенде. Если вы не разбираетесь во фронтенде, вы можете пойти на склад и скопировать его напрямую для использования. Если у вас есть вопросы, вы можете оставить сообщение в области комментариев. и я отвечу вам как можно скорее. Следуйте за мной, чтобы не потеряться. Если эта статья вам поможет, или если у вас есть какие-либо вопросы, оставьте сообщение в области комментариев, я обычно отвечу. Я вижу это. Пожалуйста, поставьте лайк и поддержите~ 💗
Автор: Ян Буйи. Перед этим я обновил 13 глав практического руководства по платежам WeChat. Если вам интересно, вы можете перейти на мою домашнюю страницу Tencent Cloud, чтобы просмотреть и узнать!
В этом проекте используется стек технологий
Серверная часть: SpringBoot3.1.x, Mysql8.0, MybatisPlus.
Интерфейс: Vue3, Vite, ElementPlus.
Мини-программы: Uniapp, UviewPlus, Vue3.
Настольное приложение: Electron славится своей медленностью. Почему настольная QQ выбрала его для обновления архитектуры? Играйте с крупными производителями (электронное яйцо)
Вы можете видеть, что наша страница разделена на две области. Верхняя область была прекрасно реализована в предыдущей статье и может использоваться повторно. Нижняя часть представляет собой строку tabBar, которая используется для отображения различных статусов (мы все еще используем. uview Библиотека компонентов может сделать это так же легко, как нарезать овощи~)
Вы можете видеть, что у нас есть знаковая функция обратного отсчета заказа с названием, плательщиком, суммой платежа, временем заказа, и если при размещении заказа платеж не поступил, вы можете снова инициировать запрос платежа на странице «Мой заказ», и пользователь отменяет заказ. заказ бизнес .
Хорошо, мы почти проанализировали это, не правда ли, ха-ха-ха, давайте построим это напрямую!
Прежде чем сделать это, запустите автозагрузку
существовать yby6-uniApp-wechatPay-blog/pages
Создать в каталоге order документпапкасуществоватьсоздавать order.vue страница
Для всеобщего удобства я публикую неважный код инициализации. Вы все это понимаете, мы уже писали их раньше ~
Скопируйте приведенный ниже код в order.vue страницасреди
<!-- yangbuyi Copyright (c) https://yby6.com 2023. -->
<script setup>
import { onLoad, onReady } from '@dcloudio/uni-app'
import { getCurrentInstance, ref } from "vue";
import Tabbar from "../tabbar/tabbar.vue";
// Получить текущий экземпляр
const { proxy } = getCurrentInstance()
// слой загрузки
const loading = ref(false)
// =========================Жизненный цикл==================== ====
onLoad(() => {
console.log('onLoad');
});
onReady(() => {
console.log('onReady');
});
</script>
<template>
<view class="app-container">
<view class="container">
<!-- верхняя часть -->
<view>
<u-notice-bar color="red" text="Уведомление:Мини Программа может просматривать ограниченное отображение около 50 платежных данных. Для получения полной информации перейдите на сайт. кPCконец!!!"></u-notice-bar>
<view class="PaymentChannel_title">
<u-tooltip text="ПК: WeChat Система оплаты: https://lzys522.cn/wx" copyText="https://lzys522.cn/wx"
overlay></u-tooltip>
</view>
<view class="PaymentChannel_title">
<u-tooltip text="Примечание: 0,4Вот и все, вы можете вернуть список заказов после успешной оплаты.»
copyText="Примечание: 0,4Вот и все, вы можете вернуть список заказов после успешной оплаты.»
overlay></u-tooltip>
</view>
<view class="PaymentChannel_title"
style="color: red; margin-bottom: 10px;font-size: 14px;height: auto !important;">
<u-tooltip text="Склад с открытым исходным кодом: https://gitee.com/yangbuyi/wxDemo" copyText="https://gitee.com/yangbuyi/wxDemo"
overlay></u-tooltip>
</view>
</view>
<!-- нижняя часть -->
<view>
</view>
<!-- слой загрузки -->
<u-loading-page :loading="loading"/>
<!-- меню -->
<tabbar selected="1"></tabbar>
</view>
</view>
</template>
<style lang="scss" scoped>
::v-deep .u-cell__body__content {
width: 70%;
}
.btn {
margin-left: 6px;
display: inline-block;
}
.payView {
/*float:right*/
display: inline-block;
text-align: right;
vertical-align: baseline;
float: right;
}
.time {
@include flex;
align-items: center;
&__custom {
margin-top: 4px;
width: 22px;
height: 22px;
background-color: $u-primary;
border-radius: 4px;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
justify-content: center;
align-items: center;
&__item {
color: #fff;
font-size: 12px;
text-align: center;
}
}
&__doc {
color: $u-primary;
padding: 0px 4px;
}
&__item {
color: #606266;
font-size: 15px;
margin-right: 4px;
}
}
</style>
Исправлять 📎pages.json
существовать pages
множествосреди Новый
{
"path": "pages/order/order",
"style": {
"navigationBarTitleText": ""
}
},
существовать list
множествосреди Новый
{
"pagePath": "pages/order/order"
},
Отлично, продолжим дальше: напишем табары пол кнопки вызова
Откройте библиотеку компонентов UviewPlus. Обратите внимание, что мы используем vue3, то есть версию 3.x.
адрес: https://uiadmin.net/uview-plus/components/tabs.html
Просто выберите то, что вам нравится, и просто скопируйте соответствующий код~
// ==========================данные==========================
const tabList = ref([
{ name: "все" },
{ name: «Не оплачено» },
{ name: «Возврат в процессе» },
{ name: «Возврат» },
{ name: «Платеж успешен» },
{ name: "тайм-аут закрыт" },
{ name: «Отмена пользователя» }
]);
<u-tabs
:list="tabList"
lineWidth="30"
lineColor="#ffb9b9"
:activeStyle="{
color: '#FF8B8B',
fontWeight: 'bold',
transform: 'scale(1.06)',
}"
:inactiveStyle="{
color: '#303133',
transform: 'scale(1)'
}"
itemStyle="padding-left: 15px; padding-right: 15px; height: 34px;margin-bottom: 2px;"
>
</u-tabs>
Я чувствую себя довольно хорошо, ха-ха~
Студенты, пожалуйста, постучите еще раз вручную.
логика: Когда мы переключаем состояния, нам приходится запрашивать у бэкэнда данные в разных состояниях и рендерить их в Mini. программасреди
адрес: https://uiadmin.net/uview-plus/components/list.html
Вы чувствуете, что оно отличается от нашего?,Потому что я настроил его,Иначе почему это так ужасно~
код метода
// нижний триггер
const scrolltolower = (data) => {
console.log(data);
};
// моделированиеданные
const loadmore = () => {
for (let i = 0; i < 10; i++) {
indexList.value.push({
url: urls[2],
});
}
};
Данные моделирования загрузки жизненного цикла
onLoad(() => {
loadmore();
console.log('onLoad');
});
страницакод <u-list
@scrolltolower="scrolltolower"
>
<u-list-item
v-for="(item, index) in indexList"
:key="index"
>
<u-cell>
<template #title>
<view>
Я - титул
</view>
<template #label>
<view>
я субтитр
</view>
</template>
</template>
</u-cell>
</u-list-item>
</u-list>
Хорошо, теперь мы построили прототип.,Мы продолжим улучшать и настраивать название, плательщика, время заказа и т. д.,Как только это будет сделано, мы перейдем к написанию данных списка запросов интерфейса интерфейса внутреннего кода.
Нужен интерфейс для разбивки моего списка заказов на страницы. Помните мой последний интерфейс написания PC Я написал его, когда размещал заказ? Нам все еще нужны писатель и Мини? Программа особенная, потому что я разрешаю отображение только первых пятидесяти фрагментов информации~ Остальное можно проверить через условия запроса~
Открытьназадконецкод Исправлять OrderInfoController.java страница
Учащиеся пишут его вручную и добавляют интерфейс orderUniAppPage.
👌Можно нормально и успешно позвонить
существовать api
Создать в каталоге orderInfo.js документ
// yangbuyi Copyright (c) https://yby6.com 2023.
import request from '@/utils/request'
export default {
// Список заказов запроса
orderUniAppPage(data) {
return request({
url: '/api/orderInfo/orderUniAppPage',
method: 'get',
params: data
})
}
}
Эта часть очень простая, поэтому я вставлю код напрямую (просто и хлопотно).
<u-list-item
v-for="(item, index) in orderList" :key="index">
<u-cell>
<template #title>
<view>
<view>
<view style="display: inline-block">
<u-tag :text="item.title"></u-tag>
</view>
<view class="payView">
<view>
<u-tag :text="item.orderStatus" v-if="item.orderStatus === 'еще нетплатить'"></u-tag>
<u-tag :text="item.orderStatus" v-if="item.orderStatus === «Платеж успешен»» type="success"></u-tag>
<u-tag :text="item.orderStatus" v-if="item.orderStatus === «Тайм-аут закрыт»» type="warning"></u-tag>
<u-tag :text="item.orderStatus" v-if="item.orderStatus === «Пользователь отменен»» type="info"></u-tag>
<u-tag :text="item.orderStatus" v-if="item.orderStatus === «Возврат в процессе»» type="danger"></u-tag>
<u-tag :text="item.orderStatus" v-if="item.orderStatus === «Возврат» type="info"></u-tag>
</view>
</view>
<view style="margin-top: 5px;">
Плательщик заказа: {{ item.title.split('-')[1] ? item.title.split('-')[1] : «Пользователи ПК» }}
</view>
</view>
</view>
<template #label>
<view style="float:left;">
<view style="text-align: left;">
Сумма заказа: {{ item.totalFee / 100 }} Юань
</view>
<view style="text-align: left;">
<view style="display: inline-block;">
Время заказа: {{ item.createTime }}
</view>
</view>
</view>
<view style="float:right;margin-top: 5px;">
<view class="btn" v-if="item.orderStatus === «Платеж успешен»»>
<u-button size="small" type="primary"
text="Возвращать деньги"></u-button>
</view>
<view class="btn" v-if="item.orderStatus === 'еще нетплатить'">
<u-button size="small" type="primary" :disabled="payBtnDisabled"
text="платить"></u-button>
</view>
<view class="btn" v-if="item.orderStatus === 'еще нетплатить'">
<u-button size="small" type="error"
text="Отмена"></u-button>
</view>
</view>
</template>
</template>
</u-cell>
</u-list-item>
Следующим шагом является выполнение заказа. кнопка оплаты, Кнопка отмены、Кнопка возврат, тайм-аут обратного отсчета, отмена заказа Мне потребовалось три часа, чтобы написать. Если это было полезно, пожалуйста, поставьте мне палец вверх ~ Спасибо💗.
использовать Всуществовать 'Купить курсстраница'Сделал заказ, ноеще нетплатитьиз Состояние,Обязательно проверьте мой заказ в это время, и вы сможете продолжить оплату заказа.,Уменьшает бэкэнд-затраты и решает проблему повторного объема заказов.
использовать Всуществоватьиспользовать户возвращатьсяеще нетплатить,использовать户不想要了那么会主观изинициативаизпродолжить Отменить заказ,Не хочу это покупать.
顾名思义использовать Виспользовать户существоватьплатить После заказа(возвращатьсяеще нет发货等一些Состояние)Может быть осуществлено Подать заявку на возврат средствдействовать
Это та функция, которая полностью необходима нашей системе.,Если пользователь существует, размещает заказ в определенное время,После размещения заказа мы не можем хранить его вечно. Нам необходимо иметь временную выгоду, чтобы ограничить срок действия этого заказа.,Итак, электронная коммерция в целомиз Время уже установлено 15 分钟倒计时系统инициатива发起Интерфейс отмены заказа по тайм-ауту.
Вот и все Интерфейс оплаты, интерфейс отмены заказа, интерфейс возврата Мы завершили предыдущий период с нуля! Если кому-то из студентов это понадобится, они могут это проверить.
Помните три метода кнопок, которые мы описали выше?
Соответствует трем функциям: оплата, отмена, возврат средств. Дальше будем улучшать!!!
Давайте воспользуемся тремя функциональными методами, чтобы щелкнуть мышью и увидеть эффект.
// Пользователь активно отменяет заказ
const cancelOrder = (obj) => {
console.log(obj);
}
// Оплата точки останова пользователя
const toPay = (obj) => {
console.log(obj);
}
// Пользователь активно возвращает деньги
const refund = (obj) => {
console.log(obj);
}
Нажатие любой кнопки выводит информацию о выбранном в данный момент объекте (то есть запись в фоновом режиме).
создаватьодин кусочек Неоплаченные заказы
Перейдите в раздел «Мои заказы» и нажмите «Запрос статуса неоплаченного заказа».
Исправлять weChatPay.js
Добавлен новый интерфейс отмены заказа. Обратите внимание, такой ли у вас внутренний интерфейс~
// Отменить заказ
export function cancel(orderNo) {
return request({
url: '/api/wx-pay/native/cancel/' + orderNo,
method: 'post'
})
}
toast("Заказ успешно отменен"); это окно подсказки, которое мы инкапсулировали в прошлый раз.
Рекомендуется, чтобы учащиеся вводили его вручную ~
// Пользователь активно отменяет заказ
const cancelOrder = (obj) => {
console.log(obj);
loading.value = true;
cancel(obj.orderNo).then((res) => {
toast("Заказ успешно отменен");
// Обновить список
loadmore();
});
}
Вы можете видеть, что мы успешно инициировали интерфейс отмены заказа, нам было предложено, и список был обновлен.
использовать Всуществовать 'Купить курсстраница'Сделал заказ, ноеще нетплатитьиз Состояние,Обязательно проверьте мой заказ в это время, и вы сможете продолжить оплату заказа.,Уменьшает бэкэнд-затраты и решает проблему повторного объема заказов.
При оформлении заказа мы уже написали как о фронтальной, так и о задней части, поэтому теперь получить к ней доступ очень просто.
Исправлять weCharPay.js
Добавить новый заказинтерфейс(Если уже сохраненосуществоватьтогда игнорируй)
// Единый заказ JSAPI
export function JSAPI(productId, openId) {
return request({
'url': `/api/wx-pay/js-api/${ productId }`,
'method': 'post',
'params': {
"openId": openId
}
})
}
создаватьодин кусочек Неоплаченные заказы
Исправлять toPay
функция Введите код оплаты напрямую в интерфейсе покупки. copy Просто иди сюда хахаха
логика: В целях безопасности боюсь обходить логин и платить напрямую, поэтому тут решение, авторизоваться или нет.
Студентам рекомендуется стучать вручную.
// Оплата точки останова пользователя
const toPay = (obj) => {
console.log(obj);
const storageSync = uni.getStorageSync('token');
const nickName = uni.getStorageSync('nickName');
payBtnDisabled.value = true;
if (!storageSync || !nickName) {
payBtnDisabled.value = false;
toast("Еще не авторизован!");
return;
}
JSAPI(obj.productId, storageSync + "|" + nickName)
.then((res) => {
const wx = res.data;
toast("Заказ успешно создан, инициируется оплата. Пожалуйста, подождите...");
uni.requestPayment({
provide: 'wxpay',
timeStamp: wx.timeStamp,
nonceStr: wx.nonceStr,
package: wx.package,
signType: wx.signType,
paySign: wx.paySign,
success: (res) => {
console.log(res);
payBtnDisabled.value = false;
},
fail: (res) => {
console.log(res);
toast("Отменить платеж, вы можете продолжить нажимать кнопку платежа, чтобы инициировать его снова");
payBtnDisabled.value = false;
},
});
})
.catch((err) => {
console.log(err);
payBtnDisabled.value = false;
});
}
Проверьте серверную часть, чтобы узнать, был ли заказ создан заново. Очевидно, мы определили, не был ли он создан заново.
Проверьте эффект
Перейдите в библиотеку компонентов uviewplus, чтобы найти наш модальный всплывающий слой.
адрес: https://uiadmin.net/uview-plus/components/modal.html
Добавить новую переменную
// Всплывающее окно возврата средств
const refundDialogVisible = ref(false);
// Форма возврата
const refundForm = ref({
orderNo: '',
refundNo: '',
reason: '',
});
// Форма правила проверки возврата
const rules = ref({
'refundNo': {
type: 'number',
required: true,
max: 4,
message: 'Пожалуйста, введите последние четыре цифры транзакции. заказа(число)', trigger: [ 'blur', 'change' ]
},
'reason': {
type: 'string',
required: true,
message: 'Пожалуйста, укажите причину возврата',
trigger: [ 'blur', 'change' ]
},
})
Идеисуществоватьвсплывающий встроенный в слой form форма
<!-- всплывающий слой Возврат -->
<u-modal
:loading="loading"
title="Подать заявку на возврат"
:show="refundDialogVisible"
showCancelButton
@confirm="refundOrder"
@cancel="closeDialog "
>
<view>
<!-- Обратите внимание: если вам нужна совместимость с WeChat Mini программе, лучше всего устанавливать правила через метод setRules -->
<u-form
labelPosition="left"
:model="refundForm"
:rules="rules"
ref="uForm"
>
<u-form-item
labelWidth="100px"
label="Торговый Номер заказа"
prop="refundNo"
borderBottom
ref="item1"
>
<u-input
v-model="refundForm.refundNo"
border="none"
></u-input>
</u-form-item>
<u-form-item
labelWidth="100px"
label="Причина возврата"
prop="reason"
borderBottom
ref="item2"
>
<u-input
v-model="refundForm.reason"
border="none"
></u-input>
</u-form-item>
</u-form>
</view>
</u-modal>
//Закрываем диалоговое окно возврата
const closeDialog = () => {
console.log('close.................');
refundDialogVisible.value = false;
refundForm.value = {
orderNo: '',
refundNo: '',
reason: '',
};
refundSubmitBtnDisabled.value = false;
};
Используется, когда пользователь не может осуществить возврат средств.
Backend интерфейсус существует Предыдущий ряд статей для ПК уже написан и объяснен. Посмотрим, что нужно передать.
Исправлять weChatPay.js
Новый Возвращать деньгиинтерфейс
// Подать заявку на возврат средств
export function refunds(orderNo, reason, refundNo) {
return request({
url: '/api/wx-pay/native/refunds/' + orderNo + '/' + refundNo + "/" + reason,
method: 'post'
})
}
запись инициирует функцию запроса возврата средств
Сначала проверьте, отключена ли кнопка запроса на возврат средств. Если она отключена, запрос не будет отправлен.
Включите непустую галочку нашей библиотеки компонентов и ограничьте максимальное количество входных номеров заказа до 4.
Создайте заказ и успешно оплатите
На этот раз запомните последние четыре цифры номера нашего заказа на транзакцию. я здесь 3070
Найдите заказ, за который мы только что заплатили.
Статья в этой главе эквивалентна завершению «Играем с WeChat с нуля» Платить》существовать Я собирался начать это руководство, я испытывал удовольствие от оплаты и чувствовал, что официальная документация была немного хлопотной. С тех пор мне пришла в голову идея написать статью о том, как использовать WeChat. с нуля. Некоторые студенты Pay могут подумать, что вызвать API просто, но если вы усердно работаете над написанием статей, чтобы помочь нуждающимся людям, то это не так просто~ конец 🎆
Этот вопрос исчерпан. Увидимся в следующий раз👋~
🌊 сосредоточиться Я не потерялся. Если эта статья вам полезна или у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение в области комментариев. Я обычно отвечу, когда увижу его. Пожалуйста, поставьте лайк и поддержите~ 💗
Я участвую в специальном учебном лагере Tencent Technology Creation 2023 Третий. выпуск Конкурс эссе, получивший приз. Соберите команду, чтобы выиграть приз!