字节小程序 授权手机号 解密

小红书微信小程序X-Sign参数解密 立即下载

原因


最近开发字节小程序 发现字节服务端demo实在是…
所以我弄完手机号解密 就发上来 给大家玩耍学习

先决条件永远是环境
你的小程序要有手机号授权能力
开发环境 字节小程序 golang

这看有个要注意
1先登录
2在授权手机号
3才可以解密

小程序代码
js

Page({
  data:{
  },
    getPhoneNumberHandler(e) {
      console.log("------手机号-------");
      console.log(e);
      console.log("------手机号-------");
      console.log(e.detail.errMsg);
      console.log(e.detail.iv);
      console.log(e.detail.encryptedData);

      this.data.encryptedData = e.detail.encryptedData
      this.data.iv = e.detail.iv
    },

    login_xxx(){
      let that = this.data
        tt.login({
            force: true,
            success(res) {
              console.log("-------登录------");
              console.log(res);
              console.log("-------登录------");
              console.log(`login 调用成功${res.code} ${res.anonymousCode}`);

              that.code = res.code
              that.anonymousCode = res.anonymousCode
            },
            fail(res) {
              console.log(`login 调用失败`);
            },
          });
    },
    //自己写的服务端解密
    sign_xxx(){

     let that = this

      tt.request({
        url: 'http://xxxxxx.xxxx/xx/xx', // 目标服务器url
        header: {
          "content-type": "application/json",
          "Authorization": "Bearer eyJhbGcIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjI3MTIyNzQsImlhdCI6MTYyMjYyNTg3NH0.j5LcJSLxpxDTd_iuDJltCE5HdE9sIu_W2l-6EyVsKag",
        },
        method: "POST",
        data: {
        
          "appid": "你小程序的appid",
        "code": that.data.code,
        "anonymous_code": that.data.anonymousCode,
        "encryptedData": that.data.encryptedData,
        "iv": that.data.iv
      },
        dataType:"json",
        success: (res) => {
          console.log(res)
        }
      });
    }

    
  });

html

<view class="intro">个人中心</view>

<button
bindtap="login_xxx"
>登录</button>

<button
class="aaaaa"
  open-type="getPhoneNumber"
  bindgetphonenumber="getPhoneNumberHandler"
>授权手机号</button>

<button
class="aaaaa"
bindtap="sign_xxx"
>解密</button>

在这里插入图片描述
下边是服务端代码 这边用的golang写的
byte code

package bytexcx

import (
	"context"
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"encoding/json"
	"errors"
	"fmt"
	"github.com/tal-tech/go-zero/core/logx"
	"poly/lib/request"
	"time"
)

var (
	ErrAppIDNotMatch       = errors.New("app id not match")
	ErrInvalidBlockSize    = errors.New("invalid block size")
	ErrInvalidPKCS7Data    = errors.New("invalid PKCS7 data")
	ErrInvalidPKCS7Padding = errors.New("invalid padding on input")
)

type AppSetting struct {
	logx.Logger
	Appkey, Secret string
}

const (
	code2Session = "https://developer.toutiao.com/api/apps/jscode2session"
)

//用户数据
type CodeOpenID struct {
	AnonymousOpenid string `json:"anonymous_openid"` //设备标识 IqSPkd0t2lvqAEsP
	Error           int    `json:"error"`            //0成功
	Openid          string `json:"openid"`           //用户标识  张建武的 28452fbc-0678-4d35-81e6-82a1182106d7
	SessionKey      string `json:"session_key"`      //用户解密铭感数据  如手机号
	Unionid         string `json:"unionid"`          //用户在小程序平台的唯一标识符,请求时有 code 参数才会返回。如果开发者拥有多个小程序,可通过 unionid 来区分用户的唯一性。
}

//报错说明
type OpenIDErr struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
	Error   int    `json:"error"`
	Message string `json:"message"`
}

