微信-获取openid
第一步 首先把微信的支付流程与相关的文档熟悉一遍,具体的支付逻辑是怎么实现的,心里要有一定的路数,开发的时候一边看文档,一边写,再一边调试这是最好的选择,首先阅读微信开发文档,因为我们这次是做公众号支付的,开发公众号支付时,在统一下单接口中要求必传用户openid,而获取openid则需要您在公众平台设置获取openid的域名,只有被设置过的域名才是一个有效的获取openid的域名,否则将获取失败。
第二步 设置一个可以获取openid的域名,这个域名也是有其设定规则的,域名设置,一定要按照规定的要求设置域名。
第三步 根据这个域名来构建链接地址,让用户点击链接先获取用户的code,如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。微信网页授权有两种scope方式,一种是以静默的方式获取到用户的openid,用户感觉就是直接进入了页面(一般是业务页面),这种方式是snsapi_base,简单轻巧。另一种方式是以snsapi_userinfo为scope发起的授权,以弹框的形式告知用户,是否同意获取您的基本资料,包括头像,昵称,性别,城市等基本信息(绝对的安全可靠)但这种授权需要用户手动同意,并且由于用户同意过无须关注,就可在授权后获取该用户的基本信息。
具体构造链接地址为:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。 appid 在自己的公众号里面获取,secrete也是同样的地方获取,redirect_uri 可自己在代码中构建,顺便可以查看code值,通过日志的形式打印出来。
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
/**这给是手动的获取到openid 首先获取的code 通过文档上面的链接获取 * 把对应的appid 都写在请求参数里面 https://open.weixin.qq.com/connect/oauth2/authorize? appid=wx87ef5cf6d104e0bf&redirect_uri=http://ytr.natapp1.cc/weixin/auth&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect * 接着把redirect的地址 重定向的地址写在 URL里面 然后运行系统 http://ytr.natapp1.cc/weixin/auth 会请求重定向到微信客户端地址 复制 * 复制地址在微信手机端打开 然后获取出code 但是code不使用的话会在五分钟后过期 所以我们要用code换取accesstoken * 接着使用链接: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code * 把appid secret code 都写入参数 然后在浏览器中打开 你就能看到一个返回的json格式的数据 里面就包含了openid * 例如: * { "access_token": "aPVsASECyBtZzAQhyPVfY32OfJZdbWLy4oh462TEGWNC2cKqFEleWKfGVE50cK4eghIXhOUSeOOFoXYiO15sRcPABTwiF4DvCCFjISVfk74", "expires_in": 7200, "refresh_token": "U-AZt9ATCZrn3CqZ6MMw87V6Osx6wIJG6d3mfwtvR64xfH1YQv1qAoF0hvGL8oa45RhWO1oT8tSEROkHXduHdHyfFz6v3eHVFN3V6V8Yt5Q", "openid": "o_KA80qhQVDBvePL5rdNIgU343Co", "scope": "snsapi_userinfo" }
以上就是完成了第一步骤,成功的获取到了用户的openid。
我们也可以通过第二种方式(第三方SDK)获取openid。
代码如下:
首先是配置相关的属性包括appId, secreat 后期还会有商户证书号 证书路径等配置。
wechat: mpAppId: wx87ef5cf6d104e0bf mpAppSecret: fbaaff8c3552e74edbe82b7fd8455673 mchId: 1483469312 mchKey: C5245D70627C1F8E9964D494B0735025 keyPath: /usr/local/keypath/h5.p12 notifyUrl: http://ytr.natapp1.cc/sell/pay/notify
获取配置参数 :
package com.wchat.config; import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component; /**
* 配置 appid appsecret
* Created by yangtianrui on 17/8/14.
*/
@Component
public class WeChatMpConfig { @Autowired
private WeChatAccountConfig weChatAccountConfig;
@Bean
public WxMpService wxMpService()
{
WxMpService wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
return wxMpService;
} @Bean
public WxMpConfigStorage wxMpConfigStorage()
{
WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
wxMpConfigStorage.setAppId(weChatAccountConfig.getMpAppId());
wxMpConfigStorage.setSecret(weChatAccountConfig.getMpAppSecret());
return wxMpConfigStorage;
}
}
构建用户点击的URL:
package com.wchat.controller; import com.wchat.config.WeChatMpConfig;
import com.wchat.enums.ResultEnum;
import com.wchat.exceptions.SellException;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import java.net.URLEncoder; /**
* Created by yangtianrui on 17/8/14.
*/
@Controller
@RequestMapping("/wechat")
@Slf4j
public class WeChatController { @Autowired
private WxMpService wxMpService;
@GetMapping("/authorize")
public String authorize(@RequestParam("returnUrl") String returnUrl)
{
String url ="http://ytr.natapp1.cc/sell/wechat/userinfo";
// 该地址就是 提跳转到微信客户端打开的链接
String resultUrl= wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAUTH2_SCOPE_USER_INFO, URLEncoder.encode(returnUrl));
log.info("[微信网页授权]获取resulr={}",resultUrl); return "redirect:"+resultUrl;
}
@GetMapping("/userinfo")
public String userInfo(@RequestParam("code")String code,
@RequestParam("state")String returnUrl)
{
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
try {
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
}catch (WxErrorException e){
log.error("[微信网页授权]{}",e);
throw new SellException(ResultEnum.WX_MP_ERROR.getCode(),e.getError().getErrorMsg());
}
String openid = wxMpOAuth2AccessToken.getOpenId();
log.info("openid={}",openid);
return "redirect:"+returnUrl+"?openid="+openid;
} }
此时只要访问:ytr.natapp1.cc/sell/wechat/authorize?returnUrl=www.baidu.com 类似这个模版的路径即可获取用户的openid。
参考:https://blog.csdn.net/hanerer1314/article/details/77387154
微信-获取openid的更多相关文章
- 简单的实现微信获取openid
微信公众平台获取openid在公众号的开发中有很多用途,前段时间为实现用户使用公众号在登录一次以后可以免密登陆而使用了openid.开发过程中遇到了一些问题,在这里向需要且还没有获取到openid的米 ...
- 微信获取 openid 静默及非静默
<?php /* 需要的微信公众号配置信息 APPID : 绑定支付的APPID APPSECRET : 公众帐号secert */ class Index { // 配置账号信息 privat ...
- 微信获取openId
router.beforeEach(function(to, from, next){ //中间页等待跳转 if(to.meta.requireCheck=="WaitLogin" ...
- 二、获取微信用户openId
/// <summary> /// 登录首页 /// </summary> /// <returns></returns> public ActionR ...
- 微信自定义菜单view类型获取openid访问网页
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,但是view不能获取用户的openid,需与网页授权获取用户基本信息接口结合使用,获得用 ...
- paip.微信菜单直接跳转url和获取openid流程总结
paip.微信菜单直接跳转url和获取openid流程总结 #------不能直接跳转,贝儿提示不安全的链接.. #-------使用auth跳转. //todox 直接转到.. direct ...
- NET实现微信分享和获取openid
VS2010开发,MVC3架构. 通过调用微信官方接口实现获取openid,和分享好友功能,实现获取signature和jsapi_ticket,并在服务端进行缓存AccessToken和jsapi_ ...
- 微信(一) 获取openid 网页授权 C# WeChatHelper
用.Net开发微信的时候第一步就是获取微信的网页授权,获取openid. 自己做个总结,以后也好用,这里只提供了获取openid的接口,后续程序有待开发 using System; using Sys ...
- [转] Android进阶——安卓接入微信,获取OpenID
PS: sendAuthRequest拿到code,通过code拿到access_token和openId,access_token可以拿到用户的信息 http://blog.csdn.net/hao ...
随机推荐
- linq和初始化器
对象初始化器 在没有初始化器之前,我们初始化一个对象可能需要在构造函数内对属性赋值,或者先实例化一个对象,在一个一个的对其属性赋值. 使用初始化器: 已知类型:var query = new Pers ...
- 空指针和NULL
#include <stdio.h> int add(int a, int b ){ //函数的返回值和参数意一样有副本机制,存储在寄存器中,而不在内存中,函数的返回值不能取地址 & ...
- linux-zookeeper安装、配置
1.下载zookeeper包 (地址:https://www-eu.apache.org/dist/zookeeper/) 2.上传zookeeper包到指定位置(例如: /usr/local/sof ...
- C++-POJ3321-Apple Tree[数据结构][树状数组]
树上的单点修改+子树查询 用dfn[u]和num[u]可以把任意子树表示成一段连续区间,此时结合树状数组就好了 #include <set> #include <map> #i ...
- 关于MySQL的tinyint(3)问题
mysql 中int(1)和tinyint(1)中的1只是指定显示长度,并不表示存储长度.tinyint可以存储1字节, 即unsigned 0~255(signed -127~127).显示大小不受 ...
- night of 2019.8.14
饭后一个小时,坐下来看了一会书,是原来的同事推荐的. 最近一段时间,心一点一点平静.能平下心来去做一些事.偶尔也常常对着窗户发呆,想一些人生感悟.想到一些感悟时,常常感到没有人可以说说心里话. 丰子恺 ...
- python+selenium:浏览器webdriver操作(1)--基本对象定位
1.简单对象的定位-----自动化测试的核心 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象.一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证 ...
- selenium + phantomJS 常用方法总结
0x01 初始化: dcap = dict(DesiredCapabilities.PHANTOMJS) #一些属性的设置 dcap["phantomjs.page.settings.lo ...
- 【做题笔记】CF1311A、B、C
或许以后会有D. A 题目大意:给定两个整数 \(a,b\) ,每次可以进行一下任意一个操作: \(a\) 加上任意一个正奇数 \(b\) 减去任意一个正偶数 问是否可以通过若干次操作把 \(a\) ...
- SSI注入漏洞
简介 SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思.从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针.SSI具有强大的功能,只 ...