微信小程序调用微信登陆获取openid及java做为服务端示例

一、微信小程序
第一步:调用 wx.login获取code 文档地址
第二步:判断用户是否授权读取用户信息 文档地址
第三步:调用wx.getUserInfo读取用户数据 文档地址
第四步:由于小程序后台授权域名无法授权微信的域名,所以我们只能通过我们自己的服务器去调用微信服务器去获取用户信息,故我们将wx.login获取code 和 wx.getUserInfo 获取的encryptedData与iv 通过wx.request 请求传入后台

服务器返回的数据:

小程序代码:

//调用登录接口,获取 code
wx.login({
 success: function (res) {
  wx.getSetting({
   success(setRes) {
    // 判断是否已授权
    if (!setRes.authSetting['scope.userInfo']) {
     // 授权访问
     wx.authorize({
      scope: 'scope.userInfo',
      success() {
       //获取用户信息
       wx.getUserInfo({
        lang: "zh_CN",
        success: function (userRes) {
         //发起网络请求
         wx.request({
          url: config.loginWXUrl,
          data: {
           code: res.code,
           encryptedData: userRes.encryptedData,
           iv: userRes.iv
          },
          header: {
           "Content-Type": "application/x-www-form-urlencoded"
          },
          method: 'POST',
          //服务端的回掉
          success: function (result) {
           var data = result.data.result;
           data.expireTime = nowDate + EXPIRETIME;
           wx.setStorageSync("userInfo", data);
           userInfo = data;
          }
         })
        }
       })
      }
     })
    } else {
     //获取用户信息
     wx.getUserInfo({
      lang: "zh_CN",
      success: function (userRes) {
       //发起网络请求
       wx.request({
        url: config.loginWXUrl,
        data: {
         code: res.code,
         encryptedData: userRes.encryptedData,
         iv: userRes.iv
        },
        header: {
         "Content-Type": "application/x-www-form-urlencoded"
        },
        method: 'POST',
        success: function (result) {
         var data = result.data.result;
         data.expireTime = nowDate + EXPIRETIME;
         wx.setStorageSync("userInfo", data);
         userInfo = data;
        }
       })
      }
     })
    }
   }
  })
 }
})

二、java服务端

根据code获取openid与解码用户信息 代码

所需要的jar包

<dependency>
  <groupId>org.codehaus.xfire</groupId>
  <artifactId>xfire-core</artifactId>
  <version>1.2.6</version>
</dependency>
<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcprov-jdk16</artifactId>
  <version>1.46</version>
</dependency> 
/**
 * 微信小程序信息获取
 *
 * @author zhy
 */
public class WXAppletUserInfo {
  private static Logger log = Logger.getLogger(WXAppletUserInfo.class); 

  /**
   * 获取微信小程序 session_key 和 openid
   *
   * @author zhy
   * @param code 调用微信登陆返回的Code
   * @return
   */
  public static JSONObject getSessionKeyOropenid(String code){
    //微信端登录code值
    String wxCode = code;
    ResourceBundle resource = ResourceBundle.getBundle("weixin");  //读取属性文件
    String requestUrl = resource.getString("url"); //请求地址 https://api.weixin.qq.com/sns/jscode2session
    Map<String,String> requestUrlParam = new HashMap<String,String>();
    requestUrlParam.put("appid", resource.getString("appId")); //开发者设置中的appId
    requestUrlParam.put("secret", resource.getString("appSecret")); //开发者设置中的appSecret
    requestUrlParam.put("js_code", wxCode); //小程序调用wx.login返回的code
    requestUrlParam.put("grant_type", "authorization_code");  //默认参数 

    //发送post请求读取调用微信 https://api.weixin.qq.com/sns/jscode2session 接口获取openid用户唯一标识
    JSONObject jsonObject = JSON.parseObject(UrlUtil.sendPost(requestUrl, requestUrlParam));
    return jsonObject;
  } 

  /**
   * 解密用户敏感数据获取用户信息
   *
   * @author zhy
   * @param sessionKey 数据进行加密签名的密钥
   * @param encryptedData 包括敏感数据在内的完整用户信息的加密数据
   * @param iv 加密算法的初始向量
   * @return
   */
  public static JSONObject getUserInfo(String encryptedData,String sessionKey,String iv){
    // 被加密的数据
    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","BC");
      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");
        return JSON.parseObject(result);
      }
    } catch (NoSuchAlgorithmException e) {
      log.error(e.getMessage(), e);
    } catch (NoSuchPaddingException e) {
      log.error(e.getMessage(), e);
    } catch (InvalidParameterSpecException e) {
      log.error(e.getMessage(), e);
    } catch (IllegalBlockSizeException e) {
      log.error(e.getMessage(), e);
    } catch (BadPaddingException e) {
      log.error(e.getMessage(), e);
    } catch (UnsupportedEncodingException e) {
      log.error(e.getMessage(), e);
    } catch (InvalidKeyException e) {
      log.error(e.getMessage(), e);
    } catch (InvalidAlgorithmParameterException e) {
      log.error(e.getMessage(), e);
    } catch (NoSuchProviderException e) {
      log.error(e.getMessage(), e);
    }
    return null;
  }
}

