bindbox-game/internal/pkg/wechat/phone_number.go
邹方成 1ab39d2f5a
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 25s
refactor: 重构项目结构并重命名模块
feat(admin): 新增工会管理功能
feat(activity): 添加活动管理相关服务
feat(user): 实现用户道具卡和积分管理
feat(guild): 新增工会成员管理功能

fix: 修复数据库连接配置
fix: 修正jwtoken导入路径
fix: 解决端口冲突问题

style: 统一代码格式和注释风格
style: 更新项目常量命名

docs: 添加项目框架和开发规范文档
docs: 更新接口文档注释

chore: 移除无用代码和文件
chore: 更新Makefile和配置文件
chore: 清理日志文件

test: 添加道具卡测试脚本
2025-11-14 21:10:00 +08:00

50 lines
1.6 KiB
Go

package wechat
import (
"encoding/json"
"fmt"
"net/http"
"bindbox-game/internal/pkg/core"
"bindbox-game/internal/pkg/httpclient"
)
type PhoneNumberResponse struct {
ErrCode int `json:"errcode,omitempty"`
ErrMsg string `json:"errmsg,omitempty"`
PhoneInfo struct {
PhoneNumber string `json:"phoneNumber"`
PurePhoneNumber string `json:"purePhoneNumber"`
CountryCode string `json:"countryCode"`
} `json:"phone_info"`
}
// GetPhoneNumber 使用微信开放接口换取用户手机号
// DOC: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html
func GetPhoneNumber(ctx core.Context, accessToken, code string) (*PhoneNumberResponse, error) {
if accessToken == "" || code == "" {
return nil, fmt.Errorf("参数缺失")
}
client := httpclient.GetHttpClientWithContext(ctx.RequestContext())
resp, err := client.R().
SetQueryParam("access_token", accessToken).
SetBody(map[string]string{"code": code}).
Post("https://api.weixin.qq.com/wxa/business/getuserphonenumber")
if err != nil {
return nil, err
}
if resp.StatusCode() != http.StatusOK {
return nil, fmt.Errorf("HTTP错误: %d", resp.StatusCode())
}
var r PhoneNumberResponse
if err := json.Unmarshal(resp.Body(), &r); err != nil {
return nil, err
}
if r.ErrCode != 0 {
return nil, fmt.Errorf(r.ErrMsg)
}
if r.PhoneInfo.PurePhoneNumber == "" && r.PhoneInfo.PhoneNumber == "" {
return nil, fmt.Errorf("未获取到手机号")
}
return &r, nil
}