项目列表

‘d

com.souvc.weixin.pojo类

token凭证自己生成get 和set方法

public class Token {

// 接口访问凭证

private String accessToken;

// 凭证有效期,单位:秒

private int expiresIn;

}

WeixinOauth2Token网页授权信息自己生成get 和set方法

public class WeixinOauth2Token {

// 网页授权接口调用凭证

private String accessToken;

// 凭证有效时长

private int expiresIn;

// 用于刷新凭证

private String refreshToken;

// 用户标识

private String openId;

// 用户授权作用域

private String scope;

}

WeixinUserInfo类微信用户的基本信息自己生成get 和set方法

public class WeixinUserInfo {

// 用户标识

private String openId;

// 用户昵称

private String nickname;

// 性别(1是男性,2是女性,0是未知)

private int sex;

// 国家

private String country;

// 省份

private String province;

// 城市

private String city;

// 用户头像链接

private String headImgUrl;

// 用户特权信息

private List privilegeList;

}

com.yc.wabc.utils包里的类

AdvancedUtil类

public class AdvancedUtil {

private static Logger log = LoggerFactory.getLogger(AdvancedUtil.class);

/**

* 获取网页授权凭证

*

* @param appId

*            公众账号的唯一标识

* @param appSecret

*            公众账号的密钥

* @param code

* @return WeixinAouth2Token

*/

public static WeixinOauth2Token getOauth2AccessToken(String appId,

String appSecret, String code) {

WeixinOauth2Token wat = null;

// 拼接请求地址

String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";

requestUrl = requestUrl.replace("APPID", appId);

requestUrl = requestUrl.replace("SECRET", appSecret);

requestUrl = requestUrl.replace("CODE", code);

// 获取网页授权凭证

JSONObject jsonObject = CommonUtil

.httpsRequest(requestUrl, "GET", null);

if (null != jsonObject) {

try {

wat = new WeixinOauth2Token();

wat.setAccessToken(jsonObject.getString("access_token"));

wat.setExpiresIn(jsonObject.getInt("expires_in"));

wat.setRefreshToken(jsonObject.getString("refresh_token"));

wat.setOpenId(jsonObject.getString("openid"));

wat.setScope(jsonObject.getString("scope"));

} catch (Exception e) {

wat = null;

int errorCode = jsonObject.getInt("errcode");

String errorMsg = jsonObject.getString("errmsg");

log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode,

errorMsg);

}

}

return wat;

}

/**

* 刷新网页授权凭证

*

* @param appId

*            公众账号的唯一标识

* @param refreshToken

* @return WeixinAouth2Token

*/

public static WeixinOauth2Token refreshOauth2AccessToken(String appId,

String refreshToken) {

WeixinOauth2Token wat = null;

// 拼接请求地址

String requestUrl = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";

requestUrl = requestUrl.replace("APPID", appId);

requestUrl = requestUrl.replace("REFRESH_TOKEN", refreshToken);

// 刷新网页授权凭证

JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);

if (null != jsonObject) {

try {

wat = new WeixinOauth2Token();

wat.setAccessToken(jsonObject.getString("access_token"));

wat.setExpiresIn(jsonObject.getInt("expires_in"));

wat.setRefreshToken(jsonObject.getString("refresh_token"));

wat.setOpenId(jsonObject.getString("openid"));

wat.setScope(jsonObject.getString("scope"));

} catch (Exception e) {

wat = null;

int errorCode = jsonObject.getInt("errcode");

String errorMsg = jsonObject.getString("errmsg");

log.error("刷新网页授权凭证失败 errcode:{} errmsg:{}", errorCode,

errorMsg);

}

}

return wat;

}

@SuppressWarnings({ "deprecation", "unchecked" })

