feat:【MALL 商城】商城分佣提现,初步对接成功微信支付

pull/148/MERGE
YunaiV 2025-05-11 09:08:18 +08:00
parent 098057b2de
commit 62d1f4f273
4 changed files with 197 additions and 56 deletions

View File

@ -114,22 +114,62 @@
<!-- 钱包记录 -->
<view v-if="state.pagination.total > 0">
<view
class="wallet-list ss-flex border-bottom"
v-for="item in state.pagination.list"
:key="item.id"
>
<view class="list-content">
<view class="title-box ss-flex ss-row-between ss-m-b-20">
<text class="title ss-line-1">{{ item.title }}</text>
<view class="money">
<text v-if="item.price >= 0" class="add">+{{ fen2yuan(item.price) }}</text>
<text v-else class="minus">{{ fen2yuan(item.price) }}</text>
<!-- 分佣列表 -->
<view v-if="state.currentTab === 0">
<view
class="wallet-list ss-flex border-bottom"
v-for="item in state.pagination.list"
:key="item.id"
>
<view class="list-content">
<view class="title-box ss-flex ss-row-between ss-m-b-20">
<text class="title ss-line-1">{{ item.title }}</text>
<view class="money">
<text v-if="item.price >= 0" class="add">+{{ fen2yuan(item.price) }}</text>
<text v-else class="minus">{{ fen2yuan(item.price) }}</text>
</view>
</view>
<view class="ss-flex ss-row-between ss-col-center">
<text class="time">
{{ sheep.$helper.timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') }}
</text>
<view class="ss-flex ss-col-center">
<text class="status" :class="'status-' + item.status">{{ item.statusName }}</text>
</view>
</view>
</view>
</view>
</view>
<!-- 提现列表 -->
<view v-else>
<view
class="wallet-list ss-flex border-bottom"
v-for="item in state.pagination.list"
:key="item.id"
>
<view class="list-content">
<view class="title-box ss-flex ss-row-between ss-m-b-20">
<text class="title ss-line-1">{{ item.typeName }}</text>
<view class="money">
<text class="minus">{{ fen2yuan(item.price) }}</text>
</view>
</view>
<view class="ss-flex ss-row-between ss-col-center">
<text class="time">
{{ sheep.$helper.timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') }}
</text>
<button
v-if="item.status === 10 && item.type === 5 && item.payTransferId > 0"
class="ss-reset-button confirm-btn ss-m-l-20"
@tap="onRequestMerchantTransfer(item)"
>
确认收款
</button>
<text v-else class="status" :class="'status-' + item.status">{{
item.statusName
}}</text>
</view>
</view>
<text class="time">{{
sheep.$helper.timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss')
}}</text>
</view>
</view>
</view>
@ -179,11 +219,11 @@
const tabMaps = [
{
name: '分佣',
value: '1', // BrokerageRecordBizTypeEnum.ORDER
value: '1',
},
{
name: '提现',
value: '2', // BrokerageRecordBizTypeEnum.WITHDRAW
value: '2',
},
];
@ -197,13 +237,19 @@
async function getLogList() {
state.loadStatus = 'loading';
let { code, data } = await BrokerageApi.getBrokerageRecordPage({
pageSize: state.pagination.pageSize,
pageNo: state.pagination.pageNo,
bizType: tabMaps[state.currentTab].value,
'createTime[0]': state.date[0] + ' 00:00:00',
'createTime[1]': state.date[1] + ' 23:59:59',
});
let { code, data } = await (state.currentTab === 0
? BrokerageApi.getBrokerageRecordPage({
pageSize: state.pagination.pageSize,
pageNo: state.pagination.pageNo,
'createTime[0]': state.date[0] + ' 00:00:00',
'createTime[1]': state.date[1] + ' 23:59:59',
})
: BrokerageApi.getBrokerageWithdrawPage({
pageSize: state.pagination.pageSize,
pageNo: state.pagination.pageNo,
'createTime[0]': state.date[0] + ' 00:00:00',
'createTime[1]': state.date[1] + ' 23:59:59',
}));
if (code !== 0) {
return;
}
@ -261,11 +307,36 @@
state.summary = data;
}
//
// https://pay.weixin.qq.com/doc/v3/merchant/4012716430
async function onRequestMerchantTransfer(item) {
const requestMerchantTransfer = sheep.$platform.useProvider()
? sheep.$platform.useProvider().requestMerchantTransfer
: undefined;
if (!requestMerchantTransfer) {
sheep.$helper.toast('仅微信平台支持该功能');
return;
}
//
const { code, data } = await BrokerageApi.getBrokerageWithdraw(item.id);
if (code !== 0) {
return;
}
//
await requestMerchantTransfer(
data.transferChannelMchId,
data.transferChannelPackageInfo,
(res) => {
debugger;
},
);
}
onLoad(async (options) => {
state.today = dayjs().format('YYYY-MM-DD');
state.date = [state.today, state.today];
if (options.type === 2) {
// tab
if (options.type === '2') {
// "" tab
state.currentTab = 1;
}
getLogList();
@ -476,6 +547,17 @@
color: $dark-3;
}
}
.confirm-btn {
font-size: 22rpx;
color: var(--ui-BG-Main);
background: rgba(var(--ui-BG-Main-rgb), 0.1);
padding: 4rpx 16rpx;
margin: 0;
line-height: 1.4;
border-radius: 20rpx;
border: 1px solid var(--ui-BG-Main);
}
}
.model-title {
@ -515,4 +597,17 @@
line-height: normal;
}
}
.status {
font-size: 22rpx;
&.status-0 {
color: #ff9900;
}
&.status-1 {
color: #19be6b;
}
&.status-2 {
color: #fa3534;
}
}
</style>

View File

@ -84,7 +84,7 @@
</view>
<!-- 持卡人姓名 -->
<view class="card-title" v-show="['2', '5', '6'].includes(state.accountInfo.type)">
收款真名
收款真名
</view>
<view
class="input-box ss-flex ss-col-center border-bottom"
@ -95,7 +95,7 @@
:inputBorder="false"
class="ss-flex-1 ss-p-l-10"
v-model="state.accountInfo.userName"
placeholder="请输入收款真名"
placeholder="请输入收款真名"
/>
</view>
<!-- 提现银行 -->

View File

@ -2,18 +2,18 @@ import request from '@/sheep/request';
const BrokerageApi = {
// 绑定分销用户
bindBrokerageUser: (data)=>{
bindBrokerageUser: (data) => {
return request({
url: '/trade/brokerage-user/bind',
method: 'PUT',
data
data,
});
},
// 获得个人分销信息
getBrokerageUser: () => {
return request({
url: '/trade/brokerage-user/get',
method: 'GET'
method: 'GET',
});
},
// 获得个人分销统计
@ -24,12 +24,12 @@ const BrokerageApi = {
});
},
// 获得分销记录分页
getBrokerageRecordPage: params => {
getBrokerageRecordPage: (params) => {
if (params.status === undefined) {
delete params.status
delete params.status;
}
const queryString = Object.keys(params)
.map(key => encodeURIComponent(key) + '=' + params[key])
.map((key) => encodeURIComponent(key) + '=' + params[key])
.join('&');
return request({
url: `/trade/brokerage-record/page?${queryString}`,
@ -37,23 +37,41 @@ const BrokerageApi = {
});
},
// 创建分销提现
createBrokerageWithdraw: data => {
createBrokerageWithdraw: (data) => {
return request({
url: '/trade/brokerage-withdraw/create',
method: 'POST',
data,
});
},
// 获得分销提现分页
getBrokerageWithdrawPage: (params) => {
const queryString = Object.keys(params)
.map((key) => encodeURIComponent(key) + '=' + params[key])
.join('&');
return request({
url: `/trade/brokerage-withdraw/page?${queryString}`,
method: 'GET',
});
},
// 获得分销提现详情
getBrokerageWithdraw: (id) => {
return request({
url: `/trade/brokerage-withdraw/get`,
method: 'GET',
params: { id },
});
},
// 获得商品的分销金额
getProductBrokeragePrice: spuId => {
getProductBrokeragePrice: (spuId) => {
return request({
url: '/trade/brokerage-record/get-product-brokerage-price',
method: 'GET',
params: { spuId }
params: { spuId },
});
},
// 获得分销用户排行(基于佣金)
getRankByPrice: params => {
getRankByPrice: (params) => {
const queryString = `times=${params.times[0]}&times=${params.times[1]}`;
return request({
url: `/trade/brokerage-user/get-rank-by-price?${queryString}`,
@ -61,9 +79,9 @@ const BrokerageApi = {
});
},
// 获得分销用户排行分页(基于佣金)
getBrokerageUserChildSummaryPageByPrice: params => {
getBrokerageUserChildSummaryPageByPrice: (params) => {
const queryString = Object.keys(params)
.map(key => encodeURIComponent(key) + '=' + params[key])
.map((key) => encodeURIComponent(key) + '=' + params[key])
.join('&');
return request({
url: `/trade/brokerage-user/rank-page-by-price?${queryString}`,
@ -71,9 +89,9 @@ const BrokerageApi = {
});
},
// 获得分销用户排行分页(基于用户量)
getBrokerageUserRankPageByUserCount: params => {
getBrokerageUserRankPageByUserCount: (params) => {
const queryString = Object.keys(params)
.map(key => encodeURIComponent(key) + '=' + params[key])
.map((key) => encodeURIComponent(key) + '=' + params[key])
.join('&');
return request({
url: `/trade/brokerage-user/rank-page-by-user-count?${queryString}`,
@ -81,13 +99,13 @@ const BrokerageApi = {
});
},
// 获得下级分销统计分页
getBrokerageUserChildSummaryPage: params => {
getBrokerageUserChildSummaryPage: (params) => {
return request({
url: '/trade/brokerage-user/child-summary-page',
method: 'GET',
params,
})
}
}
});
},
};
export default BrokerageApi
export default BrokerageApi;

View File

@ -1,6 +1,7 @@
import AuthUtil from '@/sheep/api/member/auth';
import SocialApi from '@/sheep/api/member/social';
import UserApi from '@/sheep/api/member/user';
import sheep from '@/sheep';
const socialType = 34; // 社交类型 - 微信小程序
@ -126,14 +127,14 @@ async function getInfo() {
const checkUpdate = async (silence = true) => {
if (uni.canIUse('getUpdateManager')) {
const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function(res) {
updateManager.onCheckForUpdate(function (res) {
// 请求完新版本信息的回调
if (res.hasUpdate) {
updateManager.onUpdateReady(function() {
updateManager.onUpdateReady(function () {
uni.showModal({
title: '更新提示',
content: '新版本已经准备好,是否重启应用?',
success: function(res) {
success: function (res) {
if (res.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate();
@ -141,7 +142,7 @@ const checkUpdate = async (silence = true) => {
},
});
});
updateManager.onUpdateFailed(function() {
updateManager.onUpdateFailed(function () {
// 新的版本下载失败
// uni.showModal({
// title: '已经有新版本了哟~',
@ -169,17 +170,17 @@ async function getSubscribeTemplate() {
}
// 订阅消息
function subscribeMessage(event, callback= undefined) {
function subscribeMessage(event, callback = undefined) {
let tmplIds = [];
if (typeof event === 'string') {
const temp = subscribeEventList.find(item => item.title.includes(event));
const temp = subscribeEventList.find((item) => item.title.includes(event));
if (temp) {
tmplIds.push(temp.id);
}
}
if (typeof event === 'object') {
event.forEach((e) => {
const temp = subscribeEventList.find(item => item.title.includes(e));
const temp = subscribeEventList.find((item) => item.title.includes(e));
if (temp) {
tmplIds.push(temp.id);
}
@ -189,16 +190,42 @@ function subscribeMessage(event, callback= undefined) {
uni.requestSubscribeMessage({
tmplIds,
success: ()=>{
success: () => {
// 不管是拒绝还是同意都触发
callback && callback()
},
callback && callback();
},
fail: (err) => {
console.log(err);
},
});
}
// 商家转账用户确认模式下,拉起页面请求用户确认收款 Transfer
function requestMerchantTransfer(mchId, packageInfo, successCallback, failCallback) {
if (!wx.canIUse('requestMerchantTransfer')) {
wx.showModal({
content: '你的微信版本过低,请更新至最新版本。',
showCancel: false,
});
return;
}
wx.requestMerchantTransfer({
mchId: mchId,
appId: wx.getAccountInfoSync().miniProgram.appId,
package: packageInfo,
success: (res) => {
// res.err_msg 将在页面展示成功后返回应用时返回 ok并不代表付款成功
console.log('success:', res);
successCallback && successCallback(res);
},
fail: (res) => {
console.log('fail:', res);
sheep.$helper.toast(res.errMsg);
failCallback && failCallback(res);
},
});
}
export default {
load,
login,
@ -210,4 +237,5 @@ export default {
getOpenid,
subscribeMessage,
checkUpdate,
requestMerchantTransfer,
};