type MobileInfo struct {
	CountryCode     string `json:"countryCode"`
	PhoneNumber     string `json:"phoneNumber"`
	PurePhoneNumber string `json:"purePhoneNumber"`
	Watermark       struct {
		Appid     string `json:"appid"`
		Timestamp int    `json:"timestamp"`
	} `json:"watermark"`
}

func NewAppSetting(appkey, secret string) *AppSetting {
	return &AppSetting{logx.WithContext(context.TODO()), appkey, secret}
}

// 获取 OpenId
func (app *AppSetting) GetOpenId(code, anonymous_code string) (*CodeOpenID, error) {
	url := fmt.Sprintf("%s?appid=%s&secret=%s&code=%s&anonymous_code=%s",
		code2Session,
		app.Appkey,
		app.Secret,
		code,
		anonymous_code,
	)

	logx.Info("字节小程序 GetOpenId 请求: ", url)
	fmt.Println()
	fmt.Println(url)
	fmt.Println()

	http := &request.HttpRequest{
		Url:     url,
		Month:   "GET",
		Data:    nil,
		Head:    nil,
		Timeout: 3 * time.Second, //3秒超时
	}

	data, err := http.Http()
	logx.Info("字节小程序 GetOpenId 返回: ", url)

	fmt.Println()
	fmt.Println(string(data))
	fmt.Println()

	if err != nil {
		return nil, err
	}
	open := &CodeOpenID{}
	err = json.Unmarshal(data, open)
	if err != nil {
		return nil, err
	}
	if open.Error == 0 {
		return open, nil
	}
	operr := &OpenIDErr{}
	err = json.Unmarshal(data, operr)
	if err != nil {
		return nil, err
	}
	return nil, errors.New(operr.Message)
}

// 获取授权手机号
func (app *AppSetting) GetMobileInfo(data, key, iv string) (*MobileInfo, error) {
	aesKey, err := base64.StdEncoding.DecodeString(key)
	if err != nil {
		return nil, err
	}
	cipherText, err := base64.StdEncoding.DecodeString(data)
	if err != nil {
		return nil, err
	}
	ivBytes, err := base64.StdEncoding.DecodeString(iv)
	if err != nil {
		return nil, err
	}
	block, err := aes.NewCipher(aesKey)
	if err != nil {
		return nil, err
	}
	mode := cipher.NewCBCDecrypter(block, ivBytes)
	mode.CryptBlocks(cipherText, cipherText)
	cipherText, err = pkcs7Unpad(cipherText, block.BlockSize())
	if err != nil {
		return nil, err
	}

	fmt.Println(string(cipherText))

	info := new(MobileInfo)
	err = json.Unmarshal(cipherText, info)
	if err != nil {
		return nil, err
	}

	return info, nil
}

// 获取用户信息
func (app *AppSetting) GetUserInfo() {

}

// pkcs7Unpad returns slice of the original data without padding
func pkcs7Unpad(data []byte, blockSize int) ([]byte, error) {
	if blockSize <= 0 {
		return nil, ErrInvalidBlockSize
	}
	if len(data)%blockSize != 0 || len(data) == 0 {
		return nil, ErrInvalidPKCS7Data
	}
	c := data[len(data)-1]
	n := int(c)
	if n == 0 || n > len(data) {
		return nil, ErrInvalidPKCS7Padding
	}
	for i := 0; i < n; i++ {
		if data[len(data)-n+i] != c {
			return nil, ErrInvalidPKCS7Padding
		}
	}
	return data[:len(data)-n], nil
}


这里面有个http请求 我也放一下吧

package request

import (
	"bytes"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"strings"
	"time"
)

type HttpRequest struct {
	Url     string            //请求地址
	Month   string            //请求方法
	Data    []byte            //请求内容
	Head    map[string]string //请求头
	Timeout time.Duration     //超时时间
}

