博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小程序 获取openid unionid
阅读量:5873 次
发布时间:2019-06-19

本文共 4900 字,大约阅读时间需要 16 分钟。

hot3.png

1.根据wx.login获取code

2.根据code获取openid session_key  encryptedData  iv

3.根据session_key  encryptedData  iv  获取unionid

 

1.

wx.login({

success: res => {

// 发送 res.code 到后台换取 openId, sessionKey, unionId

var that = this;

var code = res.code;//登录凭证 code获取openid只能使用一次

}

})

 

wx.getUserInfo({

success: function (res) {

var encryptedData = res.encryptedData;

var iv = res.iv;

}

})

String params = "appid = appid&secret=secret&js_code=code&grant_type=authorization_code";
String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);

获取到session_key

String m = decrypt2(encryptedData, sessionKey, iv, "UTF-8");

{"openId":"","nickName":"李破","gender":1,"language":"zh_CN","city":"Wuhan","province":"Hubei","country":"China","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/1iaXQDdbeiaLMRlTUoNLOVtkTVutT8zibTOakCia1zAfFibF1Re8jr6qj4Bu8d8T46V1GGnzJB0mdo4adLjL7BdI1vw/132","unionId":"","watermark":{"timestamp":1527841103,"appid":""}}

//相关方法

 

public static String decrypt2(String encryptedData, String sessionKey, String iv, String encodingFormat)        throws Exception {    // 被加密的数据    byte[] dataByte = Base64.decode(encryptedData);    // 加密秘钥    byte[] keyByte = Base64.decode(sessionKey);    // 偏移量    byte[] ivByte = Base64.decode(iv);    try {        // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要        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;        }        // 初始化        Security.addProvider(new BouncyCastleProvider());        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");        SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");        AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");        parameters.init(new IvParameterSpec(ivByte));        cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化        byte[] resultByte = cipher.doFinal(dataByte);        if (null != resultByte && resultByte.length > 0) {            String result = new String(resultByte, "UTF-8");            System.out.print(result);        }    }finally {        return null;    }}

 

//工具类

package com.yhhvip.utils.WxUtil;

import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;

public class HttpUtil {

    //private static final Log logger = Logs.get();
    private final static int CONNECT_TIMEOUT = 5000; // in milliseconds
    private final static String DEFAULT_ENCODING = "UTF-8";

    public static String postData(String urlStr, String data){

        return postData(urlStr, data, null);
    }

    public static String postData(String urlStr, String data, String contentType){

        BufferedReader reader = null;
        try {
            URL url = new URL(urlStr);
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            conn.setConnectTimeout(CONNECT_TIMEOUT);
            conn.setReadTimeout(CONNECT_TIMEOUT);
            if(contentType != null)
                conn.setRequestProperty("content-type", contentType);
            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);
            if(data == null)
                data = "";
            writer.write(data);
            writer.flush();
            writer.close();

            reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));

            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
                sb.append("\r\n");
            }
            return sb.toString();
        } catch (IOException e) {
            //logger.error("Error connecting to " + urlStr + ": " + e.getMessage());
        } finally {
            try {
                if (reader != null)
                    reader.close();
            } catch (IOException e) {
            }
        }
        return null;
    }
    public static String SendGET(String url,String param){
        String result="";//访问返回结果
        BufferedReader read=null;//读取访问结果

        try {

            //创建url
            URL realurl=new URL(url+"?"+param);
            //打开连接
            URLConnection connection=realurl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            //建立连接
            connection.connect();
            // 获取所有响应头字段
//                     Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段,获取到cookies等
//                     for (String key : map.keySet()) {
//                         log.info(key + "--->" + map.get(key));
//                     }
            // 定义 BufferedReader输入流来读取URL的响应
            read = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(),"UTF-8"));
            String line;//循环读取
            while ((line = read.readLine()) != null) {
                result += line;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(read!=null){//关闭流
                try {
                    read.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return result;

    }

}

转载于:https://my.oschina.net/u/3559695/blog/1822729

你可能感兴趣的文章
Ruby的case语句
查看>>
Linux的链接文件-ln命令
查看>>
maven的tomcat插件如何进行debug调试
查看>>
table表头固定
查看>>
截取字符串中两个字符串中的字符串
查看>>
spring xml properties split with comma for list
查看>>
判断点是否在三角形内
查看>>
Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)...
查看>>
在odl中怎样实现rpc
查看>>
leetcode 110 Balanced Binary Tree
查看>>
python活用isdigit方法显示系统进程
查看>>
项目开发总结
查看>>
知行合一
查看>>
jmeter插件之jsonpath提取响应结果和做断言
查看>>
apt-get 命令加 autoclean clean autoremove 区别
查看>>
Docs-->.NET-->API reference-->System.Web.UI.WebControls-->Repeater
查看>>
发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner
查看>>
Ubuntu ctrl+alt会导致窗口还原的问题
查看>>
第四十期百度技术沙龙笔记整理
查看>>
推荐系统那点事 —— 基于Spark MLlib的特征选择
查看>>