微信内のwebviewで微信ユーザの基本情報を取得(open_id)


前提:
高度なインタフェースを開いた微信の公衆番号(サービス番号が優れている)
微信のoauth
(他の方法は通用しません:urlパラメータが危険すぎて、sessionは保存できません、event=viewタイプのイベントはkey(url)などを動的に変更できません...)
 
プロセス:
認証役割ドメインの適用、snsapi_base
http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
1.カスタムメニューリンクアドレスの設定
類似:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx*********&redirect_uri=http%3A%2F%2Fwx.edaysoft.cn%2Fhome%2Ftest&response_type=code&scope=snsapi_base&state=yunnying#wechat_redirect
2. redirect_uri codeとstateの取得
3.HttpWebRequest openidとtokenの取得
4.終了.あるいは他の深く入りたいもの
//redirect_uri   
public ActionResult Test()
{
    string code = Request.QueryString["code"];
    string state = Request.QueryString["state"];
    string msg = "";
    if (string.IsNullOrEmpty(code))
    {
        msg = "      ";
    }

    string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + "wx********************"
        + "&secret=" + "SSSSSSSSSSSSSSSSSSSSSSSS" 
        + "&code=" + code
        + "&grant_type=authorization_code";

    HttpWebResponse response = this.GetRestfulResponse(url);
    if (response.StatusCode == HttpStatusCode.OK)
    {
        using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
        {
            string responseString = sr.ReadToEnd();

            wxopenidjsonobject obj = JsonConvert.DeserializeObject(responseString);
            msg = obj.openid;
        }
    }
    if (string.IsNullOrWhiteSpace(msg))
    {
        msg = "sth wrong.";
    }
    ViewBag.from = msg;
    return View();
}
private HttpWebResponse GetRestfulResponse(string url, int timeout = 600000)
{
    HttpWebRequest request = WebRequest.CreateHttp(url);
    request.ContentType = "application/json;charset=utf-8";
    
    request.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.Default);
    request.Method = "GET";
    request.ContentLength = 0;
    request.Timeout = timeout;
    return request.GetResponse() as HttpWebResponse;
}
public class wxopenidjsonobject
{
    public string access_token { get; set; }
    public int expires_in { get; set; }
    public string refresh_token { get; set; }
    public string openid { get; set; }
    public string scope { get; set; }
}
 
 
注意事項:1.redirect_uriは任意で、微盟や点呼客のような微信託管プラットフォームとは異なり、自分でhostすればいい.
2.微信公衆プラットフォーム内の開発者センターにおけるウェブサービスのウェブページ授権ユーザーの基本情報を取得する授権コールバックページドメイン名を設定し、エラーを報告しないようにする:redirect_uriパラメータエラー