关键坑点:

1. 不了解调用流程:流程->前台JS获取code-->post至后台api-->先获取session_key【调用微信api,返回json】-->解密手机号方法

2. 解密方法缺少包,需要不断添加包

3.解密方法没有问题,仍然无法获取,网上找资料清理缓存。问题解决。

第一步:wxml增加按钮

<button class='pop_btn' plain="true" open-type='getPhoneNumber' bindgetphonenumber="getPhoneNumber">获取用户手机号</button>

第二步:js文件调用后台

getPhoneNumber(e) {

console.log(e.detail.errMsg)

console.log(e.detail.iv)

var encryptedData = e.detail.encryptedData

console.log(encryptedData)

var code=""

var that = this;

console.log(e.detail.errMsg == "getPhoneNumber:ok");

if (e.detail.errMsg == "getPhoneNumber:ok") {

wx.login({

success: function (res) {

code = res.code

console.log("code_s")//这就是code

console.log( res.code)//这就是code

console.log("code_e")//这就是code

wx.request({

url: 'https://XXXXXXX',

method: "post",

header: {

'content-type': 'application/x-www-form-urlencoded;charset=utf-8'

},

data: {

encryptedData: e.detail.encryptedData,

iv: e.detail.iv,

code: res.code

},

success: function (res) {

console.log(res);

}

})

}

})

}

},

第三步:后台代码,分2步;第一步获取seesion_key;第二步解密手机号

Api服务方法

@RequestMapping("/decodephone")
    public void  decodePhone(HttpServletRequest request, HttpServletResponse response,String encryptedData,String iv,String code){
        String mbody=StringUtils.ReadAsChars(request);
        System.out.println(mbody);
        String  msession_key= HttpUtil.doGet("https://api.weixin.qq.com/sns/jscode2session","appid=您的API的ID&secret=您的秘钥&js_code=前端传过来的CODE&grant_type=authorization_code");

WeChatAppSessionModel mdl1=JSONObject.parseObject(msession_key, WeChatAppSessionModel.class);
        if(mdl1 !=null && mdl1.getSession_key()!=null)
        {
        try {
                mbody=AES.wxDecrypt(encryptedData, mdl1.getSession_key(), iv);
                response.getWriter().write("123");
            } catch (Exception e) {
                e.printStackTrace();
            }
        
        }
        System.out.println("调用结束");
    }

doGet 公共方法

public static String doGet(String url,String parameter)
    {
        String uriAPI =url+"?"+parameter ; //"http://XXXXX?str=I+am+get+String";
        String result= "";
        HttpClient client = createSSLClientDefault();
        HttpGet httpRequst = new HttpGet(uriAPI);
        try {

HttpResponse httpResponse = client.execute(httpRequst);//其中HttpGet是HttpUriRequst的子类
            if(httpResponse.getStatusLine().getStatusCode() == 200)
            {
                HttpEntity httpEntity = httpResponse.getEntity();
                result = EntityUtils.toString(httpEntity);//取出应答字符串
                // 一般来说都要删除多余的字符
                result.replaceAll("\r", "");//去掉返回结果中的"\r"字符,否则会在结果字符串后面显示一个小方格
            }
            else
                httpRequst.abort();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            result = e.getMessage().toString();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            result = e.getMessage().toString();
        }
        return result;
    }

解密方法

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.Key;
import java.security.Security;
 
public class AES {
  // 算法名
  public static final String KEY_NAME = "AES";
  // 加解密算法/模式/填充方式
  // ECB模式只用密钥即可对数据进行加密解密,CBC模式需要添加一个iv
  public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";
 
  /**
   * 微信 数据解密<br/>
   * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充<br/>
   * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)<br/>
   * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节<br/>
   * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节<br/>
   *
   * @param encrypted 目标密文
   * @param session_key 会话ID
   * @param iv 加密算法的初始向量
   */
  public static String wxDecrypt(String encrypted, String session_key, String iv) {
    String json = null;
    byte[] encrypted64 = Base64.decodeBase64(encrypted);
    byte[] key64 = Base64.decodeBase64(session_key);
    byte[] iv64 = Base64.decodeBase64(iv);
    byte[] data;
    try {
      init();
      json = new String(decrypt(encrypted64, key64, generateIV(iv64)));
    } catch (Exception e) {
      e.printStackTrace();
    }
    return json;
  }
 
  /**
   * 初始化密钥
   */
  public static void init() throws Exception {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    KeyGenerator.getInstance(KEY_NAME).init(128);
  }
 
