zoukankan      html  css  js  c++  java
  • 微信公众号支付(一):获取用户openId

    一、获取apikey,appsecret与商户号

      注册公众号、商户号

    二、获取用户的OpenId

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

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

        

        

      2.用户同意授权

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

        1.url:

    https://open.weixin.qq.com/connect/oauth2/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,只有5分钟时间的有效期。

    1 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 oauth2_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        
    }
     1 /**
     2  * 通用工具类
     3  * @author rory.wu
     4  * @version 1.0
     5  * @since 2015年08月05日
     6  */
     7 public class CommonUtil {
     8     
     9     private static Logger log = Logger.getLogger(CommonUtil.class);
    10     public static JSONObject httpsRequestToJsonObject(String requestUrl, String requestMethod, String outputStr) {
    11         JSONObject jsonObject = null;
    12         try {
    13              StringBuffer buffer = httpsRequest(requestUrl, requestMethod, outputStr);
    14             jsonObject = JSONObject.fromObject(buffer.toString());
    15         } catch (ConnectException ce) {
    16             log.error("连接超时:"+ce.getMessage());
    17         } catch (Exception e) {
    18             log.error("https请求异常:"+e.getMessage());
    19         }
    20         return jsonObject;
    21     }
    22     
    23     
    24     private static StringBuffer httpsRequest(String requestUrl, String requestMethod, String output)
    25             throws NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException, MalformedURLException,
    26             IOException, ProtocolException, UnsupportedEncodingException {
    27         
    28         URL url = new URL(requestUrl);
    29         HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
    30         
    31         connection.setDoOutput(true);
    32         connection.setDoInput(true);
    33         connection.setUseCaches(false);
    34         connection.setRequestMethod(requestMethod);
    35         if (null != output) {
    36             OutputStream outputStream = connection.getOutputStream();
    37             outputStream.write(output.getBytes("UTF-8"));
    38             outputStream.close();
    39         }
    40 
    41         // 从输入流读取返回内容
    42         InputStream inputStream = connection.getInputStream();
    43         InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
    44         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    45         String str = null;
    46         StringBuffer buffer = new StringBuffer();
    47         while ((str = bufferedReader.readLine()) != null) {
    48             buffer.append(str);
    49         }
    50 
    51         bufferedReader.close();
    52         inputStreamReader.close();
    53         inputStream.close();
    54         inputStream = null;
    55         connection.disconnect();
    56         return buffer;
    57     }58 }
     1   /**
     2      * 获取用户的openId,并放入session
     3      * @param code 微信返回的code
     4      */
     5     private void setOpenId(String code) {
     6         session.put("code", code);
     7         String oauth2_url = Constants.oauth2_url.replace("APPID", Constants.appid).replace("SECRET", Constants.appsecret).replace("CODE", String.valueOf(session.get("code")));
     8         log.info("oauth2_url:"+oauth2_url);
     9         JSONObject jsonObject = CommonUtil.httpsRequestToJsonObject(oauth2_url, "POST", null);
    10         log.info("jsonObject:"+jsonObject);
    11         Object errorCode = jsonObject.get("errcode");
    12         if(errorCode != null) {
    13             log.info("code不合法");
    14         }else{
    15             String openId = jsonObject.getString("openid");
    16             log.info("openId:"+openId);
    17             session.put("openId", openId);
    18         }
    19     }
    oauth2_url返回的格式是:
      {
       "access_token":"ACCESS_TOKEN",
       "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID", "scope":"SCOPE",
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }
    Code无效时:
      {
       "errcode":40029
       ,"errmsg":"invalid code"
    }
  • 相关阅读:
    Python之路【第二十九篇】:面向对象基础
    Python之路【第二十八篇】:生成器与迭代器
    爬虫实战---爬取猫眼电影
    Selenium库详解
    PyQuery库详解
    BeautifulSoup解析库详解
    深浅拷贝的使用场景分析
    关于大数据量下Core Data的数据迁移
    IOS5中的新增方法详解
    自定义UISearchBar
  • 原文地址:https://www.cnblogs.com/imeng/p/4788701.html
Copyright © 2011-2022 走看看