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

这里写图片描述
第一次开发微信版网页,对最重要的获取微信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-04-20 14:59:43 one_girl 阅读数 3791

开发场景:
在微信客户端打开某个网页可以获取到用户的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

2016-01-12 12:26:31 haovip123 阅读数 18246

需求:接入微信支付,需要获取 OpenID。


微信开放平台上面对大多数步骤都有详细的介绍。但是……,还是自己梳理一下吧。

1.申请AppID。

    (微信支付或微信登录等功能需要进行开发者资质认证,准备好300大洋)

2.下载最新SDK。

3.导入jar包,并配置权限。

4.代码实现

  ①  注册到微信
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, true);
api.handleIntent(getIntent(), this);
// 将该app注册到微信
api.registerApp(Constants.APP_ID);
   ②  发送请求
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
   ③ 接受微信请求(获取code值)
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
    int result = 0;
    SendAuth.Resp re = ((SendAuth.Resp) resp);
    String code = re.code;

    switch (resp.errCode) {
        case BaseResp.ErrCode.ERR_OK:
            result = R.string.errcode_success;
            getOpenID(code);

            break;
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            result = R.string.errcode_cancel;
            break;
        case BaseResp.ErrCode.ERR_AUTH_DENIED:
            result = R.string.errcode_deny;
            break;
        default:
            result = R.string.errcode_unknown;
            break;
    }

    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
    Toast.makeText(this, code, Toast.LENGTH_LONG).show();
}
   ④ 通过code获取access_token,code等数据
private void getOpenID(String code) {
    // APP_ID和APP_Secret在微信开发平台添加应用的时候会生成,grant_type 用默认的"authorization_code"即可.
    String urlStr = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+Constants.APP_ID+"&secret="+Constants.APP_Secret+
            "&code="+code+"&grant_type=authorization_code";

    HttpUtils http = new HttpUtils();
    // 设置超时时间
    //        http.configCurrentHttpCacheExpiry(1000 * 10);
    http.send(HttpRequest.HttpMethod.GET, urlStr, null,
            new RequestCallBack<String>() {
                // 接口回调
                @Override
                public void onSuccess(ResponseInfo<String> info) {
                    System.out.println("返回的json字符串:" + info.result);
                    Toast.makeText(getApplicationContext(), info.result, Toast.LENGTH_SHORT).show();

                    JSONObject obj = null;
                    try {
                        obj = new JSONObject(info.result);
                        //toast  OpenID
                        Toast.makeText(getApplicationContext(), obj.getString("openid"), Toast.LENGTH_LONG).show();

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onFailure(com.lidroid.xutils.exception.HttpException e, String s) {

                }
            });
}


注意事项:

1.下载的SDK一定要是最新的,旧一点的SDK里面在获取code的时候没有 .code属性,比如官方demo中万年不变的sdk就害的我很惨。
2.调试时的应用签名和正式版的应用签名是不一致的,应该区别对待,分别获取。签名生成工具链接
3.网络访问HttpUtils用的是xUtils.jar包里面的类,不要误会了。





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

微信小程序开发交流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;
?>

 

 

 

 

 

2018-01-09 11:15:03 HanKin_ 阅读数 11671

文章的一开始,我先解释下微信公众号的openId。

openId是微信对于用户的唯一辨识,只要有用户关注你的公众号,微信会通过公众号和用户微信号通过一种算法生成一种唯一标识码,也就是openId,用数学表达式也就是说:

x=你的公众号,y=用户微信号,f()函数表示算法

那么openId = f(x,y);

后面就讲讲怎么获取到openId把,我下面先讲一种简易的方式(还有一种后续有空加上)

1.在公众号后台设置回调的域名(大多情况下是你的项目)

开发-接口权限-网页账号-用户授权获取用户基础信息中修改

2.在页面上访问下面的网址

https://open.weixin.qq.com/connect/oauth2/authorize?appid=*******&redirect_uri=你回调的地址&response_type=code&scope=snsapi_base&state=1#wechat_redirect

上面的会返回到你回调的地址?code=xxxxxxxxx

也就是说它会返回到你回调的地址并且带上code参数,一般情况下,回调的地址设置为后端的action即可,然后就可以获取到code了,当你获取到code,已经成功了一大半。

3.然后在后端访问下面的网址

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

code的参数用刚刚返回的code值。

4.上面网页将会返回json,其中openId就在其中。


至此,openId就获取到了,但是要注意:此处只获取到了openId,也就是不需要用户授权的,要获取用户其它的信息请参考接口文档。还有就是每次获取openId请重新获取code,code值不要重复使用,防止出错。

在微信页面上我是把获取到的openId保存在cookie中的,这样就可以防止openId的重复获取,我只在用户第一次进入或者cookie中的openId失效的时候进行再次获取的。至今没什么问题,但是我不知道大神们是把openId是放在哪里,我也只是给大家一个意见而已。

如果文档中有什么问题希望指出,如果需要帮助请私信。


没有更多推荐了,返回首页