A. OAuth2.0网页授权微信怎么用java获取openid
第一步:用户同意授权,获取code 引导用户进入授权的URL 修改一些参数
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认带有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:
B. oauth2.0网页授权微信怎么用java获取code
@RequestMapping(value="oauth2/{type}/{appId}/{scope}", method=RequestMethod.GET)
public ModelAndView index(@PathVariable String type,@PathVariable String appId,@PathVariable String scope,String openId){
ModelAndView view=new ModelAndView();
if(StringUtils.isEmpty(appId)||mapWxAppInfo.get(appId)==null){
view.setViewName("fail");
return view;
}
//scope=snsapi_base 获取用户openId,无需授权
//scope=snsapi_userinfo 获取用户基本信息,需授权
String oauthUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";
//处理授权回调地址
String callback="http://wx.lrlz.com/wx/callback/"+appId;
if(!StringUtils.isEmpty(openId)){
callback += "/"+openId;
}
oauthUrl=String.format(oauthUrl, appId,callback,scope,type);
log.info("微信授权认证地址="+oauthUrl);
view.setViewName("redirect:" + oauthUrl);
return view;
}
/**
* 处理网页授权回调
* */
@RequestMapping(value="callback/{appId}")
public ModelAndView callback(@PathVariable String appId,String code,String state,String redirectUri,HttpServletRequest req,HttpServletResponse response){
return getCallback(appId,code,state,null);
}
这样就行了
C. 如何在订阅号里实现oauth微信授权登录
通过 微信公众平台---->权限接口 可以得知 微信的订阅号是没有授权登录接口的,只有服务号才有该权限。这点微信公众平台在多处反复强调
最终的事实是:微信订阅号是可以实现授权登录的!
二:具体实现步骤:
1. 首先在 微信公众平台(https://mp.weixin.qq.com/) 【开发】----> 【基本配置】----->【服务器配置】完成基本的配置信息
URL: 这里的地址我写的是我们HTML5项目的某个Controller或Servlet的地址,例如 http://www.example.com/weixin/checkSignature.do
注意这个CheckSignatureController中是要写代码的,代码的业务逻辑是要验证签名并返回echostr字段;还需要注意www.example.com 这个地址必须是外网地址(内网不行的), 因为当你配置完所有的基本信息时,当提交的时候,微信公众平台会回答你刚才填的URL地址即http://www.example.com/weixin/checkSignature.do, 如果你填内网的地址,那么这个URL调不到,如果签名验证不过去,这个基本配置就配置不成功。当你写好这个CheckSignatureController后,还要将代码放到测试环境中去,以便微信公众平台可以回调你这个Controller
[java] view plain
@Controller
@RequestMapping(value="/weixin")
public class CheckSignatureController extends BaseController {
private static transient final Logger log = LoggerFactory.getLogger(CheckSignatureController.class);
public static String WEIXIN_TOKEN = "Token";
@RequestMapping(value ="checkSignature.do", proces = "application/json; charset=utf-8")
@ResponseBody
public String checkSignature(HttpServletRequest request) {
String echostr = request.getParameter("echostr"); // 随机字符串
if (isSignature(request)) {
return echostr;
}
return null;
}
// 检查签名
public boolean isSignature(HttpServletRequest request) {
String signature = request.getParameter("signature"); // 微信加密签名
String timestamp = request.getParameter("timestamp"); // 时间戳
String nonce = request.getParameter("nonce"); // 随机数
String[] arr = new String[] {timestamp, nonce, WEIXIN_TOKEN};
Arrays.sort(arr);
String s = arr[0] + arr[1] + arr[2];
MessageDigest md;
byte[] digest = null;
try {
md = MessageDigest.getInstance("SHA-1");
digest = md.digest(s.getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
String sign = bytesToHexString(digest);
return signature.equals(sign);
}
public static final String bytesToHexString(byte[] bArray) {
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString().toLowerCase();
}
}
当你点击基本信息的【提交】按钮时,微信公众平台会向你项目发送http请求:
http://www.example.com/weixin/checkSignature.do?signature=&echostr=8312595572152199567×tamp=1460511115&nonce=534926942
如果这个地址能返回http请求中的echostr参数,就能提交成功,否则提交还会提示报错
Token:是一个字符串,自己随意写,但是要保证一点CheckSignatureController中会用到Token这个值,两者要保证完全一致即可
EncodingAESKey: 我选择的是随机生成的
2: 测试号管理
登录这个地址,进行配置:http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
在这个地址中要配置完所有信息
接口配置信息
URL: http://www.example.com/weixin/checkSignature.do 和基本信息配置一样
Token:和基本配置中的token保持一致
JS接口安全域名
域名:http://www.example.com
D. 微信如何设置开发者中心的 “OAuth2.0”网页授权
需要在微信公众后台配置授权回调域名,配置注意事项请参考公众平台接口详细说明,配置成功后,可以通过请求授权页面,直到授权后重定向到回调地址。
具体操作:粘贴如下代码:
public ActionResult WXBind()
{
string sUrl = "/oauth2/access_token?appid=" + ViewUtil.WXappID + "&secret=" + ViewUtil.WXappsecret + "&code=" + Request["code"] + "&grant_type=authorization_code";
WebClient webClient = new WebClient();
Byte[] bytes = webClient.DownloadData(sUrl);
string result = Encoding.GetEncoding("utf-8").GetString(bytes);
JSONObject obj = JSONConvert.DeserializeObject(result);
string sParam = Request["state"];
string sRedictUrl = "";
switch (sParam)
{
case "myorder":
sRedictUrl = "/Account/Order?OpenID=" + obj["openid"] +"&Param=order";
break;
case "book":
sRedictUrl = "/Book/WXHotels";break;
default:
sRedictUrl = "/Account/Index?OpenID={0}" + obj["openid"];
break;
}
Response.Redirect(sRedictUrl);
return View();
}
E. 微信OAuth2.0网页授权可以添加多个域名吗
不可以,只能添加一个域名。授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com 无法进行OAuth2.0鉴权。
F. java基于微信开发,用oauth2静默授权是,回调的url总是执行两次,怎么回事呀
用户关注微信公众账号;
微信公众账号提供用户请求授权页面URL;
用户点击授权页面URL,将向服务器发起请求;
服务器询问用户是否同意授权给微信公众账号;
用户同意(scope为snsapi_base时无此步骤);
服务器将CODE通过回调传给微信公众账号;
微信公众账号获得CODE;
微信公众账号通过CODE向服务器请求Access Token;
服务器返回Access Token和OpenID给微信公众账号;
微信公众账号通过Access Token向服务器请求用户信息;
服务器将用户信息回送给微信公众账号。
G. 你好,看到您提问OAuth2.0网页授权微信怎么用java获取openid
首先需要在微信后台的网页授权那边添加你的信任的域名下地址
页面上获取code参数
function getQueryString(name){
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
var code = "";
$(function(){
code = getQueryString('code');
。。。。。
3.传入code调用接口获取openid
public static String oauth2GetOpenid(String code) {
HttpClient client = null;
String result = "";
try {
client = new DefaultHttpClient();
HttpGet httpget = new HttpGet("https://api.weixin.qq.com/sns/oauth2/access_token?appid="+Constant.WECHATAPPID+"&secret="+Constant.WECHATAPPSECRET+"&code="+code+"&grant_type=authorization_code");
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String response = client.execute(httpget, responseHandler);
Object obj = JSONValue.parse(response);
JSONObject jbt = (JSONObject) obj;
result = String.valueOf(jbt.get("openid"));
} catch (Exception e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return result;
}
H. 怎么用java调用微信支付接口
1.调用微信接口授权
授权这里有两种方式,一种是snsapi_bases,另一种是snsapi_userinfo,这里官方文档介绍的比较清楚,可以参考官网
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN
appid登录微信公众号-基本配置-开发者ID-APPID
redirect_uri就是一个回调地址,当你调用完微信的这个链接后,他会自动调用你定义的这个地址,返回code参数
注意,redirect_uri也需要在公众号里面配置,在接口权限-网页帐号里修改。
2.可以在页面中写一个调用授权的页面
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<title>用户管理</title>
<scripttype="text/javascript"src="js/jquery/jquery-1.11.1.min.js"></script>
<scripttype="text/javascript">
functionoauth(){
varurl="<%=basePath%>getOauth2Url";
$.ajax({
url:url,
success:function(result){
//varresult=eval('('+result+')');
if(result.success){
location.href=result.obj;//
}else{
}
}
});
}
</script>
</head>
<body>
<ponclick="oauth()">非用户认证鉴权</p>
</body>
</html>
</pre><preclass="html"name="code"snippet_file_name="blog_20160608_3_8825275"code_snippet_id="1711669">java中的方法
<preclass="html"name="code">/**
*获取授权地址
*@return
*/
@RequestMapping(value="/getOauth2Url",method=RequestMethod.GET)
publicvoidgetOauth2Url(Modelmodel,HttpServletResponseresponse){
Jsonj=newJson();
try{
Stringauthorize_url=PayConfig.AUTHORIZE_URL;
StringappId=PayConfig.APPID;
Stringredirect_uri=PayConfig.REDIRECT_URI;
Stringurl=authorize_url+"?appid="+appId+"&redirect_uri="+urlEncodeUTF8(redirect_uri)+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
System.out.println(url);
j.setSuccess(true);
j.setMsg("保存成功!");
j.setObj(url);
write(response,JSON.toJSONString(j));
}catch(Exceptione){
j.setMsg(e.getMessage());
}
}
/**
*对回调地址进行encode
*@paramsource
*@return
*/
(Stringsource){
Stringresult=source;
try{
result=java.net.URLEncoder.encode(source,"utf-8");
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
returnresult;
}
<preclass="html"name="code"> /**
*获取授权地址
*@return
*/
@RequestMapping(value="/getOauth2Url",method=RequestMethod.GET)
publicvoidgetOauth2Url(Modelmodel,HttpServletResponseresponse){
Jsonj=newJson();
try{
Stringauthorize_url=PayConfig.AUTHORIZE_URL;
StringappId=PayConfig.APPID;
Stringredirect_uri=PayConfig.REDIRECT_URI;
Stringurl=authorize_url+"?appid="+appId+"&redirect_uri="+urlEncodeUTF8(redirect_uri)+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
System.out.println(url);
j.setSuccess(true);
j.setMsg("保存成功!");
j.setObj(url);
write(response,JSON.toJSONString(j));
}catch(Exceptione){
j.setMsg(e.getMessage());
}
}
/**
*对回调地址进行encode
*@paramsource
*@return
*/
(Stringsource){
Stringresult=source;
try{
result=java.net.URLEncoder.encode(source,"utf-8");
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
returnresult;
}
packagecom.crm.common;
publicclassPayConfig{
publicstaticStringAPPID="wx91af774aae000dcb";//APPID
publicstaticStringMCHID="1347742701";//商户编号
publicstaticStringPAYKEY="";//支付密钥
publicstaticStringAPPSECRET="";//公众号-基本配置-APPSECRET密钥
publicstaticStringREDIRECT_URI="
回调地址
publicstaticStringAUTHORIZE_URL="
微信授权地址
publicstaticStringACCESS_TOKEN_URI="
publicstaticStringSCOPE="snsapi_base";//snsapi_base和snsapi_userinfo
publicstaticStringGRANT_TYPE="grant_type";//获取openid时用,不用改
}
3.成功后,回到你当时写的回调地址
<preclass="html"name="code">/**
*微信授权后的回调地址的方法
*@paramcode
*@paramresponse
*/
@RequestMapping(value="/authorize",method=RequestMethod.GET)
publicvoidauthorize(Stringcode,HttpServletResponseresponse,Stringopenid){
code="test";
Stringaccess_token_uri=PayConfig.ACCESS_TOKEN_URI;
Stringappid=PayConfig.APPID;
Stringsecret=PayConfig.APPSECRET;
access_token_uri=access_token_uri.replace("APPID",appid).replace("SECRET",secret).replace("CODE",code);
System.out.println(access_token_uri);
if(openid!=null){
UniteOrderorder=getUniteOrder(openid);
StringreqXML=PayImpl.generateXML(order,PayConfig.PAYKEY);
StringrespXML=PayImpl.requestWechat(ORDER_URL,reqXML);
System.out.println("respXML="+respXML);
UniteOrderResultresult=(UniteOrderResult)PayImpl.turnObject(UniteOrderResult.class,respXML);
getWechatPay(result);
}
}
I. java怎么获取微信的openid
java获取微信的openid的方法是根据授权code来获取的,方法如下:
一个Servlet请求 获取code:
/**
* 根据code取得openId
*
* @param appid 公众号的唯一标识
* @param secret 公众号的appsecret密钥
* @param code code为换取access_token的票据
* @return
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//参数
String code = request.getParameter("code");
if(null != code && !"".equals(code)){
log.info("==============[OAuthServlet]获取网页授权code不为空,code="+code);
//根据code换取openId
OAuthInfo oa = WeixinUtil.getOAuthOpenId(Constants.appId,Constants.appSecret,code);
UserInfo info = WeixinUtil.getUserInfo(oa.getAccessToken(), oa.getOpenId());
if(!"".equals(oa) && null != oa){
request.setAttribute("openid", oa.getOpenId());
request.setAttribute("nickname", info.getNickname());
request.getRequestDispatcher("/index.jsp").forward(request, response);
}else{
log.info("==============[OAuthServlet]获取网页授权openId失败!");
}
}else{
log.info("==============[OAuthServlet]获取网页授权code失败!");
}
}
替换相应的APPID APPSECRET SCOPE。
过code换取网页授权access_token 这里的access_token与基础获取的access_token不同
获取code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
具体做法与上面基本一致。更换相对应的值。需要注意的是code可以写一个Servlet获取。String code = request.getParameter("code");get/post都可以。
这样子就会返回一下json格式数据
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}