public static WeixinUserInfo getSNSUserInfo(String accessToken, String openId) {

WeixinUserInfo snsUserInfo = null;

// 拼接请求地址

String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";

requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace(

"OPENID", openId);

// 通过网页授权获取用户信息

JSONObject jsonObject = CommonUtil

.httpsRequest(requestUrl, "GET", null);

if (null != jsonObject) {

try {

snsUserInfo = new WeixinUserInfo();

// 用户的标识

snsUserInfo.setOpenId(jsonObject.getString("openid"));

// 昵称

snsUserInfo.setNickname(jsonObject.getString("nickname"));

// 性别(1是男性,2是女性,0是未知)

snsUserInfo.setSex(jsonObject.getInt("sex"));

// 用户所在国家

snsUserInfo.setCountry(jsonObject.getString("country"));

// 用户所在省份

snsUserInfo.setProvince(jsonObject.getString("province"));

// 用户所在城市

snsUserInfo.setCity(jsonObject.getString("city"));

// 用户头像

snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));

// 用户特权信息

snsUserInfo.setPrivilegeList(JSONArray.toList(

jsonObject.getJSONArray("privilege"), List.class));

} catch (Exception e) {

snsUserInfo = null;

int errorCode = jsonObject.getInt("errcode");

String errorMsg = jsonObject.getString("errmsg");

log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);

}

}

return snsUserInfo;

}

}

CommonUtil类

public class CommonUtil {

private static Logger log = LoggerFactory.getLogger(CommonUtil.class);

// 凭证获取(GET)

public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

/**

* 发送https请求

*

* @param requestUrl

*            请求地址

* @param requestMethod

*            请求方式(GET、POST)

* @param outputStr

*            提交的数据

* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)

*/

public static JSONObject httpsRequest(String requestUrl,

String requestMethod, String outputStr) {

JSONObject jsonObject = null;

try {

// 创建SSLContext对象,并使用我们指定的信任管理器初始化

TrustManager[] tm = { new MyX509TrustManager() };

SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");

sslContext.init(null, tm, new Java.security.SecureRandom());

// 从上述SSLContext对象中得到SSLSocketFactory对象

SSLSocketFactory ssf = sslContext.getSocketFactory();

URL url = new URL(requestUrl);

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

conn.setSSLSocketFactory(ssf);

conn.setDoOutput(true);

conn.setDoInput(true);

conn.setUseCaches(false);

// 设置请求方式(GET/POST)

conn.setRequestMethod(requestMethod);

// 当outputStr不为null时向输出流写数据

if (null != outputStr) {

OutputStream outputStream = conn.getOutputStream();

// 注意编码格式

outputStream.write(outputStr.getBytes("UTF-8"));

outputStream.close();

}

// 从输入流读取返回内容

InputStream inputStream = conn.getInputStream();

InputStreamReader inputStreamReader = new InputStreamReader(

inputStream, "utf-8");

BufferedReader bufferedReader = new BufferedReader(

inputStreamReader);

String str = null;

StringBuffer buffer = new StringBuffer();

while ((str = bufferedReader.readLine()) != null) {

buffer.append(str);

}

// 释放资源

bufferedReader.close();

inputStreamReader.close();

inputStream.close();

inputStream = null;

conn.disconnect();

jsonObject = JSONObject.fromObject(buffer.toString());

} catch (ConnectException ce) {

log.error("连接超时:{}", ce);

} catch (Exception e) {

log.error("https请求异常:{}", e);

}

return jsonObject;

}

/**

* 获取接口访问凭证

*

* @param appid

*            凭证

* @param appsecret

*            密钥

* @return

*/

public static Token getToken(String appid, String appsecret) {

Token token = null;

String requestUrl = token_url.replace("APPID", appid).replace(

"APPSECRET", appsecret);

// 发起GET请求获取凭证

JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);

if (null != jsonObject) {

try {

token = new Token();

token.setAccessToken(jsonObject.getString("access_token"));

token.setExpiresIn(jsonObject.getInt("expires_in"));

} catch (JSONException e) {

token = null;

// 获取token失败

log.error("获取token失败 errcode:{} errmsg:{}",

jsonObject.getInt("errcode"),

jsonObject.getString("errmsg"));

}

}

return token;

}

