Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >纯云开发获取用户微信绑定的手机号码

纯云开发获取用户微信绑定的手机号码

作者头像
许坏
发布于 2019-09-05 08:57:52
发布于 2019-09-05 08:57:52
3.6K20
代码可运行
举报
文章被收录于专栏:宅机吧宅机吧
运行总次数:0
代码可运行

今天开始在写带支付版的二手书了,涉及到用户注册信息需要获取手机号,这里有两个办法,第一是购买短信接口,第二是直接小程序开放数据获取手机号。

两者的区别:第一种对小程序没有类型要求,个人的都可以实现。第二种必须要企业认证小程序才行,但是这种办法一方面可以直接拉取用户绑定微信的手机号,方便操作体验好,还可以使用腾讯自带的短信接口,要省一笔钱。

由于支付也必须要认证,所以这里肯定选择第二种办法,直接用小程序自带api获取。

官方文档地址:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

通过button设置getPhoneNumber可以直接获取到encryptedData,iv这两个加密参数,但需要进行解密才能进一步获取手机号,解密说明文档:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#%E5%8A%A0%E5%AF%86%E6%95%B0%E6%8D%AE%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95

我们还差一个参数session_key,这个获取需要通过另一条接口:

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

绕的有点晕,我们直接看代码:

login.js文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     //获取用户手机号
      getPhoneNumber: function(e) {
            let that = this;
            //判断用户是否授权确认
            if (!e.detail.errMsg || e.detail.errMsg != "getPhoneNumber:ok") {
                  wx.showToast({
                        title: '获取手机号失败',
                        icon: 'none'
                  })
                  return;
            }
            wx.showLoading({
                  title: '获取手机号中...',
            })
            wx.login({
                  success(re) {
                        wx.cloud.callFunction({
                              name: 'regist', // 对应云函数名
                              data: {
                                    $url: "phone", //云函数路由参数
                                    encryptedData: e.detail.encryptedData,
                                    iv: e.detail.iv,
                                    code: re.code
                              },
                              success: res => {
                                    console.log(res);
                                    wx.hideLoading()
                                    //获取成功,设置手机号码
                                    that.setData({
                                          phone: res.result.data.phoneNumber
                                    })
                              },
                              fail: err => {
                                    console.error(err);
                                    wx.hideLoading()
                                    wx.showToast({
                                          title: '获取失败,请重新获取',
                                          icon: 'none'
                                    })
                              }
                        })
                  },
                  fail: err => {
                        console.error(err);
                        wx.hideLoading()
                        wx.showToast({
                              title: '获取失败,请重新获取',
                              icon: 'none'
                        })
                  }
            })
      },

云函数regist:

先把上面第一和第二行的文件传上,下载地址:

http://oss.98api.cn/zip/xcx_cryptojs.rar

然后再来看index.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 云函数入口文件
const cloud = require('wx-server-sdk');
const TcbRouter = require('tcb-router');//云函数路由
const rq = require('request');
const wxurl ='https://api.weixin.qq.com';
const appid ='xxxxx';//你的小程序appid
const secret = 'xxxxxxxxx';//你的小程序secret
var WXBizDataCrypt = require('./RdWXBizDataCrypt') // 用于手机号解密
cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
      const app = new TcbRouter({ event });
      //获取电话号码
      app.router('phone', async (ctx) => {
            ctx.body = new Promise(resolve => {
                  rq({
                        url: wxurl + '/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + event.code+'&grant_type=authorization_code',
                        method: "GET",
                        json: true,
                  }, function (error, response, body) {
                        const decrypt1 = new WXBizDataCrypt(appid, body.session_key)  // -解密第一步
                        const decrypt2 = decrypt1.decryptData(event.encryptedData, event.iv)   // 解密第二步*/
                        resolve({ data: decrypt2 })
                  });
            });
      });
      return app.serve();
}

安装依赖,上传部署,获取完毕

参考文章:https://www.jianshu.com/p/9651cc121afe 记录此篇日志

①做了一个小程序php开发交流圈,感兴趣可以加入我们:

小程序开发讨论圈

