微信小程序手机号绑定功能(登录后绑定)

1.手机号绑定并不是手机号登录 所以他其实就是一个添加

主要是他有一个短信发送 接收验证码验证的过程

首先是小程序端

HTML

给你一个按钮绑定点击 bindtap 事件 跳转至手机号绑定页面

<l-button type="default" bindtap="phonePage">绑定手机号</l-button>

小程序 JS 页面跳转(这是没有tabBar 的页面,有tabBar的页面需换另外wx函数)

 //跳转至手机号绑定页面
    phonePage(){
      wx.navigateTo({
        url: '/pages/phone/phone',
      })
    },

手机号绑定页面

HTML

<!-- 手机号码 -->
<form bindsubmit="onSubmit">
<text class="text1">手机号码</text>
<view class="phoneNum">
<input type="text" placeholder="请输入手机号码" bindinput="phone" name="phone"></input>
</view>
<!-- 验证码 -->
<text class="text1">验证码</text>
<view class="phoneCode">
<input type="text" placeholder="请输入验证码" name="code" ></input>
<button type="primary" size="mini" bind:tap="setCode" disabled="{{button}}">{{text}}</button>
</view>

<view class="loadButton">
<button type="primary" form-type="submit">绑定手机号</button>
</view>
</form>

CSS页面

.text1{
  margin:20rpx;
}
.phoneNum input{
  margin: 20rpx;
  padding-left: 10rpx;
  height: 80rpx;
  border: 1rpx solid #c3c3c3;
}
.phoneCode{
  display: flex;
  align-items: center;
}
.phoneCode input{
  width: 60%;
  margin: 20rpx;
  border: 1rpx solid #c3c3c3;
  padding-left: 10rpx;
  height: 80rpx;
}
.phoneCode button{
  height: 80rpx;
  vertical-align: middle;
}
 
.loadButton button{
  margin-top: 50rpx;
  width: 94% !important;
}

JS

data部分

data: {
      //手机号

      phone:'',
      //手机号防止多次点击

      button:false,
       //发送验证码按钮初始内容

      text:'发送验证码'

    },

JS

输入框获取手机号

/**
     * 手机号
     * @param {*} e 
     */
    phone(e){
      let phone = e.detail.value;
      this.setData({
        phone:phone
      })
    },

获取验证码 并给按钮设置防止连续点击

/**
     * 验证码
     * @param {*} e 
     */
    setCode(e){
      let that = this;
      //data里取出之前存入的手机号
      let phone = that.data.phone;
      
      //验证手机号格式是否正确
      var phone_reg = /^1[35789]\d{9}$/;
      if(!phone_reg.test(phone)){
        wx.showToast({
          title: '手机号格式错误',
          icon:"none"
        })
        return ;
      };
      //发送接口
      wx.request({
        url: 'http://www.essou.com/index.php/api/wxNote',
        header:{ 
          'token':wx.getStorageSync('token')
        },
        data:{
          phone:phone
        },
        dataType:'json',
        method:"POST",
        success (res) {
          //获取返回来的验证码
          console.log(res.data)
          let time = 60;
          setInterval(function(){
            time--;
            if(time > 0){
              that.setData({
                text:time,
                button:true
              })
            }else{
              that.setData({
                text:'发送验证码',
                button:false
              })
            }
          },1000);
        }
      })
    },

后端PHP

首先验证是否登陆过

这里是创建中间件使用中间件验证token

1.创建中间件

php artisan make:middleware CheckLogin

2.在app/http/Middleware/kernel.php 文件中的 $routeMiddleware 加入一个 

'checklogin' => \App\Http\Middleware\CheckLogin::class

 这里的checklogin 是自己定义

3.在路由加入 这里的checklogin 是上面定义的

如果写的是接口路由最好写进api.php中

Route::group(['middleware' => ['checklogin']], function () {
    //
});

 4.中间件中判断

public function handle(Request $request, Closure $next)
{
    //判断是否登录
    if (empty($request->header('token'))){
        echo json_encode(['code'=>500,'msg'=>'请先登录','data'=>[]]);die();
    }
     
    //判断token是否正确
    if(!BaseController::verifyToken($request->header('token')))
    {
       echo json_encode(['code'=>500,'msg'=>'token令牌','data'=>[]]);die();
    }

//用户接口访问次数限制 数据库新添一个字段

$user = ApiUser::where('id','=',BaseController::verifyToken($request->header('token')))->first();
$user->increment('click');
if($user['click'] > env('APINUM'))
{
    echo $base->fail([],'已达今日访问上限');die;
}
    return $next($request);//不可删除
}

 php 后端控制器代码

