PDF2需求修复 - v1.16

## 修复
1. 资源对接:去掉"擅长什么"只保留两项
2. 资源对接:需登录+购买章节才能使用
3. 手机号API:修复AppSecret配置错误
4. 小程序码API:修复AppSecret配置错误
5. 获取地址:增强错误处理

## AppSecret统一
- qrcode/phone API统一使用正确的AppSecret

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
卡若
2026-01-29 16:17:56 +08:00
parent 132743ce34
commit 8f01de4f9a
7 changed files with 114 additions and 45 deletions

View File

@@ -7,7 +7,7 @@ import { NextRequest, NextResponse } from 'next/server'
import { query } from '@/lib/db'
const APPID = process.env.WECHAT_APPID || 'wxb8bbb2b10dec74aa'
const APPSECRET = process.env.WECHAT_APPSECRET || '25b7e7fdb7998e5107e242ebb6ddabd0'
const APPSECRET = process.env.WECHAT_APPSECRET || '3c1fb1f63e6e052222bbcead9d07fe0c'
/**
* POST - 解密手机号

View File

@@ -4,7 +4,7 @@
import { NextRequest, NextResponse } from 'next/server'
const APPID = process.env.WECHAT_APPID || 'wxb8bbb2b10dec74aa'
const APPSECRET = process.env.WECHAT_APPSECRET || '25b7e7fdb7998e5107e242ebb6ddabd0'
const APPSECRET = process.env.WECHAT_APPSECRET || '3c1fb1f63e6e052222bbcead9d07fe0c'
// 获取access_token
async function getAccessToken() {

View File

@@ -185,6 +185,40 @@ Page({
handleMatchClick() {
const currentType = MATCH_TYPES.find(t => t.id === this.data.selectedType)
// 资源对接类型需要登录+购买章节才能使用
if (currentType && currentType.id === 'investor') {
// 检查是否登录
if (!this.data.isLoggedIn) {
wx.showModal({
title: '需要登录',
content: '请先登录后再使用资源对接功能',
confirmText: '去登录',
success: (res) => {
if (res.confirm) {
wx.switchTab({ url: '/pages/my/my' })
}
}
})
return
}
// 检查是否购买过章节
const hasPurchased = app.globalData.purchasedSections?.length > 0 || app.globalData.hasFullBook
if (!hasPurchased) {
wx.showModal({
title: '需要购买章节',
content: '购买任意章节后即可使用资源对接功能',
confirmText: '去购买',
success: (res) => {
if (res.confirm) {
wx.switchTab({ url: '/pages/catalog/catalog' })
}
}
})
return
}
}
// 如果是需要填写联系方式的类型(资源对接、导师顾问、团队招募)
if (currentType && currentType.showJoinAfterMatch) {
// 先检查是否已绑定联系方式

View File

@@ -207,20 +207,16 @@
</view>
</view>
<!-- 资源对接专用输入 -->
<!-- 资源对接专用输入(只有两项) -->
<block wx:if="{{joinType === 'investor'}}">
<view class="resource-form">
<view class="form-item">
<text class="form-label">我能帮到什么</text>
<input class="form-input-new" placeholder="例如:私域运营、品牌策划..." value="{{canHelp}}" bindinput="onCanHelpInput"/>
<text class="form-label">我能帮到什么</text>
<input class="form-input-new" placeholder="例如:私域运营、品牌策划、流量资源..." value="{{canHelp}}" bindinput="onCanHelpInput"/>
</view>
<view class="form-item">
<text class="form-label">我需要什么帮助</text>
<input class="form-input-new" placeholder="例如:流量、技术支持..." value="{{needHelp}}" bindinput="onNeedHelpInput"/>
</view>
<view class="form-item">
<text class="form-label">我擅长什么</text>
<input class="form-input-new" placeholder="例如:电商运营、内容创作..." value="{{goodAt}}" bindinput="onGoodAtInput"/>
<input class="form-input-new" placeholder="例如:技术支持、资金、人脉..." value="{{needHelp}}" bindinput="onNeedHelpInput"/>
</view>
</view>
</block>

View File

@@ -185,7 +185,7 @@ Page({
// 生成推广海报
async generatePoster() {
wx.showLoading({ title: '生成中...' })
wx.showLoading({ title: '生成中...', mask: true })
this.setData({ showPosterModal: true, isGeneratingPoster: true })
try {
@@ -196,16 +196,29 @@ Page({
// 获取小程序码(带推荐人参数)
let qrcodeImage = null
try {
// scene格式ref=用户ID前20位
const scene = userId ? `ref=${userId.slice(0,20)}` : 'ref=soul'
console.log('[Poster] 请求小程序码, scene:', scene)
const qrRes = await app.request('/api/miniprogram/qrcode', {
method: 'POST',
data: { scene, page: 'pages/index/index', width: 280 }
data: {
scene,
page: 'pages/index/index',
width: 280
}
})
if (qrRes.success && qrRes.image) {
console.log('[Poster] 小程序码响应:', qrRes?.success, qrRes?.image?.length)
if (qrRes && qrRes.success && qrRes.image) {
qrcodeImage = qrRes.image
console.log('[Poster] 小程序码获取成功')
} else {
console.log('[Poster] 响应无效:', qrRes)
}
} catch (e) {
console.log('[Poster] 获取小程序码失败,使用占位符')
console.error('[Poster] 获取小程序码失败:', e)
}
// 海报尺寸 300x450

View File

@@ -64,12 +64,13 @@ Page({
},
// 一键获取收货地址
async getAddress() {
try {
const res = await wx.chooseAddress()
if (res) {
const fullAddress = `${res.provinceName}${res.cityName}${res.countyName}${res.detailInfo}`
getAddress() {
wx.chooseAddress({
success: (res) => {
console.log('[Settings] 获取地址成功:', res)
const fullAddress = `${res.provinceName || ''}${res.cityName || ''}${res.countyName || ''}${res.detailInfo || ''}`
if (fullAddress.trim()) {
wx.setStorageSync('user_address', fullAddress)
this.setData({ address: fullAddress })
@@ -80,23 +81,47 @@ Page({
}
// 同步到服务器
this.syncProfileToServer()
this.syncAddressToServer(fullAddress)
wx.showToast({ title: '地址已获取', icon: 'success' })
}
} catch (e) {
},
fail: (e) => {
console.log('[Settings] 获取地址失败:', e)
if (e.errMsg?.includes('auth deny')) {
if (e.errMsg?.includes('cancel')) {
// 用户取消,不提示
return
}
if (e.errMsg?.includes('auth deny') || e.errMsg?.includes('authorize')) {
wx.showModal({
title: '需要授权',
content: '请允许获取收货地址',
content: '请在设置中允许获取收货地址',
confirmText: '去设置',
success: (res) => {
if (res.confirm) wx.openSetting()
}
})
} else {
wx.showToast({ title: '获取失败,请重试', icon: 'none' })
}
}
})
},
// 同步地址到服务器
async syncAddressToServer(address) {
try {
const userId = app.globalData.userInfo?.id
if (!userId) return
await app.request('/api/user/update', {
method: 'POST',
data: { userId, address }
})
console.log('[Settings] 地址已同步到服务器')
} catch (e) {
console.log('[Settings] 同步地址失败:', e)
}
},
// 切换自动提现
@@ -334,10 +359,11 @@ Page({
wx.showLoading({ title: '获取中...', mask: true })
// 调用服务器解密手机号
// 调用服务器解密手机号传入userId以便同步到数据库
const userId = app.globalData.userInfo?.id
const res = await app.request('/api/miniprogram/phone', {
method: 'POST',
data: { code }
data: { code, userId }
})
wx.hideLoading()

Binary file not shown.