// 发送GET请求
// url:         请求地址
// response:    请求返回的内容
func Get(url string) string {
	// 超时时间:5秒
	client := &http.Client{Timeout: 5 * time.Second}
	resp, err := client.Get(url)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	var buffer []byte
	result := bytes.NewBuffer(nil)
	for {
		n, err := resp.Body.Read(buffer[0:])
		result.Write(buffer[0:n])
		if err != nil && err == io.EOF {
			break
		} else if err != nil {
			panic(err)
		}
	}

	return result.String()
}

// 发送POST请求
// url:         请求地址
// data:        POST请求提交的数据
// contentType: 请求体格式,如:application/json
// content:     请求放回的内容
func (hp *HttpRequest) Http() (result []byte, err error) {
	// 超时时间
	client := &http.Client{Timeout: hp.Timeout}
	req, err := http.NewRequest(hp.Month, hp.Url, strings.NewReader(string(hp.Data)))
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	for key, header := range hp.Head {
		req.Header.Set(key, header)
	}
	res, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer res.Body.Close()

	result, err = ioutil.ReadAll(res.Body)
	if err != nil {
		return
	}
	return
}

服务端(C#)获取小程序(微信、字节跳动)手机号 立即下载

相关推荐

倍压整流电路设计

倍压整流电路利用二极管和电容的充放电特性实现电压提升,可分为二倍压、三倍压及多倍压结构。其工作原理是通过交流电正负半周交替对电容充电并叠加电压,具有结构简单、成本低的优点,但带载能力差且纹波较大。典型应用包括示波器、电蚊拍等小电流高压场景。设计时需重点考虑电容耐压、二极管选型和负载匹配,高频驱动可优化性能。该电路在低功耗高压电源中具有独特优势,但需注意安全防护与电压稳定性问题。

硬核科技 1714

Uniapp 新手专用 抖音登录 获取用户头像、名称、openid、unionid、anonymous_openid、session_key

自行填写自己的appid和secret。1、修改完appid和secret,记得一定要鼠标右键上传部署 login 云函数。3、在抖音开发者工具时 一定 选择自己的抖音小程序 ,不能使用默认的测试号。将代码拷贝至您所需要的页面 该代码位置:pages/index.vue。2、调试时记得选择 连接云端云函数。

特创数字 2967

AI工程化之生成式UI & A2UI(一)

本文系统介绍了生成式UI和Google A2UI技术。生成式UI通过AI直接生成前端代码(完全生成式)或DSL(混合式),实现千人千面的动态界面和研发提效。Google A2UI提出组件级和消息级协议,采用JSON规范实现渲染框架解耦,支持多端渲染。文章详细阐述了A2UI的架构设计,包括协议生成、服务端处理和渲染器实现,并对比了与传统前端框架的差异,指出A2UI本质是UI=F(AI(UI)+AI(state))的创新模式。最后通过playground项目展示了A2UI的实践应用。

qq_34306228的博客 591

uni-app 抖音小程序接入友盟数据统计

uni-app

wx479的博客 830

AUTOSAR BswM配置实战:手把手教你用Vector Davinci Configurator搭建第一个模式管理规则

本文详细介绍了如何使用Vector Davinci Configurator工具配置AUTOSAR BswM模块,实现车身控制ECU的模式管理规则。通过实战案例,从环境准备、核心概念梳理到具体配置步骤,包括ModeRequestPort、ModeCondition、Logical Expression和Rules的构建,帮助工程师快速掌握BswM配置技巧,提升汽车电子软件开发效率。

weixin_28678831的博客 353

运算放大器多谐振荡器设计实战:从施密特触发器到波形生成

本文详细介绍了运算放大器在多谐振荡器设计中的实战应用,涵盖施密特触发器的迟滞比较原理、非稳态振荡器的自激机制以及单稳态和双稳态电路的设计技巧。通过具体案例和参数计算,帮助工程师掌握波形生成与信号处理的核心技术,提升电路设计效率与稳定性。

pz89012345的博客 217

Java解密微信小程序手机号

第一步:创建AES解密工具类:代码如下import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre...

Elion_jia的博客 8367

手把手教你离线部署bert-base-uncased模型(附完整文件清单)

本文提供了一份详尽的bert-base-uncased模型离线部署指南。针对严格内网或无网络环境,文章不仅列出了包括config.json、pytorch_model.bin在内的完整必需文件清单,还详细解释了每个文件的作用,并给出了使用snapshot_download工具或手动下载的两种文件获取方法。重点阐述了如何正确设置本地路径、编写健壮的加载代码,并通过多层次验证确保模型在离线环境下成功运行,有效解决了部署过程中常见的文件缺失和路径错误问题。

weixin_29034963的博客 320

cocos creator上架字节跳动(抖音)小游戏注意事项(匿名登录、录屏、分享等踩坑记录)

cocos creator上架字节跳动(抖音)小游戏匿名登录、录屏、分享审核不符合平台要求的注意事项

灰机大大的博客 1万+

软考高级-系统架构设计师 知识点整理 (一篇就够了 建议收藏)

软考高级-系统架构设计师知识点整理---十万字总结,助你通过高级

片言可决讼,半纸能缚龙 7348

使用abagen工具箱获取基于脑区的基因表达矩阵

脑区模板定义了您感兴趣的脑区的空间位置。abagen提供了一些预定义的脑区模板,您可以选择使用,也可以使用自定义的脑区模板。它提供了一种简便的方式来获取基于脑区的基因表达矩阵。abagen需要使用Allen脑图谱数据来获取基因表达矩阵。您可以使用abagen内置的下载功能来获取这些数据。这就是使用abagen工具箱获取基于脑区的基因表达矩阵的详细步骤。通过按照上述步骤操作,您可以轻松获取并使用Allen脑图谱数据中的基因表达信息。一旦您加载了脑区模板,您可以使用abagen来获取基于脑区的基因表达矩阵。

web_bug407的博客 1326

抖音小程序登录(前端通过tt.login获取code换取openId)

流程 静默登录依赖小程序 API tt.login,把tt.loginsuccess 回调中返回的 code 传给开发者服务端,换取开发者服务端生成的 token。具体的前端流程如下:具体流程 从前端的code去调用抖音接口去换取openid等信息,以此生成token先调用接口换取openid我是根据openid和shopId作为用户的唯一依据的,一般来说就是根据openid就可以,如果存在这个用户就查询然后将id放到token的负载之后,没有则先注册到数据库返回id,放入token中返回前端token

weixin_57445851的博客 3684

2025年下半年网络规划设计师综合知识真题及答案解析

1983年,ARPANet完成技术转型,对此后的 Internet发展全关重要,这一转型是指( ) A.电路交换转向分组交换 B.商业化转型 C.民用化转型 D.从 NCP 协议转向 TCP/IP 答案:D 解析:ARPANet 最初使用 NCP (Network Control Protocol)协议进行主机问通信。1983年1月1日,ARPANet 正式切换到TCP/IP 协议族,为后续Internet的发展奠定了统一协议基础。

鹿鸣天涯 929

后台php处理 微信小程序 授权登录 获取手机号

微信获取手机 必须 先授权登录 ,也就是在前端使用wx.login(),详情请看微信官方文档 一、后台拿到code 也就是登录后返回的 一个参数 ,然后进行auth.code2Session解密 ,换取 openid 和 session_key 代码入下 $appid = '你的appid';//小程序唯一标识 (在微信小程序管理后台获取) $ap...

qq_40816144的博客 5808

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

字节跳动php解密数据获取手机号

encryptedData //数据字符串 session_key //秘钥 iv function decryptWithOpenssl(data,data,data,key,$iv) { return openssl_decrypt(base64_decode($data), "AES-128-CBC", base64_decode($key), OPENSSL_RAW_DATA...

weixin_42518996的博客 1425

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

字节跳动小程序解密数据获取手机号PHP方法

public function getDouYinPhone($sign, $sessionKey, $iv) { return openssl_decrypt(base64_decode($sign), 'AES-128-CBC', base64_decode($sessionKey), OPENSSL_RAW_DATA, base64_decode($iv)); }

bestmac20的博客 2332

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

踩坑解密微信小程序登录授权获取手机号

解密微信小程序登录授权获取手机号 根据 官方文档 微信小程序流程: 根据官方加密数据解密算法解释: 1.对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。 2.对称解密的目标密文为 Base64_Decode(encryptedData)。 3.对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。 4.对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。 总结下前后端一共三步( 如果无需

csdn_jeffrey_tang的博客 3828

微信小程序授权获取用户手机号码

微信小程序授权获取用户手机号码 第一步:小程序通过调用wx.login()方法,来拿到用户登录凭证code。 wx.login({ success:function(res){ console.log('loginCode:', res.code) } }); 第二步:将code传给后台,后台通过登录凭证code获取 session_key 和 ...

忆凌波的专栏 9433

uniapp开发微信小程序:用户手机号授权获取全流程详解与实战示例

本文介绍了微信小程序获取用户手机号码,前端通过调用API获取加密手机号,后端则负责解密处理具体代码示例。取用户手机号码整个流程需遵守微信小程序平台的隐私政策和规定,确保用户数据的安全与合规,为用户提供透明、可控的授权体验。

JINGWHALE 2万+

如何用JAVA解密微信小程序获取的手机号

如何用JAVA解密微信小程序获取的手机号 1、加解密工具类 package ***; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.spec.IvParameterSpec; impor...

qq_36737982的博客 1641

小程序弹出授权用户信息和手机号

授权用户信息和授权手机号,可分开使用,必须用按钮触发 <button bindgetuserinfo="login" open-type="getUserInfo">获取授权</button> //获取授权 login:function(){ var that=this; wx.getSetting({ success: function(a) { a.authSetting["scop

weixin_43789753的博客 2378

小程序获取用户手机号码的加密串进行解密

最近在研究小程序,现在有个需求是获取小程序的手机号码,这个获取接口的权限需要用小程序的企业账号操作可以 首先要进行解密之前获取到sessionKey的值 const APP_ID = 'XXXXXXXXX'; //输入小程序appid const APP_SECRET = 'xxxxxxxxxxxxxxxxxxxx'; //输入小程序app_secret var OPEN_ID = '' //储存获取到openid var SESSION_KEY = '' //储存获取到session...

caichenglongcsdn的博客 1926

小程序手机号注册php,微信小程序授权获取用户手机号码

第一步:小程序通过调用wx.login()方法,来拿到用户登录凭证code。wx.login({success:function(res){console.log('loginCode:',res.code)}});第二步:将code传给后台,后台通过登录凭证code获取 session_key 和 openid获取方法如下:用你的小程序的appid,secret,code来请求下面的api(请...

weixin_36109676的博客 506

uni-app微信小程序一键授权登录最新版文档全流程揭秘

uniapp开发微信小程序,参考微信小程序文档实现最新的获取用户授权,拿到手机号,头像,昵称等用户信息。

PandaLikeMe的博客 1293

小程序如何获取用户的手机号

思路及代码展示 第一步: 用户需要调用wx.login()方法,来拿到用户登录凭证code。 wx.login({&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success:function(res){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &a

无名 1万+

JAVA 微信小程序手机号码解密

微信小程序 手机号授权获取解密-java

cf 3278
上一篇: Golang反向代理 请求体修改 返回体修改 请求头修改 IP修改
下一篇: vue3 api加载权限路由报错 vue Invalid route component
JwCode
博客等级 码龄9年 17粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JwCode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值