补充手机号解密API

This commit is contained in:
卡若
2026-01-29 12:26:43 +08:00
parent cd2c8d7cc5
commit 3f54e1af47

View File

@@ -0,0 +1,86 @@
/**
* 微信手机号解密API
* 获取用户手机号(需要小程序 getPhoneNumber 授权)
*/
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'
/**
* POST - 解密手机号
*/
export async function POST(request: NextRequest) {
try {
const body = await request.json()
const { code, userId } = body
if (!code) {
return NextResponse.json({ success: false, message: '缺少code参数' }, { status: 400 })
}
// 1. 获取 access_token
const tokenUrl = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`
const tokenRes = await fetch(tokenUrl)
const tokenData = await tokenRes.json()
if (!tokenData.access_token) {
console.error('[Phone] 获取access_token失败:', tokenData)
return NextResponse.json({
success: false,
message: '获取access_token失败',
error: tokenData.errmsg
}, { status: 500 })
}
// 2. 获取手机号
const phoneUrl = `https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=${tokenData.access_token}`
const phoneRes = await fetch(phoneUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code })
})
const phoneData = await phoneRes.json()
if (phoneData.errcode !== 0) {
console.error('[Phone] 获取手机号失败:', phoneData)
return NextResponse.json({
success: false,
message: '获取手机号失败',
error: phoneData.errmsg
}, { status: 500 })
}
const phoneNumber = phoneData.phone_info?.phoneNumber || phoneData.phone_info?.purePhoneNumber
if (!phoneNumber) {
return NextResponse.json({ success: false, message: '未获取到手机号' }, { status: 500 })
}
// 3. 如果有userId更新到数据库
if (userId) {
try {
await query('UPDATE users SET phone = ? WHERE id = ?', [phoneNumber, userId])
console.log('[Phone] 手机号已绑定到用户:', userId)
} catch (e) {
console.log('[Phone] 更新数据库失败,但返回手机号成功')
}
}
return NextResponse.json({
success: true,
phoneNumber,
countryCode: phoneData.phone_info?.countryCode || '86'
})
} catch (error) {
console.error('[Phone] Error:', error)
return NextResponse.json({
success: false,
message: '服务器错误',
error: String(error)
}, { status: 500 })
}
}