生活随笔
收集整理的這篇文章主要介紹了
java对接微信公众号
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我對接公眾號,主要使用的地方在H5。實現效果就是不需要關注公眾號就會彈出來一個授權頁,然后進行其他的一些操作。
效果圖:
其實代碼很簡單,主要是這個流程。我先講流程,再結合代碼,請仔細看完,絕對可以完成。
請求微信授權接口(分為靜默模式和非靜默模式)在第一步的基礎上會有一個回調地址redirect_uri,這里就是寫我們自己的登錄邏輯和獲取用戶信息
其實就完了。。。。
一、請求微信授權接口
https://open.weixin.qq.com/connect/oauth2/authorize?appid={APPID}&redirect_uri=https://c380h47694.vicp.fun//wechat/login&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
主要幾個參數:
- appid 微信公眾號)appid
- redirect_uri 回調地址)就是你的接口
- response_type 固定寫死的
- scope 類型這個參數就很重要了
- snsapi_userinfo:非靜默模式,就是像上圖一樣會彈出授權頁
- snsapi_base:靜默模式
文檔地址
二、編寫回調接口
主要就是獲取網頁授權token和用戶信息接口,需要注意有幾個獲取用戶信息的url,不要用錯了 網頁授權是用這個獲取
private final static String ACCESS_TOKEN_URL
= "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";
private final static String USER_INFO_URL
= "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";private static JSONObject geOauth2AccessToken(String code
) {String requestUrl
= ACCESS_TOKEN_URL
.replace("APPID", APPID
).replace("APPSECRET", SECRET
).replace("CODE",code
);String result
= HttpUtil.get(requestUrl
);log
.info(result
);JSONObject jsonObject
= JSONUtil.parseObj(result
);if (Objects.nonNull(jsonObject
.getInt(ERR_CODE
))) {throw new CustomException("網頁授權AccessToken失敗:"+jsonObject
);}return jsonObject
;}
public static JSONObject getUserInfo(String accessToken
, String openId
) {String requestUrl
= USER_INFO_URL
.replace("ACCESS_TOKEN", accessToken
).replace("OPENID", openId
);String result
= HttpUtil.get(requestUrl
);log
.info("獲取用戶信息結果:"+result
);JSONObject jsonObject
= JSONUtil.parseObj(result
);return jsonObject
;}
三、公眾號配置
完事!!!
編寫獲取微信簽名
用的是hutool工具類生成的隨機數
應該復制過去能直接用,不過有些不重要的代碼沒有貼,隨便改改寫死就行
@ApiOperation(value
= "獲取微信簽名")@GetMapping("/getWXSign")public Result<String> getWXSign(@ApiParam("當前地址") String url
) {long timeStampSec
= System.currentTimeMillis() /1000;String timestamp
= String.format("%010d", timeStampSec
);String nonceStr
= RandomUtil.randomString(8);String[] urls
= url
.split("#");String newUrl
= urls
[0];JSONObject respJson
=new JSONObject();String wxJsapiTicket
= WechatUtil.getWXJsapiTicket();System.out
.println("ticket:"+wxJsapiTicket
);String[] paramArr
=new String[]{"url=" + newUrl
,"jsapi_ticket=" + wxJsapiTicket
,"noncestr=" + nonceStr
,"timestamp=" + timestamp
};Arrays.sort(paramArr
);String content
= paramArr
[0].concat("&").concat(paramArr
[1]).concat("&").concat(paramArr
[2]).concat("&").concat(paramArr
[3]);String signature
= null;try {MessageDigest md
= MessageDigest.getInstance("SHA-1");byte[] digest
= md
.digest(content
.toString().getBytes());signature
= WechatUtil.byteToStr(digest
).toLowerCase();} catch (NoSuchAlgorithmException e
) {e
.printStackTrace();}respJson
.put("appId", WechatUtil.APPID
);respJson
.put("timestamp", timestamp
);respJson
.put("nonceStr", nonceStr
);respJson
.put("signature", signature
);return Result.newSuccess(respJson
.toJSONString());}public static String getAccessToken() {String accessToken
;RedisUtil redisUtil
= SpringUtil.getBean(RedisUtil.class);Object accessTokenCache
= redisUtil
.get(CommonConstant.ACCESS_TOKEN
);if (Objects.nonNull(accessTokenCache
)) {accessToken
= accessTokenCache
.toString();return accessToken
;}String requestUrl
= TOKEN_URL
.replace("APPID", APPID
).replace("APPSECRET", SECRET
);String result
= HttpUtil.get(requestUrl
);log
.info("全局獲取token接口返回參數:"+result
);JSONObject jsonObject
= JSONUtil.parseObj(result
);if (Objects.nonNull(jsonObject
.getInt(ERR_CODE
))) {throw new CustomException("獲取用戶信息失敗,請重試");}accessToken
= jsonObject
.getStr("access_token");redisUtil
.set(CommonConstant.ACCESS_TOKEN
,accessToken
);return accessToken
;}public static String getWXJsapiTicket() {String accessToken
= getAccessToken();String tokenUrl
= "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken
+"&type=jsapi";String result
= HttpUtil.get(tokenUrl
);com.alibaba.fastjson.JSONObject jsonObject
= JSON
.parseObject(result
);return jsonObject
.getString("ticket");}public static String byteToStr(byte[] byteArray
) {String strDigest
= "";for (int i
= 0; i
< byteArray
.length
; i
++) {strDigest
+= byteToHexStr(byteArray
[i
]);}return strDigest
;}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
;}
遇到的坑
切換測試公眾號和真實公眾號的時遇到的緩存或者沒切換
總結
以上是生活随笔為你收集整理的java对接微信公众号的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。