前几天开发微信的项目,一直比较忙,也没有时间记录一下经验,今天静下来想了一下,准备把自己工作中踩到的一些坑给大家分享一下,本篇文章主要是自我记录,如果有不足的地方,请留言多多指教,下边进入正题。
这次做得是一个微信公众号类型的,这里我们需要申请一个测试公众号。
申请测试公众号的链接:点击跳转
测试接口地址:https://mp.weixin.qq.com/debug/
网页授权文档说明:点击跳转
第一步
嗯,看文档,其实文档写的已经很清晰了,反正我个人觉得很清晰了,申请一个微信测试公众号,下边是我已经申请好的一个测试公众号,可以获取到 AppID 和 AppSercret 信息,这两个信息很重要,一定要保存下来!!!
第二步
然后配置 Js 安全域名,这个相当于你的回调域名,用来获取 Code 信息
第三步
开始开发网页授权获取 OpenId ,配置完这个 Js 安全域名,就可以进行下一步的开发了,创建一个 Controller ,这个地方我们就叫 WxLogin(叫啥不重要重要的是内容),下边说一下详细的步骤
首先进入的方法一定是 login 方法,然后通过 login 方法 redirect 重定向到 getRedireceUrl() 方法中(其实这个地方,你也可以不用做重定向跳转,直接进来就可以获取值,主要核心的代码还是下方获取 code 信息 和 根据 code 信息获取 openID 的那一部分)
然后去获取 Code 的信息,也就是我们的第二个方法
通过我们设置的回调地址,拿到我们所需要的 code 的信息,然后用我们的 code 信息去获取 openID
package org.ry.demo;
import com.alibaba.fastjson.JSONObject;
import org.apache.log4j.Logger;
import org.ry.utils.HttpUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
/**
* @ClassName:WxLogin
* @Description:TODO 微信登录,授权,详细文档说明请查看 instructions/wx_login_txt 文件
* @Author LinLuoChen
* @Date 2019/11/25/17:25
* @Version V1.0
**/
@Controller
@RequestMapping("wxLogin")
public class WxLogin {
// 引入日志文件
static Logger log = Logger.getLogger(WxLogin.class.getClass());
// 获取定义的 appId
@Value("${appId}")
private String appId;
// 获取定义的 appSecret
@Value("${appSecret}")
private String appSecret;
/**
* 微信登录地址
* @param response
* @throws IOException
*/
@RequestMapping(value = "login", method = {RequestMethod.POST,RequestMethod.GET})
public String login(HttpServletResponse response, HttpServletRequest request) throws IOException {
String wxurl = getRedirectUrl(request);
return "redirect:"+wxurl;
}
/**
* @Description 获取 code 信息,网页授权不需要 token
* @Author LinLuoChen
* @Date 17:32
**/
private String getRedirectUrl(HttpServletRequest request){
// 获取 Code 信息
String wxurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
log.info(wxurl);
// 拼接回调地址,必须是微信白名单才可以!!!
String ecodeurl = URLEncoder.encode("https://填写你配置的回调域名/rescue/wechatlogin/getUsercode");
wxurl=wxurl.replaceAll("REDIRECT_URI",ecodeurl);
log.info("Code:"+wxurl);
return wxurl;
}
/**
* @Description 获取到 openID
* @Author LinLuoChen
* @Date 9:38
* @Param [code]
* @return java.lang.String
* code 值是根据回调地址从微信获取的参数信息
**/
@RequestMapping("getUsercode")
public String getUsercode(String code, HttpSession session){
String url ="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
// 替换 appid 和 secret
// 转换连接请求为 GET 方式
url = url.replace("APPID",appId).replace("SECRET",appSecret).replace("CODE",code);
String json = HttpUtil.doGet(url,new HashMap<String,Object>(),"");
// 根据 Code 拿到 OpenId
JSONObject obj = JSONObject.parseObject(json);
// 在日志打印出报文
log.info(obj.toJSONString());
// 拿到 openid
String openId = obj.getString("openid");
return openId;
}
}
由于写本文的时候没有连贯起来,所以导致可能后边有些简陋,不过这也是获取 openID 的核心代码
主要注意的点也是就配置回调域名,然后获取 code 的值,其余的其实都是一样写的
博主 QQ :3044793043 ,有疑惑的地方欢迎私信或者评论