/**

* URL编码(utf-8)

*

* @param source

* @return

*/

public static String urlEncodeUTF8(String source) {

String result = source;

try {

result = java.NET.URLEncoder.encode(source, "utf-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return result;

}

/**

* 根据内容类型判断文件扩展名

*

* @param contentType 内容类型

* @return

*/

public static String getFileExt(String contentType) {

String fileExt = "";

if ("image/jpeg".equals(contentType))

fileExt = ".jpg";

else if ("audio/mpeg".equals(contentType))

fileExt = ".mp3";

else if ("audio/amr".equals(contentType))

fileExt = ".amr";

else if ("video/mp4".equals(contentType))

fileExt = ".mp4";

else if ("video/mpeg4".equals(contentType))

fileExt = ".mp4";

return fileExt;

}

}

MyX509TrustManager类

public class MyX509TrustManager implements X509TrustManager {

// 检查客户端证书

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

}

// 检查服务器端证书

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

}

// 返回受信任的X509证书数组

public X509Certificate[] getAcceptedIssuers() {

return null;

}

}

SignUtil类

public class SignUtil {

// 与接口配置信息中的Token要一致

private static String token = "Sih8PLcmM8d2Va8f";

/**

* 验证签名

*

* @param signature

* @param timestamp

* @param nonce

* @return

*/

public static boolean checkSignature(String signature, String timestamp, String nonce) {

String[] arr = new String[] { token, timestamp, nonce };

// 将token、timestamp、nonce三个参数进行字典序排序

Arrays.sort(arr);

StringBuilder content = new StringBuilder();

for (int i = 0; i < arr.length; i++) {

content.append(arr[i]);

}

MessageDigest md = null;

String tmpStr = null;

try {

md = MessageDigest.getInstance("SHA-1");

// 将三个参数字符串拼接成一个字符串进行sha1加密

byte[] digest = md.digest(content.toString().getBytes());

tmpStr = byteToStr(digest);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

content = null;

// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信

return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;

}

/**

* 将字节数组转换为十六进制字符串

*

* @param byteArray

* @return

*/

private static String byteToStr(byte[] byteArray) {

String strDigest = "";

for (int i = 0; i < byteArray.length; i++) {

strDigest += byteToHexStr(byteArray[i]);

}

return strDigest;

}

/**

* 将字节转换为十六进制字符串

*

* @param mByte

* @return

*/

private static String byteToHexStr(byte mByte) {

char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

char[] tempArr = new char[2];

tempArr[0] = Digit[(mByte >>> 4) & 0X0F];

tempArr[1] = Digit[mByte & 0X0F];

String s = new String(tempArr);

return s;

}

}

net.binjoo.utils包里的类

SHA1类

public class SHA1 {

private final int[] abcde = { 0x67452301, 0xefcdab89, 0x98badcfe,

0x10325476, 0xc3d2e1f0 };

// 摘要数据存储数组

private int[] digestInt = new int[5];

// 计算过程中的临时数据存储数组

private int[] tmpData = new int[80];

// 计算sha-1摘要

private int process_input_bytes(byte[] bytedata) {

// 初试化常量

System.arraycopy(abcde, 0, digestInt, 0, abcde.length);

// 格式化输入字节数组,补10及长度数据

byte[] newbyte = byteArrayFormatData(bytedata);

// 获取数据摘要计算的数据单元个数

int MCount = newbyte.length / 64;

// 循环对每个数据单元进行摘要计算

for (int pos = 0; pos < MCount; pos++) {

// 将每个单元的数据转换成16个整型数据,并保存到tmpData的前16个数组元素中

for (int j = 0; j < 16; j++) {

tmpData[j] = byteArrayToInt(newbyte, (pos * 64) + (j * 4));

}

// 摘要计算函数

encrypt();

}

return 20;

}

// 格式化输入字节数组格式

private byte[] byteArrayFormatData(byte[] bytedata) {

// 补0数量

int zeros = 0;

// 补位后总位数

int size = 0;

// 原始数据长度

int n = bytedata.length;

// 模64后的剩余位数

int m = n % 64;

// 计算添加0的个数以及添加10后的总长度

if (m < 56) {

zeros = 55 - m;

size = n - m + 64;

} else if (m == 56) {

zeros = 63;

size = n + 8 + 64;

} else {

zeros = 63 - m + 56;

size = (n + 64) - m + 64;

}

// 补位后生成的新数组内容

byte[] newbyte = new byte[size];

// 复制数组的前面部分

System.arraycopy(bytedata, 0, newbyte, 0, n);

// 获得数组Append数据元素的位置

int l = n;

// 补1操作

newbyte[l++] = (byte) 0x80;

// 补0操作

for (int i = 0; i < zeros; i++) {

newbyte[l++] = (byte) 0x00;

}

// 计算数据长度,补数据长度位共8字节,长整型

long N = (long) n * 8;

byte h8 = (byte) (N & 0xFF);

byte h7 = (byte) ((N >> 8) & 0xFF);

byte h6 = (byte) ((N >> 16) & 0xFF);

byte h5 = (byte) ((N >> 24) & 0xFF);

byte h4 = (byte) ((N >> 32) & 0xFF);

byte h3 = (byte) ((N >> 40) & 0xFF);

byte h2 = (byte) ((N >> 48) & 0xFF);

byte h1 = (byte) (N >> 56);

newbyte[l++] = h1;

newbyte[l++] = h2;

newbyte[l++] = h3;

newbyte[l++] = h4;

newbyte[l++] = h5;

newbyte[l++] = h6;

newbyte[l++] = h7;

newbyte[l++] = h8;

return newbyte;

}

private int f1(int x, int y, int z) {

return (x & y) | (~x & z);

}

private int f2(int x, int y, int z) {

return x ^ y ^ z;

}

private int f3(int x, int y, int z) {

return (x & y) | (x & z) | (y & z);

}

private int f4(int x, int y) {

return (x << y) | x >>> (32 - y);

}

// 单元摘要计算函数

private void encrypt() {

for (int i = 16; i <= 79; i++) {

tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14]

^ tmpData[i - 16], 1);

}

int[] tmpabcde = new int[5];

for (int i1 = 0; i1 < tmpabcde.length; i1++) {

tmpabcde[i1] = digestInt[i1];

}

for (int j = 0; j <= 19; j++) {

int tmp = f4(tmpabcde[0], 5)

+ f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]

+ tmpData[j] + 0x5a827999;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] = tmp;

}