  /**
   * 生成iv
   */
  public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
    // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0
    // Arrays.fill(iv, (byte) 0x00);
    AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_NAME);
    params.init(new IvParameterSpec(iv));
    return params;
  }
 
  /**
   * 生成解密
   */
  public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv)
      throws Exception {
    Key key = new SecretKeySpec(keyBytes, KEY_NAME);
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    // 设置为解密模式
    cipher.init(Cipher.DECRYPT_MODE, key, iv);
    return cipher.doFinal(encryptedData);
  }
 
}

微信公众号获取用户手机相关推荐

  1. tp5微信公众号获取用户openid_tp5+微信公众号获取用户基本信息

    获取用户基本信息(UnionID机制) 获取用户基本信息(UnionID机制) 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯 ...

  2. 微信公众号获取用户openId(扩展:小程序获取openId和手机号)

    微信公众号获取用户openId 拼接的参数[可以直接配菜单中]: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb2363dd ...

  3. Thinkphp5下微信公众号获取用户信息

    前言 一直在用整理下tp5 开发微信公众号获取用户信息的简单笔记 废话不多说 直接贴代码如下: 正文 准备工作 在微信公众平台的开发者工具中申请公众平台测试账号如下图 在网页账号中 修改网页授权获取基 ...

  4. 微信公众号获取用户位置定位信息入库asp代码

    微信公众号获取用户位置定位信息入库asp代码,可以获取微信用户的坐标和地址信息入库,代码简洁: <% if request("action")="" th ...

  5. 微信公众号获取用户头像的踩坑经历

    微信公众号获取头像有两种方式 1.用户无感知的,静默授权 snsapi_base 2.需要用户需要点击确认的 snsapi_userinfo 官方文档 我用的是第二种 开发步骤 1.引导用户进入授权页 ...

  6. 微信公众号获取用户头像昵称,用户信息

    1.关注了公众号,获取用户信息 https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=xxx&a ...

  7. php 微信获取门店列表,【转载】微信公众号获取用户地理位置并列出附近的门店...

    思路分析: 1.在微信公众号内获取用户地理位置 需要js-sdk签名包(关于如何获取文档有介绍) 2.根据获取的地理位置ajax去后台请求,通过sql语句,查询中距离最近的门店(sql语句在网上搜的, ...

  8. java查看附近门店_微信公众号获取用户地理位置并列出附近的门店的示例代码...

    思路分析: 1.在微信公众号内获取用户地理位置 需要js-sdk签名包(关于如何获取文档有介绍) 2.根据获取的地理位置ajax去后台请求,通过sql语句,查询中距离最近的门店(sql语句在网上搜的, ...

  9. 通过微信公众号获取用户信息(java版)

    最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了. 1.首先需要到微信网站去设置一下,我是直接用的微信测试号. 接口配置 ...

最新文章

  1. c语言 字母 八进制表示'/1011',C语言C语言第一课:C语言概述为什么学习C语言怎样学习C语言.DOC...
  2. 频域采样与恢复matlab实验,连续信号的采样与重构实验报告
  3. TCP/IP协议的一个具体实现Socket
  4. for循坏的穷举与迭代,while、do while循环
  5. 分辨率设置640*480
  6. VS2013中提示:没有可放置在工具箱上的组件
  7. Mysql数据库(三)——mysql数据库高级操作
  8. 云+X案例展 | 民生类:智领云数据中台为“健康武汉”增砖添瓦
  9. Java 并发编程之可重入锁 ReentrantLock
  10. CSDN博客模板调查问卷
  11. 电感的主要特性参数介绍
  12. html九宫格拼图怎么做,朋友圈九宫格拼图照片制作方法
  13. 【解决方案】macOS 打开微信视频电话其他应用音量变小问题
  14. Git内部原理之深入解析环境变量
  15. 《自控力》第八章读书笔记
  16. Intouch学习笔记—新建工程
  17. 汽车使用总结(三)--汽车里播放无损音乐的5种方法,极少人知道的秘密,音质瞬间提高
  18. 2013年节假日安排公布 春节假期2月9日至15日
  19. php lt lt lt eod,[PHP]EOD及mail发布_PHP
  20. arduino定时器

热门文章

  1. 自动化办公python脚本_Python自动化办公
  2. android 观察者模式的简单demo,一个简单的demo彻底搞懂观察者模式
  3. 赶超印度应是中国软件业发展方向吗?
  4. unity文字逐个出现实现文字打印机效果
  5. lamda 获取当前循环数,AtomicInteger
  6. 简述关系数据库的数据完整性规则_数据库的关系完整性
  7. css+jq实现简单万花筒滚动效果
  8. 如何在Vivado创建一个FIFO的IP核并使用ILA工具验证
  9. 【渝粤题库】国家开放大学2021春1396药事管理与法规(本)题目
  10. WinRAR去广告(简体中文版)