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

作者:mdxy-dxy 时间:2022-07-29 04:13:57 

一、获取apikey,appsecret与商户号

注册公众号、商户号

二、获取用户的OpenId

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

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

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

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,希望大家喜欢。

标签:微信公众号,支付,openid
0
投稿

猜你喜欢

  • Android自定义ViewGroup实现标签浮动效果

    2021-12-28 20:20:29
  • C# 列表List的常用属性和方法介绍

    2022-09-04 07:52:05
  • C#生成PDF文件流

    2023-03-19 08:52:56
  • java 多线程的三种构建方法

    2023-07-01 22:18:26
  • 利用源码编译Android系统的APK和可执行命令的方法

    2023-12-22 13:09:46
  • 详解Springboot配置文件的使用

    2022-02-26 09:02:26
  • Java自定义实现equals()方法过程解析

    2021-10-12 11:21:48
  • 解决SpringMVC、tomcat、Intellij idea、ajax中文乱码问题

    2023-10-20 10:16:23
  • Java 十大排序算法之插入排序刨析

    2021-12-07 02:48:54
  • SpringMVC HttpMessageConverter消息转换器

    2023-01-13 04:57:45
  • Android中ToggleButton开关状态按钮控件使用方法详解

    2022-11-10 06:24:35
  • Java中的collection集合类型总结

    2023-04-17 17:31:43
  • 详解Java中Collections.sort排序

    2023-08-20 00:51:48
  • VisualStudio Community2019在安装的过程中无法进入安装界面的解决方法

    2023-02-09 11:24:34
  • SpringMVC加载控制与Postmand的使用和Rest风格的引入及RestFul开发全面详解

    2021-10-14 16:45:44
  • C#使用TextBox作数据输入方法

    2023-11-16 22:26:14
  • 学习Java内存模型JMM心得

    2023-11-28 20:56:17
  • 基于java构造方法Vector创建对象源码分析

    2023-11-25 11:27:54
  • Android6.0 Launcher2应用解析

    2021-10-29 19:19:43
  • TableLayout(表格布局)基础知识点详解

    2023-05-30 01:12:42
  • asp之家 软件编程 m.aspxhome.com