for (int k = 20; k <= 39; k++) {

int tmp = f4(tmpabcde[0], 5)

+ f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]

+ tmpData[k] + 0x6ed9eba1;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] = tmp;

}

for (int l = 40; l <= 59; l++) {

int tmp = f4(tmpabcde[0], 5)

+ f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]

+ tmpData[l] + 0x8f1bbcdc;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] = tmp;

}

for (int m = 60; m <= 79; m++) {

int tmp = f4(tmpabcde[0], 5)

+ f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]

+ tmpData[m] + 0xca62c1d6;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] = tmp;

}

for (int i2 = 0; i2 < tmpabcde.length; i2++) {

digestInt[i2] = digestInt[i2] + tmpabcde[i2];

}

for (int n = 0; n < tmpData.length; n++) {

tmpData[n] = 0;

}

}

// 4字节数组转换为整数

private int byteArrayToInt(byte[] bytedata, int i) {

return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16)

| ((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff);

}

// 整数转换为4字节数组

private void intToByteArray(int intValue, byte[] byteData, int i) {

byteData[i] = (byte) (intValue >>> 24);

byteData[i + 1] = (byte) (intValue >>> 16);

byteData[i + 2] = (byte) (intValue >>> 8);

byteData[i + 3] = (byte) intValue;

}

// 将字节转换为十六进制字符串

