小程序篇 获得unionID

需要把小程序 放在 同一个 微信开发者 下

1 先按照loginInfo信息查询有无有unionID
2 如果有,直接返回 ,程序结束
3 如果没有,将用于解密的session_key获取
4 根据userInfo拿取encryptedData等加密数据
5 对加密数据进行逆解密
6 拿到unionID 返回,程序结
userInfo 注意一下:通过user.getInfo获取的和通过button授权获取的格式不一样

   /**
     * 根据logininfo 的code尝试获取unionID
     * @param request
     * @return
     */
    public static  Map<String, String> getUnionIDByLoginInfo(String resCode, HttpServletRequest request) {
        JSONObject loginRes = null;
        Map<String, String> loginResMap = new HashMap<>();
        try {
            // 网址看参数说明:  https://developers.weixin.qq.com/miniprogram/dev/api/api-login.html#wxloginobject
            String url = SysConstants.WEICHAT_UNIONID_URL+"?appid="+SysConstants.WECHAT_APPID+ "&secret="+ SysConstants.WECHAT_SECRET + "&js_code=" + resCode + "&grant_type="+SysConstants.WECHAT_FRANT_TYPE;
            loginRes = HttpClientUtils.doGet(url);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        String openid = (String) loginRes.get("openid");
        String session_key = (String) loginRes.get("session_key"); 【如果没有需要解密 】
        String unionid = (String) loginRes.get("unionid");   【判断有没有】
        loginResMap.put("openid", openid);
        loginResMap.put("unionid", unionid);
        loginResMap.put("session_key", session_key);
        return loginResMap;
    }

session_key 解密 encryptedData iv

/**
 * @param session_key
 * @return
 */
public static    JSONObject decipherByUserInfo(String session_key,String encryptedData,String iv ) {

    LOG.info(">>>start 解密需要的数据为:encryptedData:{},iv:{},session_key:{}", encryptedData, iv, session_key);
    // 被加密的数据
    byte[] dataByte = Base64.decodeBase64( encryptedData.replaceAll(" ", "+") );
    // 加密秘钥
    byte[] aeskey = Base64.decodeBase64(session_key);
    // 偏移量
    byte[] ivByte = Base64.decodeBase64( iv.replaceAll(" ", "+") );

    String newuserInfo = "";
    try {
        AES aes = new AES();
        byte[] resultByte = aes.decrypt(dataByte, aeskey, ivByte);
        if (null != resultByte && resultByte.length > 0) {
            newuserInfo = new String(resultByte, "UTF-8");
            LOG.info(">>>end 解密完毕,解密结果为newuserInfo:{}", newuserInfo);
            return JSONObject.parseObject(newuserInfo);
        }
    } catch (Exception e) {
        LOG.info("解密异常!检查解密数据 {}", newuserInfo, e);
        e.printStackTrace();
    }
    return null;
}

转载地址: https://blog.youkuaiyun.com/weixin_39214304/article/details/79158750

### 如何在微信小程序获取UnionID #### Java 实现方案 对于Java环境而言,可以通过调用微信提供的API接口并解析返回的数据包来获得UnionID。具体来说,在接收到前端传来的临时登录凭证(code)之后,服务器端利用此code向`https://api.weixin.qq.com/sns/jscode2session`发起请求,附带必要的参数如AppID、AppSecret等信息。当响应成功时,会得到一个JSON对象,其中可能包含openid以及unionid字段(前提是该账号已经在其他应用中有过授权行为)。需要注意的是,并不是每次都能拿到unionid,这取决于用户是否在同一开放平台下有过跨应用的身份验证操作[^1]。 ```java // 发送HTTP GET请求至微信服务器换取Session Key与Union ID (假设已引入HttpURLConnection库) URL url = new URL("https://api.weixin.qq.com/sns/jscode2session?appid=YOUR_APP_ID&secret=YOUR_SECRET&js_code=" + code + "&grant_type=authorization_code"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuilder content = new StringBuilder(); while ((inputLine = in.readLine()) != null){ content.append(inputLine); } JSONObject jsonObject = JSON.parseObject(content.toString()); if(jsonObject.containsKey("unionid")){ String unionId = jsonObject.getString("unionid"); // 成功获取到了Union ID } ``` #### .NET 实现方法 .NET环境下同样遵循类似的逻辑流程去取得UnionID。不过这里更倾向于采用异步编程模型来进行网络通信部分的操作。通过HttpClient类发送POST/GET请求给指定的WeChat API endpoint,随后对接收回来的结果做进一步处理——即反序列化成强类型的C#对象,从中提取出所需的UnionID属性值。值得注意的是,为了确保安全性,应该妥善保管好应用程序的秘密钥(App Secret),并且只在一个安全可控的服务端环境中执行这些敏感操作[^2]。 ```csharp using System.Net.Http; public async Task<string> GetUnionIdAsync(string jsCode) { var client = new HttpClient(); string requestUrl = $"https://api.weixin.qq.com/sns/jscode2session?appid={your_app_id}&secret={your_secret}&js_code={jsCode}&grant_type=authorization_code"; HttpResponseMessage responseMessage = await client.GetAsync(requestUrl); if(responseMessage.IsSuccessStatusCode) { dynamic jsonResponse = JObject.Parse(await responseMessage.Content.ReadAsStringAsync()); return jsonResponse.unionid; // 如果存在则返回Union ID字符串形式 } throw new HttpRequestException($"Failed to get Union Id, status code {responseMessage.StatusCode}"); } ``` #### PHP 处理方式 PHP脚本可以直接运用curl扩展函数库完成整个过程。创建一个新的cURL会话句柄后设置相应的选项,比如目标网址、自定义header头文件等等;接着执行这个会话并将结果存储起来供后续分析使用。考虑到某些场景下可能会遇到无法直接读取到unionid的情况,建议预先判断是否存在该键名再尝试访问其对应的值。另外,记得关闭不再需要使用的资源以释放内存空间[^3]。 ```php function fetch_unionid($app_id,$app_secret,$js_code){ $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,"https://api.weixin.qq.com/sns/jscode2session?"); curl_setopt($ch,CURLOPT_POST,false); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); $params=array( 'appid'=>$app_id, 'secret'=>$app_secret, 'js_code'=>$js_code, 'grant_type'=>'authorization_code' ); curl_setopt($ch,CURLOPT_POSTFIELDS,$params); $result=curl_exec ($ch); curl_close ($ch); $json_result=json_decode($result,true); if(array_key_exists('unionid',$json_result)){ echo "User's Union ID is:".$json_result['unionid']; }else{ echo "Cannot retrieve the User's Union ID."; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值