public function wxNote(Request $request)
    {

        $phone = $request->post('phone');

        //验证手机号
        if (!preg_match("/^1[3456789]\d{9}$/",$phone)){
            //手机号格式错误
            return ['status'=>500,'msg'=>'手机号格式错误','data'=>[]];
        }

        //判断请求频率
        if (Cache::store('redis')->has('time_'.$phone)){
            //判断当前请求时间和上次请求时间的间隔
            if (time() - Cache::store('redis')->get('time_'.$phone) < 60){
                //小于60秒 表示请求次数频繁
                return ['status'=>500,'msg'=>'请求次数频繁','data'=>[]];
            }else{
                //大于60 表示时间可以再次请求 将上次的时间 和 验证码删除
                Cache::store('redis')->forget('time_'.$phone);
                Cache::store('redis')->forget('code_'.$phone);
            }
        }

        $code = mt_rand(1000,9999);//验证码

        //短信内容
        $content = "您的验证码为{$code},三分钟内有效"; //要发送的短信内容
        $statusStr = array(
            "0" => "短信发送成功",
            "-1" => "参数不全",
            "-2" => "服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间!",
            "30" => "密码错误",
            "40" => "账号不存在",
            "41" => "余额不足",
            "42" => "帐户已过期",
            "43" => "IP地址限制",
            "50" => "内容含有敏感词"
        );
        $smsapi = "http://api.smsbao.com/";
        $user = "2152403800"; //短信平台帐号
        $pass = md5("51791046"); //短信平台密码
        $sendurl = $smsapi."sms?u=".$user."&p=".$pass."&m=".$phone."&c=".urlencode($content);
        $result =file_get_contents($sendurl) ;
        //发送验证码

        if ($result == 0){
            //发送成功
            //将验证码 当前发送时间 存入redis 
            Redis::setex($phone.'_code',120,$code);
//            Cache::put("code_".$phone,$code,180);
            Redis::set($phone."_time",time());
            return ['status'=>200,'msg'=>$statusStr[$result],'data'=>[]];
        }
            return ['status'=>500,'msg'=>$statusStr[$result],'data'=>[]];

    }

小程序端

//绑定验证码表单提交
    onSubmit:function(e){
      //表单数据
      let params = e.detail.value;
      // console.log(params);
      wx.request({
        url: 'http://www.essou.com/index.php/api/wxphone',
        data:params,
        method:'POST',
        header:{
          'token':wx.getStorageSync('token')
        },
        success:function(res)
        {
          // console.log(res.data);
          wx.showToast({
            title: res.data.msg,
          })
          wx.switchTab({
//跳转至列表页 正常逻辑没有这步
            url: '/pages/list/list',
          })
        }
      })
    },

后端 接收手机号以及验证码 进行验证

