获取微信小程序手机号(二)

页面

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">手机号</button>

Page({
  // 获取手机号授权
  getPhoneNumber (e)  {
      // 用户拒绝授权
      if(e.detail.errMsg == "getPhoneNumber:fail user deny") {
        wx.showToast({
          icon: "none",
          title: '请允许获取手机号,否则功能不可用!',
        })
        return
      }
      /// 用户允许授权
      console.log("e.detail.errMsg="+e.detail.errMsg)
      console.log("e.detail.iv=->", e.detail.iv); //包括敏感数据在内的完整用户信息的加密数据,需要解密
      console.log("e.detail.encryptedData->", e.detail.encryptedData); //加密算法的初始向量,解密需要用到
   
      
   
      // if(resCode){
        console.log("123123")
        this.getphone(e.detail.encryptedData, e.detail.iv);
        this.triggerEvent("isHiddenPopup");
      // }
    },
  // 访问登录凭证校验接口获取session_key 并用session_key获取手机号
  getphone: function(encryptedData, iv) {
  	//获取openid的时候存储到缓存中
    let openid = wx.getStorageSync('openid')
    let sessionkey = wx.getStorageSync('sessionkey')
    wx.request({
      url: "http://192.168.0.102:7777/ys/wxlogin/getsessionkey",//需要填写自己的服务器请求地址
      data: {
          'SessionKey':sessionkey,
          'openid':openid,
          'encryptedData' : encryptedData,
          'iv':iv
      },
      method: 'GET', 
      header: {
          'content-type': 'application/json'
      }, // 设置请求的 header
      success: function(data) {
        console.log("后台返回的数据 =", data)
        console.log("获取手机号返回JSON数据 =", data.data)
        console.log("手机号 = "+data.data.phoneNumber)
        if(data.data==undefined){
          wx.showToast({
            icon: "none",
            title: '手机号获取失败,请重新登录!',
          })
          return
        }
        if(data.statusCode == 200) { 
          if(data.data.phoneNumber==undefined){
            // 获取手机号失败 
              console.log("获取手机号失败");
              return
            }
            // 4.跳转web-view页面
            wx.switchTab({
              url: "/pages/mine/mine"
            }) 
          }
      },
      fail: function(err) {
          console.log(err);
          wx.showToast({
            icon: "none",
            title: 'session_key获取失败,请重新登录!',
          })
          return
      }
    })
  }
  })

服务端

package com.demo.util;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.InvalidParameterSpecException;
import java.util.Arrays;


/**
 * 2020/12/14 5:08 PM
 *
 * @author shoo
 * @describe 解密工具类
 */
public class SecretUtilTools {
    public SecretUtilTools() {
    }

    public static String encryptForDES(String souce, String key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        SecureRandom sr = new SecureRandom();
        DESKeySpec dks = new DESKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key1 = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(1, key1, sr);
        byte[] encryptedData = cipher.doFinal(souce.getBytes("UTF-8"));
        String base64Str = (new BASE64Encoder()).encode(encryptedData);
        return base64Str;
    }

    public static String decryptForDES(String souce, String key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IOException, IllegalBlockSizeException, BadPaddingException {
        SecureRandom sr = new SecureRandom();
        DESKeySpec dks = new DESKeySpec(key.getBytes());
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key1 = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(2, key1, sr);
        byte[] encryptedData = (new BASE64Decoder()).decodeBuffer(souce);
        byte[] decryptedData = cipher.doFinal(encryptedData);
        return new String(decryptedData, "UTF-8");
    }

    public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
        byte[] dataByte = Base64.decodeBase64(data);
        byte[] keyByte = Base64.decodeBase64(key);
        byte[] ivByte = Base64.decodeBase64(iv);
        int base = 16;
        if (keyByte.length % base != 0) {
            int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
            byte[] temp = new byte[groups * base];
            Arrays.fill(temp, (byte)0);
            System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
            keyByte = temp;
        }

        try {
            Security.addProvider(new BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
            parameters.init(new IvParameterSpec(ivByte));
            cipher.init(2, spec, parameters);
            byte[] resultByte = cipher.doFinal(dataByte);
            if (null != resultByte && resultByte.length > 0) {
                String result = new String(resultByte, encodingFormat);
                return result;
            }

            return null;
        } catch (NoSuchAlgorithmException var13) {
            var13.printStackTrace();
        } catch (NoSuchPaddingException var14) {
            var14.printStackTrace();
        } catch (InvalidParameterSpecException var15) {
            var15.printStackTrace();
        } catch (InvalidKeyException var16) {
            var16.printStackTrace();
        } catch (InvalidAlgorithmParameterException var17) {
            var17.printStackTrace();
        } catch (IllegalBlockSizeException var18) {
            var18.printStackTrace();
        } catch (BadPaddingException var19) {
            var19.printStackTrace();
        } catch (UnsupportedEncodingException var20) {
            var20.printStackTrace();
        }

        return null;
    }
}
package com.demo.controller.wxdl;


import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.demo.entity.Auser;
import com.demo.entity.Wxcode;
import com.demo.service.AuserService;
import com.demo.service.WxcodeService;
import com.demo.service.impl.RedisUtils;
import com.demo.util.IdmApiClient;
import com.demo.util.Result;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.security.spec.AlgorithmParameterSpec;


@RestController
@RequestMapping("/ys/wxlogin")
@Api(tags="测试接口(微信)")
public class WXDenglv {

   
    //解析电话号码
    @GetMapping("/getsessionkey")
    public Object getsessionkey(String SessionKey,String openid,String encryptedData, String iv) throws JsonProcessingException {
        System.out.println("SessionKey="+SessionKey);
        System.out.println("openid="+openid);
        System.out.println("encryptedData="+encryptedData);
        System.out.println("iv="+iv);


        String result = "";
        try {
            result = SecretUtilTools.decrypt(encryptedData, SessionKey, iv, "UTF-8");
            if (null != result && result.length() > 0) {

            } else {
                System.out.println("getMiniUserInfo error");
            }
        } catch (Exception var11) {
            var11.printStackTrace();
        }
        return result;
    }

}
package com.demo.controller.wxdl;

public class Wxpojo {

    public final static String appId = "";
    public final static  String secrets = "";


}

  <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk16</artifactId>
            <version>1.46</version>
        </dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值