微信公众号获取用户手机
关键坑点:
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);
}
}
微信公众号获取用户手机相关推荐
- tp5微信公众号获取用户openid_tp5+微信公众号获取用户基本信息
获取用户基本信息(UnionID机制) 获取用户基本信息(UnionID机制) 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯 ...
- 微信公众号获取用户openId(扩展:小程序获取openId和手机号)
微信公众号获取用户openId 拼接的参数[可以直接配菜单中]: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb2363dd ...
- Thinkphp5下微信公众号获取用户信息
前言 一直在用整理下tp5 开发微信公众号获取用户信息的简单笔记 废话不多说 直接贴代码如下: 正文 准备工作 在微信公众平台的开发者工具中申请公众平台测试账号如下图 在网页账号中 修改网页授权获取基 ...
- 微信公众号获取用户位置定位信息入库asp代码
微信公众号获取用户位置定位信息入库asp代码,可以获取微信用户的坐标和地址信息入库,代码简洁: <% if request("action")="" th ...
- 微信公众号获取用户头像的踩坑经历
微信公众号获取头像有两种方式 1.用户无感知的,静默授权 snsapi_base 2.需要用户需要点击确认的 snsapi_userinfo 官方文档 我用的是第二种 开发步骤 1.引导用户进入授权页 ...
- 微信公众号获取用户头像昵称,用户信息
1.关注了公众号,获取用户信息 https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=xxx&a ...
- php 微信获取门店列表,【转载】微信公众号获取用户地理位置并列出附近的门店...
思路分析: 1.在微信公众号内获取用户地理位置 需要js-sdk签名包(关于如何获取文档有介绍) 2.根据获取的地理位置ajax去后台请求,通过sql语句,查询中距离最近的门店(sql语句在网上搜的, ...
- java查看附近门店_微信公众号获取用户地理位置并列出附近的门店的示例代码...
思路分析: 1.在微信公众号内获取用户地理位置 需要js-sdk签名包(关于如何获取文档有介绍) 2.根据获取的地理位置ajax去后台请求,通过sql语句,查询中距离最近的门店(sql语句在网上搜的, ...
- 通过微信公众号获取用户信息(java版)
最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了. 1.首先需要到微信网站去设置一下,我是直接用的微信测试号. 接口配置 ...
最新文章
- c语言 字母 八进制表示'/1011',C语言C语言第一课:C语言概述为什么学习C语言怎样学习C语言.DOC...
- 频域采样与恢复matlab实验,连续信号的采样与重构实验报告
- TCP/IP协议的一个具体实现Socket
- for循坏的穷举与迭代,while、do while循环
- 分辨率设置640*480
- VS2013中提示:没有可放置在工具箱上的组件
- Mysql数据库(三)——mysql数据库高级操作
- 云+X案例展 | 民生类:智领云数据中台为“健康武汉”增砖添瓦
- Java 并发编程之可重入锁 ReentrantLock
- CSDN博客模板调查问卷
- 电感的主要特性参数介绍
- html九宫格拼图怎么做,朋友圈九宫格拼图照片制作方法
- 【解决方案】macOS 打开微信视频电话其他应用音量变小问题
- Git内部原理之深入解析环境变量
- 《自控力》第八章读书笔记
- Intouch学习笔记—新建工程
- 汽车使用总结(三)--汽车里播放无损音乐的5种方法,极少人知道的秘密,音质瞬间提高
- 2013年节假日安排公布 春节假期2月9日至15日
- php lt lt lt eod,[PHP]EOD及mail发布_PHP
- arduino定时器