2017-08-11 17:41:17 a57571737 阅读数 581

这里写图片描述
第一次开发微信版网页,对最重要的获取微信OpenId,特此记录下来

1.首先得有appid和appsecret
复制代码

1 1. public class WeiXin {
2
3 public static string appid {
4 get {
5 string _appid = “wx3xxxxxxxxxxxxxxx”;
6 return _appid;
7 }
8 }
9 public static string aseret {
10 get {
11 string appsecret = “b6719276d539796d94bxxxxxxxxxxxxxxx”;
12 return appsecret;
13 }
14 }
15
16 }

复制代码

2.只获取用户的openID,,在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面,以snsapi_base为scope发起的网页授权,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(下面代码中的url参数就是回调页,静态的可以写成:string url = https://wx.baidu.com/controller/GetOpenId,注意URL需要进行HttpUtility.UrlEncode(url)编码,还有回调页的域名需要和微信公众号里面设置的回调域名相同)
复制代码

1 public class ApplyVIPController : Controller
2 {
3
4 // GET: /ApplyVIP/
5
6 public ActionResult Index(string url)
7 {
8 string _url = string.Format(“https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state={2}#wechat_redirect”,
9 WeiXin.appid,
10 url,//回调页URL
11 Guid.NewGuid().ToString(“N”));
12 return Redirect(_url);//这里微信会自动取出回调页URL,并且跳转到该url所属的页面
13 }

复制代码

3.获取code,并且通过code获取Openid,正确时返回的JSON数据包如下:{ “access_token”:”ACCESS_TOKEN”, “expires_in”:7200, “refresh_token”:”REFRESH_TOKEN”, “openid”:”OPENID”, “scope”:”SCOPE” },这里面就包含了所需要的OPENID
复制代码

   //controller

public string GetOpenId() {
string code = requset.querystring[“code”];
string openid = “”;
string json = “”;
string url = string.Format(“https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code “//通过appid,appaseret,code
, WeiXin.appid, WeiXin.aseret, code);
HttpQuery.Get(url, null, msg => {
json = msg;
});
JObject job = (JObject)JsonConvert.DeserializeObject(json);
openid = job[“openid”].ToString();
return openid;
}

复制代码

4.请求获取Openid的httpquery.get()方法
复制代码

public class HttpQuery {
    private static readonly string DefaultUserAgent =
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";

    public static void Get(string url, object data, Action<string> callback) {
        IDictionary<string, string> parameters = Getparameters(data);

        if (!(parameters == null || parameters.Count == 0)) {
            url += "?";
            foreach (var item in parameters) {
                url += item.Key + "=" + item.Value + "&";
            }
        }
        CreateGetHttpResponse(url, null, null, null, callback);
    }
    /// <summary>  
    /// 创建GET方式的HTTP请求  
    /// </summary>  
    /// <param name="url">请求的URL</param>  
    /// <param name="timeout">请求的超时时间</param>  
    /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
    /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
    /// <returns></returns>  
    private static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent,
        CookieCollection cookies, Action<string> callback, string encoding = "utf-8") {
        if (string.IsNullOrEmpty(url)) {
            return null;
            //throw new ArgumentNullException("url");
        }
        try {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "GET";
            request.UserAgent = DefaultUserAgent;
            if (!string.IsNullOrEmpty(userAgent)) {
                request.UserAgent = userAgent;
            }
            if (timeout.HasValue) {
                request.Timeout = timeout.Value;
            }
            if (cookies != null) {
                request.CookieContainer = new CookieContainer();
                request.CookieContainer.Add(cookies);
            }

            HttpWebResponse httpWebResponse = request.GetResponse() as HttpWebResponse;

            StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream(),
                System.Text.Encoding.GetEncoding(encoding));

            string html = "";
            //获取请求到的数据
            html = reader.ReadToEnd();
            //关闭
            httpWebResponse.Close();
            reader.Close();

                callback(html);
                return httpWebResponse;
            }
        } catch {
            callback(null);
        }
        return null;
    }

}

2018-12-31 15:03:30 H_233 阅读数 384

微信公众号支付的接口即预下单接口需要传openid,但是单元测试调该接口的话,就得直接传固定的测试参数,没有办法像实际生产流程中那样获取openid,所以这里先通过微信官方的网页授权方法获取openid。

首先我们先保证前提条件以满足,完成公众号开发的相关步骤。

按照开发文档的步骤来,这里是链接https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3

这里直接从回调地址设置开始(前面的步骤已完成的情况下)


1、放置MP_verify文件到授权目录下

请将文件MP_verify_wY984BJIuZNHf8yR.txt上传至上传至dohko.m.test.com/order/(你的回调地址)指向的web服务器(或虚拟主机)的目录(可以放在该服务器节点根目录下)

