微信公众号支付(一)如何获取用户openId

网友投稿 354 2023-07-29


微信公众号支付(一)如何获取用户openId

一、获取apikey,appsecret与商户号

二、获取用户的OpenId

1.设置【授权回调页面域名】

2.用户同意授权

我是把这个url写在微信菜单下的,当进入这个页面的时候就让用户同意。注意:好像是静默授权的,用户不知道

1.url:

https://open.weixin.qq.com/connect/oauth/authorize?appid=appid&redirect_uri=url&response_type=code&scope=snsapi_userinfo&state=park#wechat_redirect

redirect_uri:重定向的url,就是授权后要跳转的页面

scope:应用授权作用域

snsapi_base:不弹出授权页面,直接跳转,只能获取用户openid

snsapi_userinfo:弹出授权页面,可通过openid拿到昵称、性别、所在地

state:重定向后带的参数

2.用户同意后会产生一个code,只有分钟时间的有效期。

String code = request.getParameter("code")

3.code换openId

/**

* 常量类

* @author rory.wu

*

*/

public class Constants {

// 第三方用户唯一凭证

public static String appid = "";

// 第三方用户唯一凭证密钥

public static String appsecret = "";

//商户ID

public static String mch_id="";

//获取openId

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

}

/**

* 通用工具类

* @author rory.wu

* @version .

* @since 年月日

*/

public class CommonUtil {

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

public static jsONObject httpsRequestToJsonObject(String requestUrl, String requestMethod, String outputStr) {

JSONObject jsonObject = null;

try {

StringBuffer buffer =FKwnxV httpsRequest(requestUrl, requestMethod, outputStr);

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

} catch (ConnectException ce) {

log.error("连接超时:"+ce.getMessage());

} catch (Exception e) {

log.error("https请求异常:"+e.getMessage());

}

return jsonObject;

}

private static StringBuffer httpsRequest(String requestUrl, String requestMethod, String output)

throws NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException, MalformedURLException,

IOException, ProtocolException, UnsupportedEncodingException {

URL url = new URL(requestUrl);

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

connection.setDoOutput(true);

connection.setDoInput(true);

connection.setUseCaches(false);

connection.setRequestMethod(requestMethod);

if (null != output) {

OutputStream outputStream = connection.getOutputStream();

outputStream.write(output.getBytes("UTF-"));

outputStream.close();

}

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

InputStrFKwnxVeam inputStream = connection.getInputStream();

InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-");

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;

connection.disconnect();

return buffer;

} }

  /**

* 获取用户的openId,并放入session

* @param code 微信返回的code

*/

private void setOpenId(String code) {

session.put("code", code);

String oauth_url = Constants.oauth_url.replace("APPID", Constants.appid).replace("SECRET", Constants.appsecret).replace("CODE", String.valueOf(session.get("code")));

log.info("oauth_url:"+oauth_url);

JSONObject jsonObject = CommonUtil.httpsRequestToJsonObject(oauth_url, "POST", null);

log.info("jsonObject:"+jsonObject);

Object errorCode = jsonObject.get("errcode");

if(errorCode != null) {

log.info("code不合法");

}else{

String openId = jsonObject.getString("openid");

log.info("openId:"+openId);

session.put("openId", openId);

}

}

oauth_url返回的格式是:

  {

   "access_token":"ACCESS_TOKEN",

   "expires_in":,

"refresh_token":"REFRESH_TOKEN",

"openid":"OPENID", "scope":"SCOPE",

"unionid": "o_bmasdasdsad_sgVthMZOPfL"

}

Code无效时:

  {

FKwnxV   "errcode":

   ,"errmsg":"invalid code"

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java实现遍历Map的方法
下一篇:cocos2dx骨骼动画Armature源码剖析(一)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~