新增: 1. /api/miniprogram/pay - 创建预支付订单API 2. /api/miniprogram/pay/notify - 支付回调处理 3. /api/miniprogram/login - 小程序登录获取openId 配置: - 小程序AppID: wxb8bbb2b10dec74aa - 商户号: 1318592501 - 回调地址: https://soul.cunbao.net/api/miniprogram/pay/notify 更新: - app.js: 添加getOpenId方法,支付前获取openId - read.js: processPayment调用真实支付接口 - 支持API不可用时回退到测试模式
104 lines
2.5 KiB
TypeScript
104 lines
2.5 KiB
TypeScript
/**
|
||
* 小程序登录API
|
||
* 使用code换取openId和session_key
|
||
*
|
||
* 小程序配置:
|
||
* - AppID: wxb8bbb2b10dec74aa
|
||
* - AppSecret: 85d3fa31584d06acdb1de4a597d25b7b
|
||
*/
|
||
|
||
import { NextResponse } from 'next/server'
|
||
|
||
const MINIPROGRAM_CONFIG = {
|
||
appId: 'wxb8bbb2b10dec74aa',
|
||
appSecret: '85d3fa31584d06acdb1de4a597d25b7b',
|
||
}
|
||
|
||
/**
|
||
* POST - 小程序登录,获取openId
|
||
*/
|
||
export async function POST(request: Request) {
|
||
try {
|
||
const body = await request.json()
|
||
const { code } = body
|
||
|
||
if (!code) {
|
||
return NextResponse.json({
|
||
success: false,
|
||
error: '缺少登录code'
|
||
}, { status: 400 })
|
||
}
|
||
|
||
console.log('[MiniLogin] 收到登录请求, code:', code.slice(0, 10) + '...')
|
||
|
||
// 调用微信接口获取openId
|
||
const wxUrl = `https://api.weixin.qq.com/sns/jscode2session?appid=${MINIPROGRAM_CONFIG.appId}&secret=${MINIPROGRAM_CONFIG.appSecret}&js_code=${code}&grant_type=authorization_code`
|
||
|
||
const response = await fetch(wxUrl)
|
||
const data = await response.json()
|
||
|
||
console.log('[MiniLogin] 微信接口返回:', {
|
||
errcode: data.errcode,
|
||
errmsg: data.errmsg,
|
||
hasOpenId: !!data.openid,
|
||
})
|
||
|
||
if (data.errcode) {
|
||
return NextResponse.json({
|
||
success: false,
|
||
error: `微信登录失败: ${data.errmsg || data.errcode}`
|
||
}, { status: 400 })
|
||
}
|
||
|
||
const openId = data.openid
|
||
const sessionKey = data.session_key
|
||
const unionId = data.unionid
|
||
|
||
if (!openId) {
|
||
return NextResponse.json({
|
||
success: false,
|
||
error: '获取openId失败'
|
||
}, { status: 500 })
|
||
}
|
||
|
||
// 创建或更新用户
|
||
// TODO: 这里应该连接数据库操作
|
||
const user = {
|
||
id: `user_${openId.slice(-8)}`,
|
||
openId,
|
||
nickname: '微信用户',
|
||
avatar: '',
|
||
referralCode: 'SOUL' + Date.now().toString(36).toUpperCase().slice(-6),
|
||
purchasedSections: [],
|
||
hasFullBook: false,
|
||
earnings: 0,
|
||
pendingEarnings: 0,
|
||
referralCount: 0,
|
||
createdAt: new Date().toISOString()
|
||
}
|
||
|
||
// 生成token
|
||
const token = `tk_${openId.slice(-8)}_${Date.now()}`
|
||
|
||
console.log('[MiniLogin] 登录成功, userId:', user.id)
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
data: {
|
||
openId,
|
||
sessionKey, // 注意:生产环境不应返回sessionKey给前端
|
||
unionId,
|
||
user,
|
||
token,
|
||
}
|
||
})
|
||
|
||
} catch (error) {
|
||
console.error('[MiniLogin] 登录失败:', error)
|
||
return NextResponse.json({
|
||
success: false,
|
||
error: '登录失败'
|
||
}, { status: 500 })
|
||
}
|
||
}
|