upload project source code

This commit is contained in:
2026-04-30 18:49:43 +08:00
commit 9b394ba682
2277 changed files with 660945 additions and 0 deletions

View File

@@ -0,0 +1,285 @@
/**
* 微信支付集成使用示例
* 展示如何在不同场景下使用新的微信支付功能
*/
import { payWithCallbacks, quickPay, securePay } from './payment';
import { quickWechatPay, secureWechatPay, handlePaymentResult } from './wechat-payment';
import type { CreateOrderParams } from '@/api/types';
declare const uni: any;
/**
* 示例1: 财运解析解锁支付
*/
export const payForWealthAnalysisUnlock = async (reportId: number, price: number) => {
const params: CreateOrderParams = {
description: '财运解析详细报告解锁',
total_amount: Math.round(price * 100), // 转换为分
business_type: 'wealth_analysis',
business_id: reportId,
pay_type: 'jsapi'
};
return await payWithCallbacks(params, {
onSuccess: (result) => {
console.log('财运解析支付成功:', result);
uni.showToast({ title: '解锁成功,正在刷新数据...', icon: 'success' });
// 这里可以触发数据刷新或页面跳转
},
onFail: (result) => {
console.error('财运解析支付失败:', result);
uni.showModal({
title: '支付失败',
content: result.msg || '支付失败,请重试',
showCancel: false
});
},
onCancel: (result) => {
console.log('用户取消财运解析支付:', result);
// 用户取消支付,可以不做任何提示
}
}, true); // 使用安全模式
};
/**
* 示例2: 企业起名服务支付
*/
export const payForCompanyNaming = async (companyInfo: any, serviceLevel: 'basic' | 'premium') => {
const prices = {
basic: 99,
premium: 299
};
const descriptions = {
basic: '企业起名基础服务',
premium: '企业起名高级服务'
};
const params: CreateOrderParams = {
description: descriptions[serviceLevel],
total_amount: prices[serviceLevel] * 100, // 转换为分
business_type: 'company_naming',
business_id: companyInfo.id,
pay_type: 'jsapi'
};
try {
const result = await secureWechatPay(params);
handlePaymentResult(result, {
onSuccess: (res) => {
uni.showToast({ title: '支付成功,正在生成方案...', icon: 'success' });
// 跳转到结果页面或刷新数据
uni.navigateTo({
url: `/pages/naming-result/index?orderId=${res.outTradeNo}`
});
},
onFail: (res) => {
uni.showModal({
title: '支付失败',
content: '支付过程中出现问题,请重试或联系客服',
showCancel: true,
confirmText: '重试',
cancelText: '取消',
success: (modalRes) => {
if (modalRes.confirm) {
// 重新发起支付
payForCompanyNaming(companyInfo, serviceLevel);
}
}
});
},
onCancel: () => {
// 用户取消支付,返回上一页或停留在当前页
}
});
return result;
} catch (error) {
console.error('企业起名支付异常:', error);
uni.showToast({ title: '支付异常,请重试', icon: 'none' });
return { success: false, msg: '支付异常' };
}
};
/**
* 示例3: 个人测名服务支付
*/
export const payForPersonalNameAnalysis = async (nameInfo: any) => {
const params: CreateOrderParams = {
description: `个人测名服务-${nameInfo.name}`,
total_amount: 1980, // 19.8元
business_type: 'personal_name_analysis',
business_id: nameInfo.id,
pay_type: 'jsapi'
};
// 使用快速支付模式(不验证支付状态)
const result = await quickPay(params);
if (result.success) {
// 支付成功后的处理
uni.showToast({ title: '支付成功', icon: 'success' });
// 可以立即显示结果或跳转
setTimeout(() => {
uni.navigateTo({
url: `/pages/name-analysis-result/index?orderId=${result.outTradeNo}`
});
}, 1500);
} else {
// 支付失败的处理
if (result.msg && !result.msg.includes('取消')) {
uni.showToast({ title: result.msg, icon: 'none' });
}
}
return result;
};
/**
* 示例4: 批量支付处理(多个服务一起购买)
*/
export const payForMultipleServices = async (services: Array<{
type: string;
description: string;
amount: number;
businessId: number;
}>) => {
const totalAmount = services.reduce((sum, service) => sum + service.amount, 0);
const description = services.map(s => s.description).join('、');
const params: CreateOrderParams = {
description: `套餐服务:${description}`,
total_amount: totalAmount * 100, // 转换为分
business_type: 'company_naming', // 主要业务类型
business_id: services[0].businessId, // 使用第一个服务的ID
pay_type: 'jsapi'
};
return await payWithCallbacks(params, {
onSuccess: (result) => {
uni.showModal({
title: '支付成功',
content: '您的套餐服务已购买成功,正在为您生成报告...',
showCancel: false,
confirmText: '查看详情',
success: () => {
uni.navigateTo({
url: `/pages/service-package-result/index?orderId=${result.outTradeNo}`
});
}
});
},
onFail: (result) => {
uni.showModal({
title: '支付失败',
content: `支付失败:${result.msg}`,
showCancel: true,
confirmText: '重试',
success: (modalRes) => {
if (modalRes.confirm) {
payForMultipleServices(services);
}
}
});
},
onCancel: () => {
console.log('用户取消套餐支付');
}
}, true); // 使用安全模式验证支付
};
/**
* 示例5: 支付状态查询和处理
*/
export const checkAndHandlePaymentStatus = async (outTradeNo: string) => {
try {
uni.showLoading({ title: '查询支付状态...' });
const { queryOrderStatus } = await import('./payment');
const orderInfo = await queryOrderStatus(outTradeNo);
uni.hideLoading();
switch (orderInfo.status) {
case 'paid':
uni.showToast({ title: '支付已完成', icon: 'success' });
return true;
case 'pending':
uni.showModal({
title: '支付处理中',
content: '您的支付正在处理中,请稍后查看',
showCancel: false
});
return false;
case 'cancelled':
uni.showToast({ title: '订单已取消', icon: 'none' });
return false;
case 'refunded':
uni.showToast({ title: '订单已退款', icon: 'none' });
return false;
default:
uni.showToast({ title: '支付状态异常', icon: 'none' });
return false;
}
} catch (error) {
uni.hideLoading();
console.error('查询支付状态失败:', error);
uni.showToast({ title: '查询失败,请重试', icon: 'none' });
return false;
}
};
/**
* 通用支付工具函数
*/
export const PaymentHelper = {
/**
* 格式化金额显示(分转元)
*/
formatAmount: (amountInCents: number): string => {
return (amountInCents / 100).toFixed(2);
},
/**
* 元转分
*/
yuanToCents: (yuan: number): number => {
return Math.round(yuan * 100);
},
/**
* 获取业务类型的中文名称
*/
getBusinessTypeName: (type: string): string => {
const typeNames: Record<string, string> = {
'company_naming': '企业起名',
'company_renaming': '企业改名',
'company_name_analysis': '企业测名',
'personal_naming': '个人起名',
'personal_renaming': '个人改名',
'personal_name_analysis': '个人测名',
'wealth_analysis': '财运解析'
};
return typeNames[type] || '未知服务';
},
/**
* 创建标准的支付参数
*/
createPaymentParams: (
businessType: string,
businessId: number,
description: string,
amountInYuan: number
): CreateOrderParams => {
return {
description,
total_amount: PaymentHelper.yuanToCents(amountInYuan),
business_type: businessType as any,
business_id: businessId,
pay_type: 'jsapi'
};
}
};