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

 更新时间:2015年09月08日 22:51:33   投稿:mdxy-dxy  
本篇文章给大家介绍微信公众号支付如何获取用户openid,需要授权回调页面域名等一系列途径实现此功能,需要的朋友可以参考下

一、获取apikey,appsecret与商户号

  注册公众号、商户号

二、获取用户的OpenId

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

    官方解释:用户在网页授权页同意授权给公众号后,微信会将授权数据传给一个回调页面,回调页面需在此域名下,以确保安全可靠。回调页面域名不支持IP地址。

      

  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

    参数:appid:公众号的唯一标识

       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 = 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();
  }
  // 从输入流读取返回内容
  InputStream 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无效时:
  {
   "errcode":
   ,"errmsg":"invalid code"
 }

以上内容就是脚本之家的小编给大家分享的微信公众号支付(一)如何获取用户openId,希望大家喜欢。

相关文章

  • JavaWeb之Filter与Listener使用解析

    JavaWeb之Filter与Listener使用解析

    这篇文章主要介绍了JavaWeb之Filter与Listener使用解析,Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一,过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能,需要的朋友可以参考下
    2024-01-01
  • Java实现特定范围的完数输出算法示例

    Java实现特定范围的完数输出算法示例

    这篇文章主要介绍了Java实现特定范围的完数输出算法,简单说明了完数的概念、计算原理并结合实例形式分析了java针对给定范围内的完数输出操作实现技巧,需要的朋友可以参考下
    2017-12-12
  • 解决IDEA中多模块下Mybatis逆向工程不生成相应文件的情况

    解决IDEA中多模块下Mybatis逆向工程不生成相应文件的情况

    这篇文章主要介绍了解决IDEA中多模块下Mybatis逆向工程不生成相应文件的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • myeclipse10配置tomcat教程详解

    myeclipse10配置tomcat教程详解

    这篇文章主要为大家详细介绍了myeclipse10配置tomcat的教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • SpringMVC方法返回值多种情况代码实例

    SpringMVC方法返回值多种情况代码实例

    这篇文章主要介绍了SpringMVC方法返回值多种情况代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Mysql中的聚簇索引cluster index解析

    Mysql中的聚簇索引cluster index解析

    这篇文章主要介绍了Mysql中的聚簇索引cluster index解析,聚簇索引是一种数据库索引的类型,它将数据行物理上存储在磁盘上按照索引的顺序进行排序,聚簇索引可以提高查询性能,因为它可以减少磁盘I/O操作,需要的朋友可以参考下
    2023-10-10
  • SWT(JFace)体验之FormLayout布局

    SWT(JFace)体验之FormLayout布局

    SWT(JFace)体验之FormLayout布局示例代码。
    2009-06-06
  • springboot整合@Retryable实现重试功能的示例代码

    springboot整合@Retryable实现重试功能的示例代码

    本文主要介绍了springboot整合@Retryable实现重试功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java中switch判断语句典型使用实例

    Java中switch判断语句典型使用实例

    这篇文章主要介绍了Java中switch判断语句典型使用实例,本文直接给出代码实例,在忘记switch语法时特别有用,复制修改即可使用,需要的朋友可以参考下
    2015-06-06
  • 解决spring集成redisson踩过的坑

    解决spring集成redisson踩过的坑

    这篇文章主要介绍了spring集成redisson踩过的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论