保证可访问https://dohko.m.test.com/MP_verify_wY984BJIuZNHf8yR.txt

2、微信管理后台设置绑定授权目录

3、微信客户端打开如下这种url

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9440000cd8000000&redirect_uri=https%3a%2f%2fdohko.m.test.com%2forder%2f&response_type=code&scope=snsapi_base&state=1&connect_redirect=1#wechat_redirect

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9440000cd8000000&redirect_uri=https%3a%2f%2fdohko.m.test.com%2forder%2f&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirec

参数说明:

链接中参数传自己的对应参数即可,appid为测试公众号的appid,redirect_uri为自己支付成功的回调地址(尽量使用https链接,微信文档中有说明,为了保证返回code的安全,scope参数可以传snsapi_base,也可以传snsapi_userinfo,区别在于snsapi_base不会弹出授权页面,而snsapi_userinfo会弹出一个授权页面,如果只需要得到openid,传snsapi_base即可,如果需要用户其他信息就snsapi_userinfo,但还需要多一步)

注意链接在微信客户端内打开,为了便于调试用电脑微信打开即可。

不能浏览器打开!!

但是电脑版在显示链接时存在这样一个问题,如图

这样就不是一个完整的链接,解决这个问题可以将回调地址urlencode编码一下即可(给出一个工具页http://tool.chinaz.com/tools/urlencode.aspx),如下图正确链接

点击后授权公众号,然后会跳转至回调地址并且会携带code及state参数,因为我的回调地址无法直接这样访问,所以没有显示,但为了看到url,我们将此访问用浏览器打开

然后浏览器中就能看到这样的url(这里传的scope为snsapi_userinfo,传snsapi_base发现浏览器打开不好使。。)

https://dohko.m.test.com/order/?code=001c7QXy0CuMUd1vgmXy0tOyXy0c7QXE&state=1

这里的code值仅能生效一次,且5分钟未使用就会失效,所以抓紧时间下一步。。

4、后续链接均可浏览器打开,为了方便这里使用postman进行访问。

访问链接模板:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数说明:

appid和secret应该是在申请公众号的时候就会获得,code就是我们上一步得到的,然后填入相应参数访问即可,下图为code5分钟未使用失效了。。

正确,未失效的

5、此时到上一步已经结束了,我们已经获取到了openid,而这一步是用来获取用户详细信息的,根据官方说明,这一步仅能在scope为snsapi_userinfo访问

参数说明:

openid就是我们获取到的用户标识,传入即可

 

已上就是获取openid的全部步骤。。

2018-04-20 14:59:43 one_girl 阅读数 4194

开发场景:
在微信客户端打开某个网页可以获取到用户的openId。

获取用户openid步骤如下:参考微信公众平台开发文档

第一步:引导微信公众平台的用户打开如下链接

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数说明

参数               是否必须   说明
appid               是      公众号的唯一标识
redirect_uri        是      授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type       是      返回类型,请填写code
scope               是      应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),     snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
state               否      重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect    是      无论直接打开还是做页面302重定向时候,必须带此参数
参考链接(请在微信客户端中打开此链接体验):
scope为snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
scope为snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

注意事项:
1、redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理。进行urlEncode处理戳这里
2、appid必须是服务号的开发者ID(订阅号是没有权限通过网页授权来获取用户基本信息的),并且该服务号开通了微信网页授权的功能,且配置了微信授权回调域名,这样才能获取到code码用于进一步获取用户openid。(微信公众号的区分–服务号和订阅号有何不同?
如下图:
这里写图片描述
这里写图片描述

第二步:在重定向的回调页面(redirect_uri)里获取code,并请求openid

    // 获取code   
    function getQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]); return null;
        }
    var code = getQueryString("code");  
    alert(code)   // 获取code值可以在客户端打开链接的时候alert出来查看
    // 请求openid
    $.ajax({ 
      async: false, 
      url: "http://api.xxx.com/member/platformDict/getOpenId", //后端提供的获取openid的接口
      type: "GET", 
      data: {code:code}, //传递本页面获取的code到接口,以便获取openid
      timeout: 5000, 
      success: function (result) { 
        // 根据后台接口返回的参数 result里应该会包含openid,就可以获取到了
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
          alert(textStatus); 
      } 
  })
</script>

code

2017-09-06 10:12:53 qq_35713752 阅读数 1824

微信小程序开发交流qq群   581478349

   承接微信小程序开发。扫码加微信。

 

微信小程序获取openid和session_key并且把openid存入数据库。已经调用openid的demo

前后端代码都有,后端php实现

在其它地方同步调用openid。(确保用户完成登录再进行后续的操作);