发送请求的代码

   /**
* 向指定 URL 发送POST方法的请求
*
* @param url 发送请求的 URL
* @param param 请求参数
* @return 所代表远程资源的响应结果
*/
ublic static String sendPost(String url, Map<String, ?> paramMap) {
   PrintWriter out = null;
   BufferedReader in = null;
   String result = ""; 

   String param = "";
Iterator<String> it = paramMap.keySet().iterator(); 

while(it.hasNext()) {
  String key = it.next();
  param += key + "=" + paramMap.get(key) + "&";
} 

   try {
     URL realUrl = new URL(url);
     // 打开和URL之间的连接
     URLConnection conn = realUrl.openConnection();
     // 设置通用的请求属性
     conn.setRequestProperty("accept", "*/*");
     conn.setRequestProperty("connection", "Keep-Alive");
     conn.setRequestProperty("Accept-Charset", "utf-8");
     conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
     // 发送POST请求必须设置如下两行
     conn.setDoOutput(true);
     conn.setDoInput(true);
     // 获取URLConnection对象对应的输出流
     out = new PrintWriter(conn.getOutputStream());
     // 发送请求参数
     out.print(param);
     // flush输出流的缓冲
     out.flush();
     // 定义BufferedReader输入流来读取URL的响应
     in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
     String line;
     while ((line = in.readLine()) != null) {
       result += line;
     }
   } catch (Exception e) {
    log.error(e.getMessage(), e);
   }
   //使用finally块来关闭输出流、输入流
   finally{
     try{
       if(out!=null){
         out.close();
       }
       if(in!=null){
         in.close();
       }
     }
     catch(IOException ex){
       ex.printStackTrace();
     }
   }
   return result;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 微信小程序如何获取openid及用户信息
  • 微信小程序授权获取用户详细信息openid的实例详解
  • 微信小程序 获取session_key和openid的实例
  • 微信小程序获取用户openId的实现方法
  • 微信小程序开发一键登录 获取session_key和openid实例
  • 微信小程序 获取微信OpenId详解及实例代码
(0)

相关推荐

  • 微信小程序 获取session_key和openid的实例

    微信小程序 获取session_key和openid的实例 说说获取session_key和openid的条件 1.AppID(小程序ID); 2.AppSecret(小程序密钥); 3.登录时获取code; 注意:即使获取到了appid,未通过打款验证,也是不能拿到code的. 打印出来是这样的. 获取流程: 1.公众平台上找到AppID(小程序ID)和AppSecret(小程序密钥); 2.微信小程序中调用API获取code wx.login({ success: function(res)

  • 微信小程序 获取微信OpenId详解及实例代码

    获取微信OpenId 先获取code 再通过code获取authtoken,从authtoken中取出openid给前台 微信端一定不要忘记设定网页账号中的授权回调页面域名 流程图如下 主要代码 页面js代码 /* 写cookie */ function setCookie(name, value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000); doc

  • 微信小程序如何获取openid及用户信息

    微信小程序获取openid及用户信息的方法 1. 获取openid 1.1 获取code 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的会话密钥(session_key).用户数据的加解密通讯需要依赖会话密钥完成. wx.login({ //获取code success: function(res) { code = res.code //返回code } }) 1.2 获取openid 拿到上一步获取的code,结合小程序 appid

  • 微信小程序获取用户openId的实现方法

    微信小程序获取用户openId的实现方法 前端: wx.login({ success: function (res) { res.code }) 获取到code后,传到后台, 然后请求微信接口 https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 把参数替换为自己的参数,这个接口就直接返回openId了

  • 微信小程序授权获取用户详细信息openid的实例详解

    小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that.setData({ nickName: res.userInfo.nickName, avatarUrl: res.userInfo.avatarUrl, }) }, }) 第二种 我们在使用小程序wx.login API进行登录的时候,直接使用wx.getUserInfo是不能获取更多的信息的,如

  • 微信小程序开发一键登录 获取session_key和openid实例

    微信小程序开发一键登录 获取session_key和openid实例 思来想去不愿自己的微信小程序是个单机版本.自己又不会写后台.现在借助leancloud可以实现微信小程序一键登录功能.尝试后,做笔记. 第一步:下载av-weapp.js,放到utils下. 第二步:使用 const AV = require('../../utils/av-weapp.js');路径根据具体情况而定. 第三步:做初始化. AV.init({ appId: 'EJx0NSfY********-gzGzoHsz'

  • 微信小程序调用微信登陆获取openid及java做为服务端示例

    一.微信小程序 第一步:调用 wx.login获取code 文档地址 第二步:判断用户是否授权读取用户信息 文档地址 第三步:调用wx.getUserInfo读取用户数据 文档地址 第四步:由于小程序后台授权域名无法授权微信的域名,所以我们只能通过我们自己的服务器去调用微信服务器去获取用户信息,故我们将wx.login获取code 和 wx.getUserInfo 获取的encryptedData与iv 通过wx.request 请求传入后台 服务器返回的数据: 小程序代码: //调用登录接口,

  • 微信小程序调用微信支付接口的实现方法

    前言:应项目要求,需要使用微信小程序做支付,写完后告知手续费太高方案不予通过(宝宝心里苦,但宝宝不说).此次开发在因站在巨人的肩膀上顺利完成. 微信支付文档传送门:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3 1.开发工具: Eclipse+Tomcat+微信web开发工具 2.开发环境: java+maven 3.开发前准备: 3.1 所需材料 小程序的appid,APPsecret,支付商户号(mch_i

  • 微信小程序 调用微信授权窗口相关问题解决

    引言 微信小程序为了优化用户体验,取消了在进入小程序时立马出现授权窗口.需要用户主动点击按钮,触发授权窗口. 那么,在我实践过程中,出现了以下问题. 1. 无法弹出授权窗口 2. 希望在用户已经授权的情况下,不显示按钮 1. 具体实现 app.js的onLaunch()函数中,添加获取用户个人信息的代码段.实现在用户已经授权的情况(例如第二次打开小程序时)下,自动获取用户个人信息,而不需要用户的授权. // 获取用户信息 wx.getSetting({ success: res => { if

  • 微信小程序登录时如何获取input框中的内容

    这篇文章主要介绍了微信小程序登录时如何获取input框中的内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近写小程序项目遇到一些问题,今天整理下这些问题的解决方法,希望对用户有帮助.下面是登录页,点击登录时获取input框中的值, 效果如下: wxml布局如下: <view > <input type="text" placeholder-style="color:#fff;" bindin

  • 微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现

    这个接口只能获得一些非敏感信息,例如用户昵称,用户头像,经过用户授权允许获取的情况下即可获得用户信息,至于openid这些,需要调取wx.login来获取. index.wxml <!-- 当已经授权的时候 --> <view wx:if="{{result == 'ok'}}" class="result"> <view class="headimg"> <image src="{{avata

  • 微信小程序调用支付接口的完整流程记录

    目录 当然在开发之前,我们需要有下面这些东西: 步骤如下: 总结 官方的文档路径------>文档路径:developers.weixin.qq.com/miniprogram… 当然在开发之前,我们需要有下面这些东西: appId(小程序分配) 小程序密钥(小程序配置界面获取) 商户号 api密钥(商家后台自己设置) 首先我们要知道把大象放进冰箱拢共需要三步(不是),那么我们调起支付也是一样的 步骤如下: wx.login获取用户临时登录凭证code,发送到后端服务器换取openId 在下单时

  • 微信小程序使用uni-app一键获取用户信息

    用户不想输入账号密码,一键登录 <label for="" @click="LoginDL">一键登陆</label> uni.getUserProfile(只支持微信小程序) 获取用户信息.每次请求都会弹出授权窗口,用户同意后返回 userInfo.  参数说明: uni.getUserProfile({ //获取微信信息 desc: '用于获取您的个人信息', // 声明获取用户个人信息后的用途,不超过30个字符 success: res

  • 微信小程序调用PHP后台接口 解析纯html文本

    微信小程序调用PHP后台接口,解析纯html文本,效果图片预览 1.微信js动态传参: wx.request({ url: 'https://m.****.com/index.php/Home/Xiaoxxf/activity_detail?a_id='+options.id,//含富文本html data: { is_detail:1 }, method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT heade

  • 微信小程序学习笔记之获取位置信息操作图文详解

    本文实例讲述了微信小程序学习笔记之获取位置信息操作.分享给大家供大家参考,具体如下: 前面介绍了微信小程序文件上传.下载操作.这里分析一下获取位置信息操作. [获取当前位置信息]wx.getLocation() getlocation.wxml: <view> <button bindtap="getlocation">获取位置</button> </view> getlocation.js: Page({ getlocation: fu

随机推荐