private static String byteToHexString(byte ib) {

char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',

'B', 'C', 'D', 'E', 'F' };

char[] ob = new char[2];

ob[0] = Digit[(ib >>> 4) & 0X0F];

ob[1] = Digit[ib & 0X0F];

String s = new String(ob);

return s;

}

// 将字节数组转换为十六进制字符串

private static String byteArrayToHexString(byte[] bytearray) {

String strDigest = "";

for (int i = 0; i < bytearray.length; i++) {

strDigest += byteToHexString(bytearray[i]);

}

return strDigest;

}

// 计算sha-1摘要,返回相应的字节数组

public byte[] getDigestOfBytes(byte[] byteData) {

process_input_bytes(byteData);

byte[] digest = new byte[20];

for (int i = 0; i < digestInt.length; i++) {

intToByteArray(digestInt[i], digest, i * 4);

}

return digest;

}

// 计算sha-1摘要,返回相应的十六进制字符串

public String getDigestOfString(byte[] byteData) {

return byteArrayToHexString(getDigestOfBytes(byteData));

}

public static void main(String[] args) {

String data = "123456";

System.out.println(data);

String digest = new SHA1().getDigestOfString(data.getBytes());

System.out.println(digest);

// System.out.println( ToMD5.convertSHA1(data).toUpperCase());

}

}

com.yc.wabc.servlets包的类

public class OAuthServlet extends HttpServlet {

private static final long serialVersionUID = -1847238807216447030L;

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("utf-8");

// 用户同意授权后,能获取到code

String code = request.getParameter("code");

String state = request.getParameter("state");

// 用户同意授权

if (!"authdeny".equals(code)) {

// 获取网页授权access_token

WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken("wx1ff244a71563c183", "936a50d4a9f1e73ad159af27fe211b41", code);

// 网页授权接口访问凭证

String accessToken = weixinOauth2Token.getAccessToken();

// 用户标识

String openId = weixinOauth2Token.getOpenId();

// 获取用户信息

WeixinUserInfo snsUserInfo = AdvancedUtil.getSNSUserInfo(accessToken, openId);

System.out.println("地址"+snsUserInfo.getCity()+"头像"+snsUserInfo.getHeadImgUrl()+"姓名"+snsUserInfo.getNickname());

// 设置要传递的参数

request.setAttribute("snsUserInfo", snsUserInfo);

request.setAttribute("state", state);

}

// 跳转到index.jsp

request.getRequestDispatcher("index.jsp").forward(request, response);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

webxm配置

OAuthServlet

/OAuthServlet

CoreServlet

/CoreServlet

跳转js片页面写一条连接

登录3

index显示用户基本信息

// 获取由OAuthServlet中传入的参数

WeixinUserInfo user = (WeixinUserInfo)request.getAttribute("snsUserInfo");

String state=request.getAttribute("state").toString();

if(null != user) {

%>

属性
OpenID
昵称
性别
国家
省份
城市
头像
特权
state:

}

else

out.print("用户不同意授权,未获取到用户信息!");

%>

结果如图

第一次搞这些文章谢谢关注

联系qq429736197

15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程http://eravip.cn/

java微信登录_java微信授权登陆相关推荐

  1. php pc机微信扫码,ThinkPHP 微信登陆 (微信PC扫码授权登陆) php 最简单代码

    ThinkPHP 微信登陆 (微信PC扫码授权登陆) php 最简单代码本主题由 隐藏人物 创建于 2016-3-28 0:15:28 http://www.thinkphp.cn/code/1556 ...

  2. 微信开发 - 第三方网站接入微信登录、微信支付时,本地 redirect_uri 参数错误导致无法调试的解决方案(微信开放平台)完美解决每次都需要部署到线上测试,在本地使用本地 ip 就能轻松调试

    问题描述 网上的教程都非常乱且无效,本文将站在新手的角度,超级详细的讲解. 本文提供 在微信开放平台,接入微信登录和微信支付时,本文无法调试 redirect_uri 回调错误 的解决方案, 仅需几个 ...