onLoad:function(options){       
 getApp().promise.then(resolve => {
          var url = app.url + '/api/v1/Room/UserInfo'
          util.request(url, 'post', {
            name: userInfo.nickName,
            avatarUrl: userInfo.avatarUrl,
            accid: wx.getStorageSync('accid')
          }, '', function (res) {
            wx.redirectTo({
              url: '/pages/home/home'
            })
          })
        })
}

小程序代码,获取openid,并且做同步的阻塞。

//app.js
var util = require('utils/util.js');
App({
  onLaunch: function() {
    this.url = 'http://127.0.0.1/smile_chatRoom/'
    var that = this;
    return that.promise = new Promise(function(resolve) {
      wx.login({
        success: function(res) {
          var data = {
            code: res.code
          }
          if (res.code) {
            //发起网络请求
            var url = that.url + '/login.php';
            util.request(url, 'POST', data, '', function(res) {
              console.log(res);
              that.openid = res.data.openid;
              wx.setStorageSync('openid', that.openid)
              resolve(that.openid);
            }, function(err) {
              console.log(err);
            })
          } else {
            console.log('登录失败!' + res.errMsg)
          }
        }
      });
    })
  }
})

 

php 代码

<?php
    header("Content-Type:text/html;charset=utf8"); 
	header("Access-Control-Allow-Origin: *"); //解决跨域
	header('Access-Control-Allow-Methods:POST');// 响应类型  
	header('Access-Control-Allow-Headers:*'); // 响应头设置 
    $link=mysql_connect("localhost","root","root"); 
    mysql_select_db("smile", $link); //选择数据库
    mysql_query("SET NAMES utf8");//解决中文乱码问题
	
    $code = $_POST['code'];
	$url='https://api.weixin.qq.com/sns/jscode2session?appid=wxfc20b2db0701ad17&secret=ffb74c8eb3f19699ec7f70861b8387ce&js_code='.$code.'&grant_type=authorization_code';
	$json = file_get_contents($url);
    //只返回openid,json是一个json对象
    $array = json_decode($json,TRUE);
    $obj = json_decode($json);
    $openid = $obj->openid;
	$q = "SELECT * FROM user"; //SQL查询语句 SELECT * FROM 表名
	$result = mysql_query("SELECT * FROM user
	WHERE openid='$openid'");
	$num=mysql_num_rows($result);  //获取行数
	if($num>0){
	}else{
			//插入数据到数据库 
			$strsql = "insert into user (openid) values('$openid')";
			//mysql_query() 函数执行一条 MySQL 查询。SELECT,SHOW,EXPLAIN 或 DESCRIBE 都需要用这个函数执行
			$result = @mysql_query($strsql);
	}
	echo $openid;
?>

 

 

 

 

 

2019-07-17 10:54:58 yakson 阅读数 738

前言

weixin4j网页静默授权获取openid案例

**说明:**微信网页授权基础知识请参考官方文档。

静默授权获取OpenId

本 示例基于weixin4j开发,weixin4j是Java微信开发SDK,官网http://www.weixin4j.org/
本示例只演示思路,并抽象出了一个授权的公共方法,仅供参考

第一步:创建Weixin对象
第二步:使用Weixin.sns()获取组件SnsComponent
第三步:生成静默授权获取OpenId的跳转链接
第四步:从请求中获取微信授权code
第五步:用code换取微信用户OpenId


import org.weixin4j.Weixin;
import org.weixin4j.WeixinException;
import org.weixin4j.component.SnsComponent;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * BaseController
 *
 * @author yangqisheng
 * @date 2019/07/17
 */
public class BaseController {

    private Weixin weixin = new Weixin();

    /**
     * 校验网页授权并获取openid
     *
     * @param request 请求对象
     * @param response 输出对象
     * @param returnUrl 网页授权后跳转回链接
     * @return 是否已获取openid
     * @throws IOException
     */
    private boolean validateOAuthOpenId(
            HttpServletRequest request, HttpServletResponse response,
            String returnUrl) throws IOException, WeixinException {
        //从session中获取openid
        Object oauth_openid = request.getSession().getAttribute("openid");
        //第一次访问,判断是否存在openid,不存在则说明没有进行授权访问,进行授权访问
        if (oauth_openid == null) {
            //获取Sns组件
            SnsComponent snsComponent = weixin.sns();
            //获取code,换取openid
            String code = request.getParameter("code");
            //如果没有获取到,则说明是直接访问页面链接,进行匿名获取
            if (code == null || code.equals("")) {
                //生成静默授权获取openid跳转链接
                String url = snsComponent.getOAuth2CodeBaseUrl(returnUrl);
                //跳转到微信授权页面
                response.sendRedirect(url);
                return false;
            } else {
                //获取授权得到的openid
                String openid = snsComponent.getOpenId(code);
                //设置当前用户
                request.getSession().setAttribute("openid", openid);
                //重定向到URL
                response.sendRedirect(returnUrl);
                return false;
            }
        }
        return true;
    }
}

步骤讲解

创建微信对象并获取SnsCompoment组件

我们引入开发包

<dependency>
     <groupId>org.weixin4j</groupId>
     <artifactId>weixin4j</artifactId>
    <version>0.1.5</version>
</dependency>

这一步可以有很多方法,比如案例中的直接

Weixin weixin =  new Weixin()

也可以使用

Weixin weixin = WeixinBuilder.newInstance().build();

如果你使用springmvc开发的话,也 可以引入weixin4j-spring

<dependency>
    <groupId>org.weixin4j</groupId>
    <artifactId>weixin4j-spring</artifactId>
    <version>1.0.0</version>
</dependency>

那么这个适合你就可以使用这种方式来创建weixin对象了
xml方式,在applicationContext.xml中配置bean

<!-- 定义微信工厂Bean -->
<bean id="weixinFactory" class="org.weixin4j.spring.WeixinFactoryBean">
    <!--property name="weixinConfig" ref="weixinConfig" /-->
    <!--property name="weixinPayConfig" ref="weixinPayConfig" /-->
    <!--property name="tokenLoader" ref="myTokenLoader" /-->
    <!--property name="ticketLoader" ref="myTicketLoader" /-->
</bean>
<!-- 初始化微信模板Bean -->
<bean id="weixinTemplate" class="org.weixin4j.spring.WeixinTemplate">
    <constructor-arg index="0" ref="weixinFactory" ></constructor-arg>
</bean>

在代码中使用注解获取

@Autowired
private WeixinTemplate weixinTemplate;

对的 ,你没看错,在springmvc里,我们的Weixin对象被WeixinTemplate代理了,所以我们这样获取SnsComponent

SnsComponent snsComponent = weixinTemplate.sns();

如果你使用的是spring-boot,那就更简单了
直接引入spring-boot的配置

<dependency>
    <groupId>org.weixin4j.spring.boot</groupId>
    <artifactId>weixin4j-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

在代码中使用注解即可获取

@Autowired
private WeixinTemplate weixinTemplate;

更多weixin4j的配置请参考这篇文章https://blog.csdn.net/yakson/article/details/82108649

生成网页授权获取openid跳转链接

关于网页授权的两种scope的区别说明
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

SnsCompomen组件里提供了静默授权(snsapi_base)和安全授权(snsapi_userinfo)

String url = snsComponent.getOAuth2CodeBaseUrl(returnUrl);

这段返回的就是微信 静默授权链接地址

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

用code换取openid

这一步是最简单的 ,看代码就清楚了

String openid = snsComponent.getOpenId(code);

好了 ,网页授权获取openid就讲到这里,另附一小段安全授权获取用户头像代码

安全授权获取微信用户昵称、头像

    /**
     * 校验网页授权并获取微信用户信息
     *
     * @param request 请求对象
     * @param response 输出对象
     * @param returnUrl 网页授权后跳转回链接
     * @return 是否已获取openid
     * @throws IOException
     */
    private boolean validateSnsUser(
            HttpServletRequest request, HttpServletResponse response,
            String returnUrl) throws IOException, WeixinException {
        //从session中获取openid
        Object oauth_openid = request.getSession().getAttribute("openid");
        //第一次访问,判断是否存在openid,不存在则说明没有进行授权访问,进行授权访问
        if (oauth_openid == null) {
            //获取Sns组件
            SnsComponent snsComponent = weixin.sns();
            //获取code,换取openid
            String code = request.getParameter("code");
            //如果没有获取到,则说明是直接访问页面链接,进行匿名获取
            if (code == null || code.equals("")) {
                //生成静默授权获取openid跳转链接
                String url = snsComponent.getOAuth2CodeUserInfoUrl(returnUrl);
                //跳转到微信授权页面
                response.sendRedirect(url);
                return false;
            } else {
                //获取授权得到微信用户信息
                SnsUser snsUser = snsComponent.getSnsUserByCode(code);
                System.out.println(snsUser.getNickname());
                System.out.println(snsUser.getHeadimgurl());
                //设置当前用户
                request.getSession().setAttribute("openid", snsUser.getOpenid());
                //重定向到URL
                response.sendRedirect(returnUrl);
                return false;
            }
        }
        return true;
    }

欢迎加入weixin4j官方VIP群学习,QQ群:473227872

微信获取code,openid,授权,绑定用户,

博文 来自: inforstack
没有更多推荐了,返回首页