public function wxPhone(Request $request)
    {
        //接收手机号以及验证码
        $phone = $request->post('phone');
        $code = $request->post('code');
        $base = new BaseController();
        //接收token
        $token = $request->header('token');
        //从redis取出之前存入的验证码
        $redisCode = Redis::get($phone.'_code');
        try {
            if (empty($redisCode))
            {
                return json_encode(['code'=>403,'msg'=>'验证码已过期,请重新获取','data'=>'']);
            }elseif (!$code == $redisCode){

                return json_encode(['code'=>500,'msg'=>'验证码有误,请重新输入','data'=>'']);

            } else{

                $result = Rentings::where('id','=',$base::verifyToken($token))->update(['phone'=>$phone]);
                if ($result){
                    return json_encode(['code'=>200,'msg'=>'绑定成功','data'=>'']);
                }else{
                    return json_encode(['code'=>500,'msg'=>'绑定失败','data'=>'']);
                }
            }
        }catch (\Exception $e){
            return json_encode(['code'=>500,'msg'=>$e->getMessage(),'data'=>'']);
        }

    }

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
A: 首先,要使用微信登录能力,需要注册并开通微信开放平台。具体可以参考微信开放平台的文档。 其次,在开发者工具中创建一个小程序,获取到小程序的 appID。 然后,在小程序中引入开放能力模块,调用 wx.login 接口获取登录凭证 code。 在获取到 code 后,可以通过微信提供的云开发服务或者自行搭建后台服务器,调用微信的接口换取用户手机号。 下面是一个通过云开发服务获取手机号的例子: ```java import com.tencent.cloud.CosStsClient; import com.tencent.cloud.auth.Credential; import com.tencent.cloud.auth.Credentials; import com.tencent.cloud.auth.ShortTimeCredential; import com.tencent.cloud.CosXmlService; import com.tencent.cloud.CosXmlServiceConfig; import com.tencent.cloud.CosXmlServiceException; import com.tencent.cloud.auth.ScopeLimitCredentialProvider; import com.tencent.cloud.CosXmlSignSourceProvider; import com.tencent.cloud.QCloudSignSourceProvider; import com.tencent.cloud.CosXmlSignSourceProvider.GetSignSourceType; import com.tencent.qcloud.core.auth.COSXmlSignSourceProvider; import com.tencent.qcloud.core.auth.ShortTimeCredentialProvider; import java.util.LinkedList; import java.util.List; public class WeChat { public static void main(String[] args) throws Exception { String appId = "你的小程序的appID"; String appSecret = "你的小程序的appSecret"; String jsCode = "获取到的登录凭证code"; String sessionKey = getSessionKey(appId, appSecret, jsCode); String encryptedData = "获取到的encryptedData"; String iv = "获取到的iv"; String phoneNumber = getPhoneNumber(appId, sessionKey, encryptedData, iv); System.out.println("用户绑定手机号为:" + phoneNumber); } public static String getSessionKey(String appId, String appSecret, String jsCode) throws Exception { String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId + "&secret=" + appSecret + "&js_code=" + jsCode + "&grant_type=authorization_code"; String response = HttpUtils.sendGet(url); JSONObject jsonObject = JSONObject.parseObject(response); String sessionKey = jsonObject.getString("session_key"); return sessionKey; } public static String getPhoneNumber(String appId, String sessionKey, String encryptedData, String iv) throws Exception { String appIdKey = appId + "_session_key"; String appSecretKey = appId + "_session_secret"; String bucketName = "default-bucket-name"; String regionName = "region"; String secretId = "secretId"; String secretKey = "secretKey"; String token = ""; long durationSeconds = 1800; // 创建临时密钥 Credential cred = new Credential(secretId, secretKey); ScopeLimitCredentialProvider scopeLimitCredentialProvider = new ScopeLimitCredentialProvider(new ShortTimeCredentialProvider(cred, durationSeconds), "selected resource regionName", "selected resource bucketName", "selected resource prefix"); LinkedList<String> headers = new LinkedList<String>(); headers.add("host"); headers.add("content-type"); CosStsClient client = new CosStsClient(scopeLimitCredentialProvider); JSONObject credentials = client.getCredential(headers); String token = credentials.getString("sessionToken"); Credentials cred = new Credentials(credentials.getLong("startTime"), credentials.getLong("expiredTime"), credentials.getString("tmpSecretId"), credentials.getString("tmpSecretKey"), token); // 创建 CosXmlServiceConfig 对象,根据个人需求修改默认的配置参数 CosXmlServiceConfig serviceConfig = new CosXmlServiceConfig.Builder() .setAppidAndRegion(appId, regionName) .setDebuggable(true) .builder(); // 创建 CosXmlService 对象,实现获取短期证书的请求签名 CosXmlService cosXmlService = new CosXmlService(context, serviceConfig, new GetSignSourceType() { @Override public QCloudSignSourceProvider getSourceProvider() { return new CosXmlSignSourceProvider(cred); } }); byte[] sessionKeyByte = Base64.decode(sessionKey, Base64.DEFAULT); byte[] encryptedDataByte = Base64.decode(encryptedData, Base64.DEFAULT); byte[] ivByte = Base64.decode(iv, Base64.DEFAULT); // AES解密 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); SecretKeySpec keySpec = new SecretKeySpec(sessionKeyByte, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(ivByte); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] dataByte = cipher.doFinal(encryptedDataByte); String data = new String(dataByte, "UTF-8"); JSONObject jsonObject = JSONObject.parseObject(data); String phoneNumber = jsonObject.getString("phoneNumber"); return phoneNumber; } } ``` 需要注意的是,在调用云开发服务时,需要引入对应的 SDK 依赖。具体可以参考腾讯云 COSXML SDK 的文档。 另外,由于微信登录接口比较敏感,开发者在开发时需要注意保护用户的隐私信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老轩头€

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值