  3. Unity3D 唤醒微信 打开微信(非微信登录、微信分享)

    关注公众号,获取更多干货. 下面是正文: 好久没有写博客了,今天发现个好玩的东西,就动动手写几个字,哈哈. 本文并不是教大家如何做微信登录和微信分享,那是需要接SDK的. 今天的东西很鸡肋,但有时候还 ...

  4. [转]Unity3D 唤醒微信 打开微信(非微信登录、微信分享)

    下面是正文: 好久没有写博客了,今天发现个好玩的东西,就动动手写几个字,哈哈. 本文并不是教大家如何做微信登录和微信分享,那是需要接SDK的. 今天的东西很鸡肋,但有时候还挺需要的. 需求很简单,就是 ...

  5. Java 第三方登录(微信 QQ)

    官方文档: 微信(appid和secret)微信网页开发 /网页授权 QQ(appid和appkey)QQ互联 | 网站开发流程 一.填写审核信息 1. 申请开发者身份,以企业名义申请.申请地址: 微 ...

  6. 微信登录,网页授权流程

    微信登录网页授权流程 1.流程 以下流程为微信官方提供的请求流程,现实中可使用第三方sdk: https://github.com/Wechat-Group/WxJava/wiki/MP_OAuth2 ...

  7. android微信登录获取微信账号,微信小程序--登录授权,一键获取用户微信手机号并登录...

    一.前言 微信小程序登录流程时序 说明: 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器 开发者服务器以code换取 用户唯一标识openid 和 会话密钥sess ...

  8. 微信登录小程序授权显示服务器出错,微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)...

    本文实例为大家分享了微信小程序授权登录解决方案的具体代码,供大家参考,具体内容如下 getUserInfoF:function(){ var that = this; wx.getSetting({ ...

  9. native react 集成微信登录_react-native——微信登陆、分享、支付

    -------android篇java 推荐使用react-native-wechat库,githup地址:github.com/yorkie/reac- 登陆,分享,收藏(v1.9.9+) 和支付的 ...

  10. java app支付_Java 微信支付之APP支付服务端 (一)

    Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /** ...

最新文章

  1. 为什么有些人用一年时间获得了你十年的工作经验?
  2. 您为了什么而学?【一入红尘深似海 勿负天下有心人】
  3. 工作208:element $message居中测试无法实现
  4. 提取图像色彩主色调工具
  5. Python基础(7) - 函数
  6. python语言规范_python语言规范
  7. edius隐藏快捷键_EDIUS7 Pro快捷键使用方法及全部快捷键功能
  8. 运用R语言绘制火山图
  9. 用于PCB设计和印刷的修补匠工具
  10. idea自动生成bean实体对象
  11. 远程桌面连接不上是什么原因?怎么解决
  12. SVN服务端的搭建和简单使用
  13. 【Mybatis】Mybatis 注解开发
  14. WSL ubuntu xfce4桌面远程连接
  15. 大数据全套视频教程完整版
  16. 无线互联IOS视频教程
  17. MIPCMS模板制作之过滤导航栏
  18. 微信小程序预览word,doc,excel文件
  19. 转载:神国中的两条路(陈鸽)
  20. java之包装类常用方法

热门文章

  1. 【过一下19】学了git,看了算法竞赛讲解
  2. Accelerated Proximal Gradient Method/FISTA
  3. 前端学习笔记:微信内置浏览器拨打电话
  4. 武林传奇之七剑下天山java游戏开发商_武林传奇2之七剑下天山的配方
  5. CCF-CSP201809-4 再卖菜
  6. Android模拟登录教务系统(强智系统)
  7. harmonyos蓝牙,Microbit蓝牙配对 (Bluetooth Pairing)
  8. 小丁带你走进git的世界三-撤销修改
  9. c# 通过读取Json文件生成HTML页并在浏览器显示
  10. linux读取excel文件内容,如何读取EXCEL文件到内表