②还在找抖音快手等小视频去水印工具吗?我开发了一款支持全网短视频去水印的小工具,能直接保存到相册的,来看看嘛:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 宅机吧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
大佬,你这个有点问题
大佬,你这个有点问题
回复回复点赞举报
你这不能用啊
你这不能用啊
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Sql2005过程分页
ALTER PROCEDURE [dbo].[procPageChangeForSql2005] ( @fromSql varchar(4000), @querySql varchar(4000), @whereSql varchar(max), @orderBySql varchar(200), @keyField varchar(100), @PageSize int, --每页多少条记录 @PageIndex int,
跟着阿笨一起玩NET
2021/09/26
7580
通用分页存储过程,干货无污染
---判断是否存在该存储过程 IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'[dbo].[WEB_PageView]') and OBJECTPROPERTY(ID, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[WEB_PageView] GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATE PROCEDURE
追逐时光者
2022/02/15
3020
据说很快的数据库分页存储过程
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100555.html原文链接:
全栈程序员站长
2021/05/06
5220
sql 2008 分页存储过程
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- [SelectBase] 1,1,'Users','username=''test''' ALTER procedure [dbo].[SelectBase] @PageIndex int, @PageSize int, @TableName nvarchar(max), @Where
javascript.shop
2019/09/04
1.2K0
silverlight + wcf(json格式) + sqlserver存储过程分页
silverlight并没有提供现成的分页控件,百度了一圈,也没有发现aspx中好用的类似AspNetPager成熟控件,网上现有的一些分页代码,很多也是基于1.0版本的,silverlight2.0的并不多,自个儿琢磨了一下,发现自己弄一个也并非难事,思路和主要代码分享如下: 1.通用的“海量”数据分页存储过程 在做aspx开发时我已经用存储过程分页多年,这个东东是通用的(不管前端用什么语言来做),而且性能也不错,所以这里就直接套过来用了,百度一下"分页存储过程"会有N多版本,这里也给出我自己写的一个版本
菩提树下的杨过
2018/01/22
1.9K0
silverlight + wcf(json格式) + sqlserver存储过程分页
SQL 存储过程分页
CREATE PROC p_Team_GetTemaList @pageindex INT , @pagesize INT , @keywords VARCHAR(200) , --模糊查询 名称 标签 @citycode VARCHAR(100) , @verifyStatus INT =0,-- -1所有的 0 没有通过 1 审核通过 @orderby INT, @TotalCount INT OUTPUT AS BEGIN
纯粹是糖
2018/03/14
1.6K0
重写了MSSQL分页存储过程,附完整sql脚本
晚上花了1小时重写了MSSQL数据库中的分页存储过程,采用ROW_NUMBER的方式,需要MSSQL2005及以上版本支持。
崔文远TroyCui
2019/02/26
1.2K0
通用分页存储过程
/*通用分页存储过程*/ USE HotelManagementSystem GO IF EXISTS(SELECT * FROM sys.objects WHERE NAME='cndoup_GetPageOfRecords') DROP PROCEDURE cndoup_GetPageOfRecords GO --创建存储过程 CREATE PROCEDURE cndoup_GetPageOfRecords @pageSize int = 20,
欢醉
2018/01/22
8840
关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
BindingNavigator: 就是DataGridView控件上面的那个,在工程里名字: bindngrDemo
全栈程序员站长
2022/09/14
5100
关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
针对Ext js的分页存储过程-适用于sqlserver2008
USE [UTMP_RC_121213] GO /****** Object: StoredProcedure [dbo].[PageProc] Script Date: 01/05/2013 08:45:56 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 刘晓伦 -- Create date: 12
liulun
2022/05/09
5590
MSSQL之二十一 存储过程案例
张哥编程
2024/12/17
1330
使用ROW_NUMBER()的分页存储过程
分页存储过程,可以直接通过传入表名进行分页的,用到了ROW_NUMBER()函数,所以只适用于MSSQL2005以上. Sql代码 -- Description: 分页,用到了ROW_NUMBER() -- ============================================= create PROCEDURE [dbo].[proc_ShowPage] @tblName varchar(255), -- 表名 @strGetFields varchar(1000
用户8983410
2021/11/02
4810
高效分页存储过程
存储过程与页面调用如下:CREATEPROCEDUREsearch_sp@tblNamevar
Java架构师必看
2021/03/22
5130
祺佑三层开发框架(猫框)2023.11.16发新
加菲猫的VFP
2023/11/16
2290
祺佑三层开发框架(猫框)2023.11.16发新
解密encrypt的存储过程
--破解函数,过程,触发器,视图.仅限于SQLSERVER2000 IF EXISTS (select 1 from dbo.sysobjects where id = object_id(N'[dbo].[SP_DECRYPT]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[SP_DECRYPT] GO CREATE PROCEDURE sp_decrypt(@objectname varchar(50)) AS begin set nocount on --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器 --修正上一版视图触发器不能正确解密错误 begin tran declare @objectname1 varchar(100),@orgvarbin varbinary(8000) declare @sql1 nvarchar(4000),@sql2 varchar(8000),@sql3 nvarchar(4000),@sql4 nvarchar(4000) DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000) declare @i int,@status int,@type varchar(10),@parentid int declare @colid int,@n int,@q int,@j int,@k int,@encrypted int,@number int select @type=xtype,@parentid=parent_obj from sysobjects where id=object_id(@objectname) create table #temp(number int,colid int,ctext varbinary(8000),encrypted int,status int) insert #temp SELECT number,colid,ctext,encrypted,status FROM syscomments WHERE id = object_id(@objectname) select @number=max(number) from #temp set @k=0 while @k<=@number begin if exists(select 1 from syscomments where id=object_id(@objectname) and number=@k) begin if @type='P' set @sql1=(case when @number>1 then 'ALTER PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS ' else 'ALTER PROCEDURE '+ @objectname+' WITH ENCRYPTION AS ' end) if @type='TR' begin declare @parent_obj varchar(255),@tr_parent_xtype varchar(10) select @parent_obj=parent_obj from sysobjects where id=object_id(@objectname) select @tr_parent_xtype=xtype from sysobjects where id=@parent_obj if @tr_parent_xtype='V' begin set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF INSERT AS PRINT 1 ' end else begin set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 ' end end if @type='FN' or @type='TF' or @type='IF' set @sql1=(case
jack.yang
2025/04/05
490
SQL基础分页存储过程(案例一)
1 --分页 存储过程 案例 2 3 -- 所执行的存储过程 4 create proc pageForUsers 5 @currPage int, --当前页数 6 @pageSize int, --每页多少条记录 7 @count int output --总记录数 8 as 9 declare @firstIndex int 10 declare @lastIndex i
用户1112962
2018/07/04
5210
曾今的代码系列——自己的分页控件+存储过程实现分页
项目里面的测试代码,仅供参考 LoginByAjax <title>Ajax登陆</title> <script src="Scripts/common.js" type="text/javascript"></script> <script type="text/javascript"> var xhr; window.onload = function () { xhr = new createXmlHttp();
用户1161731
2018/01/11
7630
曾今的代码系列——自己的分页控件+存储过程实现分页
SQLSERVER存储过程语法详解
@parameter 过程中的参数。在 Create PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。
全栈程序员站长
2022/09/13
1.8K0
关于SQL Server 镜像数据库快照的创建及使用
从SQL Server 2005 SP1 起,SQL 开始支持数据库镜像。它的设计目的是试图为SQL Server 提供一个具有实时性数据同步的灾难恢复技术,即能够提供数据冗余备份,切换起来比较方便。每个主体数据库只能有一个镜像数据库。镜像数据库作为主体数据库的一个副本,在主体数据库发生故障、不可访问时能够迅速恢复数据库访问,提供故障恢复功能。镜像数据库一直处于“恢复”状态,因此不能被直接访问。
东山絮柳仔
2021/03/20
2.4K0
走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器
  SELECT 以表格的方式输出,可以同时输出多个变量;而PRINT 则是以文本的方式输出,一次只能输出一个变量的值。
Edison Zhou
2018/08/20
1.3K0
走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器
相关推荐
Sql2005过程分页
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验