涉及微信小程序相关AIP如下:
1、wx.login
接口wx.getUserInfo
当中的 openId 和unionId属于敏感数据,所以接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,就需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:
- 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
- 对称解密的目标密文为 Base64_Decode(encryptedData)。
- 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
- 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。
# 前后端流程
1、前端调用接口wx.login ,获得code
2、前端调用接口wx.getUserInfo(参数withCredentials 设为 true),获得加密数据 encryptedData, iv
3、前端将加密数据 encryptedData, iv,以及code传给服务端,服务端按照解密算法,解密数据,得到openid/Unionid返回给前端
# 服务端解密算法(Perl CGI方式)实现如下:
前端将encryptedData, iv,以及code以json方式POST给服务端的CGI脚本,脚本如下:
use warnings;
use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');
use CGI;
use JSON;
use HTTP::Request;
use HTTP::Headers;
use LWP::UserAgent;
use Data::Dumper;
$wechat_config={
appid=>'wxd2317scfhe',
appSecret=>'0b4d05df3f990c8f5576403b1d216d6b'
};
$cgi = CGI->new();
$json = JSON->new;
my $OUTPUT = '{"unionid":"", "openid":"", "status":"failed"}';
#前端POST数据 {"iv":"xxx", "encryptedData":"xxx", "js_code":"xxx", "act":"getUid"}
if ($cgi->param("POSTDATA")) {
my $post_data = $cgi->param("POSTDATA");
#write_log("post_data.log", Dumper($post_data));
#$post_data =~s/[\r\n]//g; #去掉回车换行,以免正则匹配失败
my $input_json = $json->decode($post_data);
if ($input_json->{act} eq "getUid") {
if (length($input_json->{iv}) && length($input_json->{encryptedData}) && length($input_json->{js_code}) ) {
my $obj = $input_json->{obj};
my $iv = $input_json->{iv};
my $data = $input_json->{encryptedData};
my $jscode = $input_json->{js_code};
my $appId = $wechat_config->{appid};
my $key = $wechat_config->{appSecret};
my $ret = get_session_key($appId, $key, $jscode);
my $session_key = "";
if (defined $ret->{session_key}) {
$session_key = $ret->{session_key};
} else {
$OUTPUT = '{"unionid":"", "openid":"", "status":"failed", "errMsg":"get sessionKey failed"}';
print_result($OUTPUT);
exit;
}
#write_log("getUid.log", "jscode=".$jscode."\niv= ".$iv."\nencryptedData= ".$data."\nsession_key=".$session_key);
my $result = readpipe("python /var/app/aes.py $appId $session_key $iv $data");
#write_log("getUid.log", "result= ".$result);
if ($result =~m/{.+}/) {
my $result_json = $json->decode($result);
my $unionid = "";
my $openid = $result_json->{openId};
if (defined $result_json->{unionId}) {
$unionid = $result_json->{unionId};
} else {
$unionid = $result_json->{openId};
}
$OUTPUT = '{"unionid":"'.$unionid.'", "openid":"'.$openid.'", "status":"success"}';
}
}
} else {
write_log("input.log", "act:".$input_json->{act}."Not implement");
}
print_result($OUTPUT);
}
exit;
sub get_session_key {
my ($appId, $secret, $jscode) = @_;
my $session_key_api = "https://api.weixin.qq.com/sns/jscode2session?appid=".$appId."&secret=".$secret."&js_code=".$jscode."&grant_type=authorization_code";
my $ua = LWP::UserAgent->new();
my $req = HTTP::Request->new('GET', $session_key_api);
my $response = $ua->request($req);
my $ret;
if ($response->message ne "OK" && $response->is_success ne "1") { #出错,或者timeout了
$ret->{status} = "time out";
} else {
$ret = $json->decode($response->decoded_content());
}
#write_log("session_key.log", " $session_key_api"."\n wechat.rsp:".Dumper($ret));
return $ret;
}
# 由于解密必须采用AES算法,而Perl实现起来比较复杂,所以采用了readpipe方式调用Python的AES解密算法来实现,即:
my $result = readpipe("python /var/app/aes.py $appId $session_key $iv $data");
# aes.py内容如下:
import base64
#import json
import sys
from Crypto.Cipher import AES
def decryptData(appId, sessionKey, encryptedData, iv):
# base64 decode
sessionKey = base64.b64decode(sessionKey)
encryptedData = base64.b64decode(encryptedData)
iv = base64.b64decode(iv)
cipher = AES.new(sessionKey, AES.MODE_CBC, iv)
decrypted = _unpad(cipher.decrypt(encryptedData))
#decrypted = json.loads(_unpad(cipher.decrypt(encryptedData)))
#if decrypted['watermark']['appid'] != appId:
#print("{\"errMsg\":\"appid mismatched\", \"status\":\"failed\"}")
#sys.exit()
return decrypted
def _unpad(s):
return s[:-ord(s[len(s)-1:])]
if (len(sys.argv) != 5):
print("{\"errMsg\":\"args not enough\", \"status\":\"failed\"}")
sys.exit()
#sys.argv[0] is "aes.py"
appId = sys.argv[1]
sessionKey = sys.argv[2]
iv = sys.argv[3]
encryptedData = sys.argv[4]
decrypted = decryptData(appId, sessionKey, encryptedData, iv)
#print("{\"unionid\":\""+ decrypted['unionId'] + "\", \"status\":\"success\"}")
print(decrypted)
sys.exit()
# aes.py解密后的数据如下:
{
u'province': u'Guangdong', u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',
u'language': u'zh_CN', u'city': u'Guangzhou', u'gender': 1,
u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
u'watermark': {u'timestamp': 1477314187, u'appid': u'wx4f4bc4dec97d474b'},
u'country': u'CN', u'nickName': u'Band', u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA'
}
相关推荐
用于解密unionId的js包,使用前需 npm install crypto
TP5微信小程序获取openid和unionid代码 俩种方式:1获取openid 判断数据库是否存在获取unionid 2.获取openid后不存在 走官方button按钮 的getuserinfo去获取unionid
在微信小程序的开发过程中,获取用户的openid和其他相关信息是至关重要的步骤。这涉及到微信小程序与后端服务器之间的数据交互,确保用户身份的安全验证。本篇主要介绍如何在C#环境下,结合asp.net服务器端来实现这...
微信小程序开发获取用户openid,服务端代码。前端返回json格式解析。
在C#中开发微信小程序的服务端,获取用户解密信息是关键步骤之一,这涉及到微信小程序与微信服务器之间的数据交互。微信小程序在用户授权后,会通过API接口发送加密后的用户信息到服务端,服务端需要正确解密这些...
微信小程序的openId是指用户在微信小程序中的唯一标识符,通过该标识符可以获取用户的个人信息和行为数据。openId是微信小程序的用户身份验证机制,用于验证用户的身份和权限。 二、获取openId的过程 获取openId的...
微信小程序的用户信息包括昵称、头像等,但请注意,这些信息必须在用户授权后才能获取。 5. **安全性考虑** Session Key是敏感信息,需要妥善保管。在服务器端,可以将OpenID与Session Key关联存储,然后生成一个...
java解析的源码和小程序的源码,自己从项目中剥离出来的,肯定能用,有疑问私信,微信小程序获取各类信息(openid、session_key以及用户基本信息、解密手机号)
主要介绍了微信公众平台实现获取用户OpenID的方法,需要开发人员经过微信授权后获取高级接口才能使用此功能,用户OpenID对于微信公众平台建设有着非常广泛的用途,需要的朋友可以参考下
总的来说,这个压缩包提供的是一套完整的微信小程序获取OpenID的解决方案,包含前后端代码,适合初学者快速了解和实践微信小程序的登录授权流程。开发者只需按照说明配置好自己的AppID和AppSecret,即可在自己的环境...
总结起来,微信小程序获取用户openid的过程涉及到`wx.login`、`wx.getUserInfo`以及与后端服务器的交互。这个过程需要遵循微信的接口规范,确保用户隐私的安全,同时也需要在后端进行相应的处理来解密并存储用户信息...
微信小程序获取用户openid源码(前后端).rar
如何获取小程序的用户openid和unionid,以及后台C#代码
说实话,微信开放平台的文档真的是狗屎一般的存在,维护不及时,混乱,每隔一段时间更新一次授权接口!着实让开发者想口吐芬芳了!...微信小程序获取用户openid 首先看一下文档中规划的登录流程时序图上面这一部分:
微信小程序获取用户openId的实现方法 前端: wx.login({ success: function (res) { res.code }) 获取到code后,传到后台, 然后请求微信接口 ...把参数替换为自己的参数,这个接口就直接返回openId了 ...
asp编写的代码,可以配合认证过的微信公众号获取使用者微信信息,例如昵称、性别、地址、头像等等,可以用于会员注册等,用openid做为会员验证身份等使用场景
我们知道openid是微信用户验证的重要标识,支付功能严重依赖这个东西,之前我们做微信支付的时候是通过在微信客户端直接调用官方接口,通过传code参数来调用,下面这样 getOpenId(){ //获取用户的openid let _this=...
微信小程序 SpringBoot 后台获取用户的 OpenID 是指在微信小程序中,通过 SpringBoot 后台来获取用户的 OpenID,这个过程需要通过微信 API 来实现。下面将详细介绍微信小程序 SpringBoot 后台获取用户的 OpenID 的...
微信h5授权获取用户openId的方法和步骤,用于用户登录和注册,代码已经封装好,下载就能用
java+Springmvc实现获取微信用户唯一标识openId并返回